From 206c94fea98d44ed9667607638c455c7c0e63822 Mon Sep 17 00:00:00 2001 From: Dalai Felinto Date: Wed, 8 Nov 2017 12:16:49 -0200 Subject: Farewell Scene->base While getting rid of Scene->base we got the following fixes: * Fix "Convert To" operator * Fix "NLA allowing to selected objects that are not selectable * Fix scene.objects (readonly, no option to link/unlink) Note: Collada needs to use the context SceneLayer for adding objects however I added a placeholder, so Collada maintainers can fix this properly. --- source/blender/blenkernel/BKE_layer.h | 2 + source/blender/blenkernel/BKE_object.h | 1 - source/blender/blenkernel/BKE_scene.h | 10 +- .../blender/blenkernel/intern/blender_copybuffer.c | 7 +- source/blender/blenkernel/intern/camera.c | 9 +- source/blender/blenkernel/intern/group.c | 2 +- source/blender/blenkernel/intern/layer.c | 18 ++++ source/blender/blenkernel/intern/library_query.c | 5 - source/blender/blenkernel/intern/library_remap.c | 39 +------ source/blender/blenkernel/intern/object.c | 10 -- source/blender/blenkernel/intern/scene.c | 119 ++++++--------------- source/blender/blenkernel/intern/tracking.c | 3 +- 12 files changed, 70 insertions(+), 155 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_layer.h b/source/blender/blenkernel/BKE_layer.h index 1585742729c..aa2a2167b95 100644 --- a/source/blender/blenkernel/BKE_layer.h +++ b/source/blender/blenkernel/BKE_layer.h @@ -67,8 +67,10 @@ void BKE_scene_layer_free(struct SceneLayer *sl); void BKE_scene_layer_selected_objects_tag(struct SceneLayer *sl, const int tag); +struct Object *BKE_scene_layer_camera_find(struct SceneLayer *sl); struct SceneLayer *BKE_scene_layer_find_from_collection(const struct Scene *scene, struct LayerCollection *lc); struct Base *BKE_scene_layer_base_find(struct SceneLayer *sl, struct Object *ob); +struct Base *BKE_scene_layer_base_find_by_name(struct SceneLayer *sl, struct Object *ob); void BKE_scene_layer_base_deselect_all(struct SceneLayer *sl); void BKE_scene_layer_base_select(struct SceneLayer *sl, struct Base *selbase); diff --git a/source/blender/blenkernel/BKE_object.h b/source/blender/blenkernel/BKE_object.h index 5dcd22190ac..380da4530b9 100644 --- a/source/blender/blenkernel/BKE_object.h +++ b/source/blender/blenkernel/BKE_object.h @@ -63,7 +63,6 @@ void BKE_object_free_particlesystems(struct Object *ob); void BKE_object_free_softbody(struct Object *ob); void BKE_object_free_bulletsoftbody(struct Object *ob); void BKE_object_free_curve_cache(struct Object *ob); -void BKE_object_update_base_layer(struct Scene *scene, struct Object *ob); void BKE_object_free(struct Object *ob); void BKE_object_free_derived_caches(struct Object *ob); diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h index b9e88d02efc..04761b3fa9e 100644 --- a/source/blender/blenkernel/BKE_scene.h +++ b/source/blender/blenkernel/BKE_scene.h @@ -88,13 +88,8 @@ struct Scene *BKE_scene_add(struct Main *bmain, const char *name); void BKE_scene_remove_rigidbody_object(struct Scene *scene, struct Object *ob); -/* base functions */ -struct BaseLegacy *BKE_scene_base_find_by_name(struct Scene *scene, const char *name); -struct BaseLegacy *BKE_scene_base_find(struct Scene *scene, struct Object *ob); -struct BaseLegacy *BKE_scene_base_add(struct Scene *sce, struct Object *ob); -void BKE_scene_base_unlink(struct Scene *sce, struct BaseLegacy *base); -void BKE_scene_base_deselect_all(struct Scene *sce); -void BKE_scene_base_select(struct Scene *sce, struct BaseLegacy *selbase); +bool BKE_scene_object_find(struct Scene *scene, struct Object *ob); +struct Object *BKE_scene_object_find_by_name(struct Scene *scene, const char *name); /* Scene base iteration function. * Define struct here, so no need to bother with alloc/free it. @@ -129,7 +124,6 @@ void BKE_scene_make_local(struct Main *bmain, struct Scene *sce, const bool lib_ struct Scene *BKE_scene_find_from_collection(const struct Main *bmain, const struct SceneCollection *scene_collection); -struct Object *BKE_scene_camera_find(struct Scene *sc); #ifdef DURIAN_CAMERA_SWITCH struct Object *BKE_scene_camera_switch_find(struct Scene *scene); // DURIAN_CAMERA_SWITCH #endif diff --git a/source/blender/blenkernel/intern/blender_copybuffer.c b/source/blender/blenkernel/intern/blender_copybuffer.c index 2d37f3ab0cb..f249765e016 100644 --- a/source/blender/blenkernel/intern/blender_copybuffer.c +++ b/source/blender/blenkernel/intern/blender_copybuffer.c @@ -45,6 +45,7 @@ #include "BKE_blendfile.h" #include "BKE_context.h" #include "BKE_global.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_main.h" #include "BKE_scene.h" @@ -119,7 +120,7 @@ bool BKE_copybuffer_paste(bContext *C, const char *libname, const short flag, Re { Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); - SceneLayer *sl = CTX_data_scene_layer(C); + SceneLayer *scene_layer = CTX_data_scene_layer(C); Main *mainl = NULL; Library *lib; BlendHandle *bh; @@ -131,7 +132,7 @@ bool BKE_copybuffer_paste(bContext *C, const char *libname, const short flag, Re return false; } - BKE_scene_base_deselect_all(scene); + BKE_scene_layer_base_deselect_all(scene_layer); /* tag everything, all untagged data can be made local * its also generally useful to know what is new @@ -144,7 +145,7 @@ bool BKE_copybuffer_paste(bContext *C, const char *libname, const short flag, Re BLO_library_link_copypaste(mainl, bh); - BLO_library_link_end(mainl, &bh, flag, scene, sl); + BLO_library_link_end(mainl, &bh, flag, scene, scene_layer); /* mark all library linked objects to be updated */ BKE_main_lib_objects_recalc_all(bmain); diff --git a/source/blender/blenkernel/intern/camera.c b/source/blender/blenkernel/intern/camera.c index ac004e58785..d9280a84678 100644 --- a/source/blender/blenkernel/intern/camera.c +++ b/source/blender/blenkernel/intern/camera.c @@ -49,6 +49,7 @@ #include "BKE_camera.h" #include "BKE_object.h" #include "BKE_global.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_library_remap.h" @@ -885,9 +886,9 @@ static Object *camera_multiview_advanced(Scene *scene, Object *camera, const cha } if (name[0] != '\0') { - BaseLegacy *base = BKE_scene_base_find_by_name(scene, name); - if (base) { - return base->object; + Object *ob = BKE_scene_object_find_by_name(scene, name); + if (ob != NULL) { + return ob; } } @@ -1018,4 +1019,4 @@ void BKE_camera_background_image_clear(Camera *cam) bgpic = next_bgpic; } -} \ No newline at end of file +} diff --git a/source/blender/blenkernel/intern/group.c b/source/blender/blenkernel/intern/group.c index 5ccbe9f7054..5e5f8114ead 100644 --- a/source/blender/blenkernel/intern/group.c +++ b/source/blender/blenkernel/intern/group.c @@ -51,7 +51,7 @@ #include "BKE_library.h" #include "BKE_main.h" #include "BKE_object.h" -#include "BKE_scene.h" /* BKE_scene_base_find */ +#include "BKE_scene.h" static void free_group_object(GroupObject *go) { diff --git a/source/blender/blenkernel/intern/layer.c b/source/blender/blenkernel/intern/layer.c index 3544cf02afb..c6ee00c5839 100644 --- a/source/blender/blenkernel/intern/layer.c +++ b/source/blender/blenkernel/intern/layer.c @@ -203,6 +203,24 @@ static bool find_scene_collection_in_scene_collections(ListBase *lb, const Layer return false; } +/** + * Fallback for when a Scene has no camera to use + * + * \param scene_layer: in general you want to use the same SceneLayer that is used + * for depsgraph. If rendering you pass the scene active layer, when viewing in the viewport + * you want to get SceneLayer from context. + */ +Object *BKE_scene_layer_camera_find(SceneLayer *scene_layer) +{ + for (Base *base = scene_layer->object_bases.first; base; base = base->next) { + if (base->object->type == OB_CAMERA) { + return base->object; + } + } + + return NULL; +} + /** * Find the SceneLayer a LayerCollection belongs to */ diff --git a/source/blender/blenkernel/intern/library_query.c b/source/blender/blenkernel/intern/library_query.c index c59fd1b4085..3b870fbc234 100644 --- a/source/blender/blenkernel/intern/library_query.c +++ b/source/blender/blenkernel/intern/library_query.c @@ -408,7 +408,6 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call Scene *scene = (Scene *) id; ToolSettings *toolsett = scene->toolsettings; SceneRenderLayer *srl; - BaseLegacy *legacy_base; CALLBACK_INVOKE(scene->camera, IDWALK_CB_NOP); CALLBACK_INVOKE(scene->world, IDWALK_CB_USER); @@ -466,10 +465,6 @@ void BKE_library_foreach_ID_link(Main *bmain, ID *id, LibraryIDLinkCallback call CALLBACK_INVOKE(scene->gpd, IDWALK_CB_USER); - for (legacy_base = scene->base.first; legacy_base; legacy_base = legacy_base->next) { - CALLBACK_INVOKE(legacy_base->object, IDWALK_CB_USER); - } - FOREACH_SCENE_COLLECTION(scene, sc) { for (LinkData *link = sc->objects.first; link; link = link->next) { diff --git a/source/blender/blenkernel/intern/library_remap.c b/source/blender/blenkernel/intern/library_remap.c index 13975dbcdeb..e897f3c5330 100644 --- a/source/blender/blenkernel/intern/library_remap.c +++ b/source/blender/blenkernel/intern/library_remap.c @@ -85,6 +85,7 @@ #include "BKE_key.h" #include "BKE_lamp.h" #include "BKE_lattice.h" +#include "BKE_layer.h" #include "BKE_library.h" #include "BKE_library_query.h" #include "BKE_library_remap.h" @@ -256,24 +257,6 @@ static int foreach_libblock_remap_callback(void *user_data, ID *id_self, ID **id return IDWALK_RET_NOP; } -/* Some remapping unfortunately require extra and/or specific handling, tackle those here. */ -static void libblock_remap_data_preprocess_scene_base_unlink( - IDRemap *r_id_remap_data, Scene *sce, BaseLegacy *base, const bool skip_indirect, const bool is_indirect) -{ - if (skip_indirect && is_indirect) { - r_id_remap_data->skipped_indirect++; - r_id_remap_data->skipped_refcounted++; - } - else { - id_us_min((ID *)base->object); - BKE_scene_base_unlink(sce, base); - MEM_freeN(base); - if (!is_indirect) { - r_id_remap_data->status |= ID_REMAP_IS_LINKED_DIRECT; - } - } -} - /* Some remapping unfortunately require extra and/or specific handling, tackle those here. */ static void libblock_remap_data_preprocess_scene_object_unlink( IDRemap *r_id_remap_data, Scene *sce, Object *ob, const bool skip_indirect, const bool is_indirect) @@ -310,27 +293,12 @@ static void libblock_remap_data_preprocess(IDRemap *r_id_remap_data) r_id_remap_data, sce, ob_iter, skip_indirect, is_indirect); } FOREACH_SCENE_OBJECT_END - - - BaseLegacy *base, *base_next; - for (base = sce->base.first; base; base = base_next) { - base_next = base->next; - libblock_remap_data_preprocess_scene_base_unlink( - r_id_remap_data, sce, base, skip_indirect, is_indirect); - } } else if (GS(r_id_remap_data->old_id->name) == ID_OB) { /* ... a specific object from scene. */ Object *old_ob = (Object *)r_id_remap_data->old_id; - libblock_remap_data_preprocess_scene_object_unlink( r_id_remap_data, sce, old_ob, skip_indirect, is_indirect); - - BaseLegacy *base = BKE_scene_base_find(sce, old_ob); - if (base) { - libblock_remap_data_preprocess_scene_base_unlink( - r_id_remap_data, sce, base, skip_indirect, is_indirect); - } } } break; @@ -392,8 +360,8 @@ static void libblock_remap_data_postprocess_group_scene_unlink(Main *UNUSED(bmai { /* Note that here we assume no object has no base (i.e. all objects are assumed instanced * in one scene...). */ - for (BaseLegacy *base = sce->base.first; base; base = base->next) { - Object *ob = base->object; + FOREACH_SCENE_OBJECT(sce, ob) + { if (ob->flag & OB_FROMGROUP) { Group *grp = BKE_group_object_find(NULL, ob); @@ -406,6 +374,7 @@ static void libblock_remap_data_postprocess_group_scene_unlink(Main *UNUSED(bmai } } } + FOREACH_SCENE_OBJECT_END } static void libblock_remap_data_postprocess_obdata_relink(Main *UNUSED(bmain), Object *ob, ID *new_id) diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c index 379b65e044c..39228891d51 100644 --- a/source/blender/blenkernel/intern/object.c +++ b/source/blender/blenkernel/intern/object.c @@ -159,16 +159,6 @@ void BKE_object_workob_clear(Object *workob) workob->rotmode = ROT_MODE_EUL; } -void BKE_object_update_base_layer(struct Scene *scene, Object *ob) -{ - BaseLegacy *base = scene->base.first; - - while (base) { - if (base->object == ob) base->lay = ob->lay; - base = base->next; - } -} - void BKE_object_free_particlesystems(Object *ob) { ParticleSystem *psys; diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index ce2e4e62be1..95f10cc9846 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -242,16 +242,6 @@ void BKE_scene_copy_data(Main *bmain, Scene *sce_dst, const Scene *sce_src, cons sce_dst->obedit = NULL; sce_dst->fps_info = NULL; - BLI_duplicatelist(&(sce_dst->base), &(sce_src->base)); - for (BaseLegacy *base_dst = sce_dst->base.first, *base_src = sce_src->base.first; - base_dst; - base_dst = base_dst->next, base_src = base_src->next) - { - if (base_src == sce_src->basact) { - sce_dst->basact = base_dst; - } - } - /* layers and collections */ sce_dst->collection = MEM_dupallocN(sce_src->collection); SceneCollection *mc_src = BKE_collection_master(sce_src); @@ -590,7 +580,6 @@ void BKE_scene_free_ex(Scene *sce, const bool do_id_user) BKE_sequencer_clear_scene_in_allseqs(G.main, sce); sce->basact = NULL; - BLI_freelistN(&sce->base); BKE_sequencer_editing_free(sce); BKE_keyingsets_free(&sce->keyingsets); @@ -1081,22 +1070,29 @@ Scene *BKE_scene_add(Main *bmain, const char *name) return sce; } -BaseLegacy *BKE_scene_base_find_by_name(struct Scene *scene, const char *name) +/** + * Check if there is any intance of the object in the scene + */ +bool BKE_scene_object_find(Scene *scene, Object *ob) { - BaseLegacy *base; - - for (base = scene->base.first; base; base = base->next) { - if (STREQ(base->object->id.name + 2, name)) { - break; + for (SceneLayer *scene_layer = scene->render_layers.first; scene_layer; scene_layer = scene_layer->next) { + if (BLI_findptr(&scene_layer->object_bases, ob, offsetof(Base, object))) { + return true; } } - - return base; + return false; } -BaseLegacy *BKE_scene_base_find(Scene *scene, Object *ob) +Object *BKE_scene_object_find_by_name(Scene *scene, const char *name) { - return BLI_findptr(&scene->base, ob, offsetof(BaseLegacy, object)); + for (SceneLayer *scene_layer = scene->render_layers.first; scene_layer; scene_layer = scene_layer->next) { + for (Base *base = scene_layer->object_bases.first; base; base = base->next) { + if (STREQ(base->object->id.name + 2, name)) { + return base->object; + } + } + } + return NULL; } /** @@ -1106,7 +1102,6 @@ BaseLegacy *BKE_scene_base_find(Scene *scene, Object *ob) */ void BKE_scene_set_background(Main *bmain, Scene *scene) { - BaseLegacy *base; Object *ob; Group *group; GroupObject *go; @@ -1132,12 +1127,12 @@ void BKE_scene_set_background(Main *bmain, Scene *scene) } /* copy layers and flags from bases to objects */ - for (base = scene->base.first; base; base = base->next) { - ob = base->object; - ob->lay = base->lay; - - /* group patch... */ - BKE_scene_base_flag_sync_from_base(base); + for (SceneLayer *scene_layer = scene->render_layers.first; scene_layer; scene_layer = scene_layer->next) { + for (Base *base = scene_layer->object_bases.first; base; base = base->next) { + ob = base->object; + /* group patch... */ + BKE_scene_object_base_flag_sync_from_base(base); + } } /* no full animation update, this to enable render code to work (render code calls own animation updates) */ } @@ -1177,17 +1172,19 @@ int BKE_scene_base_iter_next( /* the first base */ if (iter->phase == F_START) { - *base = (*scene)->base.first; + SceneLayer *scene_layer = eval_ctx->scene_layer; + *base = scene_layer->object_bases.first; if (*base) { *ob = (*base)->object; iter->phase = F_SCENE; } else { - /* exception: empty scene */ + /* exception: empty scene layer */ while ((*scene)->set) { (*scene) = (*scene)->set; - if ((*scene)->base.first) { - *base = (*scene)->base.first; + SceneLayer *scene_layer_set = BKE_scene_layer_from_scene_get((*scene)); + if (scene_layer_set->object_bases.first) { + *base = scene_layer_set->object_bases.first; *ob = (*base)->object; iter->phase = F_SCENE; break; @@ -1206,8 +1203,9 @@ int BKE_scene_base_iter_next( /* (*scene) is finished, now do the set */ while ((*scene)->set) { (*scene) = (*scene)->set; - if ((*scene)->base.first) { - *base = (*scene)->base.first; + SceneLayer *scene_layer_set = BKE_scene_layer_from_scene_get((*scene)); + if (scene_layer_set->object_bases.first) { + *base = scene_layer_set->object_bases.first; *ob = (*base)->object; break; } @@ -1298,17 +1296,6 @@ Scene *BKE_scene_find_from_collection(const Main *bmain, const SceneCollection * return NULL; } -Object *BKE_scene_camera_find(Scene *sc) -{ - BaseLegacy *base; - - for (base = sc->base.first; base; base = base->next) - if (base->object->type == OB_CAMERA) - return base->object; - - return NULL; -} - #ifdef DURIAN_CAMERA_SWITCH Object *BKE_scene_camera_switch_find(Scene *scene) { @@ -1412,48 +1399,6 @@ void BKE_scene_remove_rigidbody_object(Scene *scene, Object *ob) BKE_rigidbody_remove_object(scene, ob); } -BaseLegacy *BKE_scene_base_add(Scene *sce, Object *ob) -{ - BaseLegacy *b = MEM_callocN(sizeof(*b), __func__); - BLI_addhead(&sce->base, b); - - b->object = ob; - b->flag_legacy = ob->flag; - b->lay = ob->lay; - - return b; -} - -void BKE_scene_base_unlink(Scene *sce, BaseLegacy *base) -{ - BKE_scene_remove_rigidbody_object(sce, base->object); - - BLI_remlink(&sce->base, base); - if (sce->basact == base) - sce->basact = NULL; -} - -/* deprecated, use BKE_scene_layer_base_deselect_all */ -void BKE_scene_base_deselect_all(Scene *sce) -{ - BaseLegacy *b; - - for (b = sce->base.first; b; b = b->next) { - b->flag_legacy &= ~SELECT; - int flag = b->object->flag & (OB_FROMGROUP); - b->object->flag = b->flag_legacy; - b->object->flag |= flag; - } -} - -void BKE_scene_base_select(Scene *sce, BaseLegacy *selbase) -{ - selbase->flag_legacy |= SELECT; - selbase->object->flag = selbase->flag_legacy; - - sce->basact = selbase; -} - /* checks for cycle, returns 1 if it's all OK */ bool BKE_scene_validate_setscene(Main *bmain, Scene *sce) { diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c index b4ef381534f..6ebd8e6ae36 100644 --- a/source/blender/blenkernel/intern/tracking.c +++ b/source/blender/blenkernel/intern/tracking.c @@ -61,6 +61,7 @@ #include "BKE_movieclip.h" #include "BKE_object.h" #include "BKE_scene.h" +#include "BKE_layer.h" #include "IMB_imbuf_types.h" #include "IMB_imbuf.h" @@ -400,7 +401,7 @@ void BKE_tracking_get_camera_object_matrix(Scene *scene, Object *ob, float mat[4 if (scene->camera) ob = scene->camera; else - ob = BKE_scene_camera_find(scene); + ob = BKE_scene_layer_camera_find(BKE_scene_layer_from_scene_get(scene)); } if (ob) -- cgit v1.2.3