Make `BKE_scene_copy` fully handle all duplicate modes, deep copy included.
This greatly simplifies and unifies logic. Also addresses T77255: full scene copy will now use same preferences parameters as object or collection duplicate to choose which data-blocks to copy along.
This commit is contained in:
parent
b05fa123d7
commit
eee35ebdfb
Notes:
blender-bot
2023-03-24 17:05:22 +01:00
Referenced by issue #85916, Full copy of scene doesn't behave as expected with shaders (maybe among other things) Referenced by issue #79692, Full copy of scene makes Blender freeze if there is content directly in the master collection
|
@ -851,6 +851,10 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, eSceneCopyMethod type)
|
|||
id_us_min(&sce_copy->gpd->id);
|
||||
BKE_id_copy_ex(bmain, (ID *)sce_copy->gpd, (ID **)&sce_copy->gpd, LIB_ID_COPY_ACTIONS);
|
||||
}
|
||||
|
||||
/* Deep-duplicate collections and objects (using preferences' settings for which sub-data to
|
||||
* duplicate along the object itself). */
|
||||
BKE_collection_duplicate(bmain, NULL, sce_copy->master_collection, true, true, true);
|
||||
}
|
||||
else {
|
||||
/* Remove sequencer if not full copy */
|
||||
|
@ -859,9 +863,6 @@ Scene *BKE_scene_copy(Main *bmain, Scene *sce, eSceneCopyMethod type)
|
|||
BKE_sequencer_editing_free(sce_copy, true);
|
||||
}
|
||||
|
||||
/* NOTE: part of SCE_COPY_FULL operations
|
||||
* are done outside of blenkernel with ED_object_single_users! */
|
||||
|
||||
return sce_copy;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -61,13 +61,13 @@ Scene *ED_scene_add(Main *bmain, bContext *C, wmWindow *win, eSceneCopyMethod me
|
|||
else { /* different kinds of copying */
|
||||
Scene *scene_old = WM_window_get_active_scene(win);
|
||||
|
||||
scene_new = BKE_scene_copy(bmain, scene_old, method);
|
||||
|
||||
/* these can't be handled in blenkernel currently, so do them here */
|
||||
/* We are going to deep-copy collections, objects and various object data, we need to have
|
||||
* up-to-date obdata for that. */
|
||||
if (method == SCE_COPY_FULL) {
|
||||
ED_editors_flush_edits(bmain);
|
||||
ED_object_single_users(bmain, scene_new, true, true);
|
||||
}
|
||||
|
||||
scene_new = BKE_scene_copy(bmain, scene_old, method);
|
||||
}
|
||||
|
||||
WM_window_set_active_scene(bmain, C, win, scene_new);
|
||||
|
|
Loading…
Reference in New Issue