Cleanup: style, use braces for editors
[blender.git] / source / blender / editors / scene / scene_edit.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup edscene
19  */
20
21 #include <stdio.h>
22 #include <string.h>
23
24 #include "BLI_compiler_attrs.h"
25 #include "BLI_listbase.h"
26 #include "BLI_string.h"
27
28 #include "BKE_context.h"
29 #include "BKE_global.h"
30 #include "BKE_layer.h"
31 #include "BKE_library.h"
32 #include "BKE_library_remap.h"
33 #include "BKE_main.h"
34 #include "BKE_node.h"
35 #include "BKE_report.h"
36 #include "BKE_scene.h"
37 #include "BKE_workspace.h"
38
39 #include "DEG_depsgraph.h"
40 #include "DEG_depsgraph_build.h"
41
42 #include "BLT_translation.h"
43
44 #include "DNA_object_types.h"
45 #include "DNA_workspace_types.h"
46
47 #include "ED_object.h"
48 #include "ED_render.h"
49 #include "ED_scene.h"
50 #include "ED_screen.h"
51 #include "ED_util.h"
52
53 #include "RNA_access.h"
54 #include "RNA_define.h"
55
56 #include "WM_api.h"
57 #include "WM_types.h"
58
59 Scene *ED_scene_add(Main *bmain, bContext *C, wmWindow *win, eSceneCopyMethod method)
60 {
61   Scene *scene_new;
62
63   if (method == SCE_COPY_NEW) {
64     scene_new = BKE_scene_add(bmain, DATA_("Scene"));
65   }
66   else { /* different kinds of copying */
67     Scene *scene_old = WM_window_get_active_scene(win);
68
69     scene_new = BKE_scene_copy(bmain, scene_old, method);
70
71     /* these can't be handled in blenkernel currently, so do them here */
72     if (method == SCE_COPY_FULL) {
73       ED_editors_flush_edits(bmain, false);
74       ED_object_single_users(bmain, scene_new, true, true);
75     }
76   }
77
78   WM_window_set_active_scene(bmain, C, win, scene_new);
79
80   WM_event_add_notifier(C, NC_SCENE | ND_SCENEBROWSE, scene_new);
81
82   return scene_new;
83 }
84
85 /**
86  * \note Only call outside of area/region loops
87  * \return true if successful
88  */
89 bool ED_scene_delete(bContext *C, Main *bmain, wmWindow *win, Scene *scene)
90 {
91   Scene *scene_new;
92
93   /* kill running jobs */
94   wmWindowManager *wm = bmain->wm.first;
95   WM_jobs_kill_type(wm, scene, WM_JOB_TYPE_ANY);
96
97   if (scene->id.prev) {
98     scene_new = scene->id.prev;
99   }
100   else if (scene->id.next) {
101     scene_new = scene->id.next;
102   }
103   else {
104     return false;
105   }
106
107   WM_window_set_active_scene(bmain, C, win, scene_new);
108
109   BKE_id_delete(bmain, scene);
110
111   return true;
112 }
113
114 /* Depsgraph updates after scene becomes active in a window. */
115 void ED_scene_change_update(Main *bmain, Scene *scene, ViewLayer *layer)
116 {
117   Depsgraph *depsgraph = BKE_scene_get_depsgraph(scene, layer, true);
118
119   BKE_scene_set_background(bmain, scene);
120   DEG_graph_relations_update(depsgraph, bmain, scene, layer);
121   DEG_on_visible_update(bmain, false);
122
123   ED_render_engine_changed(bmain);
124   ED_update_for_newframe(bmain, depsgraph);
125 }
126
127 static bool view_layer_remove_poll(const Scene *scene, const ViewLayer *layer)
128 {
129   const int act = BLI_findindex(&scene->view_layers, layer);
130
131   if (act == -1) {
132     return false;
133   }
134   else if ((scene->view_layers.first == scene->view_layers.last) &&
135            (scene->view_layers.first == layer)) {
136     /* ensure 1 layer is kept */
137     return false;
138   }
139
140   return true;
141 }
142
143 static void view_layer_remove_unset_nodetrees(const Main *bmain, Scene *scene, ViewLayer *layer)
144 {
145   int act_layer_index = BLI_findindex(&scene->view_layers, layer);
146
147   for (Scene *sce = bmain->scenes.first; sce; sce = sce->id.next) {
148     if (sce->nodetree) {
149       BKE_nodetree_remove_layer_n(sce->nodetree, scene, act_layer_index);
150     }
151   }
152 }
153
154 bool ED_scene_view_layer_delete(Main *bmain, Scene *scene, ViewLayer *layer, ReportList *reports)
155 {
156   if (view_layer_remove_poll(scene, layer) == false) {
157     if (reports) {
158       BKE_reportf(reports,
159                   RPT_ERROR,
160                   "View layer '%s' could not be removed from scene '%s'",
161                   layer->name,
162                   scene->id.name + 2);
163     }
164
165     return false;
166   }
167
168   /* We need to unset nodetrees before removing the layer, otherwise its index will be -1. */
169   view_layer_remove_unset_nodetrees(bmain, scene, layer);
170
171   BLI_remlink(&scene->view_layers, layer);
172   BLI_assert(BLI_listbase_is_empty(&scene->view_layers) == false);
173
174   /* Remove from windows. */
175   wmWindowManager *wm = bmain->wm.first;
176   for (wmWindow *win = wm->windows.first; win; win = win->next) {
177     if (win->scene == scene && STREQ(win->view_layer_name, layer->name)) {
178       ViewLayer *first_layer = BKE_view_layer_default_view(scene);
179       STRNCPY(win->view_layer_name, first_layer->name);
180     }
181   }
182
183   BKE_view_layer_free(layer);
184
185   DEG_id_tag_update(&scene->id, 0);
186   DEG_relations_tag_update(bmain);
187   WM_main_add_notifier(NC_SCENE | ND_LAYER | NA_REMOVED, scene);
188
189   return true;
190 }
191
192 static int scene_new_exec(bContext *C, wmOperator *op)
193 {
194   Main *bmain = CTX_data_main(C);
195   wmWindow *win = CTX_wm_window(C);
196   int type = RNA_enum_get(op->ptr, "type");
197
198   ED_scene_add(bmain, C, win, type);
199
200   return OPERATOR_FINISHED;
201 }
202
203 static void SCENE_OT_new(wmOperatorType *ot)
204 {
205   static EnumPropertyItem type_items[] = {
206       {SCE_COPY_NEW, "NEW", 0, "New", "Add a new, empty scene with default settings"},
207       {SCE_COPY_EMPTY,
208        "EMPTY",
209        0,
210        "Copy Settings",
211        "Add a new, empty scene, and copy settings from the current scene"},
212       {SCE_COPY_LINK_COLLECTION,
213        "LINK_COPY",
214        0,
215        "Linked Copy",
216        "Link in the collections from the current scene (shallow copy)"},
217       {SCE_COPY_FULL, "FULL_COPY", 0, "Full Copy", "Make a full copy of the current scene"},
218       {0, NULL, 0, NULL, NULL},
219   };
220
221   /* identifiers */
222   ot->name = "New Scene";
223   ot->description = "Add new scene by type";
224   ot->idname = "SCENE_OT_new";
225
226   /* api callbacks */
227   ot->exec = scene_new_exec;
228   ot->invoke = WM_menu_invoke;
229
230   /* flags */
231   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
232
233   /* properties */
234   ot->prop = RNA_def_enum(ot->srna, "type", type_items, 0, "Type", "");
235 }
236
237 static bool scene_delete_poll(bContext *C)
238 {
239   Scene *scene = CTX_data_scene(C);
240   return (scene->id.prev || scene->id.next);
241 }
242
243 static int scene_delete_exec(bContext *C, wmOperator *UNUSED(op))
244 {
245   Scene *scene = CTX_data_scene(C);
246
247   if (ED_scene_delete(C, CTX_data_main(C), CTX_wm_window(C), scene) == false) {
248     return OPERATOR_CANCELLED;
249   }
250
251   if (G.debug & G_DEBUG) {
252     printf("scene delete %p\n", scene);
253   }
254
255   WM_event_add_notifier(C, NC_SCENE | NA_REMOVED, scene);
256
257   return OPERATOR_FINISHED;
258 }
259
260 static void SCENE_OT_delete(wmOperatorType *ot)
261 {
262   /* identifiers */
263   ot->name = "Delete Scene";
264   ot->description = "Delete active scene";
265   ot->idname = "SCENE_OT_delete";
266
267   /* api callbacks */
268   ot->exec = scene_delete_exec;
269   ot->poll = scene_delete_poll;
270
271   /* flags */
272   ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
273 }
274
275 void ED_operatortypes_scene(void)
276 {
277   WM_operatortype_append(SCENE_OT_new);
278   WM_operatortype_append(SCENE_OT_delete);
279 }