[Bf-blender-cvs] [dc3d578bc31] temp-geometry-nodes-extrude-mesh: Cleanup: Add function to retrieve range from offsets
Hans Goudey
noreply at git.blender.org
Mon Jan 3 02:12:54 CET 2022
Commit: dc3d578bc318420cfc1ddae8e132051dced45af0
Author: Hans Goudey
Date: Sun Jan 2 19:12:43 2022 -0600
Branches: temp-geometry-nodes-extrude-mesh
https://developer.blender.org/rBdc3d578bc318420cfc1ddae8e132051dced45af0
Cleanup: Add function to retrieve range from offsets
===================================================================
M source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
===================================================================
diff --git a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
index 98c185286b7..c204ab6f506 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_extrude_mesh.cc
@@ -753,6 +753,13 @@ static void extrude_mesh_faces(MeshComponent &component,
BLI_assert(BKE_mesh_is_valid(component.get_for_write()));
}
+static IndexRange selected_corner_range(Span<int> offsets, const int index)
+{
+ const int offset = offsets[index];
+ const int next_offset = offsets[index + 1];
+ return IndexRange(offset, next_offset - offset);
+}
+
static void extrude_individual_mesh_faces(MeshComponent &component,
const Field<bool> &selection_field,
const Field<float3> &offset_field,
@@ -861,17 +868,18 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
MutableSpan<T> duplicate_data = data.slice(duplicate_edge_range);
MutableSpan<T> connect_data = data.slice(connect_edge_range);
- connect_data.fill(T());
threading::parallel_for(poly_selection.index_range(), 512, [&](const IndexRange range) {
for (const int i_selection : range) {
const MPoly &poly = polys[poly_selection[i_selection]];
+ const IndexRange poly_corner_range = selected_corner_range(index_offsets,
+ i_selection);
+
Span<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
/* The data for the duplicate edge is simply a copy of the original edge's data. */
- const int corner_offset = index_offsets[i_selection];
for (const int i : poly_loops.index_range()) {
const int orig_index = poly_loops[i].e;
- duplicate_data[corner_offset + i] = data[orig_index];
+ duplicate_data[poly_corner_range[i]] = data[orig_index];
}
/* For the extruded edges, mix the data from the two neighboring original edges of
@@ -880,7 +888,7 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
const int i_loop_next = (i == poly.totloop - 1) ? 0 : i + 1;
const int orig_index = poly_loops[i].e;
const int orig_index_next = poly_loops[i_loop_next].e;
- connect_data[corner_offset + i] = attribute_math::mix2(
+ connect_data[poly_corner_range[i]] = attribute_math::mix2(
0.5f, data[orig_index], data[orig_index_next]);
}
}
@@ -893,13 +901,9 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
threading::parallel_for(poly_selection.index_range(), 1024, [&](const IndexRange range) {
for (const int i_selection : range) {
const int poly_index = poly_selection[i_selection];
-
- const int corner_offset = index_offsets[i_selection];
- const int corner_offset_next = index_offsets[i_selection + 1];
-
- MutableSpan<T> side_poly_data = new_data.slice(corner_offset,
- corner_offset_next - corner_offset);
- side_poly_data.fill(data[poly_index]);
+ const IndexRange poly_corner_range = selected_corner_range(index_offsets,
+ i_selection);
+ new_data.slice(poly_corner_range).fill(data[poly_index]);
}
});
break;
@@ -935,18 +939,18 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
/* Some of these loops could be easily split. */
threading::parallel_for(poly_selection.index_range(), 256, [&](const IndexRange range) {
for (const int i_selection : range) {
+ const IndexRange poly_corner_range = selected_corner_range(index_offsets, i_selection);
+
const MPoly &poly = polys[poly_selection[i_selection]];
MutableSpan<MLoop> poly_loops = loops.slice(poly.loopstart, poly.totloop);
- const int corner_offset = index_offsets[i_selection];
-
for (const int i : IndexRange(poly.totloop)) {
const int i_next = (i == poly.totloop - 1) ? 0 : i + 1;
const MLoop &loop = poly_loops[i];
const MLoop &loop_next = poly_loops[i_next];
- const int i_extrude = corner_offset + i;
- const int i_extrude_next = corner_offset + i_next;
+ const int i_extrude = poly_corner_range[i];
+ const int i_extrude_next = poly_corner_range[i_next];
const int i_duplicate_edge = duplicate_edge_range[i_extrude];
const int new_vert = new_vert_range[i_extrude];
@@ -985,17 +989,16 @@ static void extrude_individual_mesh_faces(MeshComponent &component,
for (const int i : IndexRange(poly.totloop)) {
MLoop &loop = poly_loops[i];
- loop.v = new_vert_range[corner_offset + i];
- loop.e = duplicate_edge_range[corner_offset + i];
+ loop.v = new_vert_range[poly_corner_range[i]];
+ loop.e = duplicate_edge_range[poly_corner_range[i]];
}
}
});
threading::parallel_for(poly_selection.index_range(), 1024, [&](const IndexRange range) {
for (const int i_selection : range) {
- const IndexRange poly_verts{index_offsets[i_selection],
- index_offsets[i_selection + 1] - index_offsets[i_selection]};
- for (MVert &vert : new_verts.slice(poly_verts)) {
+ const IndexRange poly_corner_range = selected_corner_range(index_offsets, i_selection);
+ for (MVert &vert : new_verts.slice(poly_corner_range)) {
add_v3_v3(vert.co, poly_offset[poly_selection[i_selection]]);
}
}
More information about the Bf-blender-cvs
mailing list