[Bf-blender-cvs] [cc949f0a402] blender-v3.0-release: Fix: wrong attribute propagation in Distribute node

Jacques Lucke noreply at git.blender.org
Tue Nov 9 16:46:36 CET 2021


Commit: cc949f0a40237d38c3f57b7bd6e15415dcdab1bd
Author: Jacques Lucke
Date:   Tue Nov 9 16:43:14 2021 +0100
Branches: blender-v3.0-release
https://developer.blender.org/rBcc949f0a40237d38c3f57b7bd6e15415dcdab1bd

Fix: wrong attribute propagation in Distribute node

Currently the Distribute Points on Faces node does not propagate
non-point attributes correctly. That is because it first interpolates the
attributes to the point domain on the input mesh, and then propagates them.

Differential Revision: https://developer.blender.org/D13148

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

M	source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc
index fa439b04da0..115ad09a9e6 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_distribute_points_on_faces.cc
@@ -295,6 +295,12 @@ BLI_NOINLINE static void propagate_existing_attributes(
   for (Map<AttributeIDRef, AttributeKind>::Item entry : attributes.items()) {
     const AttributeIDRef attribute_id = entry.key;
     const CustomDataType output_data_type = entry.value.data_type;
+
+    ReadAttributeLookup source_attribute = mesh_component.attribute_try_get_for_read(attribute_id);
+    if (!source_attribute) {
+      continue;
+    }
+
     /* The output domain is always #ATTR_DOMAIN_POINT, since we are creating a point cloud. */
     OutputAttribute attribute_out = point_component.attribute_try_get_for_output_only(
         attribute_id, ATTR_DOMAIN_POINT, output_data_type);
@@ -303,23 +309,12 @@ BLI_NOINLINE static void propagate_existing_attributes(
     }
 
     GMutableSpan out_span = attribute_out.as_span();
-
-    std::optional<AttributeMetaData> attribute_info = point_component.attribute_get_meta_data(
-        attribute_id);
-    if (!attribute_info) {
-      continue;
-    }
-
-    const AttributeDomain source_domain = attribute_info->domain;
-    GVArrayPtr source_attribute = mesh_component.attribute_get_for_read(
-        attribute_id, source_domain, output_data_type, nullptr);
-    if (!source_attribute) {
-      continue;
-    }
-
-    interpolate_attribute(
-        mesh, bary_coords, looptri_indices, source_domain, *source_attribute, out_span);
-
+    interpolate_attribute(mesh,
+                          bary_coords,
+                          looptri_indices,
+                          source_attribute.domain,
+                          *source_attribute.varray,
+                          out_span);
     attribute_out.save();
   }
 }



More information about the Bf-blender-cvs mailing list