Blender  V3.3
BKE_collection.h
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #pragma once
4 
9 #include "BLI_compiler_compat.h"
10 #include "BLI_ghash.h"
11 #include "BLI_iterator.h"
12 #include "BLI_sys_types.h"
13 
14 #include "DNA_listBase.h"
15 
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19 
20 /* Structs */
21 
22 struct BLI_Iterator;
23 struct Base;
24 struct BlendDataReader;
25 struct BlendExpander;
26 struct BlendLibReader;
27 struct BlendWriter;
28 struct Collection;
29 struct Library;
30 struct Main;
31 struct Object;
32 struct Scene;
33 struct SceneCollection;
34 struct ViewLayer;
35 
36 typedef struct CollectionParent {
40 
41 /* Collections */
42 
47 struct Collection *BKE_collection_add(struct Main *bmain,
48  struct Collection *parent,
49  const char *name);
57  struct Scene *scene,
58  const struct Object *ob_src,
59  struct Collection *collection_dst);
66 void BKE_collection_add_from_collection(struct Main *bmain,
67  struct Scene *scene,
68  struct Collection *collection_src,
69  struct Collection *collection_dst);
73 void BKE_collection_free_data(struct Collection *collection);
78 bool BKE_collection_delete(struct Main *bmain, struct Collection *collection, bool hierarchy);
79 
89  struct Collection *parent,
90  struct Collection *collection,
91  uint duplicate_flags,
92  uint duplicate_options);
93 
94 /* Master Collection for Scene */
95 
96 #define BKE_SCENE_COLLECTION_NAME "Scene Collection"
98 
99 /* Collection Objects */
100 
101 bool BKE_collection_has_object(struct Collection *collection, const struct Object *ob);
102 bool BKE_collection_has_object_recursive(struct Collection *collection, struct Object *ob);
104  struct Object *ob);
105 struct Collection *BKE_collection_object_find(struct Main *bmain,
106  struct Scene *scene,
107  struct Collection *collection,
108  struct Object *ob);
109 bool BKE_collection_is_empty(const struct Collection *collection);
110 
115 bool BKE_collection_object_add(struct Main *bmain,
116  struct Collection *collection,
117  struct Object *ob);
118 
126  const struct ViewLayer *view_layer,
127  struct Collection *collection,
128  struct Object *ob);
129 
135 bool BKE_collection_object_add_notest(struct Main *bmain,
136  struct Collection *collection,
137  struct Object *ob);
144 void BKE_collection_object_add_from(struct Main *bmain,
145  struct Scene *scene,
146  struct Object *ob_src,
147  struct Object *ob_dst);
151 bool BKE_collection_object_remove(struct Main *bmain,
152  struct Collection *collection,
153  struct Object *object,
154  bool free_us);
160 void BKE_collection_object_move(struct Main *bmain,
161  struct Scene *scene,
162  struct Collection *collection_dst,
163  struct Collection *collection_src,
164  struct Object *ob);
165 
169 bool BKE_scene_collections_object_remove(struct Main *bmain,
170  struct Scene *scene,
171  struct Object *object,
172  bool free_us);
173 
178 void BKE_collections_object_remove_nulls(struct Main *bmain);
179 
187 
200 void BKE_collections_child_remove_nulls(struct Main *bmain,
201  struct Collection *parent_collection,
202  struct Collection *child_collection);
203 
204 /* Dependencies. */
205 
206 bool BKE_collection_is_in_scene(struct Collection *collection);
207 void BKE_collections_after_lib_link(struct Main *bmain);
208 bool BKE_collection_object_cyclic_check(struct Main *bmain,
209  struct Object *object,
210  struct Collection *collection);
211 
212 /* Object list cache. */
213 
214 struct ListBase BKE_collection_object_cache_get(struct Collection *collection);
216 void BKE_collection_object_cache_free(struct Collection *collection);
217 
218 struct Base *BKE_collection_or_layer_objects(const struct ViewLayer *view_layer,
219  struct Collection *collection);
220 
221 /* Editing. */
222 
228 struct Collection *BKE_collection_from_index(struct Scene *scene, int index);
232 void BKE_collection_new_name_get(struct Collection *collection_parent, char *rname);
236 const char *BKE_collection_ui_name_get(struct Collection *collection);
241 bool BKE_collection_objects_select(struct ViewLayer *view_layer,
242  struct Collection *collection,
243  bool deselect);
244 
245 /* Collection children */
246 
247 bool BKE_collection_child_add(struct Main *bmain,
248  struct Collection *parent,
249  struct Collection *child);
250 
251 bool BKE_collection_child_add_no_sync(struct Collection *parent, struct Collection *child);
252 
253 bool BKE_collection_child_remove(struct Main *bmain,
254  struct Collection *parent,
255  struct Collection *child);
256 
257 bool BKE_collection_move(struct Main *bmain,
258  struct Collection *to_parent,
259  struct Collection *from_parent,
260  struct Collection *relative,
261  bool relative_after,
262  struct Collection *collection);
263 
273 bool BKE_collection_cycle_find(struct Collection *new_ancestor, struct Collection *collection);
280 bool BKE_collection_cycles_fix(struct Main *bmain, struct Collection *collection);
281 
282 bool BKE_collection_has_collection(const struct Collection *parent,
283  const struct Collection *collection);
284 
289  const struct ViewLayer *view_layer, struct Collection *collection);
295 void BKE_collection_parent_relations_rebuild(struct Collection *collection);
300 
301 /* .blend file I/O */
302 
303 void BKE_collection_blend_write_nolib(struct BlendWriter *writer, struct Collection *collection);
304 void BKE_collection_blend_read_data(struct BlendDataReader *reader, struct Collection *collection);
305 void BKE_collection_blend_read_lib(struct BlendLibReader *reader, struct Collection *collection);
306 void BKE_collection_blend_read_expand(struct BlendExpander *expander,
307  struct Collection *collection);
308 
310  struct SceneCollection *sc);
312  struct Library *lib,
313  struct SceneCollection *sc);
315  struct SceneCollection *sc);
316 
317 /* Iteration callbacks. */
318 
319 typedef void (*BKE_scene_objects_Cb)(struct Object *ob, void *data);
320 typedef void (*BKE_scene_collections_Cb)(struct Collection *ob, void *data);
321 
322 /* Iteration over objects in collection. */
323 
324 #define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_BEGIN(_collection, _object, _mode) \
325  { \
326  int _base_flag = (_mode == DAG_EVAL_VIEWPORT) ? BASE_ENABLED_VIEWPORT : BASE_ENABLED_RENDER; \
327  int _object_visibility_flag = (_mode == DAG_EVAL_VIEWPORT) ? OB_HIDE_VIEWPORT : \
328  OB_HIDE_RENDER; \
329  int _base_id = 0; \
330  for (Base *_base = (Base *)BKE_collection_object_cache_get(_collection).first; _base; \
331  _base = _base->next, _base_id++) { \
332  Object *_object = _base->object; \
333  if ((_base->flag & _base_flag) && \
334  (_object->visibility_flag & _object_visibility_flag) == 0) {
335 
336 #define FOREACH_COLLECTION_VISIBLE_OBJECT_RECURSIVE_END \
337  } \
338  } \
339  } \
340  ((void)0)
341 
342 #define FOREACH_COLLECTION_OBJECT_RECURSIVE_BEGIN(_collection, _object) \
343  for (Base *_base = (Base *)BKE_collection_object_cache_get(_collection).first; _base; \
344  _base = _base->next) { \
345  Object *_object = _base->object; \
346  BLI_assert(_object != NULL);
347 
348 #define FOREACH_COLLECTION_OBJECT_RECURSIVE_END \
349  } \
350  ((void)0)
351 
352 /* Iteration over collections in scene. */
353 
358 void BKE_scene_collections_iterator_begin(struct BLI_Iterator *iter, void *data_in);
361 
362 void BKE_scene_objects_iterator_begin(struct BLI_Iterator *iter, void *data_in);
365 
371  struct Scene *scene;
372  int flag;
373  void *iter_data;
375 
376 void BKE_scene_objects_iterator_begin_ex(struct BLI_Iterator *iter, void *data_in);
379 
387 struct GSet *BKE_scene_objects_as_gset(struct Scene *scene, struct GSet *objects_gset);
388 
389 #define FOREACH_SCENE_COLLECTION_BEGIN(scene, _instance) \
390  ITER_BEGIN (BKE_scene_collections_iterator_begin, \
391  BKE_scene_collections_iterator_next, \
392  BKE_scene_collections_iterator_end, \
393  scene, \
394  Collection *, \
395  _instance)
396 
397 #define FOREACH_SCENE_COLLECTION_END ITER_END
398 
399 #define FOREACH_COLLECTION_BEGIN(_bmain, _scene, Type, _instance) \
400  { \
401  Type _instance; \
402  Collection *_instance_next; \
403  bool is_scene_collection = (_scene) != NULL; \
404 \
405  if (_scene) { \
406  _instance_next = _scene->master_collection; \
407  } \
408  else { \
409  _instance_next = (_bmain)->collections.first; \
410  } \
411 \
412  while ((_instance = _instance_next)) { \
413  if (is_scene_collection) { \
414  _instance_next = (_bmain)->collections.first; \
415  is_scene_collection = false; \
416  } \
417  else { \
418  _instance_next = _instance->id.next; \
419  }
420 
421 #define FOREACH_COLLECTION_END \
422  } \
423  } \
424  ((void)0)
425 
426 #define FOREACH_SCENE_OBJECT_BEGIN(scene, _instance) \
427  ITER_BEGIN (BKE_scene_objects_iterator_begin, \
428  BKE_scene_objects_iterator_next, \
429  BKE_scene_objects_iterator_end, \
430  scene, \
431  Object *, \
432  _instance)
433 
434 #define FOREACH_SCENE_OBJECT_END ITER_END
435 
436 #ifdef __cplusplus
437 }
438 #endif
struct Collection * BKE_collection_add(struct Main *bmain, struct Collection *parent, const char *name)
Definition: collection.c:425
void BKE_scene_objects_iterator_next(struct BLI_Iterator *iter)
Definition: collection.c:2042
void BKE_scene_objects_iterator_begin_ex(struct BLI_Iterator *iter, void *data_in)
Definition: collection.c:1985
bool BKE_collection_cycle_find(struct Collection *new_ancestor, struct Collection *collection)
Definition: collection.c:1435
struct ListBase BKE_collection_object_cache_get(struct Collection *collection)
Definition: collection.c:787
void(* BKE_scene_collections_Cb)(struct Collection *ob, void *data)
bool BKE_collection_child_add(struct Main *bmain, struct Collection *parent, struct Collection *child)
Definition: collection.c:1585
void BKE_collections_child_remove_nulls(struct Main *bmain, struct Collection *parent_collection, struct Collection *child_collection)
Definition: collection.c:1322
struct Collection * BKE_collection_object_find(struct Main *bmain, struct Scene *scene, struct Collection *collection, struct Object *ob)
Definition: collection.c:950
const char * BKE_collection_ui_name_get(struct Collection *collection)
Definition: collection.c:736
bool BKE_collection_cycles_fix(struct Main *bmain, struct Collection *collection)
Definition: collection.c:1498
void BKE_scene_objects_iterator_next_ex(struct BLI_Iterator *iter)
Definition: collection.c:1998
struct Collection * BKE_collection_duplicate(struct Main *bmain, struct Collection *parent, struct Collection *collection, uint duplicate_flags, uint duplicate_options)
void BKE_collection_object_cache_free(struct Collection *collection)
Definition: collection.c:832
void BKE_collection_object_add_from(struct Main *bmain, struct Scene *scene, struct Object *ob_src, struct Object *ob_dst)
Definition: collection.c:1148
void BKE_collections_object_remove_duplicates(struct Main *bmain)
Definition: collection.c:1289
bool BKE_collection_object_add(struct Main *bmain, struct Collection *collection, struct Object *ob)
Definition: collection.c:1125
void BKE_scene_collections_iterator_begin(struct BLI_Iterator *iter, void *data_in)
Definition: collection.c:1884
bool BKE_collection_has_object_recursive_instanced(struct Collection *collection, struct Object *ob)
Definition: collection.c:931
bool BKE_collection_object_cyclic_check(struct Main *bmain, struct Object *object, struct Collection *collection)
Definition: collection.c:898
struct GSet * BKE_scene_objects_as_gset(struct Scene *scene, struct GSet *objects_gset)
Definition: collection.c:2086
void BKE_collection_blend_read_data(struct BlendDataReader *reader, struct Collection *collection)
Definition: collection.c:236
void BKE_collection_compat_blend_read_lib(struct BlendLibReader *reader, struct Library *lib, struct SceneCollection *sc)
void BKE_collection_blend_read_lib(struct BlendLibReader *reader, struct Collection *collection)
Definition: collection.c:302
struct CollectionParent CollectionParent
void BKE_collection_compat_blend_read_expand(struct BlendExpander *expander, struct SceneCollection *sc)
void BKE_collection_add_from_object(struct Main *bmain, struct Scene *scene, const struct Object *ob_src, struct Collection *collection_dst)
void BKE_scene_objects_iterator_end_ex(struct BLI_Iterator *iter)
Definition: collection.c:2013
void BKE_collection_free_data(struct Collection *collection)
Definition: collection.c:489
bool BKE_collection_has_object(struct Collection *collection, const struct Object *ob)
bool BKE_collection_viewlayer_object_add(struct Main *bmain, const struct ViewLayer *view_layer, struct Collection *collection, struct Object *ob)
bool BKE_collection_has_object_recursive(struct Collection *collection, struct Object *ob)
Definition: collection.c:921
bool BKE_collection_child_remove(struct Main *bmain, struct Collection *parent, struct Collection *child)
Definition: collection.c:1600
bool BKE_collection_object_remove(struct Main *bmain, struct Collection *collection, struct Object *object, bool free_us)
Definition: collection.c:1170
void BKE_collection_new_name_get(struct Collection *collection_parent, char *rname)
Definition: collection.c:713
bool BKE_collection_object_add_notest(struct Main *bmain, struct Collection *collection, struct Object *ob)
Definition: collection.c:1099
bool BKE_collection_has_collection(const struct Collection *parent, const struct Collection *collection)
void BKE_collection_compat_blend_read_data(struct BlendDataReader *reader, struct SceneCollection *sc)
bool BKE_scene_collections_object_remove(struct Main *bmain, struct Scene *scene, struct Object *object, bool free_us)
Definition: collection.c:1224
void BKE_collection_add_from_collection(struct Main *bmain, struct Scene *scene, struct Collection *collection_src, struct Collection *collection_dst)
Definition: collection.c:455
void BKE_collections_object_remove_nulls(struct Main *bmain)
Definition: collection.c:1250
struct SceneObjectsIteratorExData SceneObjectsIteratorExData
bool BKE_collection_is_in_scene(struct Collection *collection)
Definition: collection.c:1385
struct Collection * BKE_collection_master_add(void)
Definition: collection.c:852
bool BKE_collection_child_add_no_sync(struct Collection *parent, struct Collection *child)
Definition: collection.c:1595
void BKE_collection_blend_read_expand(struct BlendExpander *expander, struct Collection *collection)
Definition: collection.c:337
void BKE_scene_objects_iterator_end(struct BLI_Iterator *iter)
Definition: collection.c:2074
struct Collection * BKE_collection_parent_editable_find_recursive(const struct ViewLayer *view_layer, struct Collection *collection)
bool BKE_collection_is_empty(const struct Collection *collection)
bool BKE_collection_move(struct Main *bmain, struct Collection *to_parent, struct Collection *from_parent, struct Collection *relative, bool relative_after, struct Collection *collection)
Definition: collection.c:1777
void(* BKE_scene_objects_Cb)(struct Object *ob, void *data)
void BKE_collections_after_lib_link(struct Main *bmain)
Definition: collection.c:1400
bool BKE_collection_delete(struct Main *bmain, struct Collection *collection, bool hierarchy)
Definition: collection.c:495
void BKE_scene_collections_iterator_end(struct BLI_Iterator *iter)
Definition: collection.c:1913
void BKE_scene_collections_iterator_next(struct BLI_Iterator *iter)
Definition: collection.c:1901
struct Base * BKE_collection_or_layer_objects(const struct ViewLayer *view_layer, struct Collection *collection)
void BKE_scene_objects_iterator_begin(struct BLI_Iterator *iter, void *data_in)
Definition: collection.c:1958
void BKE_collection_object_move(struct Main *bmain, struct Scene *scene, struct Collection *collection_dst, struct Collection *collection_src, struct Object *ob)
Definition: collection.c:1361
struct Collection * BKE_collection_from_index(struct Scene *scene, int index)
Definition: collection.c:1716
void BKE_collection_blend_write_nolib(struct BlendWriter *writer, struct Collection *collection)
Definition: collection.c:190
bool BKE_collection_objects_select(struct ViewLayer *view_layer, struct Collection *collection, bool deselect)
Definition: collection.c:1759
void BKE_collection_parent_relations_rebuild(struct Collection *collection)
Definition: collection.c:1610
void BKE_main_collections_parent_relations_rebuild(struct Main *bmain)
Definition: collection.c:1658
ListBase BKE_collection_object_cache_instanced_get(struct Collection *collection)
Definition: collection.c:803
struct GSet GSet
Definition: BLI_ghash.h:340
unsigned int uint
Definition: BLI_sys_types.h:67
These structs are the foundation for all linked lists in the library system.
Scene scene
SyclQueue void void size_t num_bytes void
DRWShaderLibrary * lib
struct CollectionParent * prev
struct Collection * collection
struct CollectionParent * next
Definition: BKE_main.h:121