Blender  V2.93
layer.c
Go to the documentation of this file.
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 
21 /* Allow using deprecated functionality for .blend file I/O. */
22 #define DNA_DEPRECATED_ALLOW
23 
24 #include <string.h>
25 
26 #include "BLI_listbase.h"
27 #include "BLI_string.h"
28 #include "BLI_string_utf8.h"
29 #include "BLI_string_utils.h"
30 #include "BLI_threads.h"
31 #include "BLT_translation.h"
32 
33 #include "BKE_animsys.h"
34 #include "BKE_collection.h"
35 #include "BKE_freestyle.h"
36 #include "BKE_idprop.h"
37 #include "BKE_layer.h"
38 #include "BKE_lib_id.h"
39 #include "BKE_main.h"
40 #include "BKE_node.h"
41 #include "BKE_object.h"
42 
43 #include "DNA_ID.h"
44 #include "DNA_collection_types.h"
45 #include "DNA_layer_types.h"
46 #include "DNA_node_types.h"
47 #include "DNA_object_types.h"
48 #include "DNA_scene_types.h"
49 #include "DNA_space_types.h"
50 #include "DNA_view3d_types.h"
52 #include "DNA_workspace_types.h"
53 
54 #include "DEG_depsgraph.h"
55 #include "DEG_depsgraph_debug.h"
56 #include "DEG_depsgraph_query.h"
57 
58 #include "DRW_engine.h"
59 
60 #include "RE_engine.h"
61 
62 #include "MEM_guardedalloc.h"
63 
64 #include "BLO_read_write.h"
65 
66 /* Set of flags which are dependent on a collection settings. */
71 
72 /* prototype */
73 static void object_bases_iterator_next(BLI_Iterator *iter, const int flag);
74 
75 /*********************** Layer Collections and bases *************************/
76 
77 static LayerCollection *layer_collection_add(ListBase *lb_parent, Collection *collection)
78 {
79  LayerCollection *lc = MEM_callocN(sizeof(LayerCollection), "Collection Base");
80  lc->collection = collection;
81  lc->local_collections_bits = ~(0);
82  BLI_addtail(lb_parent, lc);
83 
84  return lc;
85 }
86 
87 static void layer_collection_free(ViewLayer *view_layer, LayerCollection *lc)
88 {
89  if (lc == view_layer->active_collection) {
90  view_layer->active_collection = NULL;
91  }
92 
94  layer_collection_free(view_layer, nlc);
95  }
96 
98 }
99 
101 {
102  Base *base = MEM_callocN(sizeof(Base), "Object Base");
103  base->object = ob;
104  base->local_view_bits = ~(0);
105  if (ob->base_flag & BASE_SELECTED) {
106  base->flag |= BASE_SELECTED;
107  }
108  return base;
109 }
110 
111 /********************************* View Layer ********************************/
112 
113 /* RenderLayer */
114 
115 /* Returns the default view layer to view in workspaces if there is
116  * none linked to the workspace yet. */
118 {
119  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
120  if (!(view_layer->flag & VIEW_LAYER_RENDER)) {
121  return view_layer;
122  }
123  }
124 
126  return scene->view_layers.first;
127 }
128 
129 /* Returns the default view layer to render if we need to render just one. */
131 {
132  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
133  if (view_layer->flag & VIEW_LAYER_RENDER) {
134  return view_layer;
135  }
136  }
137 
139  return scene->view_layers.first;
140 }
141 
142 /* Returns view layer with matching name, or NULL if not found. */
143 ViewLayer *BKE_view_layer_find(const Scene *scene, const char *layer_name)
144 {
145  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
146  if (STREQ(view_layer->name, layer_name)) {
147  return view_layer;
148  }
149  }
150 
151  return NULL;
152 }
153 
160 {
162  return scene->view_layers.first;
163 }
164 
165 static ViewLayer *view_layer_add(const char *name)
166 {
167  if (!name) {
168  name = DATA_("View Layer");
169  }
170 
171  ViewLayer *view_layer = MEM_callocN(sizeof(ViewLayer), "View Layer");
173 
174  BLI_strncpy_utf8(view_layer->name, name, sizeof(view_layer->name));
175 
176  /* Pure rendering pipeline settings. */
177  view_layer->layflag = 0x7FFF; /* solid ztra halo edge strand */
178  view_layer->passflag = SCE_PASS_COMBINED | SCE_PASS_Z;
179  view_layer->pass_alpha_threshold = 0.5f;
180  view_layer->cryptomatte_levels = 6;
183 
184  return view_layer;
185 }
186 
187 static void layer_collection_exclude_all(LayerCollection *layer_collection)
188 {
189  LayerCollection *sub_collection = layer_collection->layer_collections.first;
190  for (; sub_collection != NULL; sub_collection = sub_collection->next) {
191  sub_collection->flag |= LAYER_COLLECTION_EXCLUDE;
192  layer_collection_exclude_all(sub_collection);
193  }
194 }
195 
201  const char *name,
202  ViewLayer *view_layer_source,
203  const int type)
204 {
205  ViewLayer *view_layer_new;
206 
207  if (view_layer_source) {
208  name = view_layer_source->name;
209  }
210 
211  switch (type) {
212  default:
213  case VIEWLAYER_ADD_NEW: {
214  view_layer_new = view_layer_add(name);
215  BLI_addtail(&scene->view_layers, view_layer_new);
216  BKE_layer_collection_sync(scene, view_layer_new);
217  break;
218  }
219  case VIEWLAYER_ADD_COPY: {
220  /* Allocate and copy view layer data */
221  view_layer_new = MEM_callocN(sizeof(ViewLayer), "View Layer");
222  *view_layer_new = *view_layer_source;
223  BKE_view_layer_copy_data(scene, scene, view_layer_new, view_layer_source, 0);
224  BLI_addtail(&scene->view_layers, view_layer_new);
225 
226  BLI_strncpy_utf8(view_layer_new->name, name, sizeof(view_layer_new->name));
227  break;
228  }
229  case VIEWLAYER_ADD_EMPTY: {
230  view_layer_new = view_layer_add(name);
231  BLI_addtail(&scene->view_layers, view_layer_new);
232 
233  /* Initialize layer-collections. */
234  BKE_layer_collection_sync(scene, view_layer_new);
236 
237  /* Update collections after changing visibility */
238  BKE_layer_collection_sync(scene, view_layer_new);
239  break;
240  }
241  }
242 
243  /* unique name */
245  view_layer_new,
246  DATA_("ViewLayer"),
247  '.',
248  offsetof(ViewLayer, name),
249  sizeof(view_layer_new->name));
250 
251  return view_layer_new;
252 }
253 
255 {
256  BKE_view_layer_free_ex(view_layer, true);
257 }
258 
262 void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
263 {
264  view_layer->basact = NULL;
265 
266  BLI_freelistN(&view_layer->object_bases);
267 
268  if (view_layer->object_bases_hash) {
269  BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL);
270  }
271 
272  LISTBASE_FOREACH (LayerCollection *, lc, &view_layer->layer_collections) {
273  layer_collection_free(view_layer, lc);
274  }
275  BLI_freelistN(&view_layer->layer_collections);
276 
277  LISTBASE_FOREACH (ViewLayerEngineData *, sled, &view_layer->drawdata) {
278  if (sled->storage) {
279  if (sled->free) {
280  sled->free(sled->storage);
281  }
282  MEM_freeN(sled->storage);
283  }
284  }
285  BLI_freelistN(&view_layer->drawdata);
286  BLI_freelistN(&view_layer->aovs);
287  view_layer->active_aov = NULL;
288 
289  MEM_SAFE_FREE(view_layer->stats);
290 
291  BKE_freestyle_config_free(&view_layer->freestyle_config, do_id_user);
292 
293  if (view_layer->id_properties) {
294  IDP_FreeProperty_ex(view_layer->id_properties, do_id_user);
295  }
296 
297  MEM_SAFE_FREE(view_layer->object_bases_array);
298 
299  MEM_freeN(view_layer);
300 }
301 
305 void BKE_view_layer_selected_objects_tag(ViewLayer *view_layer, const int tag)
306 {
307  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
308  if ((base->flag & BASE_SELECTED) != 0) {
309  base->object->flag |= tag;
310  }
311  else {
312  base->object->flag &= ~tag;
313  }
314  }
315 }
316 
318 {
319  LISTBASE_FOREACH (LayerCollection *, lcn, lb) {
320  if (lcn == lc) {
321  return true;
322  }
323  if (find_scene_collection_in_scene_collections(&lcn->layer_collections, lc)) {
324  return true;
325  }
326  }
327  return false;
328 }
329 
338 {
339  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
340  if (base->object->type == OB_CAMERA) {
341  return base->object;
342  }
343  }
344 
345  return NULL;
346 }
347 
352 {
353  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
354  if (find_scene_collection_in_scene_collections(&view_layer->layer_collections, lc)) {
355  return view_layer;
356  }
357  }
358 
359  return NULL;
360 }
361 
362 /* Base */
363 
364 static void view_layer_bases_hash_create(ViewLayer *view_layer)
365 {
366  static ThreadMutex hash_lock = BLI_MUTEX_INITIALIZER;
367 
368  if (view_layer->object_bases_hash == NULL) {
369  BLI_mutex_lock(&hash_lock);
370 
371  if (view_layer->object_bases_hash == NULL) {
373 
374  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
375  if (base->object) {
376  /* Some processes, like ID remapping, may lead to having several bases with the same
377  * object. So just take the first one here, and ignore all others
378  * (#BKE_layer_collection_sync will clean this up anyway). */
379  void **val_pp;
380  if (!BLI_ghash_ensure_p(hash, base->object, &val_pp)) {
381  *val_pp = base;
382  }
383  }
384  }
385 
386  /* Assign pointer only after hash is complete. */
387  view_layer->object_bases_hash = hash;
388  }
389 
390  BLI_mutex_unlock(&hash_lock);
391  }
392 }
393 
395 {
396  if (!view_layer->object_bases_hash) {
397  view_layer_bases_hash_create(view_layer);
398  }
399 
400  return BLI_ghash_lookup(view_layer->object_bases_hash, ob);
401 }
402 
404 {
405  Base *base;
406 
407  for (base = view_layer->object_bases.first; base; base = base->next) {
408  base->flag &= ~BASE_SELECTED;
409  }
410 }
411 
412 void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, Base *selbase)
413 {
414  view_layer->basact = selbase;
415  if ((selbase->flag & BASE_SELECTABLE) != 0) {
416  selbase->flag |= BASE_SELECTED;
417  }
418 }
419 
420 /**************************** Copy View Layer and Layer Collections ***********************/
421 static void layer_aov_copy_data(ViewLayer *view_layer_dst,
422  const ViewLayer *view_layer_src,
423  ListBase *aovs_dst,
424  const ListBase *aovs_src)
425 {
426  if (aovs_src != NULL) {
427  BLI_duplicatelist(aovs_dst, aovs_src);
428  }
429 
430  ViewLayerAOV *aov_dst = aovs_dst->first;
431  const ViewLayerAOV *aov_src = aovs_src->first;
432 
433  while (aov_dst != NULL) {
434  BLI_assert(aov_src);
435  if (aov_src == view_layer_src->active_aov) {
436  view_layer_dst->active_aov = aov_dst;
437  }
438 
439  aov_dst = aov_dst->next;
440  aov_src = aov_src->next;
441  }
442 }
443 
444 static void layer_collections_copy_data(ViewLayer *view_layer_dst,
445  const ViewLayer *view_layer_src,
446  ListBase *layer_collections_dst,
447  const ListBase *layer_collections_src)
448 {
449  BLI_duplicatelist(layer_collections_dst, layer_collections_src);
450 
451  LayerCollection *layer_collection_dst = layer_collections_dst->first;
452  const LayerCollection *layer_collection_src = layer_collections_src->first;
453 
454  while (layer_collection_dst != NULL) {
455  layer_collections_copy_data(view_layer_dst,
456  view_layer_src,
457  &layer_collection_dst->layer_collections,
458  &layer_collection_src->layer_collections);
459 
460  if (layer_collection_src == view_layer_src->active_collection) {
461  view_layer_dst->active_collection = layer_collection_dst;
462  }
463 
464  layer_collection_dst = layer_collection_dst->next;
465  layer_collection_src = layer_collection_src->next;
466  }
467 }
468 
475  const Scene *UNUSED(scene_src),
476  ViewLayer *view_layer_dst,
477  const ViewLayer *view_layer_src,
478  const int flag)
479 {
480  if (view_layer_dst->id_properties != NULL) {
481  view_layer_dst->id_properties = IDP_CopyProperty_ex(view_layer_dst->id_properties, flag);
482  }
484  &view_layer_dst->freestyle_config, &view_layer_src->freestyle_config, flag);
485 
486  view_layer_dst->stats = NULL;
487 
488  /* Clear temporary data. */
489  BLI_listbase_clear(&view_layer_dst->drawdata);
490  view_layer_dst->object_bases_array = NULL;
491  view_layer_dst->object_bases_hash = NULL;
492 
493  /* Copy layer collections and object bases. */
494  /* Inline 'BLI_duplicatelist' and update the active base. */
495  BLI_listbase_clear(&view_layer_dst->object_bases);
496  LISTBASE_FOREACH (Base *, base_src, &view_layer_src->object_bases) {
497  Base *base_dst = MEM_dupallocN(base_src);
498  BLI_addtail(&view_layer_dst->object_bases, base_dst);
499  if (view_layer_src->basact == base_src) {
500  view_layer_dst->basact = base_dst;
501  }
502  }
503 
504  view_layer_dst->active_collection = NULL;
505  layer_collections_copy_data(view_layer_dst,
506  view_layer_src,
507  &view_layer_dst->layer_collections,
508  &view_layer_src->layer_collections);
509 
510  LayerCollection *lc_scene_dst = view_layer_dst->layer_collections.first;
511  lc_scene_dst->collection = scene_dst->master_collection;
512 
513  BLI_listbase_clear(&view_layer_dst->aovs);
515  view_layer_dst, view_layer_src, &view_layer_dst->aovs, &view_layer_src->aovs);
516 
517  if ((flag & LIB_ID_CREATE_NO_USER_REFCOUNT) == 0) {
518  id_us_plus((ID *)view_layer_dst->mat_override);
519  }
520 }
521 
522 void BKE_view_layer_rename(Main *bmain, Scene *scene, ViewLayer *view_layer, const char *newname)
523 {
524  char oldname[sizeof(view_layer->name)];
525 
526  BLI_strncpy(oldname, view_layer->name, sizeof(view_layer->name));
527 
528  BLI_strncpy_utf8(view_layer->name, newname, sizeof(view_layer->name));
530  view_layer,
531  DATA_("ViewLayer"),
532  '.',
533  offsetof(ViewLayer, name),
534  sizeof(view_layer->name));
535 
536  if (scene->nodetree) {
537  bNode *node;
538  int index = BLI_findindex(&scene->view_layers, view_layer);
539 
540  for (node = scene->nodetree->nodes.first; node; node = node->next) {
541  if (node->type == CMP_NODE_R_LAYERS && node->id == NULL) {
542  if (node->custom1 == index) {
543  BLI_strncpy(node->name, view_layer->name, NODE_MAXSTR);
544  }
545  }
546  }
547  }
548 
549  /* Fix all the animation data and windows which may link to this. */
550  BKE_animdata_fix_paths_rename_all(NULL, "view_layers", oldname, view_layer->name);
551 
552  /* WM can be missing on startup. */
553  wmWindowManager *wm = bmain->wm.first;
554  if (wm) {
555  LISTBASE_FOREACH (wmWindow *, win, &wm->windows) {
556  if (win->scene == scene && STREQ(win->view_layer_name, oldname)) {
557  STRNCPY(win->view_layer_name, view_layer->name);
558  }
559  }
560  }
561 
562  /* Dependency graph uses view layer name based lookups. */
563  DEG_id_tag_update(&scene->id, 0);
564 }
565 
566 /* LayerCollection */
567 
571 static LayerCollection *collection_from_index(ListBase *lb, const int number, int *i)
572 {
573  LISTBASE_FOREACH (LayerCollection *, lc, lb) {
574  if (*i == number) {
575  return lc;
576  }
577 
578  (*i)++;
579  }
580 
581  LISTBASE_FOREACH (LayerCollection *, lc, lb) {
582  LayerCollection *lc_nested = collection_from_index(&lc->layer_collections, number, i);
583  if (lc_nested) {
584  return lc_nested;
585  }
586  }
587  return NULL;
588 }
589 
593 static bool layer_collection_hidden(ViewLayer *view_layer, LayerCollection *lc)
594 {
595  if (lc->flag & LAYER_COLLECTION_EXCLUDE) {
596  return true;
597  }
598 
599  /* Check visiblilty restriction flags */
601  return true;
602  }
603 
604  /* Restriction flags stay set, so we need to check parents */
605  CollectionParent *parent = lc->collection->parents.first;
606 
607  if (parent) {
609 
610  return lc && layer_collection_hidden(view_layer, lc);
611  }
612 
613  return false;
614 
615  return false;
616 }
617 
622 {
623  int i = 0;
624  return collection_from_index(&view_layer->layer_collections, index, &i);
625 }
626 
631 {
632  return view_layer->active_collection;
633 }
634 
635 /*
636  * Activate collection
637  */
639 {
640  if (lc->flag & LAYER_COLLECTION_EXCLUDE) {
641  return false;
642  }
643 
644  view_layer->active_collection = lc;
645  return true;
646 }
647 
652 {
653  CollectionParent *parent = lc->collection->parents.first;
654 
655  if (parent) {
657  }
658  else {
659  lc = NULL;
660  }
661 
662  /* Don't activate excluded or hidden collections to prevent creating objects in a hidden
663  * collection from the UI */
664  if (lc && layer_collection_hidden(view_layer, lc)) {
665  return BKE_layer_collection_activate_parent(view_layer, lc);
666  }
667 
668  if (!lc) {
669  lc = view_layer->layer_collections.first;
670  }
671 
672  view_layer->active_collection = lc;
673  return lc;
674 }
675 
679 static int collection_count(ListBase *lb)
680 {
681  int i = 0;
682  LISTBASE_FOREACH (LayerCollection *, lc, lb) {
683  i += collection_count(&lc->layer_collections) + 1;
684  }
685  return i;
686 }
687 
693 {
694  return collection_count(&view_layer->layer_collections);
695 }
696 
700 static int index_from_collection(ListBase *lb, const LayerCollection *lc, int *i)
701 {
702  LISTBASE_FOREACH (LayerCollection *, lcol, lb) {
703  if (lcol == lc) {
704  return *i;
705  }
706 
707  (*i)++;
708  }
709 
710  LISTBASE_FOREACH (LayerCollection *, lcol, lb) {
711  int i_nested = index_from_collection(&lcol->layer_collections, lc, i);
712  if (i_nested != -1) {
713  return i_nested;
714  }
715  }
716  return -1;
717 }
718 
723 {
724  int i = 0;
725  return index_from_collection(&view_layer->layer_collections, lc, &i);
726 }
727 
728 /*********************************** Syncing *********************************
729  *
730  * The layer collection tree mirrors the scene collection tree. Whenever that
731  * changes we need to synchronize them so that there is a corresponding layer
732  * collection for each collection. Note that the scene collection tree can
733  * contain link or override collections, and so this is also called on .blend
734  * file load to ensure any new or removed collections are synced.
735  *
736  * The view layer also contains a list of bases for each object that exists
737  * in at least one layer collection. That list is also synchronized here, and
738  * stores state like selection. */
739 
740 static void layer_collection_sync(ViewLayer *view_layer,
741  const ListBase *lb_collections,
742  ListBase *lb_layer_collections,
743  ListBase *new_object_bases,
744  short parent_exclude,
745  short parent_restrict,
746  short parent_layer_restrict,
747  unsigned short parent_local_collections_bits)
748 {
749  /* TODO: support recovery after removal of intermediate collections, reordering, ..
750  * For local edits we can make editing operating do the appropriate thing, but for
751  * linking we can only sync after the fact. */
752 
753  /* Remove layer collections that no longer have a corresponding scene collection. */
754  LISTBASE_FOREACH_MUTABLE (LayerCollection *, lc, lb_layer_collections) {
755  /* Note that ID remap can set lc->collection to NULL when deleting collections. */
756  Collection *collection = (lc->collection) ?
757  BLI_findptr(lb_collections,
758  lc->collection,
759  offsetof(CollectionChild, collection)) :
760  NULL;
761 
762  if (!collection) {
763  if (lc == view_layer->active_collection) {
764  view_layer->active_collection = NULL;
765  }
766 
767  /* Free recursively. */
768  layer_collection_free(view_layer, lc);
769  BLI_freelinkN(lb_layer_collections, lc);
770  }
771  }
772 
773  /* Add layer collections for any new scene collections, and ensure order is the same. */
774  ListBase new_lb_layer = {NULL, NULL};
775 
776  LISTBASE_FOREACH (const CollectionChild *, child, lb_collections) {
777  Collection *collection = child->collection;
779  lb_layer_collections, collection, offsetof(LayerCollection, collection));
780 
781  if (lc) {
782  BLI_remlink(lb_layer_collections, lc);
783  BLI_addtail(&new_lb_layer, lc);
784  }
785  else {
786  lc = layer_collection_add(&new_lb_layer, collection);
787  lc->flag = parent_exclude;
788  }
789 
790  unsigned short local_collections_bits = parent_local_collections_bits &
792 
793  /* Tag linked collection as a weak reference so we keep the layer
794  * collection pointer on file load and remember exclude state. */
795  id_lib_indirect_weak_link(&collection->id);
796 
797  /* Collection restrict is inherited. */
798  short child_restrict = parent_restrict;
799  short child_layer_restrict = parent_layer_restrict;
800  if (!(collection->flag & COLLECTION_IS_MASTER)) {
801  child_restrict |= collection->flag;
802  child_layer_restrict |= lc->flag;
803  }
804 
805  /* Sync child collections. */
806  layer_collection_sync(view_layer,
807  &collection->children,
808  &lc->layer_collections,
809  new_object_bases,
810  lc->flag,
811  child_restrict,
812  child_layer_restrict,
813  local_collections_bits);
814 
815  /* Layer collection exclude is not inherited. */
816  lc->runtime_flag = 0;
817  if (lc->flag & LAYER_COLLECTION_EXCLUDE) {
818  continue;
819  }
820 
821  /* We separate restrict viewport and visible view layer because a layer collection can be
822  * hidden in the view layer yet (locally) visible in a viewport (if it is not restricted).*/
823  if (child_restrict & COLLECTION_RESTRICT_VIEWPORT) {
825  }
826 
828  ((child_layer_restrict & LAYER_COLLECTION_HIDE) == 0)) {
830  }
831 
832  /* Sync objects, except if collection was excluded. */
833  LISTBASE_FOREACH (CollectionObject *, cob, &collection->gobject) {
834  if (cob->ob == NULL) {
835  continue;
836  }
837 
838  /* Tag linked object as a weak reference so we keep the object
839  * base pointer on file load and remember hidden state. */
840  id_lib_indirect_weak_link(&cob->ob->id);
841 
842  void **base_p;
843  Base *base;
844  if (BLI_ghash_ensure_p(view_layer->object_bases_hash, cob->ob, &base_p)) {
845  /* Move from old base list to new base list. Base might have already
846  * been moved to the new base list and the first/last test ensure that
847  * case also works. */
848  base = *base_p;
849  if (!ELEM(base, new_object_bases->first, new_object_bases->last)) {
850  BLI_remlink(&view_layer->object_bases, base);
851  BLI_addtail(new_object_bases, base);
852  }
853  }
854  else {
855  /* Create new base. */
856  base = object_base_new(cob->ob);
857  base->local_collections_bits = local_collections_bits;
858  *base_p = base;
859  BLI_addtail(new_object_bases, base);
860  }
861 
862  if ((child_restrict & COLLECTION_RESTRICT_VIEWPORT) == 0) {
864  if ((child_layer_restrict & LAYER_COLLECTION_HIDE) == 0) {
866  }
867  if (((child_restrict & COLLECTION_RESTRICT_SELECT) == 0)) {
869  }
870  }
871 
872  if ((child_restrict & COLLECTION_RESTRICT_RENDER) == 0) {
874  }
875 
876  /* Holdout and indirect only */
877  if (lc->flag & LAYER_COLLECTION_HOLDOUT) {
879  }
882  }
883 
885  }
886  }
887 
888  /* Free potentially remaining unused layer collections in old list.
889  * NOTE: While this does not happen in typical situations, some corner cases (like remapping
890  * several different collections to a single one) can lead to this list having extra unused
891  * items. */
892  LISTBASE_FOREACH_MUTABLE (LayerCollection *, lc, lb_layer_collections) {
893  if (lc == view_layer->active_collection) {
894  view_layer->active_collection = NULL;
895  }
896 
897  /* Free recursively. */
898  layer_collection_free(view_layer, lc);
899  BLI_freelinkN(lb_layer_collections, lc);
900  }
901  BLI_assert(BLI_listbase_is_empty(lb_layer_collections));
902 
903  /* Replace layer collection list with new one. */
904  *lb_layer_collections = new_lb_layer;
905  BLI_assert(BLI_listbase_count(lb_collections) == BLI_listbase_count(lb_layer_collections));
906 }
907 
914 {
915  if (!scene->master_collection) {
916  /* Happens for old files that don't have versioning applied yet. */
917  return;
918  }
919 
920  /* Free cache. */
921  MEM_SAFE_FREE(view_layer->object_bases_array);
922 
923  /* Create object to base hash if it does not exist yet. */
924  if (!view_layer->object_bases_hash) {
925  view_layer_bases_hash_create(view_layer);
926  }
927 
928  /* Clear visible and selectable flags to be reset. */
929  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
930  base->flag &= ~g_base_collection_flags;
931  base->flag_from_collection &= ~g_base_collection_flags;
932  }
933 
934  /* Generate new layer connections and object bases when collections changed. */
935  CollectionChild child = {.next = NULL, .prev = NULL, .collection = scene->master_collection};
936  const ListBase collections = {.first = &child, .last = &child};
937  ListBase new_object_bases = {.first = NULL, .last = NULL};
938 
939  const short parent_exclude = 0, parent_restrict = 0, parent_layer_restrict = 0;
940  layer_collection_sync(view_layer,
941  &collections,
942  &view_layer->layer_collections,
943  &new_object_bases,
944  parent_exclude,
945  parent_restrict,
946  parent_layer_restrict,
947  ~(0));
948 
949  /* Any remaining object bases are to be removed. */
950  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
951  if (view_layer->basact == base) {
952  view_layer->basact = NULL;
953  }
954 
955  if (base->object) {
956  BLI_ghash_remove(view_layer->object_bases_hash, base->object, NULL, NULL);
957  }
958  }
959 
960  BLI_freelistN(&view_layer->object_bases);
961  view_layer->object_bases = new_object_bases;
962 
963  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
964  BKE_base_eval_flags(base);
965  }
966 
967  /* Always set a valid active collection. */
969  if (active && layer_collection_hidden(view_layer, active)) {
971  }
972  else if (active == NULL) {
973  view_layer->active_collection = view_layer->layer_collections.first;
974  }
975 }
976 
978 {
979  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
980  BKE_layer_collection_sync(scene, view_layer);
981  }
982 }
983 
984 void BKE_main_collection_sync(const Main *bmain)
985 {
986  /* TODO: if a single collection changed, figure out which
987  * scenes it belongs to and only update those. */
988 
989  /* TODO: optimize for file load so only linked collections get checked? */
990 
991  for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
993  }
994 
996 }
997 
999 {
1000  /* On remapping of object or collection pointers free caches. */
1001  /* TODO: try to make this faster */
1002 
1003  for (const Scene *scene = bmain->scenes.first; scene; scene = scene->id.next) {
1004  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
1005  MEM_SAFE_FREE(view_layer->object_bases_array);
1006 
1007  if (view_layer->object_bases_hash) {
1008  BLI_ghash_free(view_layer->object_bases_hash, NULL, NULL);
1009  view_layer->object_bases_hash = NULL;
1010  }
1011  }
1012  }
1013 
1014  for (Collection *collection = bmain->collections.first; collection;
1015  collection = collection->id.next) {
1017  DEG_id_tag_update_ex((Main *)bmain, &collection->id, ID_RECALC_COPY_ON_WRITE);
1018  }
1019 
1020  BKE_main_collection_sync(bmain);
1021 }
1022 
1023 /* ---------------------------------------------------------------------- */
1024 
1032 {
1034  return false;
1035  }
1036 
1037  bool changed = false;
1038 
1039  if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) {
1041  Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
1042 
1043  if (base) {
1044  if (deselect) {
1045  if (base->flag & BASE_SELECTED) {
1046  base->flag &= ~BASE_SELECTED;
1047  changed = true;
1048  }
1049  }
1050  else {
1051  if ((base->flag & BASE_SELECTABLE) && !(base->flag & BASE_SELECTED)) {
1052  base->flag |= BASE_SELECTED;
1053  changed = true;
1054  }
1055  }
1056  }
1057  }
1058  }
1059 
1061  changed |= BKE_layer_collection_objects_select(view_layer, iter, deselect);
1062  }
1063 
1064  return changed;
1065 }
1066 
1068 {
1070  return false;
1071  }
1072 
1073  if (!(lc->flag & LAYER_COLLECTION_EXCLUDE)) {
1075  Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
1076 
1077  if (base && (base->flag & BASE_SELECTED) && (base->flag & BASE_VISIBLE_DEPSGRAPH)) {
1078  return true;
1079  }
1080  }
1081  }
1082 
1084  if (BKE_layer_collection_has_selected_objects(view_layer, iter)) {
1085  return true;
1086  }
1087  }
1088 
1089  return false;
1090 }
1091 
1093  LayerCollection *lc_child)
1094 {
1095  if (lc_parent == lc_child) {
1096  return true;
1097  }
1098 
1099  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_parent->layer_collections) {
1100  if (BKE_layer_collection_has_layer_collection(lc_iter, lc_child)) {
1101  return true;
1102  }
1103  }
1104  return false;
1105 }
1106 
1107 /* ---------------------------------------------------------------------- */
1108 
1109 /* Update after toggling visibility of an object base. */
1110 void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool extend)
1111 {
1112  if (!extend) {
1113  /* Make only one base visible. */
1114  LISTBASE_FOREACH (Base *, other, &view_layer->object_bases) {
1115  other->flag |= BASE_HIDDEN;
1116  }
1117 
1118  base->flag &= ~BASE_HIDDEN;
1119  }
1120  else {
1121  /* Toggle visibility of one base. */
1122  base->flag ^= BASE_HIDDEN;
1123  }
1124 
1125  BKE_layer_collection_sync(scene, view_layer);
1126 }
1127 
1128 bool BKE_base_is_visible(const View3D *v3d, const Base *base)
1129 {
1130  if ((base->flag & BASE_VISIBLE_DEPSGRAPH) == 0) {
1131  return false;
1132  }
1133 
1134  if (v3d == NULL) {
1135  return base->flag & BASE_VISIBLE_VIEWLAYER;
1136  }
1137 
1138  if ((v3d->localvd) && ((v3d->local_view_uuid & base->local_view_bits) == 0)) {
1139  return false;
1140  }
1141 
1142  if (((1 << (base->object->type)) & v3d->object_type_exclude_viewport) != 0) {
1143  return false;
1144  }
1145 
1146  if (v3d->flag & V3D_LOCAL_COLLECTIONS) {
1147  return (v3d->local_collections_uuid & base->local_collections_bits) != 0;
1148  }
1149 
1150  return base->flag & BASE_VISIBLE_VIEWLAYER;
1151 }
1152 
1153 bool BKE_object_is_visible_in_viewport(const View3D *v3d, const struct Object *ob)
1154 {
1155  BLI_assert(v3d != NULL);
1156 
1157  if (ob->restrictflag & OB_RESTRICT_VIEWPORT) {
1158  return false;
1159  }
1160 
1161  if ((v3d->object_type_exclude_viewport & (1 << ob->type)) != 0) {
1162  return false;
1163  }
1164 
1165  if (v3d->localvd && ((v3d->local_view_uuid & ob->base_local_view_bits) == 0)) {
1166  return false;
1167  }
1168 
1169  if ((v3d->flag & V3D_LOCAL_COLLECTIONS) &&
1171  return false;
1172  }
1173 
1174  /* If not using local collection the object may still be in a hidden collection. */
1175  if ((v3d->flag & V3D_LOCAL_COLLECTIONS) == 0) {
1176  return (ob->base_flag & BASE_VISIBLE_VIEWLAYER) != 0;
1177  }
1178 
1179  return true;
1180 }
1181 
1183 {
1184  lc->flag |= flag;
1186  layer_collection_flag_set_recursive(lc_iter, flag);
1187  }
1188 }
1189 
1191 {
1192  lc->flag &= ~flag;
1195  }
1196 }
1197 
1207  ViewLayer *view_layer,
1208  LayerCollection *lc,
1209  bool extend)
1210 {
1211  LayerCollection *lc_master = view_layer->layer_collections.first;
1212  bool hide_it = extend && (lc->runtime_flag & LAYER_COLLECTION_VISIBLE_VIEW_LAYER);
1213 
1214  if (!extend) {
1215  /* Hide all collections . */
1216  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_master->layer_collections) {
1218  }
1219  }
1220 
1221  /* Make all the direct parents visible. */
1222  if (hide_it) {
1223  lc->flag |= LAYER_COLLECTION_HIDE;
1224  }
1225  else {
1226  LayerCollection *lc_parent = lc;
1227  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_master->layer_collections) {
1228  if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) {
1229  lc_parent = lc_iter;
1230  break;
1231  }
1232  }
1233 
1234  while (lc_parent != lc) {
1235  lc_parent->flag &= ~LAYER_COLLECTION_HIDE;
1236 
1237  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_parent->layer_collections) {
1238  if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) {
1239  lc_parent = lc_iter;
1240  break;
1241  }
1242  }
1243  }
1244 
1245  /* Make all the children visible, but respect their disable state. */
1247 
1248  BKE_layer_collection_activate(view_layer, lc);
1249  }
1250 
1251  BKE_layer_collection_sync(scene, view_layer);
1252 }
1253 
1255  const int local_collections_uuid)
1256 {
1257  layer_collection->local_collections_bits |= local_collections_uuid;
1258  LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) {
1259  layer_collection_local_visibility_set_recursive(child, local_collections_uuid);
1260  }
1261 }
1262 
1264  const int local_collections_uuid)
1265 {
1266  layer_collection->local_collections_bits &= ~local_collections_uuid;
1267  LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) {
1268  layer_collection_local_visibility_unset_recursive(child, local_collections_uuid);
1269  }
1270 }
1271 
1272 static void layer_collection_local_sync(ViewLayer *view_layer,
1273  LayerCollection *layer_collection,
1274  const unsigned short local_collections_uuid,
1275  bool visible)
1276 {
1277  if ((layer_collection->local_collections_bits & local_collections_uuid) == 0) {
1278  visible = false;
1279  }
1280 
1281  if (visible) {
1282  LISTBASE_FOREACH (CollectionObject *, cob, &layer_collection->collection->gobject) {
1283  BLI_assert(cob->ob);
1284  Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
1285  base->local_collections_bits |= local_collections_uuid;
1286  }
1287  }
1288 
1289  LISTBASE_FOREACH (LayerCollection *, child, &layer_collection->layer_collections) {
1290  if ((child->flag & LAYER_COLLECTION_EXCLUDE) == 0) {
1291  layer_collection_local_sync(view_layer, child, local_collections_uuid, visible);
1292  }
1293  }
1294 }
1295 
1296 void BKE_layer_collection_local_sync(ViewLayer *view_layer, const View3D *v3d)
1297 {
1298  const unsigned short local_collections_uuid = v3d->local_collections_uuid;
1299 
1300  /* Reset flags and set the bases visible by default. */
1301  LISTBASE_FOREACH (Base *, base, &view_layer->object_bases) {
1302  base->local_collections_bits &= ~local_collections_uuid;
1303  }
1304 
1305  LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) {
1306  layer_collection_local_sync(view_layer, layer_collection, local_collections_uuid, true);
1307  }
1308 }
1309 
1314 {
1315  LISTBASE_FOREACH (Scene *, scene, &bmain->scenes) {
1316  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
1317  LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
1318  LISTBASE_FOREACH (ScrArea *, area, &screen->areabase) {
1319  if (area->spacetype != SPACE_VIEW3D) {
1320  continue;
1321  }
1322  View3D *v3d = area->spacedata.first;
1323  if (v3d->flag & V3D_LOCAL_COLLECTIONS) {
1324  BKE_layer_collection_local_sync(view_layer, v3d);
1325  }
1326  }
1327  }
1328  }
1329  }
1330 }
1331 
1338  const View3D *v3d,
1339  LayerCollection *lc,
1340  bool extend)
1341 {
1342  LayerCollection *lc_master = view_layer->layer_collections.first;
1343  bool hide_it = extend && ((v3d->local_collections_uuid & lc->local_collections_bits) != 0);
1344 
1345  if (!extend) {
1346  /* Hide all collections. */
1347  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_master->layer_collections) {
1349  }
1350  }
1351 
1352  /* Make all the direct parents visible. */
1353  if (hide_it) {
1355  }
1356  else {
1357  LayerCollection *lc_parent = lc;
1358  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_master->layer_collections) {
1359  if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) {
1360  lc_parent = lc_iter;
1361  break;
1362  }
1363  }
1364 
1365  while (lc_parent != lc) {
1367 
1368  LISTBASE_FOREACH (LayerCollection *, lc_iter, &lc_parent->layer_collections) {
1369  if (BKE_layer_collection_has_layer_collection(lc_iter, lc)) {
1370  lc_parent = lc_iter;
1371  break;
1372  }
1373  }
1374  }
1375 
1376  /* Make all the children visible. */
1378  }
1379 
1380  BKE_layer_collection_local_sync(view_layer, v3d);
1381 }
1382 
1384 {
1385  if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) {
1387  Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
1388  base->flag &= ~BASE_HIDDEN;
1389  }
1390  }
1392  layer_collection_bases_show_recursive(view_layer, lc_iter);
1393  }
1394 }
1395 
1397 {
1398  if ((lc->flag & LAYER_COLLECTION_EXCLUDE) == 0) {
1400  Base *base = BKE_view_layer_base_find(view_layer, cob->ob);
1401  base->flag |= BASE_HIDDEN;
1402  }
1403  }
1405  layer_collection_bases_hide_recursive(view_layer, lc_iter);
1406  }
1407 }
1408 
1415  LayerCollection *lc,
1416  const bool visible,
1417  const bool hierarchy)
1418 {
1419  if (hierarchy) {
1420  if (visible) {
1422  layer_collection_bases_show_recursive(view_layer, lc);
1423  }
1424  else {
1426  layer_collection_bases_hide_recursive(view_layer, lc);
1427  }
1428  }
1429  else {
1430  if (visible) {
1431  lc->flag &= ~LAYER_COLLECTION_HIDE;
1432  }
1433  else {
1434  lc->flag |= LAYER_COLLECTION_HIDE;
1435  }
1436  }
1437 }
1438 
1444  const int flag,
1445  const bool value,
1446  const bool restore_flag)
1447 {
1448  if (flag == LAYER_COLLECTION_EXCLUDE) {
1449  /* For exclude flag, we remember the state the children had before
1450  * excluding and restoring it when enabling the parent collection again. */
1451  if (value) {
1452  if (restore_flag) {
1455  }
1456  else {
1458  }
1459 
1460  lc->flag |= flag;
1461  }
1462  else {
1464  lc->flag &= ~flag;
1465  }
1466  }
1467  }
1468  else {
1469  SET_FLAG_FROM_TEST(lc->flag, value, flag);
1470  }
1471 
1473  layer_collection_flag_recursive_set(nlc, flag, value, true);
1474  }
1475 }
1476 
1477 void BKE_layer_collection_set_flag(LayerCollection *lc, const int flag, const bool value)
1478 {
1479  layer_collection_flag_recursive_set(lc, flag, value, false);
1480 }
1481 
1482 /* ---------------------------------------------------------------------- */
1483 
1485  const Collection *collection)
1486 {
1487  if (lc->collection == collection) {
1488  return lc;
1489  }
1490 
1493  if (found) {
1494  return found;
1495  }
1496  }
1497  return NULL;
1498 }
1499 
1504  const Collection *collection)
1505 {
1506  LISTBASE_FOREACH (LayerCollection *, layer_collection, &view_layer->layer_collections) {
1508  collection);
1509  if (found != NULL) {
1510  return found;
1511  }
1512  }
1513  return NULL;
1514 }
1515 
1519 bool BKE_view_layer_has_collection(ViewLayer *view_layer, const Collection *collection)
1520 {
1521  return BKE_layer_collection_first_from_scene_collection(view_layer, collection) != NULL;
1522 }
1523 
1528 {
1529  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
1530  Base *base = BKE_view_layer_base_find(view_layer, ob);
1531  if (base) {
1532  return true;
1533  }
1534  }
1535  return false;
1536 }
1537 
1540 /* Iterators */
1541 
1542 /* -------------------------------------------------------------------- */
1547  const View3D *v3d;
1550 
1551 static bool object_bases_iterator_is_valid(const View3D *v3d, Base *base, const int flag)
1552 {
1553  BLI_assert((v3d == NULL) || (v3d->spacetype == SPACE_VIEW3D));
1554 
1555  /* Any flag satisfies the condition. */
1556  if (flag == ~0) {
1557  return (base->flag != 0);
1558  }
1559 
1560  /* Flags may be more than one flag, so we can't check != 0. */
1561  return BASE_VISIBLE(v3d, base) && ((base->flag & flag) == flag);
1562 }
1563 
1564 static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in_v, const int flag)
1565 {
1566  ObjectsVisibleIteratorData *data_in = data_in_v;
1567  ViewLayer *view_layer = data_in->view_layer;
1568  const View3D *v3d = data_in->v3d;
1569  Base *base = view_layer->object_bases.first;
1570 
1571  /* when there are no objects */
1572  if (base == NULL) {
1573  iter->data = NULL;
1574  iter->valid = false;
1575  return;
1576  }
1577 
1579  iter->data = data;
1580 
1581  data->v3d = v3d;
1582  data->base = base;
1583 
1584  if (object_bases_iterator_is_valid(v3d, base, flag) == false) {
1585  object_bases_iterator_next(iter, flag);
1586  }
1587  else {
1588  iter->current = base;
1589  }
1590 }
1591 
1592 static void object_bases_iterator_next(BLI_Iterator *iter, const int flag)
1593 {
1595  Base *base = data->base->next;
1596 
1597  while (base) {
1598  if (object_bases_iterator_is_valid(data->v3d, base, flag)) {
1599  iter->current = base;
1600  data->base = base;
1601  return;
1602  }
1603  base = base->next;
1604  }
1605 
1606  iter->valid = false;
1607 }
1608 
1610 {
1611  MEM_SAFE_FREE(iter->data);
1612 }
1613 
1614 static void objects_iterator_begin(BLI_Iterator *iter, void *data_in, const int flag)
1615 {
1616  object_bases_iterator_begin(iter, data_in, flag);
1617 
1618  if (iter->valid) {
1619  iter->current = ((Base *)iter->current)->object;
1620  }
1621 }
1622 
1623 static void objects_iterator_next(BLI_Iterator *iter, const int flag)
1624 {
1625  object_bases_iterator_next(iter, flag);
1626 
1627  if (iter->valid) {
1628  iter->current = ((Base *)iter->current)->object;
1629  }
1630 }
1631 
1633 {
1635 }
1636 
1637 /* -------------------------------------------------------------------- */
1643 {
1645 }
1646 
1648 {
1650 }
1651 
1653 {
1654  objects_iterator_end(iter);
1655 }
1656 
1659 /* -------------------------------------------------------------------- */
1664 {
1665  objects_iterator_begin(iter, data_in, 0);
1666 }
1667 
1669 {
1670  objects_iterator_next(iter, 0);
1671 }
1672 
1674 {
1675  objects_iterator_end(iter);
1676 }
1677 
1680 /* -------------------------------------------------------------------- */
1685 {
1687  if (iter->valid) {
1688  if (BKE_object_is_libdata((Object *)iter->current) == false) {
1689  /* First object is valid (selectable and not libdata) -> all good. */
1690  return;
1691  }
1692 
1693  /* Object is selectable but not editable -> search for another one. */
1695  }
1696 }
1697 
1699 {
1700  /* Search while there are objects and the one we have is not editable (editable = not libdata).
1701  */
1702  do {
1704  } while (iter->valid && BKE_object_is_libdata((Object *)iter->current) != false);
1705 }
1706 
1708 {
1709  objects_iterator_end(iter);
1710 }
1711 
1714 /* -------------------------------------------------------------------- */
1719 {
1721 }
1722 
1724 {
1726 }
1727 
1729 {
1731 }
1732 
1735 /* -------------------------------------------------------------------- */
1740 {
1741  object_bases_iterator_begin(iter, data_in, 0);
1742 }
1743 
1745 {
1746  object_bases_iterator_next(iter, 0);
1747 }
1748 
1750 {
1752 }
1753 
1756 /* -------------------------------------------------------------------- */
1761 {
1762  return (base->object->type == data->object_type) &&
1763  (base->object->mode & data->object_mode) != 0;
1764 }
1765 
1767 {
1768  struct ObjectsInModeIteratorData *data = data_in;
1769  Base *base = data->base_active;
1770 
1771  /* In this case the result will always be empty, the caller must check for no mode. */
1772  BLI_assert(data->object_mode != 0);
1773 
1774  /* when there are no objects */
1775  if (base == NULL) {
1776  iter->valid = false;
1777  return;
1778  }
1779  iter->data = data_in;
1780  iter->current = base;
1781 
1782  /* default type is active object type */
1783  if (data->object_type < 0) {
1784  data->object_type = base->object->type;
1785  }
1786 
1787  if (!(base_is_in_mode(data, base) && BKE_base_is_visible(data->v3d, base))) {
1789  }
1790 }
1791 
1793 {
1794  struct ObjectsInModeIteratorData *data = iter->data;
1795  Base *base = iter->current;
1796 
1797  if (base == data->base_active) {
1798  /* first step */
1799  base = data->view_layer->object_bases.first;
1800  if ((base == data->base_active) && BKE_base_is_visible(data->v3d, base)) {
1801  base = base->next;
1802  }
1803  }
1804  else {
1805  base = base->next;
1806  }
1807 
1808  while (base) {
1809  if ((base != data->base_active) && base_is_in_mode(data, base) &&
1810  BKE_base_is_visible(data->v3d, base)) {
1811  iter->current = base;
1812  return;
1813  }
1814  base = base->next;
1815  }
1816  iter->valid = false;
1817 }
1818 
1820 {
1821  /* do nothing */
1822 }
1823 
1826 /* Evaluation */
1827 
1828 /* Applies object's restrict flags on top of flags coming from the collection
1829  * and stores those in base->flag. BASE_VISIBLE_DEPSGRAPH ignores viewport flags visibility
1830  * (i.e., restriction and local collection). */
1832 {
1833  /* Apply collection flags. */
1834  base->flag &= ~g_base_collection_flags;
1836 
1837  /* Apply object restrictions. */
1838  const int object_restrict = base->object->restrictflag;
1839  if (object_restrict & OB_RESTRICT_VIEWPORT) {
1840  base->flag &= ~BASE_ENABLED_VIEWPORT;
1841  }
1842  if (object_restrict & OB_RESTRICT_RENDER) {
1843  base->flag &= ~BASE_ENABLED_RENDER;
1844  }
1845  if (object_restrict & OB_RESTRICT_SELECT) {
1846  base->flag &= ~BASE_SELECTABLE;
1847  }
1848 
1849  /* Apply viewport visibility by default. The dependency graph for render
1850  * can change these again, but for tools we always want the viewport
1851  * visibility to be in sync regardless if depsgraph was evaluated. */
1852  if (!(base->flag & BASE_ENABLED_VIEWPORT) || (base->flag & BASE_HIDDEN)) {
1854  }
1855 
1856  /* Deselect unselectable objects. */
1857  if (!(base->flag & BASE_SELECTABLE)) {
1858  base->flag &= ~BASE_SELECTED;
1859  }
1860 }
1861 
1863  struct Scene *UNUSED(scene),
1865 {
1867 
1868  /* Create array of bases, for fast index-based lookup. */
1869  const int num_object_bases = BLI_listbase_count(&view_layer->object_bases);
1872  num_object_bases, sizeof(Base *), "view_layer->object_bases_array");
1873  int base_index = 0;
1875  view_layer->object_bases_array[base_index++] = base;
1876  }
1877 }
1878 
1880  struct Scene *scene,
1881  int view_layer_index)
1882 {
1883  BLI_assert(view_layer_index >= 0);
1884  ViewLayer *view_layer = BLI_findlink(&scene->view_layers, view_layer_index);
1887 }
1888 
1890 {
1891  LISTBASE_FOREACH (LayerCollection *, lc, lb) {
1892  BLO_write_struct(writer, LayerCollection, lc);
1893 
1894  write_layer_collections(writer, &lc->layer_collections);
1895  }
1896 }
1897 
1899 {
1902 
1903  if (view_layer->id_properties) {
1905  }
1906 
1909  }
1910 
1912  BLO_write_struct(writer, FreestyleLineSet, fls);
1913  }
1915  BLO_write_struct(writer, ViewLayerAOV, aov);
1916  }
1918 }
1919 
1920 static void direct_link_layer_collections(BlendDataReader *reader, ListBase *lb, bool master)
1921 {
1922  BLO_read_list(reader, lb);
1923  LISTBASE_FOREACH (LayerCollection *, lc, lb) {
1924 #ifdef USE_COLLECTION_COMPAT_28
1925  BLO_read_data_address(reader, &lc->scene_collection);
1926 #endif
1927 
1928  /* Master collection is not a real data-lock. */
1929  if (master) {
1930  BLO_read_data_address(reader, &lc->collection);
1931  }
1932 
1933  direct_link_layer_collections(reader, &lc->layer_collections, false);
1934  }
1935 }
1936 
1938 {
1939  view_layer->stats = NULL;
1942 
1945 
1948 
1951 
1952  BLO_read_list(reader, &view_layer->aovs);
1954 
1958 }
1959 
1961  Library *lib,
1962  LayerCollection *layer_collection,
1963  bool master)
1964 {
1965  /* Master collection is not a real data-lock. */
1966  if (!master) {
1967  BLO_read_id_address(reader, lib, &layer_collection->collection);
1968  }
1969 
1971  LayerCollection *, layer_collection_nested, &layer_collection->layer_collections) {
1972  lib_link_layer_collection(reader, lib, layer_collection_nested, false);
1973  }
1974 }
1975 
1977 {
1979  BLO_read_id_address(reader, lib, &fmc->script);
1980  }
1981 
1983  BLO_read_id_address(reader, lib, &fls->linestyle);
1984  BLO_read_id_address(reader, lib, &fls->group);
1985  }
1986 
1988  /* we only bump the use count for the collection objects */
1989  BLO_read_id_address(reader, lib, &base->object);
1990 
1991  if (base->object == NULL) {
1992  /* Free in case linked object got lost. */
1994  if (view_layer->basact == base) {
1995  view_layer->basact = NULL;
1996  }
1997  }
1998  }
1999 
2001  lib_link_layer_collection(reader, lib, layer_collection, true);
2002  }
2003 
2005 
2007 }
2008 
2009 /* -------------------------------------------------------------------- */
2014 {
2016  if (aov == NULL) {
2017  return;
2018  }
2020  &view_layer->aovs, aov, DATA_("AOV"), '.', offsetof(ViewLayerAOV, name), sizeof(aov->name));
2021 }
2022 
2024 {
2025  if (aov != NULL) {
2026  BLI_assert(BLI_findindex(&view_layer->aovs, aov) != -1);
2027  view_layer->active_aov = aov;
2028  }
2029  else {
2031  }
2032 }
2033 
2034 struct ViewLayerAOV *BKE_view_layer_add_aov(struct ViewLayer *view_layer)
2035 {
2036  ViewLayerAOV *aov;
2037  aov = MEM_callocN(sizeof(ViewLayerAOV), __func__);
2038  aov->type = AOV_TYPE_COLOR;
2039  BLI_strncpy(aov->name, DATA_("AOV"), sizeof(aov->name));
2040  BLI_addtail(&view_layer->aovs, aov);
2041  viewlayer_aov_active_set(view_layer, aov);
2042  viewlayer_aov_make_name_unique(view_layer);
2043  return aov;
2044 }
2045 
2047 {
2048  BLI_assert(BLI_findindex(&view_layer->aovs, aov) != -1);
2049  BLI_assert(aov != NULL);
2050  if (view_layer->active_aov == aov) {
2051  if (aov->next) {
2052  viewlayer_aov_active_set(view_layer, aov->next);
2053  }
2054  else {
2055  viewlayer_aov_active_set(view_layer, aov->prev);
2056  }
2057  }
2058  BLI_freelinkN(&view_layer->aovs, aov);
2059 }
2060 
2062 {
2063  viewlayer_aov_active_set(view_layer, aov);
2064 }
2065 
2066 static void bke_view_layer_verify_aov_cb(void *userdata,
2067  Scene *UNUSED(scene),
2068  ViewLayer *UNUSED(view_layer),
2069  const char *name,
2070  int UNUSED(channels),
2071  const char *UNUSED(chanid),
2073 {
2074  GHash *name_count = userdata;
2075  void **value_p;
2076  void *key = BLI_strdup(name);
2077 
2078  if (!BLI_ghash_ensure_p(name_count, key, &value_p)) {
2079  *value_p = POINTER_FROM_INT(1);
2080  }
2081  else {
2082  int value = POINTER_AS_INT(*value_p);
2083  value++;
2084  *value_p = POINTER_FROM_INT(value);
2085  MEM_freeN(key);
2086  }
2087 }
2088 
2089 /* Update the naming and conflicts of the AOVs.
2090  *
2091  * Name must be unique between all AOVs.
2092  * Conflicts with render passes will show a conflict icon. Reason is that switching a render
2093  * engine or activating a render pass could lead to other conflicts that wouldn't be that clear
2094  * for the user. */
2096  struct Scene *scene,
2097  struct ViewLayer *view_layer)
2098 {
2099  viewlayer_aov_make_name_unique(view_layer);
2100 
2101  GHash *name_count = BLI_ghash_str_new(__func__);
2103  engine, scene, view_layer, bke_view_layer_verify_aov_cb, name_count);
2104  LISTBASE_FOREACH (ViewLayerAOV *, aov, &view_layer->aovs) {
2105  void **value_p = BLI_ghash_lookup(name_count, aov->name);
2106  int count = POINTER_AS_INT(value_p);
2107  SET_FLAG_FROM_TEST(aov->flag, count > 1, AOV_CONFLICT);
2108  }
2109  BLI_ghash_free(name_count, MEM_freeN, NULL);
2110 }
2111 
2112 /* Check if the given view layer has at least one valid AOV. */
2114 {
2115  LISTBASE_FOREACH (ViewLayerAOV *, aov, &view_layer->aovs) {
2116  if ((aov->flag & AOV_CONFLICT) == 0) {
2117  return true;
2118  }
2119  }
2120  return false;
2121 }
2122 
2124 {
2125  LISTBASE_FOREACH (ViewLayer *, view_layer, &scene->view_layers) {
2126  if (BLI_findindex(&view_layer->aovs, aov) != -1) {
2127  return view_layer;
2128  }
2129  }
2130  return NULL;
2131 }
2132 
void BKE_animdata_fix_paths_rename_all(struct ID *ref_id, const char *prefix, const char *oldName, const char *newName)
Definition: anim_data.c:1414
void BKE_collection_object_cache_free(struct Collection *collection)
Definition: collection.c:872
void BKE_freestyle_config_copy(struct FreestyleConfig *new_config, const struct FreestyleConfig *config, const int flag)
void BKE_freestyle_config_free(struct FreestyleConfig *config, const bool do_id_user)
Definition: freestyle.c:56
void BKE_freestyle_config_init(struct FreestyleConfig *config)
Definition: freestyle.c:43
void IDP_FreeProperty_ex(struct IDProperty *prop, const bool do_id_user)
Definition: idprop.c:1034
void IDP_BlendWrite(struct BlendWriter *writer, const struct IDProperty *prop)
void IDP_BlendReadLib(struct BlendLibReader *reader, struct IDProperty *prop)
Definition: idprop.c:1300
#define IDP_BlendDataRead(reader, prop)
Definition: BKE_idprop.h:208
struct IDProperty * IDP_CopyProperty_ex(const struct IDProperty *prop, const int flag) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL()
@ VIEWLAYER_ADD_NEW
Definition: BKE_layer.h:50
@ VIEWLAYER_ADD_EMPTY
Definition: BKE_layer.h:51
@ VIEWLAYER_ADD_COPY
Definition: BKE_layer.h:52
@ LIB_ID_CREATE_NO_USER_REFCOUNT
Definition: BKE_lib_id.h:92
void id_us_plus(struct ID *id)
Definition: lib_id.c:288
void id_lib_indirect_weak_link(struct ID *id)
Definition: lib_id.c:220
#define CMP_NODE_R_LAYERS
Definition: BKE_node.h:1152
General operations, lookup, etc. for blender objects.
bool BKE_object_is_libdata(const struct Object *ob)
#define BLI_assert(a)
Definition: BLI_assert.h:58
unsigned int BLI_ghashutil_ptrhash(const void *key)
GHash * BLI_ghash_str_new(const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:718
bool BLI_ghashutil_ptrcmp(const void *a, const void *b)
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:900
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:1008
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:851
void * BLI_ghash_lookup(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:803
BLI_INLINE bool BLI_listbase_is_empty(const struct ListBase *lb)
Definition: BLI_listbase.h:124
#define LISTBASE_FOREACH(type, var, list)
Definition: BLI_listbase.h:172
void BLI_freelinkN(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:281
void void void void void BLI_duplicatelist(struct ListBase *dst, const struct ListBase *src) ATTR_NONNULL(1
#define LISTBASE_FOREACH_MUTABLE(type, var, list)
Definition: BLI_listbase.h:188
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:128
void void BLI_freelistN(struct ListBase *listbase) ATTR_NONNULL(1)
Definition: listbase.c:547
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:110
void BLI_remlink(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
Definition: listbase.c:133
int BLI_findindex(const struct ListBase *listbase, const void *vlink) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
void * BLI_findptr(const struct ListBase *listbase, const void *ptr, const int offset) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
#define STRNCPY(dst, src)
Definition: BLI_string.h:163
char * BLI_strdup(const char *str) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL() ATTR_MALLOC
Definition: string.c:70
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, const size_t maxncpy) ATTR_NONNULL()
Definition: string.c:108
char * BLI_strncpy_utf8(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string_utf8.c:258
bool BLI_uniquename(struct ListBase *list, void *vlink, const char *defname, char delim, int name_offset, size_t len)
Definition: string_utils.c:381
#define BLI_MUTEX_INITIALIZER
Definition: BLI_threads.h:84
void BLI_mutex_lock(ThreadMutex *mutex)
Definition: threads.cc:401
void BLI_mutex_unlock(ThreadMutex *mutex)
Definition: threads.cc:406
pthread_mutex_t ThreadMutex
Definition: BLI_threads.h:83
#define POINTER_FROM_INT(i)
#define UNUSED(x)
#define SET_FLAG_FROM_TEST(value, test, flag)
#define POINTER_AS_INT(i)
#define ELEM(...)
#define STREQ(a, b)
#define BLO_read_data_address(reader, ptr_p)
#define BLO_write_struct(writer, struct_name, data_ptr)
void BLO_read_list(BlendDataReader *reader, struct ListBase *list)
Definition: readfile.c:5654
#define BLO_read_id_address(reader, lib, id_ptr_p)
#define BLO_write_struct_list(writer, struct_name, list_ptr)
#define DATA_(msgid)
struct Depsgraph Depsgraph
Definition: DEG_depsgraph.h:51
void DEG_debug_print_eval(struct Depsgraph *depsgraph, const char *function_name, const char *object_name, const void *object_address)
void DEG_id_tag_update_ex(struct Main *bmain, struct ID *id, int flag)
void DEG_id_tag_update(struct ID *id, int flag)
ID and Library types, which are fundamental for sdna.
@ ID_RECALC_COPY_ON_WRITE
Definition: DNA_ID.h:654
Object groups, one object can be in many groups at once.
@ COLLECTION_RESTRICT_RENDER
@ COLLECTION_RESTRICT_VIEWPORT
@ COLLECTION_IS_MASTER
@ COLLECTION_RESTRICT_SELECT
@ VIEW_LAYER_CRYPTOMATTE_ACCURATE
@ LAYER_COLLECTION_HIDE
@ LAYER_COLLECTION_EXCLUDE
@ LAYER_COLLECTION_INDIRECT_ONLY
@ LAYER_COLLECTION_PREVIOUSLY_EXCLUDED
@ LAYER_COLLECTION_HOLDOUT
@ BASE_HIDDEN
@ BASE_INDIRECT_ONLY
@ BASE_SELECTABLE
@ BASE_ENABLED_RENDER
@ BASE_HOLDOUT
@ BASE_VISIBLE_VIEWLAYER
@ BASE_VISIBLE_DEPSGRAPH
@ BASE_ENABLED_VIEWPORT
@ BASE_SELECTED
@ LAYER_COLLECTION_RESTRICT_VIEWPORT
@ LAYER_COLLECTION_VISIBLE_VIEW_LAYER
@ LAYER_COLLECTION_HAS_OBJECTS
@ VIEW_LAYER_FREESTYLE
@ VIEW_LAYER_RENDER
@ AOV_TYPE_COLOR
@ AOV_CONFLICT
#define NODE_MAXSTR
eNodeSocketDatatype
Object is a sort of wrapper for general info.
@ OB_CAMERA
@ OB_RESTRICT_VIEWPORT
@ OB_RESTRICT_SELECT
@ OB_RESTRICT_RENDER
@ SCE_PASS_COMBINED
@ SCE_PASS_Z
#define BASE_VISIBLE(v3d, base)
@ SPACE_VIEW3D
#define V3D_LOCAL_COLLECTIONS
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
OperationNode * node
Scene scene
const Depsgraph * depsgraph
DRWShaderLibrary * lib
void RE_engine_update_render_passes(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer, update_render_passes_cb_t callback, void *callback_data)
Definition: engine.c:1071
int count
Object * BKE_view_layer_camera_find(ViewLayer *view_layer)
Definition: layer.c:337
void BKE_view_layer_bases_in_mode_iterator_begin(BLI_Iterator *iter, void *data_in)
Definition: layer.c:1766
void BKE_view_layer_bases_in_mode_iterator_next(BLI_Iterator *iter)
Definition: layer.c:1792
bool BKE_view_layer_has_collection(ViewLayer *view_layer, const Collection *collection)
Definition: layer.c:1519
static void layer_collection_bases_hide_recursive(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:1396
static void layer_aov_copy_data(ViewLayer *view_layer_dst, const ViewLayer *view_layer_src, ListBase *aovs_dst, const ListBase *aovs_src)
Definition: layer.c:421
void BKE_view_layer_blend_read_data(BlendDataReader *reader, ViewLayer *view_layer)
Definition: layer.c:1937
static bool layer_collection_hidden(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:593
struct LayerObjectBaseIteratorData LayerObjectBaseIteratorData
static void layer_collection_local_visibility_unset_recursive(LayerCollection *layer_collection, const int local_collections_uuid)
Definition: layer.c:1263
static void layer_collection_free(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:87
static LayerCollection * find_layer_collection_by_scene_collection(LayerCollection *lc, const Collection *collection)
Definition: layer.c:1484
static void layer_collection_flag_set_recursive(LayerCollection *lc, const int flag)
Definition: layer.c:1182
bool BKE_view_layer_has_valid_aov(ViewLayer *view_layer)
Definition: layer.c:2113
static void object_bases_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1609
void BKE_view_layer_bases_in_mode_iterator_end(BLI_Iterator *UNUSED(iter))
Definition: layer.c:1819
bool BKE_object_is_visible_in_viewport(const View3D *v3d, const struct Object *ob)
Definition: layer.c:1153
void BKE_view_layer_visible_bases_iterator_begin(BLI_Iterator *iter, void *data_in)
Definition: layer.c:1739
static void layer_collection_exclude_all(LayerCollection *layer_collection)
Definition: layer.c:187
static int collection_count(ListBase *lb)
Definition: layer.c:679
void BKE_main_collection_sync_remap(const Main *bmain)
Definition: layer.c:998
static void object_bases_iterator_begin(BLI_Iterator *iter, void *data_in_v, const int flag)
Definition: layer.c:1564
void BKE_layer_collection_set_visible(ViewLayer *view_layer, LayerCollection *lc, const bool visible, const bool hierarchy)
Definition: layer.c:1414
LayerCollection * BKE_layer_collection_from_index(ViewLayer *view_layer, const int index)
Definition: layer.c:621
int BKE_layer_collection_count(ViewLayer *view_layer)
Definition: layer.c:692
ViewLayer * BKE_view_layer_find_with_aov(struct Scene *scene, struct ViewLayerAOV *aov)
Definition: layer.c:2123
static void layer_collection_sync(ViewLayer *view_layer, const ListBase *lb_collections, ListBase *lb_layer_collections, ListBase *new_object_bases, short parent_exclude, short parent_restrict, short parent_layer_restrict, unsigned short parent_local_collections_bits)
Definition: layer.c:740
void BKE_view_layer_selected_editable_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
Definition: layer.c:1684
static ViewLayer * view_layer_add(const char *name)
Definition: layer.c:165
static void view_layer_bases_hash_create(ViewLayer *view_layer)
Definition: layer.c:364
static int index_from_collection(ListBase *lb, const LayerCollection *lc, int *i)
Definition: layer.c:700
void BKE_view_layer_set_active_aov(ViewLayer *view_layer, ViewLayerAOV *aov)
Definition: layer.c:2061
void BKE_view_layer_remove_aov(ViewLayer *view_layer, ViewLayerAOV *aov)
Definition: layer.c:2046
void BKE_view_layer_selected_editable_objects_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1707
static void viewlayer_aov_active_set(ViewLayer *view_layer, ViewLayerAOV *aov)
Definition: layer.c:2023
LayerCollection * BKE_layer_collection_activate_parent(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:651
void BKE_view_layer_selected_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
Definition: layer.c:1642
static void layer_collection_flag_recursive_set(LayerCollection *lc, const int flag, const bool value, const bool restore_flag)
Definition: layer.c:1443
static bool find_scene_collection_in_scene_collections(ListBase *lb, const LayerCollection *lc)
Definition: layer.c:317
Base * BKE_view_layer_base_find(ViewLayer *view_layer, Object *ob)
Definition: layer.c:394
void BKE_view_layer_visible_bases_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1749
bool BKE_layer_collection_has_selected_objects(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:1067
static void layer_eval_view_layer(struct Depsgraph *depsgraph, struct Scene *UNUSED(scene), ViewLayer *view_layer)
Definition: layer.c:1862
void BKE_view_layer_selected_objects_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1652
void BKE_layer_collection_set_flag(LayerCollection *lc, const int flag, const bool value)
Definition: layer.c:1477
void BKE_view_layer_selected_editable_objects_iterator_next(BLI_Iterator *iter)
Definition: layer.c:1698
void BKE_view_layer_blend_read_lib(BlendLibReader *reader, Library *lib, ViewLayer *view_layer)
Definition: layer.c:1976
ViewLayer * BKE_view_layer_default_view(const Scene *scene)
Definition: layer.c:117
void BKE_view_layer_free_ex(ViewLayer *view_layer, const bool do_id_user)
Definition: layer.c:262
static void direct_link_layer_collections(BlendDataReader *reader, ListBase *lb, bool master)
Definition: layer.c:1920
static LayerCollection * layer_collection_add(ListBase *lb_parent, Collection *collection)
Definition: layer.c:77
ViewLayer * BKE_view_layer_add(Scene *scene, const char *name, ViewLayer *view_layer_source, const int type)
Definition: layer.c:200
static const short g_base_collection_flags
Definition: layer.c:67
static void layer_collection_local_visibility_set_recursive(LayerCollection *layer_collection, const int local_collections_uuid)
Definition: layer.c:1254
static void lib_link_layer_collection(BlendLibReader *reader, Library *lib, LayerCollection *layer_collection, bool master)
Definition: layer.c:1960
LayerCollection * BKE_layer_collection_get_active(ViewLayer *view_layer)
Definition: layer.c:630
void BKE_view_layer_selected_bases_iterator_next(BLI_Iterator *iter)
Definition: layer.c:1723
static void write_layer_collections(BlendWriter *writer, ListBase *lb)
Definition: layer.c:1889
ViewLayer * BKE_view_layer_default_render(const Scene *scene)
Definition: layer.c:130
bool BKE_base_is_visible(const View3D *v3d, const Base *base)
Definition: layer.c:1128
void BKE_view_layer_verify_aov(struct RenderEngine *engine, struct Scene *scene, struct ViewLayer *view_layer)
Definition: layer.c:2095
void BKE_scene_collection_sync(const Scene *scene)
Definition: layer.c:977
void BKE_view_layer_visible_objects_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1673
void BKE_view_layer_selected_bases_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1728
void BKE_view_layer_rename(Main *bmain, Scene *scene, ViewLayer *view_layer, const char *newname)
Definition: layer.c:522
void BKE_base_set_visible(Scene *scene, ViewLayer *view_layer, Base *base, bool extend)
Definition: layer.c:1110
static void objects_iterator_next(BLI_Iterator *iter, const int flag)
Definition: layer.c:1623
void BKE_layer_collection_local_sync(ViewLayer *view_layer, const View3D *v3d)
Definition: layer.c:1296
static void layer_collection_flag_unset_recursive(LayerCollection *lc, const int flag)
Definition: layer.c:1190
bool BKE_layer_collection_has_layer_collection(LayerCollection *lc_parent, LayerCollection *lc_child)
Definition: layer.c:1092
void BKE_layer_collection_isolate_global(Scene *scene, ViewLayer *view_layer, LayerCollection *lc, bool extend)
Definition: layer.c:1206
static void bke_view_layer_verify_aov_cb(void *userdata, Scene *UNUSED(scene), ViewLayer *UNUSED(view_layer), const char *name, int UNUSED(channels), const char *UNUSED(chanid), eNodeSocketDatatype UNUSED(type))
Definition: layer.c:2066
static LayerCollection * collection_from_index(ListBase *lb, const int number, int *i)
Definition: layer.c:571
static void layer_collection_bases_show_recursive(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:1383
void BKE_layer_eval_view_layer_indexed(struct Depsgraph *depsgraph, struct Scene *scene, int view_layer_index)
Definition: layer.c:1879
static void objects_iterator_end(BLI_Iterator *iter)
Definition: layer.c:1632
ViewLayer * BKE_view_layer_find(const Scene *scene, const char *layer_name)
Definition: layer.c:143
bool BKE_scene_has_object(Scene *scene, Object *ob)
Definition: layer.c:1527
void BKE_layer_collection_isolate_local(ViewLayer *view_layer, const View3D *v3d, LayerCollection *lc, bool extend)
Definition: layer.c:1337
void BKE_main_collection_sync(const Main *bmain)
Definition: layer.c:984
void BKE_view_layer_free(ViewLayer *view_layer)
Definition: layer.c:254
LayerCollection * BKE_layer_collection_first_from_scene_collection(ViewLayer *view_layer, const Collection *collection)
Definition: layer.c:1503
static void viewlayer_aov_make_name_unique(ViewLayer *view_layer)
Definition: layer.c:2013
void BKE_view_layer_visible_objects_iterator_begin(BLI_Iterator *iter, void *data_in)
Definition: layer.c:1663
static Base * object_base_new(Object *ob)
Definition: layer.c:100
static bool object_bases_iterator_is_valid(const View3D *v3d, Base *base, const int flag)
Definition: layer.c:1551
void BKE_view_layer_selected_objects_tag(ViewLayer *view_layer, const int tag)
Definition: layer.c:305
ViewLayer * BKE_view_layer_find_from_collection(const Scene *scene, LayerCollection *lc)
Definition: layer.c:351
static void layer_collection_local_sync(ViewLayer *view_layer, LayerCollection *layer_collection, const unsigned short local_collections_uuid, bool visible)
Definition: layer.c:1272
void BKE_view_layer_base_select_and_set_active(struct ViewLayer *view_layer, Base *selbase)
Definition: layer.c:412
static void layer_collections_copy_data(ViewLayer *view_layer_dst, const ViewLayer *view_layer_src, ListBase *layer_collections_dst, const ListBase *layer_collections_src)
Definition: layer.c:444
void BKE_view_layer_base_deselect_all(ViewLayer *view_layer)
Definition: layer.c:403
void BKE_view_layer_selected_bases_iterator_begin(BLI_Iterator *iter, void *data_in)
Definition: layer.c:1718
static void object_bases_iterator_next(BLI_Iterator *iter, const int flag)
Definition: layer.c:1592
static void objects_iterator_begin(BLI_Iterator *iter, void *data_in, const int flag)
Definition: layer.c:1614
bool BKE_layer_collection_objects_select(ViewLayer *view_layer, LayerCollection *lc, bool deselect)
Definition: layer.c:1031
void BKE_layer_collection_sync(const Scene *scene, ViewLayer *view_layer)
Definition: layer.c:913
int BKE_layer_collection_findindex(ViewLayer *view_layer, const LayerCollection *lc)
Definition: layer.c:722
ViewLayer * BKE_view_layer_context_active_PLACEHOLDER(const Scene *scene)
Definition: layer.c:159
bool BKE_layer_collection_activate(ViewLayer *view_layer, LayerCollection *lc)
Definition: layer.c:638
void BKE_base_eval_flags(Base *base)
Definition: layer.c:1831
void BKE_view_layer_copy_data(Scene *scene_dst, const Scene *UNUSED(scene_src), ViewLayer *view_layer_dst, const ViewLayer *view_layer_src, const int flag)
Definition: layer.c:474
void BKE_view_layer_visible_bases_iterator_next(BLI_Iterator *iter)
Definition: layer.c:1744
void BKE_layer_collection_local_sync_all(const Main *bmain)
Definition: layer.c:1313
struct ViewLayerAOV * BKE_view_layer_add_aov(struct ViewLayer *view_layer)
Definition: layer.c:2034
void BKE_view_layer_blend_write(BlendWriter *writer, ViewLayer *view_layer)
Definition: layer.c:1898
void BKE_view_layer_visible_objects_iterator_next(BLI_Iterator *iter)
Definition: layer.c:1668
static bool base_is_in_mode(struct ObjectsInModeIteratorData *data, Base *base)
Definition: layer.c:1760
void BKE_view_layer_selected_objects_iterator_next(BLI_Iterator *iter)
Definition: layer.c:1647
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:48
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:41
void *(* MEM_dupallocN)(const void *vmemh)
Definition: mallocn.c:42
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:45
static void area(int d1, int d2, int e1, int e2, float weights[2])
bool active
all scheduled work for the GPU.
#define hash
Definition: noise.c:169
void * current
Definition: BLI_iterator.h:28
short flag_from_collection
struct Base * next
short flag
struct Object * object
unsigned short local_view_bits
unsigned short local_collections_bits
struct CollectionChild * next
struct Collection * collection
Definition: DNA_ID.h:273
void * next
Definition: DNA_ID.h:274
struct LayerCollection * next
ListBase layer_collections
unsigned short local_collections_bits
struct Collection * collection
const View3D * v3d
Definition: layer.c:1547
void * last
Definition: DNA_listBase.h:47
void * first
Definition: DNA_listBase.h:47
Definition: BKE_main.h:116
ListBase scenes
Definition: BKE_main.h:146
ListBase wm
Definition: BKE_main.h:175
ListBase screens
Definition: BKE_main.h:161
ListBase collections
Definition: BKE_main.h:167
unsigned short local_collections_bits
short base_flag
Object_Runtime runtime
unsigned short base_local_view_bits
char restrictflag
struct ViewLayer * view_layer
Definition: BKE_layer.h:183
const struct View3D * v3d
Definition: BKE_layer.h:165
struct ViewLayer * view_layer
Definition: BKE_layer.h:164
struct bNodeTree * nodetree
struct Collection * master_collection
ListBase view_layers
unsigned short local_view_uuid
struct View3D * localvd
char spacetype
unsigned short local_collections_uuid
int object_type_exclude_viewport
struct ViewLayerAOV * prev
struct ViewLayerAOV * next
ListBase drawdata
struct FreestyleConfig freestyle_config
short cryptomatte_flag
struct IDProperty * id_properties
short cryptomatte_levels
ViewLayerAOV * active_aov
ListBase layer_collections
LayerCollection * active_collection
struct GHash * object_bases_hash
struct Base ** object_bases_array
struct Base * basact
struct SceneStats * stats
ListBase object_bases
float pass_alpha_threshold
ListBase aovs
struct Material * mat_override
char name[64]
ListBase nodes