diff options
author | Hans Goudey <h.goudey@me.com> | 2021-03-17 05:41:37 +0300 |
---|---|---|
committer | Hans Goudey <h.goudey@me.com> | 2021-03-17 05:41:37 +0300 |
commit | e8e9ad92ed04e48c668e5b3642bb6bfdbf2b46cf (patch) | |
tree | 4ba85beab2976050511256e14ef81c54cf4871b1 | |
parent | 8390ffc155de74d499556d0da02ba54b4134a964 (diff) |
Add position, rotation, scale attributes to instancestemp-geometry-nodes-instances-attributes
-rw-r--r-- | source/blender/blenkernel/intern/geometry_component_instances.cc | 39 | ||||
-rw-r--r-- | source/blender/blenlib/BLI_float4x4.hh | 14 |
2 files changed, 44 insertions, 9 deletions
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; |