140 return this->collection_from_component_objects(component_objects,
name);
151 objects.
mesh_ob = this->ensure_object_for_mesh(src_ob_eval, *
mesh,
name);
155 if (curves->geometry.curve_num > 0) {
156 objects.
curves_ob = this->ensure_object_for_curves(src_ob_eval, *curves,
name);
160 if (pointcloud->totpoint > 0) {
161 objects.
pointcloud_ob = this->ensure_object_for_pointcloud(src_ob_eval, *pointcloud,
name);
165 if (greasepencil->layers().size() > 0) {
167 src_ob_eval, *greasepencil,
name);
171 objects.
instance_objects = this->create_objects_for_instances(src_ob_eval, *instances);
178 return new_instance_collections_;
186 for (
Object *
object : component_objects.all_objects()) {
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,
212 const StringRefNull
name)
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)
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);
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();
286 for (
const bke::InstanceReference &reference : instances.references()) {
287 data_by_handle.append(
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();
295 for (
const int instance_i : IndexRange(instances.instances_num())) {
296 const int handle =
handles[instance_i];
297 if (!data_by_handle.index_range().contains(handle)) {
300 const CollectionWithTransform &instance = data_by_handle[handle];
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();
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);
359 const ComponentObjects component_objects = this->get_objects_for_geometry(
360 src_ob_eval, reference.geometry_set());
361 objects.extend(component_objects.all_objects());
370 CollectionWithTransform get_or_create_collection_for_instance_reference(
371 const Object &src_ob_eval,
const bke::InstanceReference &reference)
373 if (
const CollectionWithTransform *instance = collection_by_instance_.
lookup_ptr(reference)) {
376 CollectionWithTransform instance;
377 switch (reference.type()) {
383 Object &object_eval = reference.object();
391 new_instance_collections_.
append(instance.collection);
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);
#define CTX_DATA_BEGIN(C, Type, instance, member)