Changeset View
Changeset View
Standalone View
Standalone View
source/blender/modifiers/intern/MOD_nodes.cc
| Show First 20 Lines • Show All 752 Lines • ▼ Show 20 Lines | LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) { | ||||
| if (sl->spacetype == SPACE_SPREADSHEET) { | if (sl->spacetype == SPACE_SPREADSHEET) { | ||||
| spreadsheets.append((SpaceSpreadsheet *)sl); | spreadsheets.append((SpaceSpreadsheet *)sl); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return spreadsheets; | return spreadsheets; | ||||
| } | } | ||||
| static DSocket try_get_socket_to_preview_for_spreadsheet(SpaceSpreadsheet *sspreadsheet, | static void find_sockets_to_preview_for_spreadsheet(SpaceSpreadsheet *sspreadsheet, | ||||
| NodesModifierData *nmd, | NodesModifierData *nmd, | ||||
| const ModifierEvalContext *ctx, | const ModifierEvalContext *ctx, | ||||
| const DerivedNodeTree &tree) | const DerivedNodeTree &tree, | ||||
| Set<DSocket> &r_sockets_to_preview) | |||||
| { | { | ||||
| Vector<SpreadsheetContext *> context_path = sspreadsheet->context_path; | Vector<SpreadsheetContext *> context_path = sspreadsheet->context_path; | ||||
| if (context_path.size() < 3) { | if (context_path.size() < 3) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| if (context_path[0]->type != SPREADSHEET_CONTEXT_OBJECT) { | if (context_path[0]->type != SPREADSHEET_CONTEXT_OBJECT) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| if (context_path[1]->type != SPREADSHEET_CONTEXT_MODIFIER) { | if (context_path[1]->type != SPREADSHEET_CONTEXT_MODIFIER) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| SpreadsheetContextObject *object_context = (SpreadsheetContextObject *)context_path[0]; | SpreadsheetContextObject *object_context = (SpreadsheetContextObject *)context_path[0]; | ||||
| if (object_context->object != DEG_get_original_object(ctx->object)) { | if (object_context->object != DEG_get_original_object(ctx->object)) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| SpreadsheetContextModifier *modifier_context = (SpreadsheetContextModifier *)context_path[1]; | SpreadsheetContextModifier *modifier_context = (SpreadsheetContextModifier *)context_path[1]; | ||||
| if (StringRef(modifier_context->modifier_name) != nmd->modifier.name) { | if (StringRef(modifier_context->modifier_name) != nmd->modifier.name) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| for (SpreadsheetContext *context : context_path.as_span().drop_front(2)) { | for (SpreadsheetContext *context : context_path.as_span().drop_front(2)) { | ||||
| if (context->type != SPREADSHEET_CONTEXT_NODE) { | if (context->type != SPREADSHEET_CONTEXT_NODE) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| } | } | ||||
| Span<SpreadsheetContextNode *> nested_group_contexts = | Span<SpreadsheetContextNode *> nested_group_contexts = | ||||
| context_path.as_span().drop_front(2).drop_back(1).cast<SpreadsheetContextNode *>(); | context_path.as_span().drop_front(2).drop_back(1).cast<SpreadsheetContextNode *>(); | ||||
| SpreadsheetContextNode *last_context = (SpreadsheetContextNode *)context_path.last(); | SpreadsheetContextNode *last_context = (SpreadsheetContextNode *)context_path.last(); | ||||
| const DTreeContext *context = &tree.root_context(); | const DTreeContext *context = &tree.root_context(); | ||||
| for (SpreadsheetContextNode *node_context : nested_group_contexts) { | for (SpreadsheetContextNode *node_context : nested_group_contexts) { | ||||
| const NodeTreeRef &tree_ref = context->tree(); | const NodeTreeRef &tree_ref = context->tree(); | ||||
| const NodeRef *found_node = nullptr; | const NodeRef *found_node = nullptr; | ||||
| for (const NodeRef *node_ref : tree_ref.nodes()) { | for (const NodeRef *node_ref : tree_ref.nodes()) { | ||||
| if (node_ref->name() == node_context->node_name) { | if (node_ref->name() == node_context->node_name) { | ||||
| found_node = node_ref; | found_node = node_ref; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| if (found_node == nullptr) { | if (found_node == nullptr) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| context = context->child_context(*found_node); | context = context->child_context(*found_node); | ||||
| if (context == nullptr) { | if (context == nullptr) { | ||||
| return {}; | return; | ||||
| } | } | ||||
| } | } | ||||
| const NodeTreeRef &tree_ref = context->tree(); | const NodeTreeRef &tree_ref = context->tree(); | ||||
| for (const NodeRef *node_ref : tree_ref.nodes_by_type("GeometryNodeViewer")) { | for (const NodeRef *node_ref : tree_ref.nodes_by_type("GeometryNodeViewer")) { | ||||
| if (node_ref->name() == last_context->node_name) { | if (node_ref->name() == last_context->node_name) { | ||||
| const DNode viewer_node{context, node_ref}; | const DNode viewer_node{context, node_ref}; | ||||
| return viewer_node.input(0); | for (const InputSocketRef *input_socket : node_ref->inputs()) { | ||||
| if (input_socket->is_available() && input_socket->is_logically_linked()) { | |||||
| r_sockets_to_preview.add(DSocket{context, input_socket}); | |||||
| } | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| return {}; | |||||
| } | } | ||||
| static void find_sockets_to_preview(NodesModifierData *nmd, | static void find_sockets_to_preview(NodesModifierData *nmd, | ||||
| const ModifierEvalContext *ctx, | const ModifierEvalContext *ctx, | ||||
| const DerivedNodeTree &tree, | const DerivedNodeTree &tree, | ||||
| Set<DSocket> &r_sockets_to_preview) | Set<DSocket> &r_sockets_to_preview) | ||||
| { | { | ||||
| Main *bmain = DEG_get_bmain(ctx->depsgraph); | Main *bmain = DEG_get_bmain(ctx->depsgraph); | ||||
| /* Based on every visible spreadsheet context path, get a list of sockets that need to have their | /* Based on every visible spreadsheet context path, get a list of sockets that need to have their | ||||
| * intermediate geometries cached for display. */ | * intermediate geometries cached for display. */ | ||||
| Vector<SpaceSpreadsheet *> spreadsheets = find_spreadsheet_editors(bmain); | Vector<SpaceSpreadsheet *> spreadsheets = find_spreadsheet_editors(bmain); | ||||
| for (SpaceSpreadsheet *sspreadsheet : spreadsheets) { | for (SpaceSpreadsheet *sspreadsheet : spreadsheets) { | ||||
| const DSocket socket = try_get_socket_to_preview_for_spreadsheet(sspreadsheet, nmd, ctx, tree); | find_sockets_to_preview_for_spreadsheet(sspreadsheet, nmd, ctx, tree, r_sockets_to_preview); | ||||
| if (socket) { | |||||
| r_sockets_to_preview.add(socket); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| static void clear_runtime_data(NodesModifierData *nmd) | static void clear_runtime_data(NodesModifierData *nmd) | ||||
| { | { | ||||
| if (nmd->runtime_eval_log != nullptr) { | if (nmd->runtime_eval_log != nullptr) { | ||||
| delete (geo_log::ModifierLog *)nmd->runtime_eval_log; | delete (geo_log::ModifierLog *)nmd->runtime_eval_log; | ||||
| nmd->runtime_eval_log = nullptr; | nmd->runtime_eval_log = nullptr; | ||||
| ▲ Show 20 Lines • Show All 545 Lines • Show Last 20 Lines | |||||