diff options
Diffstat (limited to 'source/blender/modifiers/intern/MOD_nodes.cc')
-rw-r--r-- | source/blender/modifiers/intern/MOD_nodes.cc | 95 |
1 files changed, 37 insertions, 58 deletions
diff --git a/source/blender/modifiers/intern/MOD_nodes.cc b/source/blender/modifiers/intern/MOD_nodes.cc index 7c5bb988012..ba4c03f68de 100644 --- a/source/blender/modifiers/intern/MOD_nodes.cc +++ b/source/blender/modifiers/intern/MOD_nodes.cc @@ -33,6 +33,7 @@ #include "DNA_scene_types.h" #include "DNA_screen_types.h" #include "DNA_space_types.h" +#include "DNA_view3d_types.h" #include "DNA_windowmanager_types.h" #include "BKE_attribute_math.hh" @@ -80,6 +81,7 @@ #include "ED_screen.h" #include "ED_spreadsheet.h" #include "ED_undo.h" +#include "ED_viewer_path.hh" #include "NOD_geometry.h" #include "NOD_geometry_nodes_lazy_function.hh" @@ -828,25 +830,6 @@ static void initialize_group_input(NodesModifierData &nmd, } } -static Vector<SpaceSpreadsheet *> find_spreadsheet_editors(Main *bmain) -{ - wmWindowManager *wm = (wmWindowManager *)bmain->wm.first; - if (wm == nullptr) { - return {}; - } - Vector<SpaceSpreadsheet *> spreadsheets; - LISTBASE_FOREACH (wmWindow *, window, &wm->windows) { - bScreen *screen = BKE_workspace_active_screen_get(window->workspace_hook); - LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { - SpaceLink *sl = (SpaceLink *)area->spacedata.first; - if (sl->spacetype == SPACE_SPREADSHEET) { - spreadsheets.append((SpaceSpreadsheet *)sl); - } - } - } - return spreadsheets; -} - static const lf::FunctionNode &find_viewer_lf_node(const bNode &viewer_bnode) { return *blender::nodes::ensure_geometry_nodes_lazy_function_graph(viewer_bnode.owner_tree()) @@ -858,50 +841,33 @@ static const lf::FunctionNode &find_group_lf_node(const bNode &group_bnode) ->mapping.group_node_map.lookup(&group_bnode); } -static void find_side_effect_nodes_for_spreadsheet( - const SpaceSpreadsheet &sspreadsheet, +static void find_side_effect_nodes_for_viewer_path( + const ViewerPath &viewer_path, const NodesModifierData &nmd, const ModifierEvalContext &ctx, - const bNodeTree &root_tree, MultiValueMap<blender::ComputeContextHash, const lf::FunctionNode *> &r_side_effect_nodes) { - Vector<SpreadsheetContext *> context_path = sspreadsheet.context_path; - if (context_path.size() < 3) { - return; - } - if (context_path[0]->type != SPREADSHEET_CONTEXT_OBJECT) { - return; - } - if (context_path[1]->type != SPREADSHEET_CONTEXT_MODIFIER) { + const std::optional<blender::ed::viewer_path::ViewerPathForGeometryNodesViewer> parsed_path = + blender::ed::viewer_path::parse_geometry_nodes_viewer(viewer_path); + if (!parsed_path.has_value()) { return; } - SpreadsheetContextObject *object_context = (SpreadsheetContextObject *)context_path[0]; - if (object_context->object != DEG_get_original_object(ctx.object)) { + if (parsed_path->object != DEG_get_original_object(ctx.object)) { return; } - SpreadsheetContextModifier *modifier_context = (SpreadsheetContextModifier *)context_path[1]; - if (StringRef(modifier_context->modifier_name) != nmd.modifier.name) { + if (parsed_path->modifier_name != nmd.modifier.name) { return; } - for (SpreadsheetContext *context : context_path.as_span().drop_front(2)) { - if (context->type != SPREADSHEET_CONTEXT_NODE) { - return; - } - } blender::ComputeContextBuilder compute_context_builder; - compute_context_builder.push<blender::bke::ModifierComputeContext>(nmd.modifier.name); - - const Span<SpreadsheetContextNode *> nested_group_contexts = - context_path.as_span().drop_front(2).drop_back(1).cast<SpreadsheetContextNode *>(); - const SpreadsheetContextNode *last_context = (SpreadsheetContextNode *)context_path.last(); + compute_context_builder.push<blender::bke::ModifierComputeContext>(parsed_path->modifier_name); + const bNodeTree *group = nmd.node_group; Stack<const bNode *> group_node_stack; - const bNodeTree *group = &root_tree; - for (SpreadsheetContextNode *node_context : nested_group_contexts) { + for (const StringRefNull group_node_name : parsed_path->group_node_names) { const bNode *found_node = nullptr; for (const bNode *node : group->group_nodes()) { - if (STREQ(node->name, node_context->node_name)) { + if (node->name == group_node_name) { found_node = node; break; } @@ -913,13 +879,13 @@ static void find_side_effect_nodes_for_spreadsheet( return; } group_node_stack.push(found_node); - group = reinterpret_cast<const bNodeTree *>(found_node->id); - compute_context_builder.push<blender::bke::NodeGroupComputeContext>(node_context->node_name); + group = reinterpret_cast<bNodeTree *>(found_node->id); + compute_context_builder.push<blender::bke::NodeGroupComputeContext>(group_node_name); } const bNode *found_viewer_node = nullptr; for (const bNode *viewer_node : group->nodes_by_type("GeometryNodeViewer")) { - if (STREQ(viewer_node->name, last_context->node_name)) { + if (viewer_node->name == parsed_path->viewer_node_name) { found_viewer_node = viewer_node; break; } @@ -943,16 +909,29 @@ static void find_side_effect_nodes_for_spreadsheet( static void find_side_effect_nodes( const NodesModifierData &nmd, const ModifierEvalContext &ctx, - const bNodeTree &tree, MultiValueMap<blender::ComputeContextHash, const lf::FunctionNode *> &r_side_effect_nodes) { Main *bmain = DEG_get_bmain(ctx.depsgraph); - - /* Based on every visible spreadsheet context path, get a list of sockets that need to have their - * intermediate geometries cached for display. */ - Vector<SpaceSpreadsheet *> spreadsheets = find_spreadsheet_editors(bmain); - for (SpaceSpreadsheet *sspreadsheet : spreadsheets) { - find_side_effect_nodes_for_spreadsheet(*sspreadsheet, nmd, ctx, tree, r_side_effect_nodes); + wmWindowManager *wm = (wmWindowManager *)bmain->wm.first; + if (wm == nullptr) { + return; + } + LISTBASE_FOREACH (const wmWindow *, window, &wm->windows) { + const bScreen *screen = BKE_workspace_active_screen_get(window->workspace_hook); + const WorkSpace *workspace = BKE_workspace_active_get(window->workspace_hook); + find_side_effect_nodes_for_viewer_path(workspace->viewer_path, nmd, ctx, r_side_effect_nodes); + LISTBASE_FOREACH (const ScrArea *, area, &screen->areabase) { + const SpaceLink *sl = static_cast<SpaceLink *>(area->spacedata.first); + if (sl->spacetype == SPACE_SPREADSHEET) { + const SpaceSpreadsheet &sspreadsheet = *reinterpret_cast<const SpaceSpreadsheet *>(sl); + find_side_effect_nodes_for_viewer_path( + sspreadsheet.viewer_path, nmd, ctx, r_side_effect_nodes); + } + if (sl->spacetype == SPACE_VIEW3D) { + const View3D &v3d = *reinterpret_cast<const View3D *>(sl); + find_side_effect_nodes_for_viewer_path(v3d.viewer_path, nmd, ctx, r_side_effect_nodes); + } + } } } @@ -1162,7 +1141,7 @@ static GeometrySet compute_geometry( geo_nodes_modifier_data.eval_log = eval_log.get(); } MultiValueMap<blender::ComputeContextHash, const lf::FunctionNode *> r_side_effect_nodes; - find_side_effect_nodes(*nmd, *ctx, btree, r_side_effect_nodes); + find_side_effect_nodes(*nmd, *ctx, r_side_effect_nodes); geo_nodes_modifier_data.side_effect_nodes = &r_side_effect_nodes; blender::nodes::GeoNodesLFUserData user_data; user_data.modifier_data = &geo_nodes_modifier_data; |