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

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


Commit: 00c5fa3bf15d89ece370e28c60528ae658e517a8
Author: Jacques Lucke
Date:   Thu Jan 6 16:13:56 2022 +0100
Branches: temp-scale-elements-node-test
https://developer.blender.org/rB00c5fa3bf15d89ece370e28c60528ae658e517a8

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 9819966c6e4..3dbd611ab86 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
@@ -30,13 +30,20 @@ static void node_declare(NodeDeclarationBuilder &b)
   b.add_input<decl::Bool>(N_("Selection")).default_value(true).hide_value().supports_field();
   b.add_input<decl::Vector>(N_("Scale")).default_value({1.0f, 1.0f, 1.0f}).supports_field();
   b.add_input<decl::Vector>(N_("Pivot")).subtype(PROP_TRANSLATION).implicit_field();
+  b.add_input<decl::Vector>(N_("X Axis")).default_value({1.0f, 0.0f, 0.0f}).supports_field();
+  b.add_input<decl::Vector>(N_("Up")).default_value({0.0f, 0.0f, 1.0f}).supports_field();
   b.add_output<decl::Geometry>(N_("Geometry"));
 };
 
-static void scale_faces(MeshComponent &mesh_component,
-                        const Field<bool> &selection_field,
-                        const Field<float3> &scale_field,
-                        const Field<float3> &pivot_field)
+struct InputFields {
+  Field<bool> selection;
+  Field<float3> scale;
+  Field<float3> pivot;
+  Field<float3> x_axis;
+  Field<float3> up;
+};
+
+static void scale_faces(MeshComponent &mesh_component, const InputFields &input_fields)
 {
   Mesh *mesh = mesh_component.get_for_write();
   mesh->mvert = static_cast<MVert *>(
@@ -44,13 +51,17 @@ static void scale_faces(MeshComponent &mesh_component,
 
   GeometryComponentFieldContext field_context{mesh_component, ATTR_DOMAIN_FACE};
   FieldEvaluator evaluator{field_context, mesh->totpoly};
-  evaluator.set_selection(selection_field);
-  evaluator.add(scale_field);
-  evaluator.add(pivot_field);
+  evaluator.set_selection(input_fields.selection);
+  VArray<float3> scales;
+  VArray<float3> pivots;
+  VArray<float3> x_axis_vectors;
+  VArray<float3> up_vectors;
+  evaluator.add(input_fields.scale, &scales);
+  evaluator.add(input_fields.pivot, &pivots);
+  evaluator.add(input_fields.x_axis, &x_axis_vectors);
+  evaluator.add(input_fields.up, &up_vectors);
   evaluator.evaluate();
   const IndexMask selection = evaluator.get_evaluated_selection_as_mask();
-  const VArray<float3> scales = evaluator.get_evaluated<float3>(0);
-  const VArray<float3> pivots = evaluator.get_evaluated<float3>(1);
 
   DisjointSet disjoint_set(mesh->totvert);
   for (const int poly_index : selection) {
@@ -69,20 +80,21 @@ static void scale_faces(MeshComponent &mesh_component,
   struct GroupData {
     float3 scale = {0.0f, 0.0f, 0.0f};
     float3 pivot = {0.0f, 0.0f, 0.0f};
+    float3 x_axis = {0.0f, 0.0f, 0.0f};
+    float3 up = {0.0f, 0.0f, 0.0f};
     int tot_faces = 0;
   };
 
-  const int max_group_index = mesh->totvert;
-  Array<GroupData> groups_data(max_group_index);
+  Array<GroupData> groups_data(mesh->totvert);
   for (const int poly_index : selection) {
     const MPoly &poly = mesh->mpoly[poly_index];
     const int first_vertex = mesh->mloop[poly.loopstart].v;
     const int group_index = group_by_vertex_index[first_vertex];
-    const float3 scale = scales[poly_index];
-    const float3 pivot = pivots[poly_index];
     GroupData &group_info = groups_data[group_index];
-    group_info.pivot += pivot;
-    group_info.scale += scale;
+    group_info.pivot += pivots[poly_index];
+    group_info.scale += scales[poly_index];
+    group_info.x_axis += x_axis_vectors[poly_index];
+    group_info.up += up_vectors[poly_index];
     group_info.tot_faces++;
   }
 
@@ -102,9 +114,27 @@ static void scale_faces(MeshComponent &mesh_component,
         continue;
       }
       MVert &vert = mesh->mvert[vert_index];
-      const float3 diff = float3(vert.co) - group_data.pivot;
-      const float3 new_diff = diff * group_data.scale;
-      copy_v3_v3(vert.co, group_data.pivot + new_diff);
+
+      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 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);
+
+      float mat_inv[3][3];
+      transpose_m3_m3(mat_inv, mat);
+
+      float3 diff = float3(vert.co) - group_data.pivot;
+      mul_m3_v3(mat, diff);
+      diff *= group_data.scale;
+      mul_m3_v3(mat_inv, diff);
+
+      copy_v3_v3(vert.co, group_data.pivot + diff);
     }
   });
 }
@@ -115,16 +145,19 @@ static void node_geo_exec(GeoNodeExecParams params)
       params.node().custom1);
 
   GeometrySet geometry = params.extract_input<GeometrySet>("Geometry");
-  const Field<bool> &selection_field = params.get_input<Field<bool>>("Selection");
-  const Field<float3> &scale_field = params.get_input<Field<float3>>("Scale");
-  const Field<float3> &pivot_field = params.get_input<Field<float3>>("Pivot");
+  InputFields input_fields;
+  input_fields.selection = params.get_input<Field<bool>>("Selection");
+  input_fields.scale = params.get_input<Field<float3>>("Scale");
+  input_fields.pivot = params.get_input<Field<float3>>("Pivot");
+  input_fields.x_axis = params.get_input<Field<float3>>("X Axis");
+  input_fields.up = params.get_input<Field<float3>>("Up");
 
   geometry.modify_geometry_sets([&](GeometrySet &geometry) {
     switch (mode) {
       case GEO_NODE_SCALE_ELEMENTS_MODE_FACE: {
         if (geometry.has_mesh()) {
           MeshComponent &mesh_component = geometry.get_component_for_write<MeshComponent>();
-          scale_faces(mesh_component, selection_field, scale_field, pivot_field);
+          scale_faces(mesh_component, input_fields);
         }
         break;
       }



More information about the Bf-blender-cvs mailing list