Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Goudey <h.goudey@me.com>2021-03-17 05:41:37 +0300
committerHans Goudey <h.goudey@me.com>2021-03-17 05:41:37 +0300
commite8e9ad92ed04e48c668e5b3642bb6bfdbf2b46cf (patch)
tree4ba85beab2976050511256e14ef81c54cf4871b1
parent8390ffc155de74d499556d0da02ba54b4134a964 (diff)
Add position, rotation, scale attributes to instancestemp-geometry-nodes-instances-attributes
-rw-r--r--source/blender/blenkernel/intern/geometry_component_instances.cc39
-rw-r--r--source/blender/blenlib/BLI_float4x4.hh14
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;