[Bf-blender-cvs] [b08301c865f] master: Geometry Nodes: Optimization in Set Position node
Erik Abrahamsson
noreply at git.blender.org
Mon Dec 12 23:03:11 CET 2022
Commit: b08301c865f42ab51b29efb80fcf68074a947d93
Author: Erik Abrahamsson
Date: Mon Dec 12 23:01:49 2022 +0100
Branches: master
https://developer.blender.org/rBb08301c865f42ab51b29efb80fcf68074a947d93
Geometry Nodes: Optimization in Set Position node
Adds an early return if Position/Offset inputs won't lead
to any changes in the Geometry.
It now also compares with the read-only Position attribute instead of
getting it for write only, to work correctly with Copy-on-Write.
Before, the `is_same`-check only worked for geometry created
in the node tree.
Differential Revision: https://developer.blender.org/D16738
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_set_position.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_set_position.cc b/source/blender/nodes/geometry/nodes/node_geo_set_position.cc
index e243fe3614c..e219d5bc0a1 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_set_position.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_set_position.cc
@@ -29,15 +29,22 @@ static void set_computed_position_and_offset(GeometryComponent &component,
const IndexMask selection)
{
MutableAttributeAccessor attributes = *component.attributes_for_write();
- AttributeWriter<float3> positions = attributes.lookup_for_write<float3>("position");
+ const VArray<float3> positions_read_only = attributes.lookup<float3>("position");
+ if (in_positions.is_same(positions_read_only)) {
+ if (const std::optional<float3> offset = in_offsets.get_if_single()) {
+ if (math::is_zero(offset.value())) {
+ return;
+ }
+ }
+ }
const int grain_size = 10000;
switch (component.type()) {
case GEO_COMPONENT_TYPE_MESH: {
Mesh *mesh = static_cast<MeshComponent &>(component).get_for_write();
MutableSpan<MVert> verts = mesh->verts_for_write();
- if (in_positions.is_same(positions.varray)) {
+ if (in_positions.is_same(positions_read_only)) {
devirtualize_varray(in_offsets, [&](const auto in_offsets) {
threading::parallel_for(
selection.index_range(), grain_size, [&](const IndexRange range) {
@@ -63,15 +70,16 @@ static void set_computed_position_and_offset(GeometryComponent &component,
break;
}
case GEO_COMPONENT_TYPE_CURVE: {
- CurveComponent &curve_component = static_cast<CurveComponent &>(component);
- Curves &curves_id = *curve_component.get_for_write();
- bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
if (attributes.contains("handle_right") && attributes.contains("handle_left")) {
+ CurveComponent &curve_component = static_cast<CurveComponent &>(component);
+ Curves &curves_id = *curve_component.get_for_write();
+ bke::CurvesGeometry &curves = bke::CurvesGeometry::wrap(curves_id.geometry);
SpanAttributeWriter<float3> handle_right_attribute =
attributes.lookup_or_add_for_write_span<float3>("handle_right", ATTR_DOMAIN_POINT);
SpanAttributeWriter<float3> handle_left_attribute =
attributes.lookup_or_add_for_write_span<float3>("handle_left", ATTR_DOMAIN_POINT);
+ AttributeWriter<float3> positions = attributes.lookup_for_write<float3>("position");
MutableVArraySpan<float3> out_positions_span = positions.varray;
devirtualize_varray2(
in_positions, in_offsets, [&](const auto in_positions, const auto in_offsets) {
@@ -88,6 +96,7 @@ static void set_computed_position_and_offset(GeometryComponent &component,
});
out_positions_span.save();
+ positions.finish();
handle_right_attribute.finish();
handle_left_attribute.finish();
@@ -95,13 +104,12 @@ static void set_computed_position_and_offset(GeometryComponent &component,
curves.calculate_bezier_auto_handles();
break;
}
- else {
- ATTR_FALLTHROUGH;
- }
+ ATTR_FALLTHROUGH;
}
default: {
+ AttributeWriter<float3> positions = attributes.lookup_for_write<float3>("position");
MutableVArraySpan<float3> out_positions_span = positions.varray;
- if (in_positions.is_same(positions.varray)) {
+ if (in_positions.is_same(positions_read_only)) {
devirtualize_varray(in_offsets, [&](const auto in_offsets) {
threading::parallel_for(
selection.index_range(), grain_size, [&](const IndexRange range) {
@@ -123,11 +131,10 @@ static void set_computed_position_and_offset(GeometryComponent &component,
});
}
out_positions_span.save();
+ positions.finish();
break;
}
}
-
- positions.finish();
}
static void set_position_in_component(GeometryComponent &component,
More information about the Bf-blender-cvs
mailing list