[Bf-blender-cvs] [c31a346ec55] temp-scale-elements-node-test: progress

Jacques Lucke noreply at git.blender.org
Fri Jan 7 08:02:35 CET 2022


Commit: c31a346ec555b9830f5a48a56c731d5a12f2624c
Author: Jacques Lucke
Date:   Thu Jan 6 17:01:17 2022 +0100
Branches: temp-scale-elements-node-test
https://developer.blender.org/rBc31a346ec555b9830f5a48a56c731d5a12f2624c

progress

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

M	source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc

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

diff --git a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
index 3dbd611ab86..052197fd259 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
@@ -85,7 +85,8 @@ static void scale_faces(MeshComponent &mesh_component, const InputFields &input_
     int tot_faces = 0;
   };
 
-  Array<GroupData> groups_data(mesh->totvert);
+  const int group_amount = mesh->totvert;
+  Array<GroupData> groups_data(group_amount);
   for (const int poly_index : selection) {
     const MPoly &poly = mesh->mpoly[poly_index];
     const int first_vertex = mesh->mloop[poly.loopstart].v;
@@ -106,35 +107,51 @@ static void scale_faces(MeshComponent &mesh_component, const InputFields &input_
     }
   }
 
+  Array<float4x4> transforms(group_amount);
   threading::parallel_for(IndexRange(mesh->totvert), 1024, [&](const IndexRange range) {
     for (const int vert_index : range) {
-      const int group_index = group_by_vertex_index[vert_index];
-      const GroupData &group_data = groups_data[group_index];
+      GroupData &group_data = groups_data[vert_index];
       if (group_data.tot_faces == 0) {
+        transforms[vert_index] = float4x4::identity();
         continue;
       }
-      MVert &vert = mesh->mvert[vert_index];
 
-      const float3 up = group_data.up.normalized();
-      /* TODO: Check if axis make sense, also see #from_normalized_axis_data. */
       const float3 x_axis = group_data.x_axis.normalized();
-      const float3 y_axis = -float3::cross(x_axis, up);
+      const float3 y_axis = -float3::cross(x_axis, group_data.up).normalized();
       const float3 z_axis = float3::cross(x_axis, y_axis);
 
-      float mat[3][3];
-      copy_v3_v3(mat[0], x_axis);
-      copy_v3_v3(mat[1], y_axis);
-      copy_v3_v3(mat[2], z_axis);
+      const float3 pivot = group_data.pivot;
+
+      float4x4 &transform = transforms[vert_index];
+      unit_m4(transform.values);
+      sub_v3_v3(transform.values[3], pivot);
 
-      float mat_inv[3][3];
-      transpose_m3_m3(mat_inv, mat);
+      float4x4 axis_transform;
+      unit_m4(axis_transform.values);
+      copy_v3_v3(axis_transform.values[0], x_axis);
+      copy_v3_v3(axis_transform.values[1], y_axis);
+      copy_v3_v3(axis_transform.values[2], z_axis);
 
-      float3 diff = float3(vert.co) - group_data.pivot;
-      mul_m3_v3(mat, diff);
-      diff *= group_data.scale;
-      mul_m3_v3(mat_inv, diff);
+      float4x4 axis_transform_inv = axis_transform.transposed();
 
-      copy_v3_v3(vert.co, group_data.pivot + diff);
+      float4x4 scale_transform;
+      unit_m4(scale_transform.values);
+      scale_transform.values[0][0] = group_data.scale.x;
+      scale_transform.values[1][1] = group_data.scale.y;
+      scale_transform.values[2][2] = group_data.scale.z;
+
+      transform = axis_transform * scale_transform * axis_transform_inv * transform;
+      add_v3_v3(transform.values[3], pivot);
+    }
+  });
+
+  threading::parallel_for(IndexRange(mesh->totvert), 1024, [&](const IndexRange range) {
+    for (const int vert_index : range) {
+      const int group_index = group_by_vertex_index[vert_index];
+      MVert &vert = mesh->mvert[vert_index];
+      const float3 old_position = vert.co;
+      const float3 new_position = transforms[group_index] * old_position;
+      copy_v3_v3(vert.co, new_position);
     }
   });
 }



More information about the Bf-blender-cvs mailing list