140 return this->collection_from_component_objects(component_objects,
name);
150 if (
mesh->verts_num > 0) {
151 objects.
mesh_ob = this->ensure_object_for_mesh(src_ob_eval, *
mesh,
name);
155 if (
curves->geometry.curve_num > 0) {
171 objects.
instance_objects = this->create_objects_for_instances(src_ob_eval, *instances);
178 return new_instance_collections_;
192 Object *ensure_object_for_mesh(
const Object &src_ob_eval,
193 const Mesh &src_mesh,
197 Mesh *new_mesh = BKE_id_new<Mesh>(&bmain_, name.c_str());
198 Object *new_ob = BKE_object_add_only_object(&bmain_, OB_MESH, name.c_str());
199 new_ob->data = new_mesh;
201 BKE_mesh_nomain_to_mesh(BKE_mesh_copy_for_eval(src_mesh), new_mesh, new_ob);
202 new_mesh->attributes_for_write().remove_anonymous();
203 copy_materials_to_new_geometry_object(src_ob_eval, src_mesh.id, *new_ob, new_mesh->id);
204 bke::mesh_remove_invalid_attribute_strings(*new_mesh);
205 multires_customdata_delete(new_mesh);
210 Object *ensure_object_for_curves(
const Object &src_ob_eval,
215 Curves *new_curves = BKE_id_new<Curves>(&bmain_, name.c_str());
216 Object *new_ob = BKE_object_add_only_object(&bmain_, OB_CURVES, name.c_str());
217 new_ob->data = new_curves;
219 new_curves->geometry.wrap() = src_curves.geometry.wrap();
220 new_curves->geometry.wrap().attributes_for_write().remove_anonymous();
221 copy_materials_to_new_geometry_object(src_ob_eval, src_curves.id, *new_ob, new_curves->id);
226 Object *ensure_object_for_pointcloud(
const Object &src_ob_eval,
228 const StringRefNull
name)
230 return new_object_by_generated_geometry_.lookup_or_add_cb(&src_pointcloud.
id, [&]() {
231 PointCloud *new_pointcloud = BKE_id_new<PointCloud>(&bmain_, name.c_str());
232 Object *new_ob = BKE_object_add_only_object(&bmain_, OB_POINTCLOUD, name.c_str());
233 new_ob->data = new_pointcloud;
235 BKE_pointcloud_nomain_to_pointcloud(BKE_pointcloud_copy_for_eval(&src_pointcloud),
237 new_pointcloud->attributes_for_write().remove_anonymous();
238 copy_materials_to_new_geometry_object(
239 src_ob_eval, src_pointcloud.id, *new_ob, new_pointcloud->id);
244 Object *ensure_object_for_grease_pencil(
const Object &src_ob_eval,
246 const StringRefNull
name)
248 return new_object_by_generated_geometry_.lookup_or_add_cb(&src_grease_pencil.
id, [&]() {
249 GreasePencil *new_grease_pencil = BKE_id_new<GreasePencil>(&bmain_, name.c_str());
250 Object *new_ob = BKE_object_add_only_object(&bmain_, OB_GREASE_PENCIL, name.c_str());
251 new_ob->data = new_grease_pencil;
253 GreasePencil *greasepencil_to_move_from = BKE_grease_pencil_copy_for_eval(
255 BKE_grease_pencil_nomain_to_grease_pencil(greasepencil_to_move_from, new_grease_pencil);
256 new_grease_pencil->attributes_for_write().remove_anonymous();
257 for (GreasePencilDrawingBase *base : new_grease_pencil->drawings()) {
258 if (base->type != GP_DRAWING) {
261 bke::greasepencil::Drawing &drawing =
262 reinterpret_cast<GreasePencilDrawing *>(base)->wrap();
263 drawing.strokes_for_write().attributes_for_write().remove_anonymous();
266 src_ob_eval, src_grease_pencil.
id, *new_ob, new_grease_pencil->id);
271 Vector<Object *> create_objects_for_instances(
const Object &src_ob_eval,
272 const bke::Instances &src_instances)
274 if (std::optional<Vector<Object *>> simple_objects = this->create_objects_for_instances_simple(
275 src_ob_eval, src_instances))
277 return *simple_objects;
280 bke::Instances instances = src_instances;
281 instances.remove_unused_references();
285 Vector<CollectionWithTransform> data_by_handle;
286 for (
const bke::InstanceReference &reference : instances.references()) {
288 this->get_or_create_collection_for_instance_reference(src_ob_eval, reference));
291 const Span<int>
handles = instances.reference_handles();
292 const Span<float4x4> transforms = instances.transforms();
294 Vector<Object *> objects;
295 for (
const int instance_i : IndexRange(instances.instances_num())) {
296 const int handle =
handles[instance_i];
301 if (!instance.collection) {
314 objects.
append(instance_object);
324 std::optional<Vector<Object *>> create_objects_for_instances_simple(
325 const Object &src_ob_eval,
const bke::Instances &src_instances)
327 const Span<float4x4> transforms = src_instances.transforms();
328 const Span<int>
handles = src_instances.reference_handles();
329 const Span<bke::InstanceReference> references = src_instances.references();
331 Vector<Object *> objects;
332 for (
const int i : IndexRange(src_instances.instances_num())) {
338 if (handle < 0 || handle >= references.
size()) {
341 const bke::InstanceReference &reference = references[handle];
342 switch (reference.type()) {
347 Object &object_eval = reference.object();
349 if (
ELEM(object_orig, &src_ob_eval,
nullptr)) {
352 objects.
append(object_orig);
360 src_ob_eval, reference.geometry_set());
361 objects.
extend(component_objects.all_objects());
371 const Object &src_ob_eval,
const bke::InstanceReference &reference)
377 switch (reference.type()) {
383 Object &object_eval = reference.object();
391 new_instance_collections_.
append(instance.collection);
400 copy_v3_v3(instance.collection->instance_offset, object_transform.location());
407 Collection &collection_eval = reference.collection();
409 instance.collection = collection_orig;
413 instance.collection = this->build_collection_for_geometry(src_ob_eval,
414 reference.geometry_set());
415 new_instance_collections_.
append(instance.collection);
419 collection_by_instance_.
add(reference, instance);
447 selected_objects_orig.
append(src_ob_orig);
455 for (
Object *src_ob_orig : selected_objects_orig) {
461 all_new_top_level_objects.
extend(top_level_objects);
465 bmain, &scene, *src_ob_orig);
470 for (
Object *
object : top_level_objects) {
472 for (
Collection *collection_to_add_to : collections_to_add_to) {
479 object->parent = src_ob_orig->parent;
485 for (
Collection *new_collection : new_instance_collections) {
496 for (
Object *
object : all_new_top_level_objects) {
501 if (!all_new_top_level_objects.
is_empty()) {
509 for (
Collection *new_collection : new_instance_collections) {
511 view_layer, new_collection);
#define CTX_DATA_BEGIN(C, Type, instance, member)