[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