Commit: 59b1eb145d0aa7c1b9a13750ce5c5f941ad27638 Author: Hans Goudey Date: Wed Dec 14 18:42:04 2022 -0600 Branches: temp-nodes-group-declarations https://developer.blender.org/rB59b1eb145d0aa7c1b9a13750ce5c5f941ad27638
Start of refactoring to use declaration for group nodes =================================================================== M source/blender/blenkernel/BKE_node.h M source/blender/blenkernel/BKE_node_runtime.hh M source/blender/blenkernel/intern/node.cc M source/blender/blenkernel/intern/node_tree_field_inferencing.cc M source/blender/blenkernel/intern/node_tree_update.cc M source/blender/editors/space_node/link_drag_search.cc M source/blender/editors/space_node/node_group.cc M source/blender/makesrna/intern/rna_nodetree.c M source/blender/nodes/NOD_common.h M source/blender/nodes/NOD_node_declaration.hh M source/blender/nodes/NOD_socket_declarations.hh M source/blender/nodes/composite/nodes/node_composite_common.cc M source/blender/nodes/geometry/nodes/node_geo_common.cc M source/blender/nodes/intern/node_common.cc M source/blender/nodes/intern/node_declaration.cc M source/blender/nodes/intern/node_socket.cc M source/blender/nodes/intern/node_socket_declarations.cc M source/blender/nodes/intern/socket_search_link.cc M source/blender/nodes/shader/nodes/node_shader_common.cc M source/blender/nodes/texture/nodes/node_texture_common.cc =================================================================== diff --git a/source/blender/blenkernel/BKE_node.h b/source/blender/blenkernel/BKE_node.h index 5a1198791fb..845b5a5566d 100644 --- a/source/blender/blenkernel/BKE_node.h +++ b/source/blender/blenkernel/BKE_node.h @@ -104,6 +104,7 @@ namespace nodes { class DNode; class NodeMultiFunctionBuilder; class GeoNodeExecParams; +class NodeDeclaration; class NodeDeclarationBuilder; class GatherLinkSearchOpParams; } // namespace nodes @@ -121,6 +122,9 @@ using CPPTypeHandle = blender::CPPType; using NodeMultiFunctionBuildFunction = void (*)(blender::nodes::NodeMultiFunctionBuilder &builder); using NodeGeometryExecFunction = void (*)(blender::nodes::GeoNodeExecParams params); using NodeDeclareFunction = void (*)(blender::nodes::NodeDeclarationBuilder &builder); +using NodeDeclareDynamicFunction = bool (*)(const bNodeTree &tree, + const bNode &node, + blender::nodes::NodeDeclaration &r_declaration); using SocketGetCPPValueFunction = void (*)(const struct bNodeSocket &socket, void *r_value); using SocketGetGeometryNodesCPPValueFunction = void (*)(const struct bNodeSocket &socket, void *r_value); @@ -140,6 +144,7 @@ typedef void *NodeGetCompositorShaderNodeFunction; typedef void *NodeMultiFunctionBuildFunction; typedef void *NodeGeometryExecFunction; typedef void *NodeDeclareFunction; +typedef void *NodeDeclareDynamicFunction; typedef void *NodeGatherSocketLinkOperationsFunction; typedef void *SocketGetCPPTypeFunction; typedef void *SocketGetGeometryNodesCPPTypeFunction; @@ -176,11 +181,6 @@ typedef struct bNodeSocketType { struct bNode *node, struct bNodeSocket *sock, const char *data_path); - void (*interface_verify_socket)(struct bNodeTree *ntree, - const struct bNodeSocket *interface_socket, - struct bNode *node, - struct bNodeSocket *sock, - const char *data_path); void (*interface_from_socket)(struct bNodeTree *ntree, struct bNodeSocket *interface_socket, struct bNode *node, @@ -345,8 +345,12 @@ typedef struct bNodeType { /* Declares which sockets the node has. */ NodeDeclareFunction declare; - /* Different nodes of this type can have different declarations. */ - bool declaration_is_dynamic; + /** + * Declare which sockets the node has, but isn't static per node type. In orther words, + * different nodes of this type can have different declarations and different sockets. + */ + NodeDeclareDynamicFunction declare_dynamic; + /* Declaration to be used when it is not dynamic. */ NodeDeclarationHandle *fixed_declaration; diff --git a/source/blender/blenkernel/BKE_node_runtime.hh b/source/blender/blenkernel/BKE_node_runtime.hh index 6a00e70cb5b..7f0e7f66936 100644 --- a/source/blender/blenkernel/BKE_node_runtime.hh +++ b/source/blender/blenkernel/BKE_node_runtime.hh @@ -324,7 +324,7 @@ inline bool topology_cache_is_available(const bNodeSocket &socket) namespace node_field_inferencing { bool update_field_inferencing(const bNodeTree &tree); -} +} // namespace node_field_inferencing } // namespace blender::bke diff --git a/source/blender/blenkernel/intern/node.cc b/source/blender/blenkernel/intern/node.cc index 9bc42879d78..0a318e42779 100644 --- a/source/blender/blenkernel/intern/node.cc +++ b/source/blender/blenkernel/intern/node.cc @@ -1374,7 +1374,7 @@ void nodeRegisterType(bNodeType *nt) BLI_assert(nt->idname[0] != '\0'); BLI_assert(nt->poll != nullptr); - if (nt->declare && !nt->declaration_is_dynamic) { + if (nt->declare && !nt->declare_dynamic) { if (nt->fixed_declaration == nullptr) { nt->fixed_declaration = new blender::nodes::NodeDeclaration(); blender::nodes::build_node_declaration(*nt, *nt->fixed_declaration); @@ -2997,7 +2997,7 @@ static void node_free_node(bNodeTree *ntree, bNode *node) MEM_freeN(node->prop); } - if (node->typeinfo->declaration_is_dynamic) { + if (node->typeinfo->declare_dynamic) { delete node->runtime->declaration; } @@ -3612,7 +3612,7 @@ bool nodeDeclarationEnsureOnOutdatedNode(bNodeTree * /*ntree*/, bNode *node) if (node->typeinfo->declare == nullptr) { return false; } - if (node->typeinfo->declaration_is_dynamic) { + if (node->typeinfo->declare_dynamic) { node->runtime->declaration = new blender::nodes::NodeDeclaration(); blender::nodes::build_node_declaration(*node->typeinfo, *node->runtime->declaration); } diff --git a/source/blender/blenkernel/intern/node_tree_field_inferencing.cc b/source/blender/blenkernel/intern/node_tree_field_inferencing.cc index 88fd3636633..b828586ba0a 100644 --- a/source/blender/blenkernel/intern/node_tree_field_inferencing.cc +++ b/source/blender/blenkernel/intern/node_tree_field_inferencing.cc @@ -486,27 +486,34 @@ static void update_socket_shapes(const bNodeTree &tree, } } -bool update_field_inferencing(const bNodeTree &tree) +FieldInferencingInterface calculate_field_inferencing(const bNodeTree &tree) { + FieldInferencingInterface interface; + tree.ensure_topology_cache(); - /* Create new inferencing interface for this node group. */ - std::unique_ptr<FieldInferencingInterface> new_inferencing_interface = - std::make_unique<FieldInferencingInterface>(); - new_inferencing_interface->inputs.resize(BLI_listbase_count(&tree.inputs), - InputSocketFieldType::IsSupported); - new_inferencing_interface->outputs.resize(BLI_listbase_count(&tree.outputs), - OutputFieldDependency::ForDataSource()); + interface.inputs.resize(BLI_listbase_count(&tree.inputs), InputSocketFieldType::IsSupported); + interface.outputs.resize(BLI_listbase_count(&tree.outputs), + OutputFieldDependency::ForDataSource()); /* Keep track of the state of all sockets. The index into this array is #SocketRef::id(). */ Array<SocketFieldState> field_state_by_socket_id(tree.all_sockets().size()); propagate_data_requirements_from_right_to_left(tree, field_state_by_socket_id); - determine_group_input_states(tree, *new_inferencing_interface, field_state_by_socket_id); + determine_group_input_states(tree, interface, field_state_by_socket_id); propagate_field_status_from_left_to_right(tree, field_state_by_socket_id); - determine_group_output_states(tree, *new_inferencing_interface, field_state_by_socket_id); + determine_group_output_states(tree, interface, field_state_by_socket_id); update_socket_shapes(tree, field_state_by_socket_id); + return interface; +} + +bool update_field_inferencing(const bNodeTree &tree) +{ + /* Create new inferencing interface for this node group. */ + std::unique_ptr<FieldInferencingInterface> new_inferencing_interface = + std::make_unique<FieldInferencingInterface>(calculate_field_inferencing(tree)); + /* Update the previous group interface. */ const bool group_interface_changed = !tree.runtime->field_inferencing_interface || *tree.runtime->field_inferencing_interface != diff --git a/source/blender/blenkernel/intern/node_tree_update.cc b/source/blender/blenkernel/intern/node_tree_update.cc index a49baf11680..3cec5e4a5fe 100644 --- a/source/blender/blenkernel/intern/node_tree_update.cc +++ b/source/blender/blenkernel/intern/node_tree_update.cc @@ -540,12 +540,18 @@ class NodeTreeMainUpdater { nodeDeclarationEnsure(&ntree, node); if (this->should_update_individual_node(ntree, *node)) { bNodeType &ntype = *node->typeinfo; - if (ntype.group_update_func) { - ntype.group_update_func(&ntree, node); - } if (ntype.updatefunc) { ntype.updatefunc(&ntree, node); } + if (ntype.declare_dynamic) { + if (!node->runtime->declaration) { + node->runtime->declaration = new blender::nodes::NodeDeclaration(); + } + build_node_declaration_dynamic(ntree, *node, *node->runtime->declaration); + } + if (ntype.group_update_func) { + ntype.group_update_func(&ntree, node); + } } if (ELEM(node->type, NODE_GROUP_INPUT, NODE_GROUP_OUTPUT)) { group_inout_nodes.append(node); diff --git a/source/blender/editors/space_node/link_drag_search.cc b/source/blender/editors/space_node/link_drag_search.cc index 8e156f409af..e4197c98ea1 100644 --- a/source/blender/editors/space_node/link_drag_search.cc +++ b/source/blender/editors/space_node/link_drag_search.cc @@ -198,7 +198,7 @@ static void search_link_ops_for_asset_metadata(const bNodeTree &node_tree, DEG_relations_tag_update(&bmain); /* Create the inputs and outputs on the new node. */ - node.typeinfo->group_update_func(¶ms.node_tree, &node); + node.typeinfo->updatefunc(¶ms.node_tree, &node); bNodeSocket *new_node_socket = bke::node_find_enabled_socket( node, in_out, socket_property->name); diff --git a/source/blender/editors/space_node/node_group.cc b/source/blender/editors/space_node/node_group.cc index 2c28a8fae34..32946888635 100644 --- a/source/blender/editors/space_node/node_group.cc +++ b/source/blender/editors/space_node/node_group.cc @@ -780,8 +780,7 @@ static void node_group_make_redirect_incoming_link( socket_for_naming->name); /* Update the group node and interface sockets so the new interface socket can be linked. */ - node_group_update(&ntree, gnode); - node_group_input_update(ngroup, input_node); + /* TODO: Update sockets based on declaration here. */ /* Create new internal link. */ bNodeSocket *input_sock = node_group_input_find_socket(input_node, iosock->identifier); @@ -942,11 +941,7 @@ static void node_group_make_insert_selected(const bContext &C, &ntree.li @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs