diff options
author | Sebastian Parborg <darkdefende@gmail.com> | 2021-01-26 20:21:12 +0300 |
---|---|---|
committer | Sebastian Parborg <darkdefende@gmail.com> | 2021-01-26 20:21:12 +0300 |
commit | abd6b1d7b281c85fce748e0535f1f769916cd9b3 (patch) | |
tree | e228ff3ac96e6aa9de6b776e9f4605e86d93fcbd /source/blender/nodes | |
parent | 6d40d7218971b558074eb418afd244ab13ab8fbf (diff) |
Fix T85049: Geometry Nodes: How to handle instances with shear?
Use transform matrices instead of loc, rot, scale variables to store instance transforms.
Reviewed By: JacquesLucke
Differential Revision: http://developer.blender.org/D10211
Diffstat (limited to 'source/blender/nodes')
3 files changed, 10 insertions, 17 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc index e00ee9b01d8..67bc095fa31 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_join_geometry.cc @@ -233,11 +233,9 @@ static void join_components(Span<const InstancesComponent *> src_components, Geo for (const InstancesComponent *component : src_components) { const int size = component->instances_amount(); Span<InstancedData> instanced_data = component->instanced_data(); - Span<float3> positions = component->positions(); - Span<float3> rotations = component->rotations(); - Span<float3> scales = component->scales(); + Span<float4x4> transforms = component->transforms(); for (const int i : IndexRange(size)) { - dst_component.add_instance(instanced_data[i], positions[i], rotations[i], scales[i]); + dst_component.add_instance(instanced_data[i], transforms[i]); } } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc index d9e69adb860..a96dc710427 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_point_instance.cc @@ -165,7 +165,9 @@ static void add_instances_from_geometry_component(InstancesComponent &instances, for (const int i : IndexRange(domain_size)) { if (instances_data[i].has_value()) { - instances.add_instance(*instances_data[i], positions[i], rotations[i], scales[i], ids[i]); + float transform[4][4]; + loc_eul_size_to_mat4(transform, positions[i], rotations[i], scales[i]); + instances.add_instance(*instances_data[i], transform, ids[i]); } } } diff --git a/source/blender/nodes/geometry/nodes/node_geo_transform.cc b/source/blender/nodes/geometry/nodes/node_geo_transform.cc index 84540c283ef..1fcd1063993 100644 --- a/source/blender/nodes/geometry/nodes/node_geo_transform.cc +++ b/source/blender/nodes/geometry/nodes/node_geo_transform.cc @@ -91,27 +91,20 @@ static void transform_instances(InstancesComponent &instances, const float3 rotation, const float3 scale) { - MutableSpan<float3> positions = instances.positions(); - MutableSpan<float3> rotations = instances.rotations(); - MutableSpan<float3> scales = instances.scales(); + MutableSpan<float4x4> transforms = instances.transforms(); /* Use only translation if rotation and scale don't apply. */ if (use_translate(rotation, scale)) { - for (float3 &position : positions) { - add_v3_v3(position, translation); + for (float4x4 &transform : transforms) { + add_v3_v3(transform.ptr()[3], translation); } } else { float mat[4][4]; - float instance_mat[4][4]; - float quaternion[4]; loc_eul_size_to_mat4(mat, translation, rotation, scale); - for (int i = 0; i < positions.size(); i++) { - loc_eul_size_to_mat4(instance_mat, positions[i], rotations[i], scales[i]); - mul_m4_m4_pre(instance_mat, mat); - mat4_decompose(positions[i], quaternion, scales[i], instance_mat); - quat_to_eul(rotations[i], quaternion); + for (float4x4 &transform : transforms) { + mul_m4_m4_pre(transform.ptr(), mat); } } } |