Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/scene.c
| Show First 20 Lines • Show All 207 Lines • ▼ Show 20 Lines | while (layer_collection_dst != NULL) { | ||||
| layer_collection_dst = layer_collection_dst->next; | layer_collection_dst = layer_collection_dst->next; | ||||
| layer_collection_src = layer_collection_src->next; | layer_collection_src = layer_collection_src->next; | ||||
| } | } | ||||
| } | } | ||||
| /* recreate the LayerCollection tree */ | /* recreate the LayerCollection tree */ | ||||
| static void layer_collections_recreate( | static void layer_collections_recreate( | ||||
| SceneLayer *sl_dst, ListBase *lb_src, SceneCollection *mc_dst, SceneCollection *mc_src) | ViewLayer *sl_dst, ListBase *lb_src, SceneCollection *mc_dst, SceneCollection *mc_src) | ||||
| { | { | ||||
| for (LayerCollection *lc_src = lb_src->first; lc_src; lc_src = lc_src->next) { | for (LayerCollection *lc_src = lb_src->first; lc_src; lc_src = lc_src->next) { | ||||
| SceneCollection *sc_dst = scene_collection_from_new_tree(lc_src->scene_collection, mc_dst, mc_src); | SceneCollection *sc_dst = scene_collection_from_new_tree(lc_src->scene_collection, mc_dst, mc_src); | ||||
| BLI_assert(sc_dst); | BLI_assert(sc_dst); | ||||
| /* instead of synchronizing both trees we simply re-create it */ | /* instead of synchronizing both trees we simply re-create it */ | ||||
| BKE_collection_link(sl_dst, sc_dst); | BKE_collection_link(sl_dst, sc_dst); | ||||
| } | } | ||||
| Show All 21 Lines | void BKE_scene_copy_data(Main *bmain, Scene *sce_dst, const Scene *sce_src, const int flag) | ||||
| sce_dst->collection = MEM_dupallocN(sce_src->collection); | sce_dst->collection = MEM_dupallocN(sce_src->collection); | ||||
| SceneCollection *mc_src = BKE_collection_master(sce_src); | SceneCollection *mc_src = BKE_collection_master(sce_src); | ||||
| SceneCollection *mc_dst = BKE_collection_master(sce_dst); | SceneCollection *mc_dst = BKE_collection_master(sce_dst); | ||||
| /* recursively creates a new SceneCollection tree */ | /* recursively creates a new SceneCollection tree */ | ||||
| scene_collection_copy(mc_dst, mc_src, flag_subdata); | scene_collection_copy(mc_dst, mc_src, flag_subdata); | ||||
| IDPropertyTemplate val = {0}; | IDPropertyTemplate val = {0}; | ||||
| BLI_duplicatelist(&sce_dst->render_layers, &sce_src->render_layers); | BLI_duplicatelist(&sce_dst->view_layers, &sce_src->view_layers); | ||||
| for (SceneLayer *scene_layer_src = sce_src->render_layers.first, *scene_layer_dst = sce_dst->render_layers.first; | for (ViewLayer *view_layer_src = sce_src->view_layers.first, *view_layer_dst = sce_dst->view_layers.first; | ||||
| scene_layer_src; | view_layer_src; | ||||
| scene_layer_src = scene_layer_src->next, scene_layer_dst = scene_layer_dst->next) | view_layer_src = view_layer_src->next, view_layer_dst = view_layer_dst->next) | ||||
| { | { | ||||
| if (scene_layer_dst->id_properties != NULL) { | if (view_layer_dst->id_properties != NULL) { | ||||
| scene_layer_dst->id_properties = IDP_CopyProperty_ex(scene_layer_dst->id_properties, flag_subdata); | view_layer_dst->id_properties = IDP_CopyProperty_ex(view_layer_dst->id_properties, flag_subdata); | ||||
| } | } | ||||
| BKE_freestyle_config_copy(&scene_layer_dst->freestyle_config, &scene_layer_src->freestyle_config, flag_subdata); | BKE_freestyle_config_copy(&view_layer_dst->freestyle_config, &view_layer_src->freestyle_config, flag_subdata); | ||||
| scene_layer_dst->stats = NULL; | view_layer_dst->stats = NULL; | ||||
| scene_layer_dst->properties_evaluated = NULL; | view_layer_dst->properties_evaluated = NULL; | ||||
| scene_layer_dst->properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | view_layer_dst->properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | ||||
| IDP_MergeGroup_ex(scene_layer_dst->properties, scene_layer_src->properties, true, flag_subdata); | IDP_MergeGroup_ex(view_layer_dst->properties, view_layer_src->properties, true, flag_subdata); | ||||
| /* we start fresh with no overrides and no visibility flags set | /* we start fresh with no overrides and no visibility flags set | ||||
| * instead of syncing both trees we simply unlink and relink the scene collection */ | * instead of syncing both trees we simply unlink and relink the scene collection */ | ||||
| BLI_listbase_clear(&scene_layer_dst->layer_collections); | BLI_listbase_clear(&view_layer_dst->layer_collections); | ||||
| BLI_listbase_clear(&scene_layer_dst->object_bases); | BLI_listbase_clear(&view_layer_dst->object_bases); | ||||
| BLI_listbase_clear(&scene_layer_dst->drawdata); | BLI_listbase_clear(&view_layer_dst->drawdata); | ||||
| layer_collections_recreate(scene_layer_dst, &scene_layer_src->layer_collections, mc_dst, mc_src); | layer_collections_recreate(view_layer_dst, &view_layer_src->layer_collections, mc_dst, mc_src); | ||||
| /* Now we handle the syncing for visibility, selectability, ... */ | /* Now we handle the syncing for visibility, selectability, ... */ | ||||
| layer_collections_sync_flags(&scene_layer_dst->layer_collections, &scene_layer_src->layer_collections); | layer_collections_sync_flags(&view_layer_dst->layer_collections, &view_layer_src->layer_collections); | ||||
| Object *active_ob = OBACT(scene_layer_src); | Object *active_ob = OBACT(view_layer_src); | ||||
| for (Base *base_src = scene_layer_src->object_bases.first, *base_dst = scene_layer_dst->object_bases.first; | for (Base *base_src = view_layer_src->object_bases.first, *base_dst = view_layer_dst->object_bases.first; | ||||
| base_src; | base_src; | ||||
| base_src = base_src->next, base_dst = base_dst->next) | base_src = base_src->next, base_dst = base_dst->next) | ||||
| { | { | ||||
| base_dst->flag = base_src->flag; | base_dst->flag = base_src->flag; | ||||
| base_dst->flag_legacy = base_src->flag_legacy; | base_dst->flag_legacy = base_src->flag_legacy; | ||||
| if (base_dst->object == active_ob) { | if (base_dst->object == active_ob) { | ||||
| scene_layer_dst->basact = base_dst; | view_layer_dst->basact = base_dst; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| sce_dst->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | sce_dst->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | ||||
| if (sce_src->collection_properties) { | if (sce_src->collection_properties) { | ||||
| IDP_MergeGroup_ex(sce_dst->collection_properties, sce_src->collection_properties, true, flag_subdata); | IDP_MergeGroup_ex(sce_dst->collection_properties, sce_src->collection_properties, true, flag_subdata); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | if (type == SCE_COPY_EMPTY) { | ||||
| ToolSettings *ts; | ToolSettings *ts; | ||||
| ListBase rv; | ListBase rv; | ||||
| sce_copy = BKE_scene_add(bmain, sce->id.name + 2); | sce_copy = BKE_scene_add(bmain, sce->id.name + 2); | ||||
| rv = sce_copy->r.views; | rv = sce_copy->r.views; | ||||
| curvemapping_free_data(&sce_copy->r.mblur_shutter_curve); | curvemapping_free_data(&sce_copy->r.mblur_shutter_curve); | ||||
| sce_copy->r = sce->r; | sce_copy->r = sce->r; | ||||
| sce_copy->active_layer = 0; | sce_copy->active_view_layer = 0; | ||||
| sce_copy->r.views = rv; | sce_copy->r.views = rv; | ||||
| sce_copy->unit = sce->unit; | sce_copy->unit = sce->unit; | ||||
| sce_copy->physics_settings = sce->physics_settings; | sce_copy->physics_settings = sce->physics_settings; | ||||
| sce_copy->gm = sce->gm; | sce_copy->gm = sce->gm; | ||||
| sce_copy->audio = sce->audio; | sce_copy->audio = sce->audio; | ||||
| if (sce->id.properties) | if (sce->id.properties) | ||||
| sce_copy->id.properties = IDP_CopyProperty(sce->id.properties); | sce_copy->id.properties = IDP_CopyProperty(sce->id.properties); | ||||
| ▲ Show 20 Lines • Show All 81 Lines • ▼ Show 20 Lines | else { | ||||
| BKE_id_copy_ex(bmain, (ID *)sce, (ID **)&sce_copy, LIB_ID_COPY_ACTIONS, false); | BKE_id_copy_ex(bmain, (ID *)sce, (ID **)&sce_copy, LIB_ID_COPY_ACTIONS, false); | ||||
| id_us_min(&sce_copy->id); | id_us_min(&sce_copy->id); | ||||
| id_us_ensure_real(&sce_copy->id); | id_us_ensure_real(&sce_copy->id); | ||||
| /* Extra actions, most notably SCE_FULL_COPY also duplicates several 'children' datablocks... */ | /* Extra actions, most notably SCE_FULL_COPY also duplicates several 'children' datablocks... */ | ||||
| if (type == SCE_COPY_FULL) { | if (type == SCE_COPY_FULL) { | ||||
| /* Copy Freestyle LineStyle datablocks. */ | /* Copy Freestyle LineStyle datablocks. */ | ||||
| for (SceneLayer *scene_layer_dst = sce_copy->render_layers.first; scene_layer_dst; scene_layer_dst = scene_layer_dst->next) { | for (ViewLayer *view_layer_dst = sce_copy->view_layers.first; view_layer_dst; view_layer_dst = view_layer_dst->next) { | ||||
| for (FreestyleLineSet *lineset = scene_layer_dst->freestyle_config.linesets.first; lineset; lineset = lineset->next) { | for (FreestyleLineSet *lineset = view_layer_dst->freestyle_config.linesets.first; lineset; lineset = lineset->next) { | ||||
| if (lineset->linestyle) { | if (lineset->linestyle) { | ||||
| /* XXX Not copying anim/actions here? */ | /* XXX Not copying anim/actions here? */ | ||||
| BKE_id_copy_ex(bmain, (ID *)lineset->linestyle, (ID **)&lineset->linestyle, 0, false); | BKE_id_copy_ex(bmain, (ID *)lineset->linestyle, (ID **)&lineset->linestyle, 0, false); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* Full copy of world (included animations) */ | /* Full copy of world (included animations) */ | ||||
| ▲ Show 20 Lines • Show All 115 Lines • ▼ Show 20 Lines | void BKE_scene_free_ex(Scene *sce, const bool do_id_user) | ||||
| BKE_sound_destroy_scene(sce); | BKE_sound_destroy_scene(sce); | ||||
| BKE_color_managed_view_settings_free(&sce->view_settings); | BKE_color_managed_view_settings_free(&sce->view_settings); | ||||
| BKE_previewimg_free(&sce->preview); | BKE_previewimg_free(&sce->preview); | ||||
| curvemapping_free_data(&sce->r.mblur_shutter_curve); | curvemapping_free_data(&sce->r.mblur_shutter_curve); | ||||
| for (SceneLayer *sl = sce->render_layers.first, *sl_next; sl; sl = sl_next) { | for (ViewLayer *sl = sce->view_layers.first, *sl_next; sl; sl = sl_next) { | ||||
| sl_next = sl->next; | sl_next = sl->next; | ||||
| BLI_remlink(&sce->render_layers, sl); | BLI_remlink(&sce->view_layers, sl); | ||||
| BKE_scene_layer_free(sl); | BKE_view_layer_free(sl); | ||||
| } | } | ||||
| /* Master Collection */ | /* Master Collection */ | ||||
| BKE_collection_master_free(sce, do_id_user); | BKE_collection_master_free(sce, do_id_user); | ||||
| MEM_freeN(sce->collection); | MEM_freeN(sce->collection); | ||||
| sce->collection = NULL; | sce->collection = NULL; | ||||
| /* LayerCollection engine settings. */ | /* LayerCollection engine settings. */ | ||||
| ▲ Show 20 Lines • Show All 368 Lines • ▼ Show 20 Lines | void BKE_scene_init(Scene *sce) | ||||
| BLI_strncpy(sce->collection->name, "Master Collection", sizeof(sce->collection->name)); | BLI_strncpy(sce->collection->name, "Master Collection", sizeof(sce->collection->name)); | ||||
| /* Engine settings */ | /* Engine settings */ | ||||
| IDPropertyTemplate val = {0}; | IDPropertyTemplate val = {0}; | ||||
| sce->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | sce->collection_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | ||||
| BKE_layer_collection_engine_settings_create(sce->collection_properties); | BKE_layer_collection_engine_settings_create(sce->collection_properties); | ||||
| sce->layer_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | sce->layer_properties = IDP_New(IDP_GROUP, &val, ROOT_PROP); | ||||
| BKE_scene_layer_engine_settings_create(sce->layer_properties); | BKE_view_layer_engine_settings_create(sce->layer_properties); | ||||
| BKE_scene_layer_add(sce, "Render Layer"); | BKE_view_layer_add(sce, "Render Layer"); | ||||
| } | } | ||||
| Scene *BKE_scene_add(Main *bmain, const char *name) | Scene *BKE_scene_add(Main *bmain, const char *name) | ||||
| { | { | ||||
| Scene *sce; | Scene *sce; | ||||
| sce = BKE_libblock_alloc(bmain, ID_SCE, name, 0); | sce = BKE_libblock_alloc(bmain, ID_SCE, name, 0); | ||||
| id_us_min(&sce->id); | id_us_min(&sce->id); | ||||
| id_us_ensure_real(&sce->id); | id_us_ensure_real(&sce->id); | ||||
| BKE_scene_init(sce); | BKE_scene_init(sce); | ||||
| return sce; | return sce; | ||||
| } | } | ||||
| /** | /** | ||||
| * Check if there is any intance of the object in the scene | * Check if there is any intance of the object in the scene | ||||
| */ | */ | ||||
| bool BKE_scene_object_find(Scene *scene, Object *ob) | bool BKE_scene_object_find(Scene *scene, Object *ob) | ||||
| { | { | ||||
| for (SceneLayer *scene_layer = scene->render_layers.first; scene_layer; scene_layer = scene_layer->next) { | for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { | ||||
| if (BLI_findptr(&scene_layer->object_bases, ob, offsetof(Base, object))) { | if (BLI_findptr(&view_layer->object_bases, ob, offsetof(Base, object))) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| Object *BKE_scene_object_find_by_name(Scene *scene, const char *name) | Object *BKE_scene_object_find_by_name(Scene *scene, const char *name) | ||||
| { | { | ||||
| for (SceneLayer *scene_layer = scene->render_layers.first; scene_layer; scene_layer = scene_layer->next) { | for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { | ||||
| for (Base *base = scene_layer->object_bases.first; base; base = base->next) { | for (Base *base = view_layer->object_bases.first; base; base = base->next) { | ||||
| if (STREQ(base->object->id.name + 2, name)) { | if (STREQ(base->object->id.name + 2, name)) { | ||||
| return base->object; | return base->object; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| Show All 24 Lines | for (group = bmain->group.first; group; group = group->id.next) { | ||||
| for (go = group->gobject.first; go; go = go->next) { | for (go = group->gobject.first; go; go = go->next) { | ||||
| if (go->ob) { | if (go->ob) { | ||||
| go->ob->flag |= OB_FROMGROUP; | go->ob->flag |= OB_FROMGROUP; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* copy layers and flags from bases to objects */ | /* copy layers and flags from bases to objects */ | ||||
| for (SceneLayer *scene_layer = scene->render_layers.first; scene_layer; scene_layer = scene_layer->next) { | for (ViewLayer *view_layer = scene->view_layers.first; view_layer; view_layer = view_layer->next) { | ||||
| for (Base *base = scene_layer->object_bases.first; base; base = base->next) { | for (Base *base = view_layer->object_bases.first; base; base = base->next) { | ||||
| ob = base->object; | ob = base->object; | ||||
| /* group patch... */ | /* group patch... */ | ||||
| BKE_scene_object_base_flag_sync_from_base(base); | 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) */ | /* no full animation update, this to enable render code to work (render code calls own animation updates) */ | ||||
| } | } | ||||
| Show All 27 Lines | int BKE_scene_base_iter_next( | ||||
| } | } | ||||
| 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) { | ||||
| SceneLayer *scene_layer = eval_ctx->scene_layer; | ViewLayer *view_layer = eval_ctx->view_layer; | ||||
| *base = scene_layer->object_bases.first; | *base = view_layer->object_bases.first; | ||||
| if (*base) { | if (*base) { | ||||
| *ob = (*base)->object; | *ob = (*base)->object; | ||||
| iter->phase = F_SCENE; | iter->phase = F_SCENE; | ||||
| } | } | ||||
| else { | else { | ||||
| /* exception: empty scene layer */ | /* exception: empty scene layer */ | ||||
| while ((*scene)->set) { | while ((*scene)->set) { | ||||
| (*scene) = (*scene)->set; | (*scene) = (*scene)->set; | ||||
| SceneLayer *scene_layer_set = BKE_scene_layer_from_scene_get((*scene)); | ViewLayer *view_layer_set = BKE_view_layer_from_scene_get((*scene)); | ||||
| if (scene_layer_set->object_bases.first) { | if (view_layer_set->object_bases.first) { | ||||
| *base = scene_layer_set->object_bases.first; | *base = view_layer_set->object_bases.first; | ||||
| *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 = (*base)->next; | ||||
| 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; | ||||
| SceneLayer *scene_layer_set = BKE_scene_layer_from_scene_get((*scene)); | ViewLayer *view_layer_set = BKE_view_layer_from_scene_get((*scene)); | ||||
| if (scene_layer_set->object_bases.first) { | if (view_layer_set->object_bases.first) { | ||||
| *base = scene_layer_set->object_bases.first; | *base = view_layer_set->object_bases.first; | ||||
| *ob = (*base)->object; | *ob = (*base)->object; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 64 Lines • ▼ Show 20 Lines | |||||
| #endif | #endif | ||||
| return iter->phase; | return iter->phase; | ||||
| } | } | ||||
| Scene *BKE_scene_find_from_collection(const Main *bmain, const SceneCollection *scene_collection) | Scene *BKE_scene_find_from_collection(const Main *bmain, const SceneCollection *scene_collection) | ||||
| { | { | ||||
| for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { | for (Scene *scene = bmain->scene.first; scene; scene = scene->id.next) { | ||||
| for (SceneLayer *layer = scene->render_layers.first; layer; layer = layer->next) { | for (ViewLayer *layer = scene->view_layers.first; layer; layer = layer->next) { | ||||
| if (BKE_scene_layer_has_collection(layer, scene_collection)) { | if (BKE_view_layer_has_collection(layer, scene_collection)) { | ||||
| return scene; | return scene; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 227 Lines • ▼ Show 20 Lines | if ((obedit->type == OB_MESH) && | ||||
| BMesh *bm = mesh->edit_btmesh->bm; | BMesh *bm = mesh->edit_btmesh->bm; | ||||
| BM_mesh_bm_to_me(bm, mesh, (&(struct BMeshToMeshParams){0})); | BM_mesh_bm_to_me(bm, mesh, (&(struct BMeshToMeshParams){0})); | ||||
| DEG_id_tag_update(&mesh->id, 0); | DEG_id_tag_update(&mesh->id, 0); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /* TODO(sergey): This actually should become scene_layer_graph or so. | /* TODO(sergey): This actually should become view_layer_graph or so. | ||||
| * Same applies to update_for_newframe. | * Same applies to update_for_newframe. | ||||
| */ | */ | ||||
| void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx, | void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx, | ||||
| Depsgraph *depsgraph, | Depsgraph *depsgraph, | ||||
| Main *bmain, | Main *bmain, | ||||
| Scene *scene, | Scene *scene, | ||||
| SceneLayer *scene_layer) | ViewLayer *view_layer) | ||||
| { | { | ||||
| /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ | /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ | ||||
| if (scene_layer == NULL) { | if (view_layer == NULL) { | ||||
| scene_layer = DEG_get_evaluated_scene_layer(depsgraph); | view_layer = DEG_get_evaluated_view_layer(depsgraph); | ||||
| BLI_assert(scene_layer != NULL); | BLI_assert(view_layer != NULL); | ||||
| } | } | ||||
| /* TODO(sergey): Some functions here are changing global state, | /* TODO(sergey): Some functions here are changing global state, | ||||
| * for example, clearing update tags from bmain. | * for example, clearing update tags from bmain. | ||||
| */ | */ | ||||
| /* (Re-)build dependency graph if needed. */ | /* (Re-)build dependency graph if needed. */ | ||||
| DEG_graph_relations_update(depsgraph, bmain, scene, scene_layer); | DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); | ||||
| /* Uncomment this to check if graph was properly tagged for update. */ | /* Uncomment this to check if graph was properly tagged for update. */ | ||||
| // DEG_debug_graph_relations_validate(depsgraph, bmain, scene); | // DEG_debug_graph_relations_validate(depsgraph, bmain, scene); | ||||
| /* Flush editing data if needed. */ | /* Flush editing data if needed. */ | ||||
| prepare_mesh_for_viewport_render(bmain, scene); | prepare_mesh_for_viewport_render(bmain, scene); | ||||
| /* Flush recalc flags to dependencies. */ | /* Flush recalc flags to dependencies. */ | ||||
| DEG_graph_flush_update(bmain, depsgraph); | DEG_graph_flush_update(bmain, depsgraph); | ||||
| /* Update all objects: drivers, matrices, displists, etc. flags set | /* Update all objects: drivers, matrices, displists, etc. flags set | ||||
| * by depgraph or manual, no layer check here, gets correct flushed. | * by depgraph or manual, no layer check here, gets correct flushed. | ||||
| */ | */ | ||||
| DEG_evaluate_on_refresh(eval_ctx, depsgraph); | DEG_evaluate_on_refresh(eval_ctx, depsgraph); | ||||
| /* Update sound system animation (TODO, move to depsgraph). */ | /* Update sound system animation (TODO, move to depsgraph). */ | ||||
| BKE_sound_update_scene(bmain, scene); | BKE_sound_update_scene(bmain, scene); | ||||
| /* Inform editors about possible changes. */ | /* Inform editors about possible changes. */ | ||||
| DEG_ids_check_recalc(bmain, scene, false); | DEG_ids_check_recalc(bmain, scene, false); | ||||
| /* Clear recalc flags. */ | /* Clear recalc flags. */ | ||||
| DEG_ids_clear_recalc(bmain); | DEG_ids_clear_recalc(bmain); | ||||
| } | } | ||||
| /* applies changes right away, does all sets too */ | /* applies changes right away, does all sets too */ | ||||
| void BKE_scene_graph_update_for_newframe(EvaluationContext *eval_ctx, | void BKE_scene_graph_update_for_newframe(EvaluationContext *eval_ctx, | ||||
| Depsgraph *depsgraph, | Depsgraph *depsgraph, | ||||
| Main *bmain, | Main *bmain, | ||||
| Scene *scene, | Scene *scene, | ||||
| SceneLayer *scene_layer) | ViewLayer *view_layer) | ||||
| { | { | ||||
| /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ | /* TODO(sergey): Temporary solution for until pipeline.c is ported. */ | ||||
| if (scene_layer == NULL) { | if (view_layer == NULL) { | ||||
| scene_layer = DEG_get_evaluated_scene_layer(depsgraph); | view_layer = DEG_get_evaluated_view_layer(depsgraph); | ||||
| BLI_assert(scene_layer != NULL); | BLI_assert(view_layer != NULL); | ||||
| } | } | ||||
| /* TODO(sergey): Some functions here are changing global state, | /* TODO(sergey): Some functions here are changing global state, | ||||
| * for example, clearing update tags from bmain. | * for example, clearing update tags from bmain. | ||||
| */ | */ | ||||
| const float ctime = BKE_scene_frame_get(scene); | const float ctime = BKE_scene_frame_get(scene); | ||||
| /* Inform editors we are starting scene update. */ | /* Inform editors we are starting scene update. */ | ||||
| DEG_editors_update_pre(bmain, scene, true); | DEG_editors_update_pre(bmain, scene, true); | ||||
| /* Keep this first. | /* Keep this first. | ||||
| * TODO(sergey): Should it be after the editors update? | * TODO(sergey): Should it be after the editors update? | ||||
| */ | */ | ||||
| BLI_callback_exec(bmain, &scene->id, BLI_CB_EVT_FRAME_CHANGE_PRE); | BLI_callback_exec(bmain, &scene->id, BLI_CB_EVT_FRAME_CHANGE_PRE); | ||||
| /* Update animated image textures for particles, modifiers, gpu, etc, | /* Update animated image textures for particles, modifiers, gpu, etc, | ||||
| * call this at the start so modifiers with textures don't lag 1 frame. | * call this at the start so modifiers with textures don't lag 1 frame. | ||||
| */ | */ | ||||
| BKE_image_update_frame(bmain, scene->r.cfra); | BKE_image_update_frame(bmain, scene->r.cfra); | ||||
| BKE_sound_set_cfra(scene->r.cfra); | BKE_sound_set_cfra(scene->r.cfra); | ||||
| DEG_graph_relations_update(depsgraph, bmain, scene, scene_layer); | DEG_graph_relations_update(depsgraph, bmain, scene, view_layer); | ||||
| /* Update animated cache files for modifiers. | /* Update animated cache files for modifiers. | ||||
| * | * | ||||
| * TODO(sergey): Make this a depsgraph node? | * TODO(sergey): Make this a depsgraph node? | ||||
| */ | */ | ||||
| BKE_cachefile_update_frame(bmain, scene, ctime, | BKE_cachefile_update_frame(bmain, scene, ctime, | ||||
| (((double)scene->r.frs_sec) / (double)scene->r.frs_sec_base)); | (((double)scene->r.frs_sec) / (double)scene->r.frs_sec_base)); | ||||
| #ifdef POSE_ANIMATION_WORKAROUND | #ifdef POSE_ANIMATION_WORKAROUND | ||||
| scene_armature_depsgraph_workaround(bmain); | scene_armature_depsgraph_workaround(bmain); | ||||
| ▲ Show 20 Lines • Show All 88 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| if (r->mode & R_SIMPLIFY) | if (r->mode & R_SIMPLIFY) | ||||
| return ((1.0f - r->simplify_aosss) * 10.0f + 1.0f) * error; | return ((1.0f - r->simplify_aosss) * 10.0f + 1.0f) * error; | ||||
| else | else | ||||
| return error; | return error; | ||||
| } | } | ||||
| /** | /** | ||||
| * Helper function for the SETLOOPER and SETLOOPER_SCENE_LAYER macros | * Helper function for the SETLOOPER and SETLOOPER_VIEW_LAYER macros | ||||
| * | * | ||||
| * It iterates over the bases of the active layer and then the bases | * It iterates over the bases of the active layer and then the bases | ||||
| * of the active layer of the background (set) scenes recursively. | * of the active layer of the background (set) scenes recursively. | ||||
| */ | */ | ||||
| Base *_setlooper_base_step(Scene **sce_iter, SceneLayer *scene_layer, Base *base) | Base *_setlooper_base_step(Scene **sce_iter, ViewLayer *view_layer, Base *base) | ||||
| { | { | ||||
| if (base && base->next) { | if (base && base->next) { | ||||
| /* Common case, step to the next. */ | /* Common case, step to the next. */ | ||||
| return base->next; | return base->next; | ||||
| } | } | ||||
| else if ((base == NULL) && (scene_layer != NULL)) { | else if ((base == NULL) && (view_layer != NULL)) { | ||||
| /* First time looping, return the scenes first base. */ | /* First time looping, return the scenes first base. */ | ||||
| /* For the first loop we should get the layer from workspace when available. */ | /* For the first loop we should get the layer from workspace when available. */ | ||||
| if (scene_layer->object_bases.first) { | if (view_layer->object_bases.first) { | ||||
| return (Base *)scene_layer->object_bases.first; | return (Base *)view_layer->object_bases.first; | ||||
| } | } | ||||
| /* No base on this scene layer. */ | /* No base on this scene layer. */ | ||||
| goto next_set; | goto next_set; | ||||
| } | } | ||||
| else { | else { | ||||
| next_set: | next_set: | ||||
| /* Reached the end, get the next base in the set. */ | /* Reached the end, get the next base in the set. */ | ||||
| while ((*sce_iter = (*sce_iter)->set)) { | while ((*sce_iter = (*sce_iter)->set)) { | ||||
| SceneLayer *scene_layer_set = BKE_scene_layer_from_scene_get((*sce_iter)); | ViewLayer *view_layer_set = BKE_view_layer_from_scene_get((*sce_iter)); | ||||
| base = (Base *)scene_layer_set->object_bases.first; | base = (Base *)view_layer_set->object_bases.first; | ||||
| if (base) { | if (base) { | ||||
| return base; | return base; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| return NULL; | return NULL; | ||||
| Show All 31 Lines | bool BKE_scene_uses_blender_game(const Scene *scene) | ||||
| return BKE_viewrender_uses_blender_game(&scene->view_render); | return BKE_viewrender_uses_blender_game(&scene->view_render); | ||||
| } | } | ||||
| bool BKE_scene_uses_blender_eevee(const Scene *scene) | bool BKE_scene_uses_blender_eevee(const Scene *scene) | ||||
| { | { | ||||
| return BKE_viewrender_uses_blender_eevee(&scene->view_render); | return BKE_viewrender_uses_blender_eevee(&scene->view_render); | ||||
| } | } | ||||
| void BKE_scene_base_flag_to_objects(SceneLayer *scene_layer) | void BKE_scene_base_flag_to_objects(ViewLayer *view_layer) | ||||
| { | { | ||||
| Base *base = scene_layer->object_bases.first; | Base *base = view_layer->object_bases.first; | ||||
| while (base) { | while (base) { | ||||
| BKE_scene_object_base_flag_sync_from_base(base); | BKE_scene_object_base_flag_sync_from_base(base); | ||||
| base = base->next; | base = base->next; | ||||
| } | } | ||||
| } | } | ||||
| void BKE_scene_object_base_flag_sync_from_base(Base *base) | void BKE_scene_object_base_flag_sync_from_base(Base *base) | ||||
| ▲ Show 20 Lines • Show All 468 Lines • ▼ Show 20 Lines | else { | ||||
| return BKE_scene_multiview_num_views_get(rd); | return BKE_scene_multiview_num_views_get(rd); | ||||
| } | } | ||||
| } | } | ||||
| /* Manipulation of depsgraph storage. */ | /* Manipulation of depsgraph storage. */ | ||||
| /* This is a key which identifies depsgraph. */ | /* This is a key which identifies depsgraph. */ | ||||
| typedef struct DepsgraphKey { | typedef struct DepsgraphKey { | ||||
| SceneLayer *scene_layer; | ViewLayer *view_layer; | ||||
| /* TODO(sergey): Need to include window somehow (same layer might be in a | /* TODO(sergey): Need to include window somehow (same layer might be in a | ||||
| * different states in different windows). | * different states in different windows). | ||||
| */ | */ | ||||
| } DepsgraphKey; | } DepsgraphKey; | ||||
| static unsigned int depsgraph_key_hash(const void *key_v) | static unsigned int depsgraph_key_hash(const void *key_v) | ||||
| { | { | ||||
| const DepsgraphKey *key = key_v; | const DepsgraphKey *key = key_v; | ||||
| unsigned int hash = BLI_ghashutil_ptrhash(key->scene_layer); | unsigned int hash = BLI_ghashutil_ptrhash(key->view_layer); | ||||
| /* TODO(sergey): Include hash from other fields in the key. */ | /* TODO(sergey): Include hash from other fields in the key. */ | ||||
| return hash; | return hash; | ||||
| } | } | ||||
| static bool depsgraph_key_compare(const void *key_a_v, const void *key_b_v) | static bool depsgraph_key_compare(const void *key_a_v, const void *key_b_v) | ||||
| { | { | ||||
| const DepsgraphKey *key_a = key_a_v; | const DepsgraphKey *key_a = key_a_v; | ||||
| const DepsgraphKey *key_b = key_b_v; | const DepsgraphKey *key_b = key_b_v; | ||||
| /* TODO(sergey): Compare rest of */ | /* TODO(sergey): Compare rest of */ | ||||
| return !(key_a->scene_layer == key_b->scene_layer); | return !(key_a->view_layer == key_b->view_layer); | ||||
| } | } | ||||
| static void depsgraph_key_free(void *key_v) | static void depsgraph_key_free(void *key_v) | ||||
| { | { | ||||
| DepsgraphKey *key = key_v; | DepsgraphKey *key = key_v; | ||||
| MEM_freeN(key); | MEM_freeN(key); | ||||
| } | } | ||||
| Show All 25 Lines | void BKE_scene_free_depsgraph_hash(Scene *scene) | ||||
| BLI_ghash_free(scene->depsgraph_hash, | BLI_ghash_free(scene->depsgraph_hash, | ||||
| depsgraph_key_free, | depsgraph_key_free, | ||||
| depsgraph_key_value_free); | depsgraph_key_value_free); | ||||
| } | } | ||||
| /* Query depsgraph for a specific contexts. */ | /* Query depsgraph for a specific contexts. */ | ||||
| Depsgraph *BKE_scene_get_depsgraph(Scene *scene, | Depsgraph *BKE_scene_get_depsgraph(Scene *scene, | ||||
| SceneLayer *scene_layer, | ViewLayer *view_layer, | ||||
| bool allocate) | bool allocate) | ||||
| { | { | ||||
| BLI_assert(scene != NULL); | BLI_assert(scene != NULL); | ||||
| BLI_assert(scene_layer != NULL); | BLI_assert(view_layer != NULL); | ||||
| /* Make sure hash itself exists. */ | /* Make sure hash itself exists. */ | ||||
| if (allocate) { | if (allocate) { | ||||
| BKE_scene_ensure_depsgraph_hash(scene); | BKE_scene_ensure_depsgraph_hash(scene); | ||||
| } | } | ||||
| if (scene->depsgraph_hash == NULL) { | if (scene->depsgraph_hash == NULL) { | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| /* Either ensure item is in the hash or simply return NULL if it's not, | /* Either ensure item is in the hash or simply return NULL if it's not, | ||||
| * depending on whether caller wants us to create depsgraph or not. | * depending on whether caller wants us to create depsgraph or not. | ||||
| */ | */ | ||||
| DepsgraphKey key; | DepsgraphKey key; | ||||
| key.scene_layer = scene_layer; | key.view_layer = view_layer; | ||||
| Depsgraph *depsgraph; | Depsgraph *depsgraph; | ||||
| if (allocate) { | if (allocate) { | ||||
| DepsgraphKey **key_ptr; | DepsgraphKey **key_ptr; | ||||
| Depsgraph **depsgraph_ptr; | Depsgraph **depsgraph_ptr; | ||||
| if (!BLI_ghash_ensure_p_ex(scene->depsgraph_hash, | if (!BLI_ghash_ensure_p_ex(scene->depsgraph_hash, | ||||
| &key, | &key, | ||||
| (void***)&key_ptr, | (void***)&key_ptr, | ||||
| (void***)&depsgraph_ptr)) | (void***)&depsgraph_ptr)) | ||||
| Show All 12 Lines | |||||