Commit: 97465046c6bb43647a34d9fbbf33b784c0c2604d Author: Jacques Lucke Date: Fri Nov 26 18:00:52 2021 +0100 Branches: master https://developer.blender.org/rB97465046c6bb43647a34d9fbbf33b784c0c2604d
Geometry Nodes: add utility to set remaining outputs Differential Revision: https://developer.blender.org/D13384 =================================================================== M source/blender/modifiers/intern/MOD_nodes_evaluator.cc M source/blender/nodes/NOD_geometry_exec.hh M source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc M source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc M source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc M source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc M source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc M source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc M source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc M source/blender/nodes/geometry/nodes/node_geo_collection_info.cc M source/blender/nodes/geometry/nodes/node_geo_convex_hull.cc M source/blender/nodes/geometry/nodes/node_geo_curve_length.cc M source/blender/nodes/geometry/nodes/node_geo_curve_primitive_circle.cc M source/blender/nodes/geometry/nodes/node_geo_curve_primitive_quadrilateral.cc M source/blender/nodes/geometry/nodes/node_geo_curve_primitive_spiral.cc M source/blender/nodes/geometry/nodes/node_geo_curve_resample.cc M source/blender/nodes/geometry/nodes/node_geo_curve_sample.cc M source/blender/nodes/geometry/nodes/node_geo_image_texture.cc M source/blender/nodes/geometry/nodes/node_geo_instances_to_points.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_circle.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cone.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cube.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_cylinder.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_grid.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_primitive_uv_sphere.cc M source/blender/nodes/geometry/nodes/node_geo_mesh_subdivide.cc M source/blender/nodes/geometry/nodes/node_geo_object_info.cc M source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc M source/blender/nodes/geometry/nodes/node_geo_proximity.cc M source/blender/nodes/geometry/nodes/node_geo_raycast.cc M source/blender/nodes/intern/node_geometry_exec.cc =================================================================== diff --git a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc index 33a5da7ccb7..5a8575424c8 100644 --- a/source/blender/modifiers/intern/MOD_nodes_evaluator.cc +++ b/source/blender/modifiers/intern/MOD_nodes_evaluator.cc @@ -416,6 +416,8 @@ class NodeParamsProvider : public nodes::GeoNodeExecParamsProvider { bool lazy_require_input(StringRef identifier) override; bool lazy_output_is_required(StringRef identifier) const override; + + void set_default_remaining_outputs(); }; class GeometryNodesEvaluator { @@ -1371,6 +1373,7 @@ class GeometryNodesEvaluator { /** * Moves a newly computed value from an output socket to all the inputs that might need it. + * Takes ownership of the value and destructs if it is unused. */ void forward_output(const DOutputSocket from_socket, GMutablePointer value_to_forward, @@ -1891,6 +1894,29 @@ bool NodeParamsProvider::lazy_output_is_required(StringRef identifier) const return output_state.output_usage_for_execution == ValueUsage::Required; } +void NodeParamsProvider::set_default_remaining_outputs() +{ + LinearAllocator<> &allocator = evaluator_.local_allocators_.local(); + + for (const int i : this->dnode->outputs().index_range()) { + OutputState &output_state = node_state_.outputs[i]; + if (output_state.has_been_computed) { + continue; + } + if (output_state.output_usage_for_execution == ValueUsage::Unused) { + continue; + } + + const DOutputSocket socket = this->dnode.output(i); + const CPPType *type = get_socket_cpp_type(socket); + BLI_assert(type != nullptr); + void *buffer = allocator.allocate(type->size(), type->alignment()); + type->copy_construct(type->default_value(), buffer); + evaluator_.forward_output(socket, {type, buffer}, run_state_); + output_state.has_been_computed = true; + } +} + void evaluate_geometry_nodes(GeometryNodesEvaluationParams ¶ms) { GeometryNodesEvaluator evaluator{params}; diff --git a/source/blender/nodes/NOD_geometry_exec.hh b/source/blender/nodes/NOD_geometry_exec.hh index 6b6e8a89240..f15f5abcb4e 100644 --- a/source/blender/nodes/NOD_geometry_exec.hh +++ b/source/blender/nodes/NOD_geometry_exec.hh @@ -118,6 +118,8 @@ class GeoNodeExecParamsProvider { virtual bool output_is_required(StringRef identifier) const = 0; virtual bool lazy_require_input(StringRef identifier) = 0; virtual bool lazy_output_is_required(StringRef identifier) const = 0; + + virtual void set_default_remaining_outputs() = 0; }; class GeoNodeExecParams { @@ -357,6 +359,8 @@ class GeoNodeExecParams { std::string attribute_producer_name() const; + void set_default_remaining_outputs(); + private: /* Utilities for detecting common errors at when using this class. */ void check_input_access(StringRef identifier, const CPPType *requested_type = nullptr) const; diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc index 1f241e1f20e..d364ef0bb1d 100644 --- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc +++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_convert.cc @@ -141,7 +141,7 @@ static void node_geo_exec(GeoNodeExecParams params) const AttributeDomain domain = static_cast<AttributeDomain>(node_storage.domain); if (result_name.empty()) { - params.set_output("Geometry", geometry_set); + params.set_default_remaining_outputs(); return; } diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc index 8fb05d031a6..99adb079f91 100644 --- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc +++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_randomize.cc @@ -287,7 +287,7 @@ static void node_geo_exec(GeoNodeExecParams params) GeometrySet geometry_set = params.extract_input<GeometrySet>("Geometry"); const std::string attribute_name = params.get_input<std::string>("Attribute"); if (attribute_name.empty()) { - params.set_output("Geometry", geometry_set); + params.set_default_remaining_outputs(); return; } const int seed = params.get_input<int>("Seed"); diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc index afdadee97c7..faea8751687 100644 --- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc +++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_attribute_transfer.cc @@ -483,7 +483,7 @@ static void node_geo_exec(GeoNodeExecParams params) const std::string dst_attribute_name = params.extract_input<std::string>("Destination"); if (src_attribute_name.empty() || dst_attribute_name.empty()) { - params.set_output("Geometry", dst_geometry_set); + params.set_default_remaining_outputs(); return; } diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc index 184f39ba094..b0b53e8136c 100644 --- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc +++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_curve_endpoints.cc @@ -152,8 +152,7 @@ static void node_geo_exec(GeoNodeExecParams params) geometry_set = bke::geometry_set_realize_instances(geometry_set); if (!geometry_set.has_curve()) { - params.set_output("Start Points", GeometrySet()); - params.set_output("End Points", GeometrySet()); + params.set_default_remaining_outputs(); return; } @@ -168,8 +167,7 @@ static void node_geo_exec(GeoNodeExecParams params) const int total_size = offsets.size(); if (total_size == 0) { - params.set_output("Start Points", GeometrySet()); - params.set_output("End Points", GeometrySet()); + params.set_default_remaining_outputs(); return; } diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc index e384124d3e1..8fd7d612021 100644 --- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc +++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_mesh_to_curve.cc @@ -34,7 +34,7 @@ static void node_geo_exec(GeoNodeExecParams params) geometry_set = bke::geometry_set_realize_instances(geometry_set); if (!geometry_set.has_mesh()) { - params.set_output("Curve", GeometrySet()); + params.set_default_remaining_outputs(); return; } @@ -55,7 +55,7 @@ static void node_geo_exec(GeoNodeExecParams params) } if (selected_edge_indices.size() == 0) { - params.set_output("Curve", GeometrySet()); + params.set_default_remaining_outputs(); return; } diff --git a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc index d62f3536680..2451a7447ec 100644 --- a/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc +++ b/source/blender/nodes/geometry/nodes/legacy/node_geo_legacy_point_distribute.cc @@ -552,14 +552,14 @@ static void node_geo_exec(GeoNodeExecParams params) "Density Attribute"); if (density <= 0.0f) { - params.set_output("Geometry", GeometrySet()); + params.set_default_remaining_outputs(); return; } Vector<GeometryInstanceGroup> set_groups; geometry_set_gather_instances(geometry_set, set_groups); if (set_groups.is_empty()) { - params.set_output("Geometry", GeometrySet()); + params.set_default_remaining_outputs(); return; } @@ -573,7 +573,7 @@ static void node_geo_exec(GeoNodeExecParams params) if (set_groups.is_empty()) { params.error_message_add(NodeWarningType::Error, TIP_("Input geometry must contain a mesh")); - params.set_output("Geometry", GeometrySet()); + params.set_default_remaining_outputs(); return; } @@ -623,7 +623,7 @@ static void node_geo_exec(GeoNodeExecParams params) } if (final_points_len == 0) { - params.set_output("Geometry", GeometrySet()); + params.set_default_remaining_outputs(); return; } diff --git a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc index c84031f4c6b..4d7ab97bf0e 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_attribute_statistic.cc @@ -144,29 +144,6 @@ static float median_of_sorted_span(const Span<float> data) } return median; } -static void set_empty(CustomDataType data_type, GeoNodeExecParams ¶ms) -{ - if (data_type == CD_PROP_FLOAT) { - params.set_output("Mean", 0.0f); - params.set_output("Median", 0.0f); - params.set_output("Sum", 0.0f); - params.set_output("Min", 0.0f); - params.set_output("Max", 0.0f); - params.set_output("Range", 0.0f); - params.set_output("Standard Deviation", 0.0f); - params.set_output("Variance", 0.0f); - } - else if (data_type == CD_PROP_FLOAT3) { - params.set_output("Mean_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Median_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Sum_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Min_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Max_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Range_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Standard Deviation_001", float3{0.0f, 0.0f, 0.0f}); - params.set_output("Variance_001", float3{0.0f, 0.0f, 0.0f}); - } -} static void node_geo_exec(GeoNodeExecParams params) { @@ -185,7 +162,7 @@ static void node_geo_exec(GeoNodeExecParams params) } } if (total_size == 0) { - set_empty(data_type, params); + params.set_default @@ Diff output truncated at 10240 characters. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
