Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/scene.c
| Show First 20 Lines • Show All 874 Lines • ▼ Show 20 Lines | for (screen = bmain->screen.first; screen; screen = screen->id.next) { | ||||
| } | } | ||||
| /* editors are handled by WM_main_remove_editor_id_reference */ | /* editors are handled by WM_main_remove_editor_id_reference */ | ||||
| } | } | ||||
| BKE_libblock_free(bmain, sce); | BKE_libblock_free(bmain, sce); | ||||
| } | } | ||||
| static Base *seek_base_in_layer(Base *base, unsigned int lay) | |||||
| { | |||||
| if (base) { | |||||
| if (lay == 0) { | |||||
| return base; | |||||
| } | |||||
| while (base && (base->lay & lay) == 0) { | |||||
| base = base->next; | |||||
| } | |||||
| } | |||||
| return base; | |||||
| } | |||||
| /* Used by metaballs, return *all* objects (including duplis) existing in the scene (including scene's sets) */ | /* Used by metaballs, return *all* objects (including duplis) existing in the scene (including scene's sets) */ | ||||
| int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, | int BKE_scene_base_iter_next(EvaluationContext *eval_ctx, SceneBaseIter *iter, | ||||
| Scene **scene, int val, Base **base, Object **ob) | Scene **scene, int val, unsigned int layer, Base **base, Object **ob) | ||||
| { | { | ||||
| bool run_again = true; | bool run_again = true; | ||||
| /* init */ | /* init */ | ||||
| if (val == 0) { | if (val == 0) { | ||||
| iter->phase = F_START; | iter->phase = F_START; | ||||
| iter->dupob = NULL; | iter->dupob = NULL; | ||||
| iter->duplilist = NULL; | iter->duplilist = NULL; | ||||
| iter->dupli_refob = NULL; | iter->dupli_refob = NULL; | ||||
| } | } | ||||
| else { | else { | ||||
| /* run_again is set when a duplilist has been ended */ | /* run_again is set when a duplilist has been ended */ | ||||
| while (run_again) { | while (run_again) { | ||||
| run_again = false; | run_again = false; | ||||
| /* the first base */ | /* the first base */ | ||||
| if (iter->phase == F_START) { | if (iter->phase == F_START) { | ||||
| *base = (*scene)->base.first; | *base = seek_base_in_layer((*scene)->base.first, layer); | ||||
| if (*base) { | if (*base) { | ||||
| *ob = (*base)->object; | *ob = (*base)->object; | ||||
| iter->phase = F_SCENE; | iter->phase = F_SCENE; | ||||
| } | } | ||||
| else { | else { | ||||
| /* exception: empty scene */ | /* exception: empty scene */ | ||||
| while ((*scene)->set) { | while ((*scene)->set) { | ||||
| (*scene) = (*scene)->set; | (*scene) = (*scene)->set; | ||||
| if ((*scene)->base.first) { | *base = seek_base_in_layer((*scene)->base.first, layer); | ||||
| *base = (*scene)->base.first; | if (*base) { | ||||
| *ob = (*base)->object; | *ob = (*base)->object; | ||||
| iter->phase = F_SCENE; | iter->phase = F_SCENE; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| if (*base && iter->phase != F_DUPLI) { | if (*base && iter->phase != F_DUPLI) { | ||||
| *base = (*base)->next; | *base = seek_base_in_layer((*base)->next, layer); | ||||
| if (*base) { | if (*base) { | ||||
| *ob = (*base)->object; | *ob = (*base)->object; | ||||
| } | } | ||||
| else { | else { | ||||
| if (iter->phase == F_SCENE) { | if (iter->phase == F_SCENE) { | ||||
| /* (*scene) is finished, now do the set */ | /* (*scene) is finished, now do the set */ | ||||
| while ((*scene)->set) { | while ((*scene)->set) { | ||||
| (*scene) = (*scene)->set; | (*scene) = (*scene)->set; | ||||
| if ((*scene)->base.first) { | *base = seek_base_in_layer((*scene)->base.first, layer); | ||||
| if (*base) { | |||||
| *base = (*scene)->base.first; | *base = (*scene)->base.first; | ||||
| *ob = (*base)->object; | *ob = (*base)->object; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 1,639 Lines • Show Last 20 Lines | |||||