[Bf-blender-cvs] [5dff952b674] geometry-nodes: Geometry Nodes: support instances in Transform node

Jacques Lucke noreply at git.blender.org
Thu Nov 12 13:31:19 CET 2020


Commit: 5dff952b674630c7a5948fa8e6b4c4988f561d27
Author: Jacques Lucke
Date:   Thu Nov 12 13:27:56 2020 +0100
Branches: geometry-nodes
https://developer.blender.org/rB5dff952b674630c7a5948fa8e6b4c4988f561d27

Geometry Nodes: support instances in Transform node

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

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

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform.cc b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
index b3c48845eb6..80c32ba8535 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_transform.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_transform.cc
@@ -35,7 +35,7 @@ static bNodeSocketTemplate geo_node_transform_out[] = {
     {-1, ""},
 };
 
-using blender::float3;
+namespace blender::nodes {
 
 static bool use_translate(const float3 rotation, const float3 scale)
 {
@@ -85,7 +85,28 @@ static void transform_pointcloud(PointCloud *pointcloud,
   }
 }
 
-namespace blender::nodes {
+static void transform_instances(InstancesComponent &instances,
+                                const float3 translation,
+                                const float3 rotation,
+                                const float3 scale)
+{
+  MutableSpan<float3> positions = instances.positions();
+
+  /* Use only translation if rotation and scale don't apply. */
+  if (use_translate(rotation, scale)) {
+    for (float3 &position : positions) {
+      add_v3_v3(position, translation);
+    }
+  }
+  else {
+    float mat[4][4];
+    loc_eul_size_to_mat4(mat, translation, rotation, scale);
+    for (float3 &position : positions) {
+      mul_m4_v3(mat, position);
+    }
+  }
+}
+
 static void geo_transform_exec(bNode *UNUSED(node), GeoNodeInputs inputs, GeoNodeOutputs outputs)
 {
   GeometrySetPtr geometry_set = inputs.extract<GeometrySetPtr>("Geometry");
@@ -111,6 +132,11 @@ static void geo_transform_exec(bNode *UNUSED(node), GeoNodeInputs inputs, GeoNod
     transform_pointcloud(pointcloud, translation, rotation, scale);
   }
 
+  if (geometry_set->has_instances()) {
+    InstancesComponent &instances = geometry_set->get_component_for_write<InstancesComponent>();
+    transform_instances(instances, translation, rotation, scale);
+  }
+
   outputs.set("Geometry", std::move(geometry_set));
 }
 }  // namespace blender::nodes



More information about the Bf-blender-cvs mailing list