Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/intern/geometry_nodes_log.cc
| /* SPDX-License-Identifier: GPL-2.0-or-later */ | /* SPDX-License-Identifier: GPL-2.0-or-later */ | ||||
| #include "NOD_geometry_nodes_lazy_function.hh" | #include "NOD_geometry_nodes_lazy_function.hh" | ||||
| #include "NOD_geometry_nodes_log.hh" | #include "NOD_geometry_nodes_log.hh" | ||||
| #include "BKE_compute_contexts.hh" | #include "BKE_compute_contexts.hh" | ||||
| #include "BKE_curves.hh" | #include "BKE_curves.hh" | ||||
| #include "BKE_node_runtime.hh" | #include "BKE_node_runtime.hh" | ||||
| #include "BKE_viewer_path.h" | |||||
| #include "FN_field_cpp_type.hh" | #include "FN_field_cpp_type.hh" | ||||
| #include "DNA_modifier_types.h" | #include "DNA_modifier_types.h" | ||||
| #include "DNA_space_types.h" | #include "DNA_space_types.h" | ||||
| #include "ED_viewer_path.hh" | |||||
| namespace blender::nodes::geo_eval_log { | namespace blender::nodes::geo_eval_log { | ||||
| using fn::FieldInput; | using fn::FieldInput; | ||||
| using fn::FieldInputs; | using fn::FieldInputs; | ||||
| GenericValueLog::~GenericValueLog() | GenericValueLog::~GenericValueLog() | ||||
| { | { | ||||
| this->value.destruct(); | this->value.destruct(); | ||||
| ▲ Show 20 Lines • Show All 160 Lines • ▼ Show 20 Lines | else { | ||||
| log_generic_value(base_type, value); | log_generic_value(base_type, value); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| log_generic_value(type, value.get()); | log_generic_value(type, value.get()); | ||||
| } | } | ||||
| } | } | ||||
| void GeoTreeLogger::log_viewer_node(const bNode &viewer_node, | void GeoTreeLogger::log_viewer_node(const bNode &viewer_node, GeometrySet geometry) | ||||
| const GeometrySet &geometry, | |||||
| const GField &field) | |||||
| { | { | ||||
| destruct_ptr<ViewerNodeLog> log = this->allocator->construct<ViewerNodeLog>(); | destruct_ptr<ViewerNodeLog> log = this->allocator->construct<ViewerNodeLog>(); | ||||
| log->geometry = geometry; | log->geometry = std::move(geometry); | ||||
| log->field = field; | |||||
| log->geometry.ensure_owns_direct_data(); | log->geometry.ensure_owns_direct_data(); | ||||
| this->viewer_node_logs.append({this->allocator->copy_string(viewer_node.name), std::move(log)}); | this->viewer_node_logs.append({this->allocator->copy_string(viewer_node.name), std::move(log)}); | ||||
| } | } | ||||
| void GeoTreeLog::ensure_node_warnings() | void GeoTreeLog::ensure_node_warnings() | ||||
| { | { | ||||
| if (reduced_node_warnings_) { | if (reduced_node_warnings_) { | ||||
| return; | return; | ||||
| ▲ Show 20 Lines • Show All 334 Lines • ▼ Show 20 Lines | GeoTreeLog *GeoModifierLog::get_tree_log_for_node_editor(const SpaceNode &snode) | ||||
| compute_context_builder.push<bke::ModifierComputeContext>( | compute_context_builder.push<bke::ModifierComputeContext>( | ||||
| object_and_modifier->nmd->modifier.name); | object_and_modifier->nmd->modifier.name); | ||||
| for (const bNodeTreePath *path_item : tree_path.as_span().drop_front(1)) { | for (const bNodeTreePath *path_item : tree_path.as_span().drop_front(1)) { | ||||
| compute_context_builder.push<bke::NodeGroupComputeContext>(path_item->node_name); | compute_context_builder.push<bke::NodeGroupComputeContext>(path_item->node_name); | ||||
| } | } | ||||
| return &modifier_log->get_tree_log(compute_context_builder.hash()); | return &modifier_log->get_tree_log(compute_context_builder.hash()); | ||||
| } | } | ||||
| const ViewerNodeLog *GeoModifierLog::find_viewer_node_log_for_spreadsheet( | const ViewerNodeLog *GeoModifierLog::find_viewer_node_log_for_path(const ViewerPath &viewer_path) | ||||
| const SpaceSpreadsheet &sspreadsheet) | |||||
| { | { | ||||
| Vector<const SpreadsheetContext *> context_path = sspreadsheet.context_path; | const std::optional<ed::viewer_path::ViewerPathForGeometryNodesViewer> parsed_path = | ||||
| if (context_path.size() < 3) { | ed::viewer_path::parse_geometry_nodes_viewer(viewer_path); | ||||
| return nullptr; | if (!parsed_path.has_value()) { | ||||
| } | |||||
| if (context_path[0]->type != SPREADSHEET_CONTEXT_OBJECT) { | |||||
| return nullptr; | |||||
| } | |||||
| if (context_path[1]->type != SPREADSHEET_CONTEXT_MODIFIER) { | |||||
| return nullptr; | |||||
| } | |||||
| const SpreadsheetContextObject *object_context = | |||||
| reinterpret_cast<const SpreadsheetContextObject *>(context_path[0]); | |||||
| const SpreadsheetContextModifier *modifier_context = | |||||
| reinterpret_cast<const SpreadsheetContextModifier *>(context_path[1]); | |||||
| if (object_context->object == nullptr) { | |||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| const Object *object = parsed_path->object; | |||||
| NodesModifierData *nmd = nullptr; | NodesModifierData *nmd = nullptr; | ||||
| LISTBASE_FOREACH (ModifierData *, md, &object_context->object->modifiers) { | LISTBASE_FOREACH (ModifierData *, md, &object->modifiers) { | ||||
| if (STREQ(md->name, modifier_context->modifier_name)) { | if (md->name == parsed_path->modifier_name) { | ||||
| if (md->type == eModifierType_Nodes) { | if (md->type == eModifierType_Nodes) { | ||||
| nmd = reinterpret_cast<NodesModifierData *>(md); | nmd = reinterpret_cast<NodesModifierData *>(md); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| if (nmd == nullptr) { | if (nmd == nullptr) { | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| if (nmd->runtime_eval_log == nullptr) { | if (nmd->runtime_eval_log == nullptr) { | ||||
| return nullptr; | return nullptr; | ||||
| } | } | ||||
| nodes::geo_eval_log::GeoModifierLog *modifier_log = | nodes::geo_eval_log::GeoModifierLog *modifier_log = | ||||
| static_cast<nodes::geo_eval_log::GeoModifierLog *>(nmd->runtime_eval_log); | static_cast<nodes::geo_eval_log::GeoModifierLog *>(nmd->runtime_eval_log); | ||||
| ComputeContextBuilder compute_context_builder; | ComputeContextBuilder compute_context_builder; | ||||
| compute_context_builder.push<bke::ModifierComputeContext>(modifier_context->modifier_name); | compute_context_builder.push<bke::ModifierComputeContext>(parsed_path->modifier_name); | ||||
| for (const SpreadsheetContext *context : context_path.as_span().drop_front(2).drop_back(1)) { | for (const StringRef group_node_name : parsed_path->group_node_names) { | ||||
| if (context->type != SPREADSHEET_CONTEXT_NODE) { | compute_context_builder.push<bke::NodeGroupComputeContext>(group_node_name); | ||||
| return nullptr; | |||||
| } | |||||
| const SpreadsheetContextNode &node_context = *reinterpret_cast<const SpreadsheetContextNode *>( | |||||
| context); | |||||
| compute_context_builder.push<bke::NodeGroupComputeContext>(node_context.node_name); | |||||
| } | } | ||||
| const ComputeContextHash context_hash = compute_context_builder.hash(); | const ComputeContextHash context_hash = compute_context_builder.hash(); | ||||
| nodes::geo_eval_log::GeoTreeLog &tree_log = modifier_log->get_tree_log(context_hash); | nodes::geo_eval_log::GeoTreeLog &tree_log = modifier_log->get_tree_log(context_hash); | ||||
| tree_log.ensure_viewer_node_logs(); | tree_log.ensure_viewer_node_logs(); | ||||
| const SpreadsheetContext *last_context = context_path.last(); | |||||
| if (last_context->type != SPREADSHEET_CONTEXT_NODE) { | |||||
| return nullptr; | |||||
| } | |||||
| const SpreadsheetContextNode &last_node_context = | |||||
| *reinterpret_cast<const SpreadsheetContextNode *>(last_context); | |||||
| const ViewerNodeLog *viewer_log = tree_log.viewer_node_logs.lookup_default( | const ViewerNodeLog *viewer_log = tree_log.viewer_node_logs.lookup_default( | ||||
| last_node_context.node_name, nullptr); | parsed_path->viewer_node_name, nullptr); | ||||
| return viewer_log; | return viewer_log; | ||||
| } | } | ||||
| } // namespace blender::nodes::geo_eval_log | } // namespace blender::nodes::geo_eval_log | ||||