49 propagation_attributes.
append({iter.
name, iter.
data_type, AttrDomain::Point, *src_attribute});
52 mask.foreach_index(
GrainSize(32), [&](
const int vert_i,
const int element_i) {
60 src_attribute.name, AttrDomain::Point, src_attribute.data_type);
64 src_attribute.data.get(vert_i, dst.
span[0]);
89 if (iter.
name ==
".edge_verts") {
96 if (
ELEM(src_attribute.
domain, AttrDomain::Point, AttrDomain::Edge)) {
97 propagation_attributes.
append(
100 else if (src_attribute.
domain == AttrDomain::Corner) {
102 *src_attribute, src_attribute.
domain, AttrDomain::Point))
104 propagation_attributes.
append(
105 {iter.
name, iter.
data_type, AttrDomain::Point, adapted_attribute});
108 else if (src_attribute.
domain == AttrDomain::Face) {
110 *src_attribute, src_attribute.
domain, AttrDomain::Edge))
112 propagation_attributes.
append(
113 {iter.
name, iter.
data_type, AttrDomain::Edge, adapted_attribute});
118 mask.foreach_index(
GrainSize(32), [&](
const int edge_i,
const int element_i) {
123 element_edges[0] = {0, 1};
124 const int2 &src_edge = src_edges[edge_i];
129 src_attribute.name, src_attribute.domain, src_attribute.data_type);
133 if (src_attribute.domain == AttrDomain::Point) {
134 src_attribute.data.get(src_edge[0], dst.
span[0]);
135 src_attribute.data.get(src_edge[1], dst.
span[1]);
138 src_attribute.data.get(edge_i, dst.
span[0]);
155 const Span<int> src_corner_verts = mesh.corner_verts();
156 const Span<int> src_corner_edges = mesh.corner_edges();
166 if (
ELEM(iter.
name,
".edge_verts",
".corner_edge",
".corner_vert")) {
173 if (!src_attribute) {
176 propagation_attributes.
append(
180 mask.foreach_index(
GrainSize(32), [&](
const int face_i,
const int element_i) {
181 const IndexRange src_face = src_faces[face_i];
182 const int verts_num = src_face.
size();
193 element_edges[
i] = {
i,
i + 1};
194 element_corner_verts[
i] =
i;
195 element_corner_edges[
i] =
i;
197 element_edges.
last()[1] = 0;
198 element_face_offsets[0] = 0;
199 element_face_offsets[1] = verts_num;
204 src_attribute.name, src_attribute.domain, src_attribute.data_type);
208 switch (src_attribute.domain) {
209 case AttrDomain::Point: {
211 const int src_corner_i = src_face[
i];
212 const int src_vert_i = src_corner_verts[src_corner_i];
213 src_attribute.
data.get(src_vert_i, dst.
span[
i]);
217 case AttrDomain::Edge: {
219 const int src_corner_i = src_face[
i];
220 const int src_edge_i = src_corner_edges[src_corner_i];
221 src_attribute.
data.get(src_edge_i, dst.
span[
i]);
225 case AttrDomain::Corner: {
226 src_attribute.data.materialize_compressed(src_face, dst.
span.
data());
229 case AttrDomain::Face: {
230 src_attribute.data.get(face_i, dst.
span[0]);
254 mask.foreach_index(
GrainSize(32), [&](
const int point_i,
const int element_i) {
264 element->attributes_for_write());
282 mask.foreach_index(
GrainSize(32), [&](
const int point_i,
const int element_i) {
283 const int curve_i = point_to_curve_map[point_i];
290 element->geometry.wrap().attributes_for_write();
320 mask.foreach_index(
GrainSize(32), [&](
const int curve_i,
const int element_i) {
321 const IndexRange src_points = src_points_by_curve[curve_i];
322 const int points_num = src_points.
size();
325 element->geometry.wrap().attributes_for_write();
339 element->geometry.wrap().update_curve_types();
359 mask.foreach_index(
GrainSize(32), [&](
const int instance_i,
const int element_i) {
360 const int old_handle = src_reference_handles[instance_i];
362 const float4x4 &old_transform = src_transforms[instance_i];
365 const int new_handle =
element->add_new_reference(old_reference);
366 element->add_instance(new_handle, old_transform);
369 AttrDomain::Instance,
370 AttrDomain::Instance,
372 attribute_filter, {
".reference_index",
"instance_transform"}),
374 element->attributes_for_write());
387 BLI_assert(
mask.min_array_size() <= grease_pencil.layers().size());
393 mask.foreach_index(
GrainSize(32), [&](
const int layer_i,
const int element_i) {
399 const Layer &src_layer = *src_layers[layer_i];
400 const Drawing *src_drawing = grease_pencil.get_eval_drawing(src_layer);
403 Layer &new_layer =
element->add_layer(src_layer.name());
412 element->attributes_for_write());
428 const Layer &src_layer = grease_pencil.layer(layer_i);
429 const Drawing &src_drawing = *grease_pencil.get_eval_drawing(src_layer);
436 mask.foreach_index(
GrainSize(32), [&](
const int point_i,
const int element_i) {
437 const int curve_i = point_to_curve_map[point_i];
444 Layer &new_layer =
element->add_layer(src_layer.name());
467 element->attributes_for_write());
484 const Layer &src_layer = grease_pencil.layer(layer_i);
485 const Drawing &src_drawing = *grease_pencil.get_eval_drawing(src_layer);
492 mask.foreach_index(
GrainSize(32), [&](
const int curve_i,
const int element_i) {
493 const IndexRange src_points = src_points_by_curve[curve_i];
494 const int points_num = src_points.
size();
501 Layer &new_layer =
element->add_layer(src_layer.name());
505 new_curves.
resize(points_num, 1);
523 element->attributes_for_write());
Low-level operations for curves.
Low-level operations for grease pencil.
GreasePencil * BKE_grease_pencil_new_nomain()
void BKE_mesh_copy_parameters_for_eval(Mesh *me_dst, const Mesh *me_src)
Mesh * BKE_mesh_new_nomain(int verts_num, int edges_num, int faces_num, int corners_num)
General operations for point clouds.
PointCloud * BKE_pointcloud_new_nomain(int totpoint)
#define BLI_assert_unreachable()
ATTR_WARN_UNUSED_RESULT const void * element
constexpr T & last(const int64_t n=0) const
constexpr int64_t size() const
constexpr T & last(const int64_t n=0) const
constexpr const T * data() const
void append(const T &value)
void foreach_attribute(const FunctionRef< void(const AttributeIter &)> fn) const
GVArray adapt_domain(const GVArray &varray, const AttrDomain from_domain, const AttrDomain to_domain) const
GAttributeReader get() const
Array< int > point_to_curve_map() const
OffsetIndices< int > points_by_curve() const
void update_curve_types()
MutableAttributeAccessor attributes_for_write()
void resize(int points_num, int curves_num)
AttributeAccessor attributes() const
MutableSpan< int > offsets_for_write()
Span< int > reference_handles() const
Span< float4x4 > transforms() const
Span< InstanceReference > references() const
bke::AttributeAccessor attributes() const
int instances_num() const
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, AttrType data_type)
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
void * MEM_dupallocN(const void *vmemh)
ccl_device_inline float2 mask(const MaskType mask, const float2 a)
void curves_copy_parameters(const Curves &src, Curves &dst)
void gather_attributes(AttributeAccessor src_attributes, AttrDomain src_domain, AttrDomain dst_domain, const AttributeFilter &attribute_filter, const IndexMask &selection, MutableAttributeAccessor dst_attributes)
auto attribute_filter_with_skip_ref(AttributeFilter filter, const Span< StringRef > skip)
Curves * curves_new_nomain_single(int points_num, CurveType type)
Curves * curves_new_nomain(int points_num, int curves_num)
Array< bke::Instances * > extract_instances(const bke::Instances &instances, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< GreasePencil * > extract_greasepencil_layer_points(const GreasePencil &grease_pencil, int layer_i, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< Mesh * > extract_mesh_faces(const Mesh &mesh, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< Mesh * > extract_mesh_vertices(const Mesh &mesh, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< Curves * > extract_curves(const Curves &curves, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< Curves * > extract_curves_points(const Curves &curves, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< GreasePencil * > extract_greasepencil_layers(const GreasePencil &grease_pencil, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< GreasePencil * > extract_greasepencil_layer_curves(const GreasePencil &grease_pencil, int layer_i, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< PointCloud * > extract_pointcloud_points(const PointCloud &pointcloud, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
Array< Mesh * > extract_mesh_edges(const Mesh &mesh, const IndexMask &mask, const bke::AttributeFilter &attribute_filter)
MatBase< float, 4, 4 > float4x4
VecBase< int32_t, 2 > int2
struct Material ** material_array
bool allow_skip(const StringRef name) const