Geometry Nodes: Store tool group in a separate editor property
This enables switching back and forth between the modifier and tool contexts of the geometry node editor without losing the assigned tool node group. See #101778 Pull Request: https://projects.blender.org/blender/blender/pulls/112926
This commit is contained in:
parent
4f617bc728
commit
9e495c5b06
|
@ -307,7 +307,7 @@ class NewGeometryNodeGroupTool(Operator):
|
||||||
|
|
||||||
def execute(self, context):
|
def execute(self, context):
|
||||||
group = geometry_node_group_empty_tool_new(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'}
|
return {'FINISHED'}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -162,7 +162,7 @@ class NODE_HT_header(Header):
|
||||||
else:
|
else:
|
||||||
row.template_ID(snode, "node_tree", new="node.new_geometry_nodes_modifier")
|
row.template_ID(snode, "node_tree", new="node.new_geometry_nodes_modifier")
|
||||||
else:
|
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:
|
if snode.node_tree:
|
||||||
layout.popover(panel="NODE_PT_geometry_node_tool_object_types", text="Types")
|
layout.popover(panel="NODE_PT_geometry_node_tool_object_types", text="Types")
|
||||||
layout.popover(panel="NODE_PT_geometry_node_tool_mode", text="Modes")
|
layout.popover(panel="NODE_PT_geometry_node_tool_mode", text="Modes")
|
||||||
|
|
|
@ -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
|
/* Both `snode->id` and `snode->nodetree` have been remapped now, so their data can be
|
||||||
* accessed. */
|
* accessed. */
|
||||||
BLI_assert(snode->id == nullptr || snode->nodetree == nullptr ||
|
BLI_assert(snode->id == nullptr || snode->nodetree == nullptr ||
|
||||||
|
|
|
@ -1626,6 +1626,13 @@ typedef struct SpaceNode {
|
||||||
*/
|
*/
|
||||||
char geometry_nodes_type;
|
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. */
|
/** Grease-pencil data. */
|
||||||
struct bGPdata *gpd;
|
struct bGPdata *gpd;
|
||||||
|
|
||||||
|
|
|
@ -2507,6 +2507,22 @@ static void rna_SpaceNodeEditor_node_tree_set(PointerRNA *ptr,
|
||||||
ED_node_tree_start(snode, (bNodeTree *)value.data, nullptr, nullptr);
|
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<const bNodeTree *>(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)
|
static bool space_node_node_geometry_nodes_poll(const SpaceNode &snode, const bNodeTree &ntree)
|
||||||
{
|
{
|
||||||
switch (SpaceNodeGeometryNodesType(snode.geometry_nodes_type)) {
|
switch (SpaceNodeGeometryNodesType(snode.geometry_nodes_type)) {
|
||||||
|
@ -2547,20 +2563,6 @@ static bool rna_SpaceNodeEditor_node_tree_poll(PointerRNA *ptr, const PointerRNA
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rna_SpaceNodeEditor_geometry_nodes_type_update(Main * /*bmain*/,
|
|
||||||
Scene * /*scene*/,
|
|
||||||
PointerRNA *ptr)
|
|
||||||
{
|
|
||||||
SpaceNode &snode = *static_cast<SpaceNode *>(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*/)
|
static void rna_SpaceNodeEditor_node_tree_update(const bContext *C, PointerRNA * /*ptr*/)
|
||||||
{
|
{
|
||||||
ED_node_tree_update(C);
|
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_enum_items(prop, geometry_nodes_type_items);
|
||||||
RNA_def_property_ui_text(prop, "Geometry Nodes Type", "");
|
RNA_def_property_ui_text(prop, "Geometry Nodes Type", "");
|
||||||
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID);
|
RNA_def_property_translation_context(prop, BLT_I18NCONTEXT_ID_ID);
|
||||||
RNA_def_property_update(
|
RNA_def_property_update(prop, NC_SPACE | ND_SPACE_NODE, nullptr);
|
||||||
prop, NC_SPACE | ND_SPACE_NODE, "rna_SpaceNodeEditor_geometry_nodes_type_update");
|
|
||||||
|
|
||||||
prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
|
prop = RNA_def_property(srna, "id", PROP_POINTER, PROP_NONE);
|
||||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||||
|
@ -7561,6 +7562,13 @@ static void rna_def_space_node(BlenderRNA *brna)
|
||||||
RNA_def_property_update(
|
RNA_def_property_update(
|
||||||
prop, NC_SPACE | ND_SPACE_NODE_VIEW, "rna_SpaceNodeEditor_show_backdrop_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);
|
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_boolean_sdna(prop, nullptr, "flag", SNODE_SHOW_GPENCIL);
|
||||||
RNA_def_property_ui_text(prop, "Show Annotation", "Show annotations for this view");
|
RNA_def_property_ui_text(prop, "Show Annotation", "Show annotations for this view");
|
||||||
|
|
|
@ -35,7 +35,7 @@ static void geometry_node_tree_get_from_context(
|
||||||
{
|
{
|
||||||
const SpaceNode *snode = CTX_wm_space_node(C);
|
const SpaceNode *snode = CTX_wm_space_node(C);
|
||||||
if (snode->geometry_nodes_type == SNODE_GEOMETRY_TOOL) {
|
if (snode->geometry_nodes_type == SNODE_GEOMETRY_TOOL) {
|
||||||
*r_ntree = snode->nodetree;
|
*r_ntree = snode->geometry_nodes_tool_tree;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue