diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2017-11-08 17:16:49 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2017-11-08 23:39:01 +0300 |
commit | 206c94fea98d44ed9667607638c455c7c0e63822 (patch) | |
tree | ddc1f6f30c18d10674daaeeaee6b465550447709 /source/blender/blenkernel/intern/scene.c | |
parent | 670e6cab4319b94c96c6a61cb76199f1054b935a (diff) |
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.
Diffstat (limited to 'source/blender/blenkernel/intern/scene.c')
-rw-r--r-- | source/blender/blenkernel/intern/scene.c | 119 |
1 files changed, 32 insertions, 87 deletions
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) { |