Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/scene/scene_edit.c
| Show First 20 Lines • Show All 117 Lines • ▼ Show 20 Lines | void ED_scene_exit(bContext *C) | ||||
| ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO); | ED_object_editmode_exit(C, EM_FREEDATA | EM_DO_UNDO); | ||||
| } | } | ||||
| void ED_scene_changed_update(Main *bmain, bContext *C, Scene *scene_new, const bScreen *active_screen) | void ED_scene_changed_update(Main *bmain, bContext *C, Scene *scene_new, const bScreen *active_screen) | ||||
| { | { | ||||
| /* XXX Just using active scene render-layer for workspace when switching, | /* XXX Just using active scene render-layer for workspace when switching, | ||||
| * but workspace should remember the last one set. Could store render-layer | * but workspace should remember the last one set. Could store render-layer | ||||
| * per window-workspace combination (using WorkSpaceDataRelation) */ | * per window-workspace combination (using WorkSpaceDataRelation) */ | ||||
| SceneLayer *layer_new = BLI_findlink(&scene_new->render_layers, scene_new->active_layer); | ViewLayer *layer_new = BLI_findlink(&scene_new->view_layers, scene_new->active_view_layer); | ||||
| Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene_new, layer_new, true); | Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene_new, layer_new, true); | ||||
| CTX_data_scene_set(C, scene_new); | CTX_data_scene_set(C, scene_new); | ||||
| BKE_workspace_render_layer_set(CTX_wm_workspace(C), layer_new); | BKE_workspace_view_layer_set(CTX_wm_workspace(C), layer_new); | ||||
| BKE_scene_set_background(bmain, scene_new); | BKE_scene_set_background(bmain, scene_new); | ||||
| DEG_graph_relations_update(depsgraph, bmain, scene_new, layer_new); | DEG_graph_relations_update(depsgraph, bmain, scene_new, layer_new); | ||||
| DEG_on_visible_update(bmain, false); | DEG_on_visible_update(bmain, false); | ||||
| ED_screen_update_after_scene_change(active_screen, scene_new, layer_new); | ED_screen_update_after_scene_change(active_screen, scene_new, layer_new); | ||||
| ED_render_engine_changed(bmain); | ED_render_engine_changed(bmain); | ||||
| ED_update_for_newframe(bmain, scene_new, layer_new, depsgraph); | ED_update_for_newframe(bmain, scene_new, layer_new, depsgraph); | ||||
| /* complete redraw */ | /* complete redraw */ | ||||
| WM_event_add_notifier(C, NC_WINDOW, NULL); | WM_event_add_notifier(C, NC_WINDOW, NULL); | ||||
| } | } | ||||
| static bool scene_render_layer_remove_poll( | static bool view_layer_remove_poll( | ||||
| const Scene *scene, const SceneLayer *layer) | const Scene *scene, const ViewLayer *layer) | ||||
| { | { | ||||
| const int act = BLI_findindex(&scene->render_layers, layer); | const int act = BLI_findindex(&scene->view_layers, layer); | ||||
| if (act == -1) { | if (act == -1) { | ||||
| return false; | return false; | ||||
| } | } | ||||
| else if ((scene->render_layers.first == scene->render_layers.last) && | else if ((scene->view_layers.first == scene->view_layers.last) && | ||||
| (scene->render_layers.first == layer)) | (scene->view_layers.first == layer)) | ||||
| { | { | ||||
| /* ensure 1 layer is kept */ | /* ensure 1 layer is kept */ | ||||
| return false; | return false; | ||||
| } | } | ||||
| return true; | return true; | ||||
| } | } | ||||
| static void scene_render_layer_remove_unset_nodetrees(const Main *bmain, Scene *scene, SceneLayer *layer) | static void view_layer_remove_unset_nodetrees(const Main *bmain, Scene *scene, ViewLayer *layer) | ||||
| { | { | ||||
| int act_layer_index = BLI_findindex(&scene->render_layers, layer); | int act_layer_index = BLI_findindex(&scene->view_layers, layer); | ||||
| for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) { | for (Scene *sce = bmain->scene.first; sce; sce = sce->id.next) { | ||||
| if (sce->nodetree) { | if (sce->nodetree) { | ||||
| BKE_nodetree_remove_layer_n(sce->nodetree, scene, act_layer_index); | BKE_nodetree_remove_layer_n(sce->nodetree, scene, act_layer_index); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| bool ED_scene_render_layer_delete( | bool ED_scene_view_layer_delete( | ||||
| Main *bmain, Scene *scene, SceneLayer *layer, | Main *bmain, Scene *scene, ViewLayer *layer, | ||||
| ReportList *reports) | ReportList *reports) | ||||
| { | { | ||||
| if (scene_render_layer_remove_poll(scene, layer) == false) { | if (view_layer_remove_poll(scene, layer) == false) { | ||||
| if (reports) { | if (reports) { | ||||
| BKE_reportf(reports, RPT_ERROR, "Render layer '%s' could not be removed from scene '%s'", | BKE_reportf(reports, RPT_ERROR, "View layer '%s' could not be removed from scene '%s'", | ||||
| layer->name, scene->id.name + 2); | layer->name, scene->id.name + 2); | ||||
| } | } | ||||
| return false; | return false; | ||||
| } | } | ||||
| BLI_remlink(&scene->render_layers, layer); | BLI_remlink(&scene->view_layers, layer); | ||||
| BLI_assert(BLI_listbase_is_empty(&scene->render_layers) == false); | BLI_assert(BLI_listbase_is_empty(&scene->view_layers) == false); | ||||
| scene->active_layer = 0; | scene->active_view_layer = 0; | ||||
| ED_workspace_render_layer_unset(bmain, layer, scene->render_layers.first); | ED_workspace_view_layer_unset(bmain, layer, scene->view_layers.first); | ||||
| scene_render_layer_remove_unset_nodetrees(bmain, scene, layer); | view_layer_remove_unset_nodetrees(bmain, scene, layer); | ||||
| BKE_scene_layer_free(layer); | BKE_view_layer_free(layer); | ||||
| DEG_id_tag_update(&scene->id, 0); | DEG_id_tag_update(&scene->id, 0); | ||||
| DEG_relations_tag_update(bmain); | DEG_relations_tag_update(bmain); | ||||
| WM_main_add_notifier(NC_SCENE | ND_LAYER | NA_REMOVED, scene); | WM_main_add_notifier(NC_SCENE | ND_LAYER | NA_REMOVED, scene); | ||||
| return true; | return true; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 73 Lines • Show Last 20 Lines | |||||