32 BLI_assert(mask.min_array_size() <= mesh.verts_num);
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.cd_type);
64 src_attribute.data.get(vert_i, dst.
span[0]);
78 BLI_assert(mask.min_array_size() <= mesh.edges_num);
89 if (iter.
name ==
".edge_verts") {
96 if (
ELEM(src_attribute.domain, AttrDomain::Point, AttrDomain::Edge)) {
97 propagation_attributes.
append(
98 {iter.
name, iter.
data_type, src_attribute.domain, *src_attribute});
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.cd_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]);
152 BLI_assert(mask.min_array_size() <= mesh.faces_num);
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(
177 {iter.
name, iter.
data_type, src_attribute.domain, *src_attribute});
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.cd_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) {
256 element->totcol = pointcloud.
totcol;
264 element->attributes_for_write());
275 BLI_assert(mask.min_array_size() <= curves.geometry.point_num);
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();
313 BLI_assert(mask.min_array_size() <= curves.geometry.curve_num);
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();
351 BLI_assert(mask.min_array_size() <= instances.instances_num());
356 const Span<int> src_reference_handles = instances.reference_handles();
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());
386 using namespace bke::greasepencil;
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) {
395 element->material_array =
static_cast<Material **
>(
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());
404 Drawing &drawing = *element->insert_frame(new_layer, element->
runtime->eval_frame);
412 element->attributes_for_write());
427 using namespace bke::greasepencil;
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];
440 element->material_array =
static_cast<Material **
>(
444 Layer &new_layer = element->add_layer(src_layer.name());
445 Drawing &drawing = *element->insert_frame(new_layer, element->
runtime->eval_frame);
467 element->attributes_for_write());
483 using namespace bke::greasepencil;
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();
497 element->material_array =
static_cast<Material **
>(
501 Layer &new_layer = element->add_layer(src_layer.name());
502 Drawing &drawing = *element->insert_frame(new_layer, element->
runtime->eval_frame);
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 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
eCustomDataType data_type
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()
GSpanAttributeWriter lookup_or_add_for_write_only_span(StringRef attribute_id, AttrDomain domain, eCustomDataType data_type)
bke::CurvesGeometry & strokes_for_write()
const bke::CurvesGeometry & strokes() const
void *(* MEM_dupallocN)(const void *vmemh)
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)
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)
GreasePencilLayerRuntimeHandle * runtime
struct Material ** material_array
bool allow_skip(const StringRef name) const