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