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:
authorJohnny Matthews <johnny.matthews@gmail.com>2022-05-31 18:15:40 +0300
committerJohnny Matthews <johnny.matthews@gmail.com>2022-05-31 18:15:40 +0300
commit908dfd5e0da52cdc912873e8b3c20ea3d33ff1ec (patch)
tree4238bedd757cc4ea6cb407673279be64b9eea86c /source/blender/nodes
parent3060b98842fe1b1bca6cce6678ee8a022583e63f (diff)
parent52cb24a7796c1043dab076d3ef025b4c8545c1ef (diff)
Merge branch 'blender-v3.2-release'
Diffstat (limited to 'source/blender/nodes')
-rw-r--r--source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc53
1 files changed, 38 insertions, 15 deletions
diff --git a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc
index ac057ad078b..ebf0c450605 100644
--- a/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc
+++ b/source/blender/nodes/geometry/nodes/node_geo_duplicate_elements.cc
@@ -92,12 +92,16 @@ static Array<int> accumulate_counts_to_offsets(const IndexMask selection,
/* Utility functions for threaded copying of attribute data where possible. */
template<typename T>
-static void threaded_slice_fill(Span<int> offsets, Span<T> src, MutableSpan<T> dst)
+static void threaded_slice_fill(Span<int> offsets,
+ const IndexMask selection,
+ Span<T> src,
+ MutableSpan<T> dst)
{
BLI_assert(offsets.last() == dst.size());
+ BLI_assert(selection.size() == offsets.size());
threading::parallel_for(IndexRange(offsets.size() - 1), 512, [&](IndexRange range) {
for (const int i : range) {
- dst.slice(range_for_offsets_index(offsets, i)).fill(src[i]);
+ dst.slice(range_for_offsets_index(offsets, i)).fill(src[selection[i]]);
}
});
}
@@ -191,6 +195,7 @@ static void copy_point_attributes_without_id(GeometrySet &geometry_set,
const GeometryComponentType component_type,
const bool include_instances,
const Span<int> offsets,
+ const IndexMask selection,
const GeometryComponent &src_component,
GeometryComponent &dst_component)
{
@@ -215,7 +220,7 @@ static void copy_point_attributes_without_id(GeometrySet &geometry_set,
using T = decltype(dummy);
VArray_Span<T> src = src_attribute.varray.typed<T>();
MutableSpan<T> dst = dst_attribute.as_span<T>();
- threaded_slice_fill<T>(offsets, src, dst);
+ threaded_slice_fill<T>(offsets, selection, src, dst);
});
dst_attribute.save();
}
@@ -265,7 +270,7 @@ static void copy_curve_attributes_without_id(const GeometrySet &geometry_set,
switch (out_domain) {
case ATTR_DOMAIN_CURVE:
- threaded_slice_fill<T>(curve_offsets, src, dst);
+ threaded_slice_fill<T>(curve_offsets, selection, src, dst);
break;
case ATTR_DOMAIN_POINT:
threading::parallel_for(selection.index_range(), 512, [&](IndexRange range) {
@@ -416,6 +421,7 @@ static void copy_face_attributes_without_id(GeometrySet &geometry_set,
const Span<int> vert_mapping,
const Span<int> loop_mapping,
const Span<int> offsets,
+ const IndexMask selection,
const GeometryComponent &src_component,
GeometryComponent &dst_component)
{
@@ -445,7 +451,7 @@ static void copy_face_attributes_without_id(GeometrySet &geometry_set,
switch (out_domain) {
case ATTR_DOMAIN_FACE:
- threaded_slice_fill<T>(offsets, src, dst);
+ threaded_slice_fill<T>(offsets, selection, src, dst);
break;
case ATTR_DOMAIN_EDGE:
threaded_mapped_copy<T>(edge_mapping, src, dst);
@@ -601,6 +607,7 @@ static void duplicate_faces(GeometrySet &geometry_set,
vert_mapping,
loop_mapping,
offsets,
+ selection,
src_component,
dst_component);
@@ -627,6 +634,7 @@ static void duplicate_faces(GeometrySet &geometry_set,
static void copy_edge_attributes_without_id(GeometrySet &geometry_set,
const Span<int> point_mapping,
const Span<int> offsets,
+ const IndexMask selection,
const GeometryComponent &src_component,
GeometryComponent &dst_component)
{
@@ -655,7 +663,7 @@ static void copy_edge_attributes_without_id(GeometrySet &geometry_set,
switch (out_domain) {
case ATTR_DOMAIN_EDGE:
- threaded_slice_fill<T>(offsets, src, dst);
+ threaded_slice_fill<T>(offsets, selection, src, dst);
break;
case ATTR_DOMAIN_POINT:
threaded_mapped_copy<T>(point_mapping, src, dst);
@@ -771,7 +779,7 @@ static void duplicate_edges(GeometrySet &geometry_set,
dst_component.replace(new_mesh, GeometryOwnershipType::Editable);
copy_edge_attributes_without_id(
- geometry_set, vert_orig_indices, edge_offsets, src_component, dst_component);
+ geometry_set, vert_orig_indices, edge_offsets, selection, src_component, dst_component);
copy_stable_id_edges(mesh, selection, edge_offsets, src_component, dst_component);
@@ -866,7 +874,7 @@ static void duplicate_points_curve(GeometrySet &geometry_set,
});
break;
case ATTR_DOMAIN_POINT:
- threaded_slice_fill(offsets, src, dst);
+ threaded_slice_fill(offsets, selection, src, dst);
break;
default:
break;
@@ -913,12 +921,17 @@ static void duplicate_points_mesh(GeometrySet &geometry_set,
Mesh *new_mesh = BKE_mesh_new_nomain(offsets.last(), 0, 0, 0, 0);
MutableSpan<MVert> dst_verts(new_mesh->mvert, new_mesh->totvert);
- threaded_slice_fill(offsets.as_span(), src_verts, dst_verts);
+ threaded_slice_fill(offsets.as_span(), selection, src_verts, dst_verts);
MeshComponent dst_component;
dst_component.replace(new_mesh, GeometryOwnershipType::Editable);
- copy_point_attributes_without_id(
- geometry_set, GEO_COMPONENT_TYPE_MESH, false, offsets, src_component, dst_component);
+ copy_point_attributes_without_id(geometry_set,
+ GEO_COMPONENT_TYPE_MESH,
+ false,
+ offsets,
+ selection,
+ src_component,
+ dst_component);
copy_stable_id_point(offsets, src_component, dst_component);
@@ -959,8 +972,13 @@ static void duplicate_points_pointcloud(GeometrySet &geometry_set,
PointCloudComponent dst_component;
dst_component.replace(pointcloud, GeometryOwnershipType::Editable);
- copy_point_attributes_without_id(
- geometry_set, GEO_COMPONENT_TYPE_POINT_CLOUD, false, offsets, src_points, dst_component);
+ copy_point_attributes_without_id(geometry_set,
+ GEO_COMPONENT_TYPE_POINT_CLOUD,
+ false,
+ offsets,
+ selection,
+ src_points,
+ dst_component);
copy_stable_id_point(offsets, src_points, dst_component);
@@ -1058,8 +1076,13 @@ static void duplicate_instances(GeometrySet &geometry_set,
dst_instances.instance_reference_handles().slice(range).fill(new_handle);
}
- copy_point_attributes_without_id(
- geometry_set, GEO_COMPONENT_TYPE_INSTANCES, true, offsets, src_instances, dst_instances);
+ copy_point_attributes_without_id(geometry_set,
+ GEO_COMPONENT_TYPE_INSTANCES,
+ true,
+ offsets,
+ selection,
+ src_instances,
+ dst_instances);
if (attribute_outputs.duplicate_index) {
create_duplicate_index_attribute(