Changeset View
Changeset View
Standalone View
Standalone View
source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc
| Show First 20 Lines • Show All 695 Lines • ▼ Show 20 Lines | if (!dst_attribute) { | ||||
| return; | return; | ||||
| } | } | ||||
| Span<MEdge> edges(mesh.medge, mesh.totedge); | Span<MEdge> edges(mesh.medge, mesh.totedge); | ||||
| VArray_Span<int> src{src_attribute.varray.typed<int>()}; | VArray_Span<int> src{src_attribute.varray.typed<int>()}; | ||||
| MutableSpan<int> dst = dst_attribute.as_span<int>(); | MutableSpan<int> dst = dst_attribute.as_span<int>(); | ||||
| threading::parallel_for(IndexRange(selection.size()), 1024, [&](IndexRange range) { | threading::parallel_for(IndexRange(selection.size()), 1024, [&](IndexRange range) { | ||||
| for (const int i_edge : range) { | for (const int i_selection : range) { | ||||
| const IndexRange edge_range = range_for_offsets_index(edge_offsets, i_edge); | const IndexRange edge_range = range_for_offsets_index(edge_offsets, i_selection); | ||||
| if (edge_range.size() == 0) { | if (edge_range.size() == 0) { | ||||
| continue; | continue; | ||||
| } | } | ||||
| const MEdge &edge = edges[i_edge]; | const MEdge &edge = edges[selection[i_selection]]; | ||||
| const IndexRange vert_range = {edge_range.start() * 2, edge_range.size() * 2}; | const IndexRange vert_range = {edge_range.start() * 2, edge_range.size() * 2}; | ||||
| dst[vert_range[0]] = src[edge.v1]; | dst[vert_range[0]] = src[edge.v1]; | ||||
| dst[vert_range[1]] = src[edge.v2]; | dst[vert_range[1]] = src[edge.v2]; | ||||
| for (const int i_duplicate : IndexRange(1, edge_range.size() - 1)) { | for (const int i_duplicate : IndexRange(1, edge_range.size() - 1)) { | ||||
| dst[vert_range[i_duplicate * 2]] = noise::hash(src[edge.v1], i_duplicate); | dst[vert_range[i_duplicate * 2]] = noise::hash(src[edge.v1], i_duplicate); | ||||
| dst[vert_range[i_duplicate * 2 + 1]] = noise::hash(src[edge.v2], i_duplicate); | dst[vert_range[i_duplicate * 2 + 1]] = noise::hash(src[edge.v2], i_duplicate); | ||||
| } | } | ||||
| Show All 27 Lines | static void duplicate_edges(GeometrySet &geometry_set, | ||||
| Array<int> edge_offsets = accumulate_counts_to_offsets(selection, counts); | Array<int> edge_offsets = accumulate_counts_to_offsets(selection, counts); | ||||
| Mesh *new_mesh = BKE_mesh_new_nomain(edge_offsets.last() * 2, edge_offsets.last(), 0, 0, 0); | Mesh *new_mesh = BKE_mesh_new_nomain(edge_offsets.last() * 2, edge_offsets.last(), 0, 0, 0); | ||||
| MutableSpan<MVert> new_verts(new_mesh->mvert, new_mesh->totvert); | MutableSpan<MVert> new_verts(new_mesh->mvert, new_mesh->totvert); | ||||
| MutableSpan<MEdge> new_edges(new_mesh->medge, new_mesh->totedge); | MutableSpan<MEdge> new_edges(new_mesh->medge, new_mesh->totedge); | ||||
| Array<int> vert_orig_indices(edge_offsets.last() * 2); | Array<int> vert_orig_indices(edge_offsets.last() * 2); | ||||
| threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) { | threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) { | ||||
| for (const int i_edge : range) { | for (const int i_selection : range) { | ||||
| const MEdge &edge = edges[i_edge]; | const MEdge &edge = edges[selection[i_selection]]; | ||||
| const IndexRange edge_range = range_for_offsets_index(edge_offsets, i_edge); | const IndexRange edge_range = range_for_offsets_index(edge_offsets, i_selection); | ||||
| const IndexRange vert_range(edge_range.start() * 2, edge_range.size() * 2); | const IndexRange vert_range(edge_range.start() * 2, edge_range.size() * 2); | ||||
| for (const int i_duplicate : IndexRange(edge_range.size())) { | for (const int i_duplicate : IndexRange(edge_range.size())) { | ||||
| vert_orig_indices[vert_range[i_duplicate * 2]] = edge.v1; | vert_orig_indices[vert_range[i_duplicate * 2]] = edge.v1; | ||||
| vert_orig_indices[vert_range[i_duplicate * 2 + 1]] = edge.v2; | vert_orig_indices[vert_range[i_duplicate * 2 + 1]] = edge.v2; | ||||
| } | } | ||||
| } | } | ||||
| }); | }); | ||||
| threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) { | threading::parallel_for(selection.index_range(), 1024, [&](IndexRange range) { | ||||
| for (const int i_edge : range) { | for (const int i_selection : range) { | ||||
| const IndexRange edge_range = range_for_offsets_index(edge_offsets, i_edge); | const IndexRange edge_range = range_for_offsets_index(edge_offsets, i_selection); | ||||
| const IndexRange vert_range(edge_range.start() * 2, edge_range.size() * 2); | const IndexRange vert_range(edge_range.start() * 2, edge_range.size() * 2); | ||||
| for (const int i_duplicate : IndexRange(edge_range.size())) { | for (const int i_duplicate : IndexRange(edge_range.size())) { | ||||
| MEdge &new_edge = new_edges[edge_range[i_duplicate]]; | MEdge &new_edge = new_edges[edge_range[i_duplicate]]; | ||||
| new_edge.v1 = vert_range[i_duplicate * 2]; | new_edge.v1 = vert_range[i_duplicate * 2]; | ||||
| new_edge.v2 = vert_range[i_duplicate * 2] + 1; | new_edge.v2 = vert_range[i_duplicate * 2] + 1; | ||||
| new_edge.flag = ME_LOOSEEDGE; | new_edge.flag = ME_LOOSEEDGE; | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 400 Lines • Show Last 20 Lines | |||||