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 #pragma once
18 
19 /** \file
20  * \ingroup bke
21  */
22 
23 #include "BKE_collection.h"
24 
25 #include "DNA_listBase.h"
26 #include "DNA_scene_types.h"
27 
28 #ifdef __cplusplus
29 extern "C" {
30 #endif
31 
32 #define TODO_LAYER_OVERRIDE  /* CollectionOverride */
33 #define TODO_LAYER_OPERATORS /* collection mamanger and property panel operators */
34 #define TODO_LAYER           /* generic todo */
35 
36 struct Base;
37 struct Collection;
38 struct Depsgraph;
39 struct LayerCollection;
40 struct Main;
41 struct Object;
42 struct Scene;
43 struct View3D;
44 struct ViewLayer;
45 
46 typedef enum eViewLayerCopyMethod {
47   VIEWLAYER_ADD_NEW = 0,
48   VIEWLAYER_ADD_EMPTY = 1,
49   VIEWLAYER_ADD_COPY = 2,
50 } eViewLayerCopyMethod;
51 
52 struct ViewLayer *BKE_view_layer_default_view(const struct Scene *scene);
53 struct ViewLayer *BKE_view_layer_default_render(const struct Scene *scene);
54 struct ViewLayer *BKE_view_layer_find(const struct Scene *scene, const char *layer_name);
55 struct ViewLayer *BKE_view_layer_add(Scene *scene,
56                                      const char *name,
57                                      ViewLayer *view_layer_source,
58                                      const int type);
59 
60 /* DEPRECATED */
61 struct ViewLayer *BKE_view_layer_context_active_PLACEHOLDER(const struct Scene *scene);
62 
63 void BKE_view_layer_free(struct ViewLayer *view_layer);
64 void BKE_view_layer_free_ex(struct ViewLayer *view_layer, const bool do_id_user);
65 
66 void BKE_view_layer_selected_objects_tag(struct ViewLayer *view_layer, const int tag);
67 
68 struct Object *BKE_view_layer_camera_find(struct ViewLayer *view_layer);
69 struct ViewLayer *BKE_view_layer_find_from_collection(const struct Scene *scene,
70                                                       struct LayerCollection *lc);
71 struct Base *BKE_view_layer_base_find(struct ViewLayer *view_layer, struct Object *ob);
72 void BKE_view_layer_base_deselect_all(struct ViewLayer *view_layer);
73 
74 void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, struct Base *selbase);
75 
76 void BKE_view_layer_copy_data(struct Scene *scene_dst,
77                               const struct Scene *scene_src,
78                               struct ViewLayer *view_layer_dst,
79                               const struct ViewLayer *view_layer_src,
80                               const int flag);
81 
82 void BKE_view_layer_rename(struct Main *bmain,
83                            struct Scene *scene,
84                            struct ViewLayer *view_layer,
85                            const char *name);
86 
87 struct LayerCollection *BKE_layer_collection_get_active(struct ViewLayer *view_layer);
88 bool BKE_layer_collection_activate(struct ViewLayer *view_layer, struct LayerCollection *lc);
89 struct LayerCollection *BKE_layer_collection_activate_parent(struct ViewLayer *view_layer,
90                                                              struct LayerCollection *lc);
91 
92 int BKE_layer_collection_count(struct ViewLayer *view_layer);
93 
94 struct LayerCollection *BKE_layer_collection_from_index(struct ViewLayer *view_layer,
95                                                         const int index);
96 int BKE_layer_collection_findindex(struct ViewLayer *view_layer, const struct LayerCollection *lc);
97 
98 void BKE_main_collection_sync(const struct Main *bmain);
99 void BKE_scene_collection_sync(const struct Scene *scene);
100 void BKE_layer_collection_sync(const struct Scene *scene, struct ViewLayer *view_layer);
101 void BKE_layer_collection_local_sync(struct ViewLayer *view_layer, const struct View3D *v3d);
102 void BKE_layer_collection_local_sync_all(const struct Main *bmain);
103 
104 void BKE_main_collection_sync_remap(const struct Main *bmain);
105 
106 struct LayerCollection *BKE_layer_collection_first_from_scene_collection(
107     struct ViewLayer *view_layer, const struct Collection *collection);
108 bool BKE_view_layer_has_collection(struct ViewLayer *view_layer,
109                                    const struct Collection *collection);
110 bool BKE_scene_has_object(struct Scene *scene, struct Object *ob);
111 
112 /* selection and hiding */
113 
114 bool BKE_layer_collection_objects_select(struct ViewLayer *view_layer,
115                                          struct LayerCollection *lc,
116                                          bool deselect);
117 bool BKE_layer_collection_has_selected_objects(struct ViewLayer *view_layer,
118                                                struct LayerCollection *lc);
119 bool BKE_layer_collection_has_layer_collection(struct LayerCollection *lc_parent,
120                                                struct LayerCollection *lc_child);
121 
122 void BKE_base_set_visible(struct Scene *scene,
123                           struct ViewLayer *view_layer,
124                           struct Base *base,
125                           bool extend);
126 bool BKE_base_is_visible(const struct View3D *v3d, const struct Base *base);
127 bool BKE_object_is_visible_in_viewport(const struct View3D *v3d, const struct Object *ob);
128 void BKE_layer_collection_isolate_global(struct Scene *scene,
129                                          struct ViewLayer *view_layer,
130                                          struct LayerCollection *lc,
131                                          bool extend);
132 void BKE_layer_collection_isolate_local(struct ViewLayer *view_layer,
133                                         const struct View3D *v3d,
134                                         struct LayerCollection *lc,
135                                         bool extend);
136 void BKE_layer_collection_set_visible(struct ViewLayer *view_layer,
137                                       struct LayerCollection *lc,
138                                       const bool visible,
139                                       const bool hierarchy);
140 void BKE_layer_collection_set_flag(struct LayerCollection *lc, const int flag, const bool value);
141 
142 /* evaluation */
143 
144 void BKE_base_eval_flags(struct Base *base);
145 
146 void BKE_layer_eval_view_layer_indexed(struct Depsgraph *depsgraph,
147                                        struct Scene *scene,
148                                        int view_layer_index);
149 
150 /* iterators */
151 
152 typedef struct ObjectsVisibleIteratorData {
153   struct ViewLayer *view_layer;
154   const struct View3D *v3d;
155 } ObjectsVisibleIteratorData;
156 
157 void BKE_view_layer_selected_objects_iterator_begin(BLI_Iterator *iter, void *data_in);
158 void BKE_view_layer_selected_objects_iterator_next(BLI_Iterator *iter);
159 void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter);
160 
161 void BKE_view_layer_visible_objects_iterator_begin(BLI_Iterator *iter, void *data_in);
162 void BKE_view_layer_visible_objects_iterator_next(BLI_Iterator *iter);
163 void BKE_view_layer_visible_objects_iterator_end(BLI_Iterator *iter);
164 
165 void BKE_view_layer_selected_editable_objects_iterator_begin(BLI_Iterator *iter, void *data_in);
166 void BKE_view_layer_selected_editable_objects_iterator_next(BLI_Iterator *iter);
167 void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *iter);
168 
169 struct ObjectsInModeIteratorData {
170   int object_mode;
171   int object_type;
172   struct ViewLayer *view_layer;
173   const struct View3D *v3d;
174   struct Base *base_active;
175 };
176 
177 void BKE_view_layer_bases_in_mode_iterator_begin(BLI_Iterator *iter, void *data_in);
178 void BKE_view_layer_bases_in_mode_iterator_next(BLI_Iterator *iter);
179 void BKE_view_layer_bases_in_mode_iterator_end(BLI_Iterator *iter);
180 
181 void BKE_view_layer_selected_bases_iterator_begin(BLI_Iterator *iter, void *data_in);
182 void BKE_view_layer_selected_bases_iterator_next(BLI_Iterator *iter);
183 void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *iter);
184 
185 void BKE_view_layer_visible_bases_iterator_begin(BLI_Iterator *iter, void *data_in);
186 void BKE_view_layer_visible_bases_iterator_next(BLI_Iterator *iter);
187 void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter);
188 
189 #define FOREACH_SELECTED_OBJECT_BEGIN(_view_layer, _v3d, _instance) \
190   { \
191     struct ObjectsVisibleIteratorData data_ = { \
192         .view_layer = _view_layer, \
193         .v3d = _v3d, \
194     }; \
195     ITER_BEGIN (BKE_view_layer_selected_objects_iterator_begin, \
196                 BKE_view_layer_selected_objects_iterator_next, \
197                 BKE_view_layer_selected_objects_iterator_end, \
198                 &data_, \
199                 Object *, \
200                 _instance)
201 
202 #define FOREACH_SELECTED_OBJECT_END \
203   ITER_END; \
204   } \
205   ((void)0)
206 
207 #define FOREACH_SELECTED_EDITABLE_OBJECT_BEGIN(_view_layer, _v3d, _instance) \
208   { \
209     struct ObjectsVisibleIteratorData data_ = { \
210         .view_layer = _view_layer, \
211         .v3d = _v3d, \
212     }; \
213     ITER_BEGIN (BKE_view_layer_selected_editable_objects_iterator_begin, \
214                 BKE_view_layer_selected_editable_objects_iterator_next, \
215                 BKE_view_layer_selected_editable_objects_iterator_end, \
216                 &data_, \
217                 Object *, \
218                 _instance)
219 
220 #define FOREACH_SELECTED_EDITABLE_OBJECT_END \
221   ITER_END; \
222   } \
223   ((void)0)
224 
225 #define FOREACH_VISIBLE_OBJECT_BEGIN(_view_layer, _v3d, _instance) \
226   { \
227     struct ObjectsVisibleIteratorData data_ = { \
228         .view_layer = _view_layer, \
229         .v3d = _v3d, \
230     }; \
231     ITER_BEGIN (BKE_view_layer_visible_objects_iterator_begin, \
232                 BKE_view_layer_visible_objects_iterator_next, \
233                 BKE_view_layer_visible_objects_iterator_end, \
234                 &data_, \
235                 Object *, \
236                 _instance)
237 
238 #define FOREACH_VISIBLE_OBJECT_END \
239   ITER_END; \
240   } \
241   ((void)0)
242 
243 #define FOREACH_BASE_IN_MODE_BEGIN(_view_layer, _v3d, _object_type, _object_mode, _instance) \
244   { \
245     struct ObjectsInModeIteratorData data_ = { \
246         .object_mode = _object_mode, \
247         .object_type = _object_type, \
248         .view_layer = _view_layer, \
249         .v3d = _v3d, \
250         .base_active = _view_layer->basact, \
251     }; \
252     ITER_BEGIN (BKE_view_layer_bases_in_mode_iterator_begin, \
253                 BKE_view_layer_bases_in_mode_iterator_next, \
254                 BKE_view_layer_bases_in_mode_iterator_end, \
255                 &data_, \
256                 Base *, \
257                 _instance)
258 
259 #define FOREACH_BASE_IN_MODE_END \
260   ITER_END; \
261   } \
262   ((void)0)
263 
264 #define FOREACH_BASE_IN_EDIT_MODE_BEGIN(_view_layer, _v3d, _instance) \
265   FOREACH_BASE_IN_MODE_BEGIN (_view_layer, _v3d, -1, OB_MODE_EDIT, _instance)
266 
267 #define FOREACH_BASE_IN_EDIT_MODE_END FOREACH_BASE_IN_MODE_END
268 
269 #define FOREACH_OBJECT_IN_MODE_BEGIN(_view_layer, _v3d, _object_type, _object_mode, _instance) \
270   FOREACH_BASE_IN_MODE_BEGIN (_view_layer, _v3d, _object_type, _object_mode, _base) { \
271     Object *_instance = _base->object;
272 
273 #define FOREACH_OBJECT_IN_MODE_END \
274   } \
275   FOREACH_BASE_IN_MODE_END
276 
277 #define FOREACH_OBJECT_IN_EDIT_MODE_BEGIN(_view_layer, _v3d, _instance) \
278   FOREACH_BASE_IN_EDIT_MODE_BEGIN (_view_layer, _v3d, _base) { \
279     Object *_instance = _base->object;
280 
281 #define FOREACH_OBJECT_IN_EDIT_MODE_END \
282   } \
283   FOREACH_BASE_IN_EDIT_MODE_END
284 
285 #define FOREACH_SELECTED_BASE_BEGIN(view_layer, _instance) \
286   ITER_BEGIN (BKE_view_layer_selected_bases_iterator_begin, \
287               BKE_view_layer_selected_bases_iterator_next, \
288               BKE_view_layer_selected_bases_iterator_end, \
289               view_layer, \
290               Base *, \
291               _instance)
292 
293 #define FOREACH_SELECTED_BASE_END ITER_END
294 
295 #define FOREACH_VISIBLE_BASE_BEGIN(_view_layer, _v3d, _instance) \
296   { \
297     struct ObjectsVisibleIteratorData data_ = { \
298         .view_layer = _view_layer, \
299         .v3d = _v3d, \
300     }; \
301     ITER_BEGIN (BKE_view_layer_visible_bases_iterator_begin, \
302                 BKE_view_layer_visible_bases_iterator_next, \
303                 BKE_view_layer_visible_bases_iterator_end, \
304                 &data_, \
305                 Base *, \
306                 _instance)
307 
308 #define FOREACH_VISIBLE_BASE_END \
309   ITER_END; \
310   } \
311   ((void)0)
312 
313 #define FOREACH_OBJECT_BEGIN(view_layer, _instance) \
314   { \
315     Object *_instance; \
316     Base *_base; \
317     for (_base = (view_layer)->object_bases.first; _base; _base = _base->next) { \
318       _instance = _base->object;
319 
320 #define FOREACH_OBJECT_END \
321   } \
322   } \
323   ((void)0)
324 
325 #define FOREACH_OBJECT_FLAG_BEGIN(scene, _view_layer, _v3d, flag, _instance) \
326   { \
327     IteratorBeginCb func_begin; \
328     IteratorCb func_next, func_end; \
329     void *data_in; \
330     struct ObjectsVisibleIteratorData data_ = { \
331         .view_layer = _view_layer, \
332         .v3d = _v3d, \
333     }; \
334 \
335     if (flag == SELECT) { \
336       func_begin = &BKE_view_layer_selected_objects_iterator_begin; \
337       func_next = &BKE_view_layer_selected_objects_iterator_next; \
338       func_end = &BKE_view_layer_selected_objects_iterator_end; \
339       data_in = &data_; \
340     } \
341     else { \
342       func_begin = BKE_scene_objects_iterator_begin; \
343       func_next = BKE_scene_objects_iterator_next; \
344       func_end = BKE_scene_objects_iterator_end; \
345       data_in = (scene); \
346     } \
347     ITER_BEGIN (func_begin, func_next, func_end, data_in, Object *, _instance)
348 
349 #define FOREACH_OBJECT_FLAG_END \
350   ITER_END; \
351   } \
352   ((void)0)
353 
354 /* layer_utils.c */
355 
356 struct ObjectsInViewLayerParams {
357   uint no_dup_data : 1;
358 
359   bool (*filter_fn)(struct Object *ob, void *user_data);
360   void *filter_userdata;
361 };
362 
363 struct Object **BKE_view_layer_array_selected_objects_params(
364     struct ViewLayer *view_layer,
365     const struct View3D *v3d,
366     uint *r_len,
367     const struct ObjectsInViewLayerParams *params);
368 
369 #define BKE_view_layer_array_selected_objects(view_layer, v3d, r_len, ...) \
370   BKE_view_layer_array_selected_objects_params( \
371       view_layer, v3d, r_len, &(const struct ObjectsInViewLayerParams)__VA_ARGS__)
372 
373 struct ObjectsInModeParams {
374   int object_mode;
375   uint no_dup_data : 1;
376 
377   bool (*filter_fn)(struct Object *ob, void *user_data);
378   void *filter_userdata;
379 };
380 
381 Base **BKE_view_layer_array_from_bases_in_mode_params(struct ViewLayer *view_layer,
382                                                       const struct View3D *v3d,
383                                                       uint *r_len,
384                                                       const struct ObjectsInModeParams *params);
385 
386 struct Object **BKE_view_layer_array_from_objects_in_mode_params(
387     struct ViewLayer *view_layer,
388     const struct View3D *v3d,
389     uint *len,
390     const struct ObjectsInModeParams *params);
391 
392 #define BKE_view_layer_array_from_objects_in_mode(view_layer, v3d, r_len, ...) \
393   BKE_view_layer_array_from_objects_in_mode_params( \
394       view_layer, v3d, r_len, &(const struct ObjectsInModeParams)__VA_ARGS__)
395 
396 #define BKE_view_layer_array_from_bases_in_mode(view_layer, v3d, r_len, ...) \
397   BKE_view_layer_array_from_bases_in_mode_params( \
398       view_layer, v3d, r_len, &(const struct ObjectsInModeParams)__VA_ARGS__)
399 
400 bool BKE_view_layer_filter_edit_mesh_has_uvs(struct Object *ob, void *user_data);
401 bool BKE_view_layer_filter_edit_mesh_has_edges(struct Object *ob, void *user_data);
402 
403 /* Utility macros that wrap common args (add more as needed). */
404 
405 #define BKE_view_layer_array_from_objects_in_edit_mode(view_layer, v3d, r_len) \
406   BKE_view_layer_array_from_objects_in_mode(view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT})
407 
408 #define BKE_view_layer_array_from_bases_in_edit_mode(view_layer, v3d, r_len) \
409   BKE_view_layer_array_from_bases_in_mode(view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT})
410 
411 #define BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, v3d, r_len) \
412   BKE_view_layer_array_from_objects_in_mode( \
413       view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT, .no_dup_data = true})
414 
415 #define BKE_view_layer_array_from_bases_in_edit_mode_unique_data(view_layer, v3d, r_len) \
416   BKE_view_layer_array_from_bases_in_mode( \
417       view_layer, v3d, r_len, {.object_mode = OB_MODE_EDIT, .no_dup_data = true})
418 
419 #define BKE_view_layer_array_from_objects_in_edit_mode_unique_data_with_uvs( \
420     view_layer, v3d, r_len) \
421   BKE_view_layer_array_from_objects_in_mode( \
422       view_layer, \
423       v3d, \
424       r_len, \
425       {.object_mode = OB_MODE_EDIT, \
426        .no_dup_data = true, \
427        .filter_fn = BKE_view_layer_filter_edit_mesh_has_uvs})
428 
429 #define BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, v3d, r_len, mode) \
430   BKE_view_layer_array_from_objects_in_mode( \
431       view_layer, v3d, r_len, {.object_mode = mode, .no_dup_data = true})
432 
433 #ifdef __cplusplus
434 }
435 #endif
436