[Bf-blender-cvs] [80c3f12c08b] temp-geometry-nodes-instances-api-v2: Support instances in the points to volume node

Hans Goudey noreply at git.blender.org
Sat Feb 6 16:21:17 CET 2021


Commit: 80c3f12c08b894899f1bcbea544c76388df34f68
Author: Hans Goudey
Date:   Sat Feb 6 08:54:18 2021 -0600
Branches: temp-geometry-nodes-instances-api-v2
https://developer.blender.org/rB80c3f12c08b894899f1bcbea544c76388df34f68

Support instances in the points to volume node

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
index b90ef2034a8..c7b36a8989f 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_points_to_volume.cc
@@ -129,18 +129,31 @@ static float compute_voxel_size(const GeoNodeExecParams &params,
   return voxel_size;
 }
 
-static void gather_point_data_from_component(const GeoNodeExecParams &params,
-                                             const GeometryComponent &component,
-                                             Vector<float3> &r_positions,
-                                             Vector<float> &r_radii)
+static void gather_point_data_from_component_and_transforms(const GeoNodeExecParams &params,
+                                                            const GeometryComponent &component,
+                                                            Vector<float3> &r_positions,
+                                                            Vector<float> &r_radii,
+                                                            Span<float4x4> transforms)
 {
-  Float3ReadAttribute positions = component.attribute_get_for_read<float3>(
-      "position", ATTR_DOMAIN_POINT, {0, 0, 0});
-  FloatReadAttribute radii = params.get_input_attribute<float>(
+  ReadAttributePtr positions_attribte = component.attribute_try_get_for_read(
+      "position", ATTR_DOMAIN_POINT, CD_PROP_FLOAT3);
+  if (!positions_attribte) {
+    return;
+  }
+  FloatReadAttribute radii_attribute = params.get_input_attribute<float>(
       "Radius", component, ATTR_DOMAIN_POINT, 0.0f);
+  Span<float> radii = radii_attribute.get_span();
+  Span<float3> positions = positions_attribte->get_span<float3>();
+
+  r_positions.reserve(r_positions.size() +
+                      component.attribute_domain_size(ATTR_DOMAIN_POINT) * transforms.size());
 
-  r_positions.extend(positions.get_span());
-  r_radii.extend(radii.get_span());
+  for (const float4x4 &transform : transforms) {
+    for (const float3 position : positions) {
+      r_positions.append(transform * position);
+    }
+    r_radii.extend(radii);
+  }
 }
 
 static void convert_to_grid_index_space(const float voxel_size,
@@ -163,14 +176,14 @@ static void initialize_volume_component_from_points(const GeometrySet &geometry_
   Vector<float3> positions;
   Vector<float> radii;
 
-  if (geometry_set_in.has<MeshComponent>()) {
-    gather_point_data_from_component(
-        params, *geometry_set_in.get_component_for_read<MeshComponent>(), positions, radii);
-  }
-  if (geometry_set_in.has<PointCloudComponent>()) {
-    gather_point_data_from_component(
-        params, *geometry_set_in.get_component_for_read<PointCloudComponent>(), positions, radii);
-  }
+  /* Note that it would be possible to avoid the matrix multiplication
+   * for the first non-instance geometry components. */
+  BKE_geometry_set_foreach_component_recursive(
+      geometry_set_in,
+      [&](const GeometryComponent &component, Span<blender::float4x4> transforms) {
+        gather_point_data_from_component_and_transforms(
+            params, component, positions, radii, transforms);
+      });
 
   const float max_radius = *std::max_element(radii.begin(), radii.end());
   const float voxel_size = compute_voxel_size(params, positions, max_radius);



More information about the Bf-blender-cvs mailing list