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:
authorJacques Lucke <jacques@blender.org>2022-01-10 22:12:06 +0300
committerJacques Lucke <jacques@blender.org>2022-01-10 22:12:06 +0300
commit409bcdc10239f2a72abc369b39ccb5bda3f39d1e (patch)
tree0b7b7bb88fccc76c221756fb71cf783d0d1a1b17
parent1438398488b48335a0e8440f5a01c634004ba5df (diff)
cleanup
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc37
1 files changed, 23 insertions, 14 deletions
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 c701c025ca8..a32f9f0e0da 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
@@ -96,9 +96,7 @@ struct EvaluatedFields {
};
struct ScaleIsland {
- /* May contain duplicates. */
- Vector<int> vertex_indices;
- /* Either face or edge. */
+ /* Either face or edge indices. */
Vector<int> element_indices;
};
@@ -153,9 +151,11 @@ static EvaluatedFields evaluate_fields(FieldEvaluator &evaluator, const InputFie
return evaluated;
}
-static void scale_vertex_islands(Mesh &mesh,
- const Span<ScaleIsland> islands,
- const EvaluatedFields &evaluated)
+static void scale_vertex_islands(
+ Mesh &mesh,
+ const Span<ScaleIsland> islands,
+ const EvaluatedFields &evaluated,
+ const FunctionRef<void(int element_index, Vector<int> &r_vertex_indices)> get_vertex_indices)
{
threading::parallel_for(islands.index_range(), 256, [&](const IndexRange range) {
Set<int> handled_vertices;
@@ -167,7 +167,9 @@ static void scale_vertex_islands(Mesh &mesh,
float3 x_axis = {0.0f, 0.0f, 0.0f};
float3 up = {0.0f, 0.0f, 0.0f};
+ Vector<int> vertex_indices;
for (const int poly_index : island.element_indices) {
+ get_vertex_indices(poly_index, vertex_indices);
pivot += evaluated.pivots[poly_index];
if (evaluated.uniform_scales) {
scale += float3(evaluated.uniform_scales[poly_index]);
@@ -189,7 +191,7 @@ static void scale_vertex_islands(Mesh &mesh,
const float4x4 transform = create_transform(pivot, x_axis, up, scale);
handled_vertices.clear();
- for (const int vert_index : island.vertex_indices) {
+ for (const int vert_index : vertex_indices) {
if (!handled_vertices.add(vert_index)) {
continue;
}
@@ -230,9 +232,6 @@ static Vector<ScaleIsland> prepare_face_islands(const Mesh &mesh, const IndexMas
islands.append({});
}
ScaleIsland &island = islands[island_index];
- for (const MLoop &loop : poly_loops) {
- island.vertex_indices.append(loop.v);
- }
island.element_indices.append(poly_index);
}
@@ -250,7 +249,14 @@ static void scale_faces(MeshComponent &mesh_component, const InputFields &input_
EvaluatedFields evaluated = evaluate_fields(evaluator, input_fields);
Vector<ScaleIsland> island = prepare_face_islands(mesh, evaluated.selection);
- scale_vertex_islands(mesh, island, evaluated);
+ scale_vertex_islands(
+ mesh, island, evaluated, [&](int face_index, Vector<int> &r_vertex_indices) {
+ const MPoly &poly = mesh.mpoly[face_index];
+ const Span<MLoop> poly_loops{mesh.mloop + poly.loopstart, poly.totloop};
+ for (const MLoop &loop : poly_loops) {
+ r_vertex_indices.append(loop.v);
+ }
+ });
}
static Vector<ScaleIsland> prepare_edge_islands(const Mesh &mesh, const IndexMask edge_selection)
@@ -272,8 +278,6 @@ static Vector<ScaleIsland> prepare_edge_islands(const Mesh &mesh, const IndexMas
islands.append({});
}
ScaleIsland &island = islands[island_index];
- island.vertex_indices.append(edge.v1);
- island.vertex_indices.append(edge.v2);
island.element_indices.append(edge_index);
}
@@ -291,7 +295,12 @@ static void scale_edges(MeshComponent &mesh_component, const InputFields &input_
EvaluatedFields evaluated = evaluate_fields(evaluator, input_fields);
Vector<ScaleIsland> island = prepare_edge_islands(mesh, evaluated.selection);
- scale_vertex_islands(mesh, island, evaluated);
+ scale_vertex_islands(
+ mesh, island, evaluated, [&](const int edge_index, Vector<int> &r_vertex_indices) {
+ const MEdge &edge = mesh.medge[edge_index];
+ r_vertex_indices.append(edge.v1);
+ r_vertex_indices.append(edge.v2);
+ });
}
static void node_geo_exec(GeoNodeExecParams params)