[Bf-blender-cvs] [1438398488b] temp-geometry-nodes-extrude-and-scale: improve naming
Jacques Lucke
noreply at git.blender.org
Tue Jan 11 18:04:53 CET 2022
Commit: 1438398488b48335a0e8440f5a01c634004ba5df
Author: Jacques Lucke
Date: Mon Jan 10 20:01:32 2022 +0100
Branches: temp-geometry-nodes-extrude-and-scale
https://developer.blender.org/rB1438398488b48335a0e8440f5a01c634004ba5df
improve naming
===================================================================
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 a85bd06eb0c..c701c025ca8 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_scale_elements.cc
@@ -95,7 +95,7 @@ struct EvaluatedFields {
VArray<float3> up_vectors;
};
-struct ScaleGroup {
+struct ScaleIsland {
/* May contain duplicates. */
Vector<int> vertex_indices;
/* Either face or edge. */
@@ -153,21 +153,21 @@ static EvaluatedFields evaluate_fields(FieldEvaluator &evaluator, const InputFie
return evaluated;
}
-static void scale_separate_groups(Mesh &mesh,
- const Span<ScaleGroup> scale_groups,
- const EvaluatedFields &evaluated)
+static void scale_vertex_islands(Mesh &mesh,
+ const Span<ScaleIsland> islands,
+ const EvaluatedFields &evaluated)
{
- threading::parallel_for(scale_groups.index_range(), 256, [&](const IndexRange range) {
+ threading::parallel_for(islands.index_range(), 256, [&](const IndexRange range) {
Set<int> handled_vertices;
- for (const int group_index : range) {
- const ScaleGroup &group = scale_groups[group_index];
+ for (const int island_index : range) {
+ const ScaleIsland &island = islands[island_index];
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};
- for (const int poly_index : group.element_indices) {
+ for (const int poly_index : island.element_indices) {
pivot += evaluated.pivots[poly_index];
if (evaluated.uniform_scales) {
scale += float3(evaluated.uniform_scales[poly_index]);
@@ -181,7 +181,7 @@ static void scale_separate_groups(Mesh &mesh,
}
}
- const float f = 1.0f / group.element_indices.size();
+ const float f = 1.0f / island.element_indices.size();
scale *= f;
pivot *= f;
x_axis *= f;
@@ -189,7 +189,7 @@ static void scale_separate_groups(Mesh &mesh,
const float4x4 transform = create_transform(pivot, x_axis, up, scale);
handled_vertices.clear();
- for (const int vert_index : group.vertex_indices) {
+ for (const int vert_index : island.vertex_indices) {
if (!handled_vertices.add(vert_index)) {
continue;
}
@@ -204,18 +204,10 @@ static void scale_separate_groups(Mesh &mesh,
BKE_mesh_normals_tag_dirty(&mesh);
}
-static void scale_faces(MeshComponent &mesh_component, const InputFields &input_fields)
+static Vector<ScaleIsland> prepare_face_islands(const Mesh &mesh, const IndexMask face_selection)
{
- Mesh &mesh = *mesh_component.get_for_write();
- mesh.mvert = static_cast<MVert *>(
- CustomData_duplicate_referenced_layer(&mesh.vdata, CD_MVERT, mesh.totvert));
-
- GeometryComponentFieldContext field_context{mesh_component, ATTR_DOMAIN_FACE};
- FieldEvaluator evaluator{field_context, mesh.totpoly};
- EvaluatedFields evaluated = evaluate_fields(evaluator, input_fields);
-
DisjointSet disjoint_set(mesh.totvert);
- for (const int poly_index : evaluated.selection) {
+ for (const int poly_index : face_selection) {
const MPoly &poly = mesh.mpoly[poly_index];
const Span<MLoop> poly_loops{mesh.mloop + poly.loopstart, poly.totloop};
for (const int loop_index : IndexRange(poly.totloop - 1)) {
@@ -226,60 +218,80 @@ static void scale_faces(MeshComponent &mesh_component, const InputFields &input_
disjoint_set.join(poly_loops.first().v, poly_loops.last().v);
}
- VectorSet<int> group_ids;
- Vector<ScaleGroup> scale_groups;
- scale_groups.reserve(evaluated.selection.size());
- for (const int poly_index : evaluated.selection) {
+ VectorSet<int> island_ids;
+ Vector<ScaleIsland> islands;
+ islands.reserve(face_selection.size());
+ for (const int poly_index : face_selection) {
const MPoly &poly = mesh.mpoly[poly_index];
const Span<MLoop> poly_loops{mesh.mloop + poly.loopstart, poly.totloop};
- const int group_id = disjoint_set.find_root(poly_loops[0].v);
- const int group_index = group_ids.index_of_or_add(group_id);
- if (group_index == scale_groups.size()) {
- scale_groups.append({});
+ const int island_id = disjoint_set.find_root(poly_loops[0].v);
+ const int island_index = island_ids.index_of_or_add(island_id);
+ if (island_index == islands.size()) {
+ islands.append({});
}
- ScaleGroup &group = scale_groups[group_index];
+ ScaleIsland &island = islands[island_index];
for (const MLoop &loop : poly_loops) {
- group.vertex_indices.append(loop.v);
+ island.vertex_indices.append(loop.v);
}
- group.element_indices.append(poly_index);
+ island.element_indices.append(poly_index);
}
- scale_separate_groups(mesh, scale_groups, evaluated);
+ return islands;
}
-static void scale_edges(MeshComponent &mesh_component, const InputFields &input_fields)
+static void scale_faces(MeshComponent &mesh_component, const InputFields &input_fields)
{
Mesh &mesh = *mesh_component.get_for_write();
mesh.mvert = static_cast<MVert *>(
CustomData_duplicate_referenced_layer(&mesh.vdata, CD_MVERT, mesh.totvert));
- GeometryComponentFieldContext field_context{mesh_component, ATTR_DOMAIN_EDGE};
- FieldEvaluator evaluator{field_context, mesh.totedge};
+ GeometryComponentFieldContext field_context{mesh_component, ATTR_DOMAIN_FACE};
+ FieldEvaluator evaluator{field_context, mesh.totpoly};
EvaluatedFields evaluated = evaluate_fields(evaluator, input_fields);
+ Vector<ScaleIsland> island = prepare_face_islands(mesh, evaluated.selection);
+ scale_vertex_islands(mesh, island, evaluated);
+}
+
+static Vector<ScaleIsland> prepare_edge_islands(const Mesh &mesh, const IndexMask edge_selection)
+{
DisjointSet disjoint_set(mesh.totvert);
- for (const int edge_index : evaluated.selection) {
+ for (const int edge_index : edge_selection) {
const MEdge &edge = mesh.medge[edge_index];
disjoint_set.join(edge.v1, edge.v2);
}
- VectorSet<int> group_ids;
- Vector<ScaleGroup> scale_groups;
- scale_groups.reserve(evaluated.selection.size());
- for (const int edge_index : evaluated.selection) {
+ VectorSet<int> island_ids;
+ Vector<ScaleIsland> islands;
+ islands.reserve(edge_selection.size());
+ for (const int edge_index : edge_selection) {
const MEdge &edge = mesh.medge[edge_index];
- const int group_id = disjoint_set.find_root(edge.v1);
- const int group_index = group_ids.index_of_or_add(group_id);
- if (group_index == scale_groups.size()) {
- scale_groups.append({});
+ const int island_id = disjoint_set.find_root(edge.v1);
+ const int island_index = island_ids.index_of_or_add(island_id);
+ if (island_index == islands.size()) {
+ islands.append({});
}
- ScaleGroup &group = scale_groups[group_index];
- group.vertex_indices.append(edge.v1);
- group.vertex_indices.append(edge.v2);
- group.element_indices.append(edge_index);
+ ScaleIsland &island = islands[island_index];
+ island.vertex_indices.append(edge.v1);
+ island.vertex_indices.append(edge.v2);
+ island.element_indices.append(edge_index);
}
- scale_separate_groups(mesh, scale_groups, evaluated);
+ return islands;
+}
+
+static void scale_edges(MeshComponent &mesh_component, const InputFields &input_fields)
+{
+ Mesh &mesh = *mesh_component.get_for_write();
+ mesh.mvert = static_cast<MVert *>(
+ CustomData_duplicate_referenced_layer(&mesh.vdata, CD_MVERT, mesh.totvert));
+
+ GeometryComponentFieldContext field_context{mesh_component, ATTR_DOMAIN_EDGE};
+ FieldEvaluator evaluator{field_context, mesh.totedge};
+ EvaluatedFields evaluated = evaluate_fields(evaluator, input_fields);
+
+ Vector<ScaleIsland> island = prepare_edge_islands(mesh, evaluated.selection);
+ scale_vertex_islands(mesh, island, evaluated);
}
static void node_geo_exec(GeoNodeExecParams params)
More information about the Bf-blender-cvs
mailing list