[Bf-blender-cvs] [e8e9ad92ed0] temp-geometry-nodes-instances-attributes: Add position, rotation, scale attributes to instances

Hans Goudey noreply at git.blender.org
Wed Mar 17 03:41:45 CET 2021


Commit: e8e9ad92ed04e48c668e5b3642bb6bfdbf2b46cf
Author: Hans Goudey
Date:   Tue Mar 16 22:41:37 2021 -0400
Branches: temp-geometry-nodes-instances-attributes
https://developer.blender.org/rBe8e9ad92ed04e48c668e5b3642bb6bfdbf2b46cf

Add position, rotation, scale attributes to instances

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

M	source/blender/blenkernel/intern/geometry_component_instances.cc
M	source/blender/blenlib/BLI_float4x4.hh

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

diff --git a/source/blender/blenkernel/intern/geometry_component_instances.cc b/source/blender/blenkernel/intern/geometry_component_instances.cc
index db1257d2296..92b172088ea 100644
--- a/source/blender/blenkernel/intern/geometry_component_instances.cc
+++ b/source/blender/blenkernel/intern/geometry_component_instances.cc
@@ -207,6 +207,30 @@ static void set_matrix_position(float4x4 &matrix, const float3 &translation)
   copy_v3_v3(matrix.ptr()[3], translation);
 }
 
+static float3 get_matrix_rotation(const float4x4 &matrix)
+{
+  return matrix.to_euler();
+}
+
+static void set_matrix_rotation(float4x4 &matrix, const float3 &rotation)
+{
+  float4x4 rotation_matrix;
+  loc_eul_size_to_mat4(rotation_matrix.values, float3(0), rotation, float3(1));
+  matrix = matrix * rotation_matrix;
+}
+
+static float3 get_matrix_scale(const float4x4 &matrix)
+{
+  return matrix.scale();
+}
+
+static void set_matrix_scale(float4x4 &matrix, const float3 &scale)
+{
+  float4x4 scale_matrix;
+  size_to_mat4(scale_matrix.values, scale);
+  matrix = matrix * scale_matrix;
+}
+
 template<float3 (*GetFunc)(const float4x4 &), void (*SetFunc)(float4x4 &, const float3 &)>
 class Float4x4AttributeProvider final : public BuiltinAttributeProvider {
  public:
@@ -224,7 +248,7 @@ class Float4x4AttributeProvider final : public BuiltinAttributeProvider {
   {
     const InstancesComponent &instances_component = static_cast<const InstancesComponent &>(
         component);
-    if (instances_component.transforms().size() == 0) {
+    if (instances_component.instances_amount() == 0) {
       return {};
     }
 
@@ -234,9 +258,8 @@ class Float4x4AttributeProvider final : public BuiltinAttributeProvider {
 
   WriteAttributePtr try_get_for_write(GeometryComponent &component) const final
   {
-    const InstancesComponent &instances_component = static_cast<const InstancesComponent &>(
-        component);
-    if (instances_component.transforms().size() == 0) {
+    InstancesComponent &instances_component = static_cast<InstancesComponent &>(component);
+    if (instances_component.instances_amount() == 0) {
       return {};
     }
 
@@ -266,12 +289,10 @@ class Float4x4AttributeProvider final : public BuiltinAttributeProvider {
  */
 static ComponentAttributeProviders create_attribute_providers_for_instances()
 {
-  // auto get_position = [](const float4x4 &matrix) { return matrix.translation(); };
-  // auto set_position = [](float4x4 &matrix, const float3 &translation) {
-  //   copy_v3_v3(matrix.ptr()[3], translation);
-  // };
   static Float4x4AttributeProvider<get_matrix_position, set_matrix_position> position("position");
-  return ComponentAttributeProviders({&position /*, &rotation, &scale*/}, {});
+  static Float4x4AttributeProvider<get_matrix_rotation, set_matrix_rotation> rotation("rotation");
+  static Float4x4AttributeProvider<get_matrix_scale, set_matrix_scale> scale("scale");
+  return ComponentAttributeProviders({&position, &rotation, &scale}, {});
 }
 
 }  // namespace blender::bke
diff --git a/source/blender/blenlib/BLI_float4x4.hh b/source/blender/blenlib/BLI_float4x4.hh
index 56d1a96b139..722d863c7af 100644
--- a/source/blender/blenlib/BLI_float4x4.hh
+++ b/source/blender/blenlib/BLI_float4x4.hh
@@ -84,6 +84,20 @@ struct float4x4 {
     return float3(values[3]);
   }
 
+  float3 to_euler() const
+  {
+    float3 euler;
+    mat4_to_eul(euler, values);
+    return euler;
+  }
+
+  float3 scale() const
+  {
+    float3 scale;
+    mat4_to_size(scale, values);
+    return scale;
+  }
+
   float4x4 inverted() const
   {
     float4x4 result;



More information about the Bf-blender-cvs mailing list