[Bf-blender-cvs] [e7364533041] temp-geometry-nodes-instances-api-v2: Support instances in the point instance node

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


Commit: e73645330412acff28d723f5fb893c94cd9b358a
Author: Hans Goudey
Date:   Sat Feb 6 09:21:14 2021 -0600
Branches: temp-geometry-nodes-instances-api-v2
https://developer.blender.org/rBe73645330412acff28d723f5fb893c94cd9b358a

Support instances in the point instance node

This can use a read-only input since it just creates new data

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
index 3bd8c355124..c89cfca656c 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc
@@ -153,7 +153,8 @@ static Array<std::optional<InstancedData>> get_instanced_data(const GeoNodeExecP
 
 static void add_instances_from_geometry_component(InstancesComponent &instances,
                                                   const GeometryComponent &src_geometry,
-                                                  const GeoNodeExecParams &params)
+                                                  const GeoNodeExecParams &params,
+                                                  const float4x4 &transform)
 {
   const AttributeDomain domain = ATTR_DOMAIN_POINT;
 
@@ -171,9 +172,10 @@ static void add_instances_from_geometry_component(InstancesComponent &instances,
 
   for (const int i : IndexRange(domain_size)) {
     if (instances_data[i].has_value()) {
-      float transform[4][4];
-      loc_eul_size_to_mat4(transform, positions[i], rotations[i], scales[i]);
-      instances.add_instance(*instances_data[i], transform, ids[i]);
+      float4x4 instance_transform;
+      loc_eul_size_to_mat4(instance_transform.values, positions[i], rotations[i], scales[i]);
+      instance_transform = transform * instance_transform;
+      instances.add_instance(*instances_data[i], instance_transform, ids[i]);
     }
   }
 }
@@ -184,14 +186,14 @@ static void geo_node_point_instance_exec(GeoNodeExecParams params)
   GeometrySet geometry_set_out;
 
   InstancesComponent &instances = geometry_set_out.get_component_for_write<InstancesComponent>();
-  if (geometry_set.has<MeshComponent>()) {
-    add_instances_from_geometry_component(
-        instances, *geometry_set.get_component_for_read<MeshComponent>(), params);
-  }
-  if (geometry_set.has<PointCloudComponent>()) {
-    add_instances_from_geometry_component(
-        instances, *geometry_set.get_component_for_read<PointCloudComponent>(), params);
-  }
+
+  /* Note that the matrix multiplication for the non-instances components could be avoided. */
+  BKE_geometry_set_foreach_component_recursive(
+      geometry_set, [&](const GeometryComponent &component, Span<float4x4> transforms) {
+        for (const float4x4 &transform : transforms) {
+          add_instances_from_geometry_component(instances, component, params, transform);
+        }
+      });
 
   params.set_output("Geometry", std::move(geometry_set_out));
 }



More information about the Bf-blender-cvs mailing list