[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 ¶ms, 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