diff --git a/scripts/startup/bl_operators/geometry_nodes.py b/scripts/startup/bl_operators/geometry_nodes.py index 37dbb20b180..ec3e8c3e900 100644 --- a/scripts/startup/bl_operators/geometry_nodes.py +++ b/scripts/startup/bl_operators/geometry_nodes.py @@ -307,7 +307,7 @@ class NewGeometryNodeGroupTool(Operator): def execute(self, context): group = geometry_node_group_empty_tool_new(context) - context.space_data.node_tree = group + context.space_data.geometry_nodes_tool_tree = group return {'FINISHED'} diff --git a/scripts/startup/bl_ui/space_node.py b/scripts/startup/bl_ui/space_node.py index db3031b8333..f46de3927ad 100644 --- a/scripts/startup/bl_ui/space_node.py +++ b/scripts/startup/bl_ui/space_node.py @@ -162,7 +162,7 @@ class NODE_HT_header(Header): else: row.template_ID(snode, "node_tree", new="node.new_geometry_nodes_modifier") else: - layout.template_ID(snode, "node_tree", new="node.new_geometry_node_group_tool") + layout.template_ID(snode, "geometry_nodes_tool_tree", new="node.new_geometry_node_group_tool") if snode.node_tree: layout.popover(panel="NODE_PT_geometry_node_tool_object_types", text="Types") layout.popover(panel="NODE_PT_geometry_node_tool_mode", text="Modes") diff --git a/source/blender/editors/space_node/space_node.cc b/source/blender/editors/space_node/space_node.cc index ee413e8a6a0..323eb5dc141 100644 --- a/source/blender/editors/space_node/space_node.cc +++ b/source/blender/editors/space_node/space_node.cc @@ -1253,6 +1253,8 @@ static void node_foreach_id(SpaceLink *space_link, LibraryForeachIDData *data) } } + BKE_LIB_FOREACHID_PROCESS_IDSUPER(data, snode->geometry_nodes_tool_tree, IDWALK_CB_USER_ONE); + /* Both `snode->id` and `snode->nodetree` have been remapped now, so their data can be * accessed. */ BLI_assert(snode->id == nullptr || snode->nodetree == nullptr || diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 7ca6dbb9cee..5c8c055ca50 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -1626,6 +1626,13 @@ typedef struct SpaceNode { */ char geometry_nodes_type; + /** + * Used as the editor's top-level node group for #SNODE_GEOMETRY_TOOL. This is stored in the + * node editor because it isn't part of the context otherwise, and it isn't meant to be set + * separately from the editor's regular node group. + */ + struct bNodeTree *geometry_nodes_tool_tree; + /** Grease-pencil data. */ struct bGPdata *gpd; diff --git a/source/blender/makesrna/intern/rna_space.cc b/source/blender/makesrna/intern/rna_space.cc index f795d233135..cb22f9bcbfc 100644 --- a/source/blender/makesrna/intern/rna_space.cc +++ b/source/blender/makesrna/intern/rna_space.cc @@ -2507,6 +2507,22 @@ static void rna_SpaceNodeEditor_node_tree_set(PointerRNA *ptr, ED_node_tree_start(snode, (bNodeTree *)value.data, nullptr, nullptr); } +static bool rna_SpaceNodeEditor_geometry_nodes_tool_tree_poll(PointerRNA * /*ptr*/, + const PointerRNA value) +{ + const bNodeTree &ntree = *static_cast(value.data); + if (ntree.type != NTREE_GEOMETRY) { + return false; + } + if (!ntree.geometry_node_asset_traits) { + return false; + } + if ((ntree.geometry_node_asset_traits->flag & GEO_NODE_ASSET_TOOL) == 0) { + return false; + } + return true; +} + static bool space_node_node_geometry_nodes_poll(const SpaceNode &snode, const bNodeTree &ntree) { switch (SpaceNodeGeometryNodesType(snode.geometry_nodes_type)) { @@ -2547,20 +2563,6 @@ static bool rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, const PointerRNA return true; } -static void rna_SpaceNodeEditor_geometry_nodes_type_update(Main * /*bmain*/, - Scene * /*scene*/, - PointerRNA *ptr) -{ - SpaceNode &snode = *static_cast(ptr->data); - if (snode.nodetree) { - if (snode.nodetree->type == NTREE_GEOMETRY) { - if (!space_node_node_geometry_nodes_poll(snode, *snode.nodetree)) { - snode.nodetree = nullptr; - } - } - } -} - static void rna_SpaceNodeEditor_node_tree_update(const bContext *C, PointerRNA * /*ptr*/) { ED_node_tree_update(C); @@ -7512,8 +7514,7 @@ static void rna_def_space_node(BlenderRNA *brna) RNA_def_property_enum_items(prop, geometry_nodes_type_items); RNA_def_property_ui_text(prop, "Geometry Nodes Type", ""); RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID); - RNA_def_property_update( - prop, NC_SPACE | ND_SPACE_NODE, "rna_SpaceNodeEditor_geometry_nodes_type_update"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_NODE, nullptr); prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE); RNA_def_property_clear_flag(prop, PROP_EDITABLE); @@ -7561,6 +7562,13 @@ static void rna_def_space_node(BlenderRNA *brna) RNA_def_property_update( prop, NC_SPACE | ND_SPACE_NODE_VIEW, "rna_SpaceNodeEditor_show_backdrop_update"); + prop = RNA_def_property(srna, "geometry_nodes_tool_tree", PROP_POINTER, PROP_NONE); + RNA_def_property_pointer_funcs( + prop, nullptr, nullptr, nullptr, "rna_SpaceNodeEditor_geometry_nodes_tool_tree_poll"); + RNA_def_property_flag(prop, PROP_EDITABLE | PROP_CONTEXT_UPDATE); + RNA_def_property_ui_text(prop, "Node Tool Tree", "Node group to edit as node tool"); + RNA_def_property_update(prop, NC_SPACE | ND_SPACE_NODE, "rna_SpaceNodeEditor_node_tree_update"); + prop = RNA_def_property(srna, "show_annotation", PROP_BOOLEAN, PROP_NONE); RNA_def_property_boolean_sdna(prop, nullptr, "flag", SNODE_SHOW_GPENCIL); RNA_def_property_ui_text(prop, "Show Annotation", "Show annotations for this view"); diff --git a/source/blender/nodes/geometry/node_geometry_tree.cc b/source/blender/nodes/geometry/node_geometry_tree.cc index 54689867747..1406bfdcb4c 100644 --- a/source/blender/nodes/geometry/node_geometry_tree.cc +++ b/source/blender/nodes/geometry/node_geometry_tree.cc @@ -35,7 +35,7 @@ static void geometry_node_tree_get_from_context( { const SpaceNode *snode = CTX_wm_space_node(C); if (snode->geometry_nodes_type == SNODE_GEOMETRY_TOOL) { - *r_ntree = snode->nodetree; + *r_ntree = snode->geometry_nodes_tool_tree; return; }