[Bf-blender-cvs] [ee3049e5086] temp-geometry-nodes-evaluator-refactor: support logging field in viewer again

Jacques Lucke noreply at git.blender.org
Wed Sep 7 13:02:57 CEST 2022


Commit: ee3049e50868f444faa0ba7aa2e599dc0fbdad52
Author: Jacques Lucke
Date:   Wed Sep 7 12:10:08 2022 +0200
Branches: temp-geometry-nodes-evaluator-refactor
https://developer.blender.org/rBee3049e50868f444faa0ba7aa2e599dc0fbdad52

support logging field in viewer again

===================================================================

M	source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
M	source/blender/nodes/NOD_geometry_nodes_log.hh
M	source/blender/nodes/intern/geometry_nodes_log.cc
M	source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc

===================================================================

diff --git a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
index ce71e1334f0..8b7e5ca6062 100644
--- a/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
+++ b/source/blender/editors/space_spreadsheet/spreadsheet_data_source_geometry.cc
@@ -42,6 +42,7 @@
 #include "spreadsheet_intern.hh"
 
 using blender::fn::GField;
+using blender::nodes::geo_eval_log::ViewerNodeLog;
 
 namespace blender::ed::spreadsheet {
 
@@ -410,24 +411,24 @@ int VolumeDataSource::tot_rows() const
   return BKE_volume_num_grids(volume);
 }
 
-static std::optional<GeometrySet> try_find_logged_geometry(const SpaceSpreadsheet &sspreadsheet)
+static const ViewerNodeLog *try_find_viewer_node_log(const SpaceSpreadsheet &sspreadsheet)
 {
   Vector<const SpreadsheetContext *> context_path = sspreadsheet.context_path;
   if (context_path.size() < 3) {
-    return std::nullopt;
+    return nullptr;
   }
   if (context_path[0]->type != SPREADSHEET_CONTEXT_OBJECT) {
-    return std::nullopt;
+    return nullptr;
   }
   if (context_path[1]->type != SPREADSHEET_CONTEXT_MODIFIER) {
-    return std::nullopt;
+    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 std::nullopt;
+    return nullptr;
   }
   NodesModifierData *nmd = nullptr;
   LISTBASE_FOREACH (ModifierData *, md, &object_context->object->modifiers) {
@@ -438,10 +439,10 @@ static std::optional<GeometrySet> try_find_logged_geometry(const SpaceSpreadshee
     }
   }
   if (nmd == nullptr) {
-    return std::nullopt;
+    return nullptr;
   }
   if (nmd->runtime_eval_log == nullptr) {
-    return std::nullopt;
+    return nullptr;
   }
   nodes::geo_eval_log::GeoModifierLog *modifier_log =
       static_cast<nodes::geo_eval_log::GeoModifierLog *>(nmd->runtime_eval_log);
@@ -450,7 +451,7 @@ static std::optional<GeometrySet> try_find_logged_geometry(const SpaceSpreadshee
   context_stack_builder.push<nodes::ModifierContextStack>(modifier_context->modifier_name);
   for (const SpreadsheetContext *context : context_path.as_span().drop_front(2).drop_back(1)) {
     if (context->type != SPREADSHEET_CONTEXT_NODE) {
-      return std::nullopt;
+      return nullptr;
     }
     const SpreadsheetContextNode &node_context = *reinterpret_cast<const SpreadsheetContextNode *>(
         context);
@@ -462,16 +463,12 @@ static std::optional<GeometrySet> try_find_logged_geometry(const SpaceSpreadshee
 
   const SpreadsheetContext *last_context = context_path.last();
   if (last_context->type != SPREADSHEET_CONTEXT_NODE) {
-    return std::nullopt;
+    return nullptr;
   }
   const SpreadsheetContextNode &last_node_context =
       *reinterpret_cast<const SpreadsheetContextNode *>(last_context);
-  const nodes::geo_eval_log::ViewerNodeLog *viewer_log = tree_log.viewer_node_logs.lookup(
-      last_node_context.node_name);
-  if (viewer_log == nullptr) {
-    return std::nullopt;
-  }
-  return viewer_log->geometry;
+  const ViewerNodeLog *viewer_log = tree_log.viewer_node_logs.lookup(last_node_context.node_name);
+  return viewer_log;
 }
 
 GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspreadsheet,
@@ -529,8 +526,8 @@ GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspread
         }
       }
       else {
-        if (std::optional<GeometrySet> viewer_geometry = try_find_logged_geometry(*sspreadsheet)) {
-          geometry_set = std::move(*viewer_geometry);
+        if (const ViewerNodeLog *viewer_log = try_find_viewer_node_log(*sspreadsheet)) {
+          geometry_set = viewer_log->geometry;
         }
       }
     }
@@ -539,7 +536,7 @@ GeometrySet spreadsheet_get_display_geometry_set(const SpaceSpreadsheet *sspread
 }
 
 static void find_fields_to_evaluate(const SpaceSpreadsheet *sspreadsheet,
-                                    Map<std::string, GField> &UNUSED(r_fields))
+                                    Map<std::string, GField> &r_fields)
 {
   if (sspreadsheet->object_eval_state != SPREADSHEET_OBJECT_EVAL_STATE_VIEWER_NODE) {
     return;
@@ -548,30 +545,11 @@ static void find_fields_to_evaluate(const SpaceSpreadsheet *sspreadsheet,
     /* No viewer is currently referenced by the context path. */
     return;
   }
-  // const geo_log::NodeLog *node_log =
-  // geo_log::ModifierLog::find_node_by_spreadsheet_editor_context(
-  //     *sspreadsheet);
-  // if (node_log == nullptr) {
-  //   return;
-  // }
-  // for (const geo_log::SocketLog &socket_log : node_log->input_logs()) {
-  //   const geo_log::ValueLog *value_log = socket_log.value();
-  //   if (value_log == nullptr) {
-  //     continue;
-  //   }
-  //   if (const geo_log::FieldInfoLog *field_value_log =
-  //           dynamic_cast<const geo_log::FieldInfoLog *>(value_log)) {
-  //     const GField &field = field_value_log->field();
-  //     if (field) {
-  //       r_fields.add("Viewer", std::move(field));
-  //     }
-  //   }
-  //   if (const geo_log::GenericValueLog *generic_value_log =
-  //           dynamic_cast<const geo_log::GenericValueLog *>(value_log)) {
-  //     GPointer value = generic_value_log->value();
-  //     r_fields.add("Viewer", fn::make_constant_field(*value.type(), value.get()));
-  //   }
-  // }
+  if (const ViewerNodeLog *viewer_log = try_find_viewer_node_log(*sspreadsheet)) {
+    if (viewer_log->field) {
+      r_fields.add("Viewer", viewer_log->field);
+    }
+  }
 }
 
 class GeometryComponentCacheKey : public SpreadsheetCache::Key {
diff --git a/source/blender/nodes/NOD_geometry_nodes_log.hh b/source/blender/nodes/NOD_geometry_nodes_log.hh
index 679f2a65acc..ba9f057967b 100644
--- a/source/blender/nodes/NOD_geometry_nodes_log.hh
+++ b/source/blender/nodes/NOD_geometry_nodes_log.hh
@@ -107,6 +107,7 @@ class GeometryInfoLog : public ValueLog {
 class ViewerNodeLog {
  public:
   GeometrySet geometry;
+  GField field;
 };
 
 using Clock = std::chrono::steady_clock;
@@ -127,7 +128,7 @@ class GeoTreeLogger {
   Vector<std::tuple<std::string, destruct_ptr<ViewerNodeLog>>, 0> viewer_node_logs_;
 
   void log_value(const bNode &node, const bNodeSocket &socket, GPointer value);
-  void log_viewer_node(const bNode &viewer_node, const GeometrySet &geometry);
+  void log_viewer_node(const bNode &viewer_node, const GeometrySet &geometry, const GField &field);
 };
 
 class GeoNodeLog {
diff --git a/source/blender/nodes/intern/geometry_nodes_log.cc b/source/blender/nodes/intern/geometry_nodes_log.cc
index 34c33ca6c19..b866da6213c 100644
--- a/source/blender/nodes/intern/geometry_nodes_log.cc
+++ b/source/blender/nodes/intern/geometry_nodes_log.cc
@@ -155,10 +155,13 @@ void GeoTreeLogger::log_value(const bNode &node, const bNodeSocket &socket, cons
   }
 }
 
-void GeoTreeLogger::log_viewer_node(const bNode &viewer_node, const GeometrySet &geometry)
+void GeoTreeLogger::log_viewer_node(const bNode &viewer_node,
+                                    const GeometrySet &geometry,
+                                    const GField &field)
 {
   destruct_ptr<ViewerNodeLog> log = this->allocator.construct<ViewerNodeLog>();
   log->geometry = geometry;
+  log->field = field;
   log->geometry.ensure_owns_direct_data();
   this->viewer_node_logs_.append({viewer_node.name, std::move(log)});
 }
diff --git a/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc b/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc
index 22dd34195e1..c08cd4ab0e3 100644
--- a/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc
+++ b/source/blender/nodes/intern/geometry_nodes_to_lazy_function_graph.cc
@@ -440,12 +440,20 @@ class LazyFunctionForComplexInput : public LazyFunction {
 class LazyFunctionForViewerNode : public LazyFunction {
  private:
   const bNode &bnode_;
+  bool use_field_input_ = true;
 
  public:
-  LazyFunctionForViewerNode(const bNode &bnode) : bnode_(bnode)
+  LazyFunctionForViewerNode(const bNode &bnode, Vector<const bNodeSocket *> &r_used_inputs)
+      : bnode_(bnode)
   {
     static_name_ = "Viewer";
-    inputs_.append({"Geometry", CPPType::get<GeometrySet>()});
+    Vector<const bNodeSocket *> dummy_used_outputs;
+    lazy_function_interface_from_node(bnode, r_used_inputs, dummy_used_outputs, inputs_, outputs_);
+    if (!r_used_inputs[1]->is_directly_linked()) {
+      use_field_input_ = false;
+      r_used_inputs.pop_last();
+      inputs_.pop_last();
+    }
   }
 
   void execute_impl(lf::Params &params, const lf::Context &context) const override
@@ -455,13 +463,18 @@ class LazyFunctionForViewerNode : public LazyFunction {
 
     GeometrySet geometry = params.extract_input<GeometrySet>(0);
 
+    GField field;
+    if (use_field_input_) {
+      const void *value_or_field = params.try_get_input_data_ptr(1);
+      BLI_assert(value_or_field != nullptr);
+      const ValueOrFieldCPPType &value_or_field_type = static_cast<const ValueOrFieldCPPType &>(
+          *inputs_[1].type);
+      field = value_or_field_type.as_field(value_or_field);
+    }
+
     geo_eval_log::GeoTreeLogger &tree_logger =
         user_data->modifier_data->eval_log->get_local_tree_logger(*user_data->context_stack);
-    tree_logger.log_viewer_node(bnode_, geometry);
-
-    std::stringstream ss;
-    ss << geometry;
-    user_data->context_stack->print_stack(std::cout, ss.str());
+    tree_logger.log_viewer_node(bnode_, geometry, field);
   }
 };
 
@@ -861,14 +874,18 @@ struct GeometryNodesLazyFunctionGraphBuilder {
 
   void handle_viewer_node(const bNode &bnode)
   {
-    auto lazy_function = std::make_unique<LazyFunctionForViewerNode>(bnode);
+    Vector<const bNodeSocket *> used_inputs;
+    auto lazy_function = std::make_unique<LazyFunctionForViewerNode>(bnode, used_inputs);
     lf::FunctionNode &lf_node = lf_graph_->add_function(*lazy_function);
     lf_graph_info_->functions.append(std::move(lazy_function));
 
-    const bNodeSocket &geometry_bsocket = bnode.

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list