From abd6b1d7b281c85fce748e0535f1f769916cd9b3 Mon Sep 17 00:00:00 2001 From: Sebastian Parborg Date: Tue, 26 Jan 2021 18:21:12 +0100 Subject: 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 --- .../nodes/geometry/nodes/node_geo_join_geometry.cc | 6 ++---- .../nodes/geometry/nodes/node_geo_point_instance.cc | 4 +++- .../blender/nodes/geometry/nodes/node_geo_transform.cc | 17 +++++------------ 3 files changed, 10 insertions(+), 17 deletions(-) (limited to 'source/blender/nodes') 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 src_components, Geo for (const InstancesComponent *component : src_components) { const int size = component->instances_amount(); Span instanced_data = component->instanced_data(); - Span positions = component->positions(); - Span rotations = component->rotations(); - Span scales = component->scales(); + Span 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 positions = instances.positions(); - MutableSpan rotations = instances.rotations(); - MutableSpan scales = instances.scales(); + MutableSpan 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); } } } -- cgit v1.2.3