Blender  V3.3
main.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
3 
10 #include <string.h>
11 
12 #include "MEM_guardedalloc.h"
13 
14 #include "BLI_blenlib.h"
15 #include "BLI_ghash.h"
16 #include "BLI_mempool.h"
17 #include "BLI_threads.h"
18 
19 #include "DNA_ID.h"
20 
21 #include "BKE_global.h"
22 #include "BKE_idtype.h"
23 #include "BKE_lib_id.h"
24 #include "BKE_lib_query.h"
25 #include "BKE_main.h"
26 #include "BKE_main_idmap.h"
27 #include "BKE_main_namemap.h"
28 
29 #include "IMB_imbuf.h"
30 #include "IMB_imbuf_types.h"
31 
33 {
34  Main *bmain = MEM_callocN(sizeof(Main), "new main");
35  bmain->lock = MEM_mallocN(sizeof(SpinLock), "main lock");
36  BLI_spin_init((SpinLock *)bmain->lock);
37  return bmain;
38 }
39 
40 void BKE_main_free(Main *mainvar)
41 {
42  /* In case this is called on a 'split-by-libraries' list of mains.
43  *
44  * Should not happen in typical usages, but can occur e.g. if a file reading is aborted. */
45  if (mainvar->next) {
46  BKE_main_free(mainvar->next);
47  }
48 
49  /* also call when reading a file, erase all, etc */
50  ListBase *lbarray[INDEX_ID_MAX];
51  int a;
52 
53  /* Since we are removing whole main, no need to bother 'properly'
54  * (and slowly) removing each ID from it. */
55  const int free_flag = (LIB_ID_FREE_NO_MAIN | LIB_ID_FREE_NO_UI_USER |
57 
58  MEM_SAFE_FREE(mainvar->blen_thumb);
59 
60  a = set_listbasepointers(mainvar, lbarray);
61  while (a--) {
62  ListBase *lb = lbarray[a];
63  ID *id, *id_next;
64 
65  for (id = lb->first; id != NULL; id = id_next) {
66  id_next = id->next;
67 #if 1
68  BKE_id_free_ex(mainvar, id, free_flag, false);
69 #else
70  /* errors freeing ID's can be hard to track down,
71  * enable this so valgrind will give the line number in its error log */
72  switch (a) {
73  case 0:
74  BKE_id_free_ex(mainvar, id, free_flag, false);
75  break;
76  case 1:
77  BKE_id_free_ex(mainvar, id, free_flag, false);
78  break;
79  case 2:
80  BKE_id_free_ex(mainvar, id, free_flag, false);
81  break;
82  case 3:
83  BKE_id_free_ex(mainvar, id, free_flag, false);
84  break;
85  case 4:
86  BKE_id_free_ex(mainvar, id, free_flag, false);
87  break;
88  case 5:
89  BKE_id_free_ex(mainvar, id, free_flag, false);
90  break;
91  case 6:
92  BKE_id_free_ex(mainvar, id, free_flag, false);
93  break;
94  case 7:
95  BKE_id_free_ex(mainvar, id, free_flag, false);
96  break;
97  case 8:
98  BKE_id_free_ex(mainvar, id, free_flag, false);
99  break;
100  case 9:
101  BKE_id_free_ex(mainvar, id, free_flag, false);
102  break;
103  case 10:
104  BKE_id_free_ex(mainvar, id, free_flag, false);
105  break;
106  case 11:
107  BKE_id_free_ex(mainvar, id, free_flag, false);
108  break;
109  case 12:
110  BKE_id_free_ex(mainvar, id, free_flag, false);
111  break;
112  case 13:
113  BKE_id_free_ex(mainvar, id, free_flag, false);
114  break;
115  case 14:
116  BKE_id_free_ex(mainvar, id, free_flag, false);
117  break;
118  case 15:
119  BKE_id_free_ex(mainvar, id, free_flag, false);
120  break;
121  case 16:
122  BKE_id_free_ex(mainvar, id, free_flag, false);
123  break;
124  case 17:
125  BKE_id_free_ex(mainvar, id, free_flag, false);
126  break;
127  case 18:
128  BKE_id_free_ex(mainvar, id, free_flag, false);
129  break;
130  case 19:
131  BKE_id_free_ex(mainvar, id, free_flag, false);
132  break;
133  case 20:
134  BKE_id_free_ex(mainvar, id, free_flag, false);
135  break;
136  case 21:
137  BKE_id_free_ex(mainvar, id, free_flag, false);
138  break;
139  case 22:
140  BKE_id_free_ex(mainvar, id, free_flag, false);
141  break;
142  case 23:
143  BKE_id_free_ex(mainvar, id, free_flag, false);
144  break;
145  case 24:
146  BKE_id_free_ex(mainvar, id, free_flag, false);
147  break;
148  case 25:
149  BKE_id_free_ex(mainvar, id, free_flag, false);
150  break;
151  case 26:
152  BKE_id_free_ex(mainvar, id, free_flag, false);
153  break;
154  case 27:
155  BKE_id_free_ex(mainvar, id, free_flag, false);
156  break;
157  case 28:
158  BKE_id_free_ex(mainvar, id, free_flag, false);
159  break;
160  case 29:
161  BKE_id_free_ex(mainvar, id, free_flag, false);
162  break;
163  case 30:
164  BKE_id_free_ex(mainvar, id, free_flag, false);
165  break;
166  case 31:
167  BKE_id_free_ex(mainvar, id, free_flag, false);
168  break;
169  case 32:
170  BKE_id_free_ex(mainvar, id, free_flag, false);
171  break;
172  case 33:
173  BKE_id_free_ex(mainvar, id, free_flag, false);
174  break;
175  case 34:
176  BKE_id_free_ex(mainvar, id, free_flag, false);
177  break;
178  default:
180  break;
181  }
182 #endif
183  }
184  BLI_listbase_clear(lb);
185  }
186 
187  if (mainvar->relations) {
188  BKE_main_relations_free(mainvar);
189  }
190 
191  if (mainvar->id_map) {
192  BKE_main_idmap_destroy(mainvar->id_map);
193  }
194 
195  if (mainvar->name_map) {
197  }
198 
199  BLI_spin_end((SpinLock *)mainvar->lock);
200  MEM_freeN(mainvar->lock);
201  MEM_freeN(mainvar);
202 }
203 
204 bool BKE_main_is_empty(struct Main *bmain)
205 {
206  ID *id_iter;
207  FOREACH_MAIN_ID_BEGIN (bmain, id_iter) {
208  return false;
209  }
211  return true;
212 }
213 
214 void BKE_main_lock(struct Main *bmain)
215 {
216  BLI_spin_lock((SpinLock *)bmain->lock);
217 }
218 
219 void BKE_main_unlock(struct Main *bmain)
220 {
221  BLI_spin_unlock((SpinLock *)bmain->lock);
222 }
223 
225 {
226  MainIDRelations *bmain_relations = cb_data->user_data;
227  ID *id_self = cb_data->id_self;
228  ID **id_pointer = cb_data->id_pointer;
229  const int cb_flag = cb_data->cb_flag;
230 
231  if (*id_pointer) {
232  MainIDRelationsEntry **entry_p;
233 
234  /* Add `id_pointer` as child of `id_self`. */
235  {
236  if (!BLI_ghash_ensure_p(
237  bmain_relations->relations_from_pointers, id_self, (void ***)&entry_p)) {
238  *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
239  (*entry_p)->session_uuid = id_self->session_uuid;
240  }
241  else {
242  BLI_assert((*entry_p)->session_uuid == id_self->session_uuid);
243  }
244  MainIDRelationsEntryItem *to_id_entry = BLI_mempool_alloc(bmain_relations->entry_items_pool);
245  to_id_entry->next = (*entry_p)->to_ids;
246  to_id_entry->id_pointer.to = id_pointer;
247  to_id_entry->session_uuid = (*id_pointer != NULL) ? (*id_pointer)->session_uuid :
249  to_id_entry->usage_flag = cb_flag;
250  (*entry_p)->to_ids = to_id_entry;
251  }
252 
253  /* Add `id_self` as parent of `id_pointer`. */
254  if (*id_pointer != NULL) {
255  if (!BLI_ghash_ensure_p(
256  bmain_relations->relations_from_pointers, *id_pointer, (void ***)&entry_p)) {
257  *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
258  (*entry_p)->session_uuid = (*id_pointer)->session_uuid;
259  }
260  else {
261  BLI_assert((*entry_p)->session_uuid == (*id_pointer)->session_uuid);
262  }
264  bmain_relations->entry_items_pool);
265  from_id_entry->next = (*entry_p)->from_ids;
266  from_id_entry->id_pointer.from = id_self;
267  from_id_entry->session_uuid = id_self->session_uuid;
268  from_id_entry->usage_flag = cb_flag;
269  (*entry_p)->from_ids = from_id_entry;
270  }
271  }
272 
273  return IDWALK_RET_NOP;
274 }
275 
276 void BKE_main_relations_create(Main *bmain, const short flag)
277 {
278  if (bmain->relations != NULL) {
280  }
281 
282  bmain->relations = MEM_mallocN(sizeof(*bmain->relations), __func__);
286  sizeof(MainIDRelationsEntryItem), 128, 128, BLI_MEMPOOL_NOP);
287 
288  bmain->relations->flag = flag;
289 
290  ID *id;
291  FOREACH_MAIN_ID_BEGIN (bmain, id) {
292  const int idwalk_flag = IDWALK_READONLY |
293  ((flag & MAINIDRELATIONS_INCLUDE_UI) != 0 ? IDWALK_INCLUDE_UI : 0);
294 
295  /* Ensure all IDs do have an entry, even if they are not connected to any other. */
296  MainIDRelationsEntry **entry_p;
297  if (!BLI_ghash_ensure_p(bmain->relations->relations_from_pointers, id, (void ***)&entry_p)) {
298  *entry_p = MEM_callocN(sizeof(**entry_p), __func__);
299  (*entry_p)->session_uuid = id->session_uuid;
300  }
301  else {
302  BLI_assert((*entry_p)->session_uuid == id->session_uuid);
303  }
304 
306  NULL, id, main_relations_create_idlink_cb, bmain->relations, idwalk_flag);
307  }
309 }
310 
312 {
313  if (bmain->relations != NULL) {
314  if (bmain->relations->relations_from_pointers != NULL) {
316  }
318  MEM_freeN(bmain->relations);
319  bmain->relations = NULL;
320  }
321 }
322 
323 void BKE_main_relations_tag_set(struct Main *bmain,
324  const eMainIDRelationsEntryTags tag,
325  const bool value)
326 {
327  if (bmain->relations == NULL) {
328  return;
329  }
330 
331  GHashIterator *gh_iter;
333  !BLI_ghashIterator_done(gh_iter);
334  BLI_ghashIterator_step(gh_iter)) {
336  if (value) {
337  entry->tags |= tag;
338  }
339  else {
340  entry->tags &= ~tag;
341  }
342  }
343  BLI_ghashIterator_free(gh_iter);
344 }
345 
347 {
348  if (gset == NULL) {
350  }
351 
352  ID *id;
353  FOREACH_MAIN_ID_BEGIN (bmain, id) {
354  BLI_gset_add(gset, id);
355  }
357  return gset;
358 }
359 
360 /* Utils for ID's library weak reference API. */
361 typedef struct LibWeakRefKey {
365 
367  const char *lib_path,
368  const char *id_name)
369 {
370  if (key == NULL) {
371  key = MEM_mallocN(sizeof(*key), __func__);
372  }
373  BLI_strncpy(key->filepath, lib_path, sizeof(key->filepath));
374  BLI_strncpy(key->id_name, id_name, sizeof(key->id_name));
375  return key;
376 }
377 
378 static uint lib_weak_key_hash(const void *ptr)
379 {
380  const LibWeakRefKey *string_pair = ptr;
382  return hash ^ BLI_ghashutil_strhash_p_murmur(string_pair->id_name);
383 }
384 
385 static bool lib_weak_key_cmp(const void *a, const void *b)
386 {
387  const LibWeakRefKey *string_pair_a = a;
388  const LibWeakRefKey *string_pair_b = b;
389 
390  return !(STREQ(string_pair_a->filepath, string_pair_b->filepath) &&
391  STREQ(string_pair_a->id_name, string_pair_b->id_name));
392 }
393 
395 {
396  GHash *library_weak_reference_mapping = BLI_ghash_new(
398 
399  ListBase *lb;
400  FOREACH_MAIN_LISTBASE_BEGIN (bmain, lb) {
401  ID *id_iter = lb->first;
402  if (id_iter == NULL) {
403  continue;
404  }
405  if (!BKE_idtype_idcode_append_is_reusable(GS(id_iter->name))) {
406  continue;
407  }
409 
410  FOREACH_MAIN_LISTBASE_ID_BEGIN (lb, id_iter) {
411  if (id_iter->library_weak_reference == NULL) {
412  continue;
413  }
417  BLI_ghash_insert(library_weak_reference_mapping, key, id_iter);
418  }
420  }
422 
423  return library_weak_reference_mapping;
424 }
425 
426 void BKE_main_library_weak_reference_destroy(GHash *library_weak_reference_mapping)
427 {
428  BLI_ghash_free(library_weak_reference_mapping, MEM_freeN, NULL);
429 }
430 
431 ID *BKE_main_library_weak_reference_search_item(GHash *library_weak_reference_mapping,
432  const char *library_filepath,
433  const char *library_id_name)
434 {
435  LibWeakRefKey key;
436  lib_weak_key_create(&key, library_filepath, library_id_name);
437  return (ID *)BLI_ghash_lookup(library_weak_reference_mapping, &key);
438 }
439 
440 void BKE_main_library_weak_reference_add_item(GHash *library_weak_reference_mapping,
441  const char *library_filepath,
442  const char *library_id_name,
443  ID *new_id)
444 {
445  BLI_assert(GS(library_id_name) == GS(new_id->name));
448 
449  new_id->library_weak_reference = MEM_mallocN(sizeof(*(new_id->library_weak_reference)),
450  __func__);
451 
452  LibWeakRefKey *key = lib_weak_key_create(NULL, library_filepath, library_id_name);
453  void **id_p;
454  const bool already_exist_in_mapping = BLI_ghash_ensure_p(
455  library_weak_reference_mapping, key, &id_p);
456  BLI_assert(!already_exist_in_mapping);
457  UNUSED_VARS_NDEBUG(already_exist_in_mapping);
458 
460  library_filepath,
461  sizeof(new_id->library_weak_reference->library_filepath));
463  library_id_name,
464  sizeof(new_id->library_weak_reference->library_id_name));
465  *id_p = new_id;
466 }
467 
468 void BKE_main_library_weak_reference_update_item(GHash *library_weak_reference_mapping,
469  const char *library_filepath,
470  const char *library_id_name,
471  ID *old_id,
472  ID *new_id)
473 {
474  BLI_assert(GS(library_id_name) == GS(old_id->name));
475  BLI_assert(GS(library_id_name) == GS(new_id->name));
478  BLI_assert(STREQ(old_id->library_weak_reference->library_filepath, library_filepath));
479  BLI_assert(STREQ(old_id->library_weak_reference->library_id_name, library_id_name));
480 
481  LibWeakRefKey key;
482  lib_weak_key_create(&key, library_filepath, library_id_name);
483  void **id_p = BLI_ghash_lookup_p(library_weak_reference_mapping, &key);
484  BLI_assert(id_p != NULL && *id_p == old_id);
485 
487  old_id->library_weak_reference = NULL;
488  *id_p = new_id;
489 }
490 
491 void BKE_main_library_weak_reference_remove_item(GHash *library_weak_reference_mapping,
492  const char *library_filepath,
493  const char *library_id_name,
494  ID *old_id)
495 {
496  BLI_assert(GS(library_id_name) == GS(old_id->name));
498 
499  LibWeakRefKey key;
500  lib_weak_key_create(&key, library_filepath, library_id_name);
501 
502  BLI_assert(BLI_ghash_lookup(library_weak_reference_mapping, &key) == old_id);
503  BLI_ghash_remove(library_weak_reference_mapping, &key, MEM_freeN, NULL);
504 
506 }
507 
509 {
511 
512  if (bmain) {
513  MEM_SAFE_FREE(bmain->blen_thumb);
514  }
515 
516  if (img) {
517  const size_t data_size = BLEN_THUMB_MEMSIZE(img->x, img->y);
518  data = MEM_mallocN(data_size, __func__);
519 
520  IMB_rect_from_float(img); /* Just in case... */
521  data->width = img->x;
522  data->height = img->y;
523  memcpy(data->rect, img->rect, data_size - sizeof(*data));
524  }
525 
526  if (bmain) {
527  bmain->blen_thumb = data;
528  }
529  return data;
530 }
531 
533 {
534  ImBuf *img = NULL;
535 
536  if (!data && bmain) {
537  data = bmain->blen_thumb;
538  }
539 
540  if (data) {
541  img = IMB_allocFromBuffer(
542  (const uint *)data->rect, NULL, (uint)data->width, (uint)data->height, 4);
543  }
544 
545  return img;
546 }
547 
548 void BKE_main_thumbnail_create(struct Main *bmain)
549 {
550  MEM_SAFE_FREE(bmain->blen_thumb);
551 
553  bmain->blen_thumb->width = BLEN_THUMB_SIZE;
555 }
556 
557 const char *BKE_main_blendfile_path(const Main *bmain)
558 {
559  return bmain->filepath;
560 }
561 
563 {
565 }
566 
568 {
569  switch ((ID_Type)type) {
570  case ID_SCE:
571  return &(bmain->scenes);
572  case ID_LI:
573  return &(bmain->libraries);
574  case ID_OB:
575  return &(bmain->objects);
576  case ID_ME:
577  return &(bmain->meshes);
578  case ID_CU_LEGACY:
579  return &(bmain->curves);
580  case ID_MB:
581  return &(bmain->metaballs);
582  case ID_MA:
583  return &(bmain->materials);
584  case ID_TE:
585  return &(bmain->textures);
586  case ID_IM:
587  return &(bmain->images);
588  case ID_LT:
589  return &(bmain->lattices);
590  case ID_LA:
591  return &(bmain->lights);
592  case ID_CA:
593  return &(bmain->cameras);
594  case ID_IP:
595  return &(bmain->ipo);
596  case ID_KE:
597  return &(bmain->shapekeys);
598  case ID_WO:
599  return &(bmain->worlds);
600  case ID_SCR:
601  return &(bmain->screens);
602  case ID_VF:
603  return &(bmain->fonts);
604  case ID_TXT:
605  return &(bmain->texts);
606  case ID_SPK:
607  return &(bmain->speakers);
608  case ID_LP:
609  return &(bmain->lightprobes);
610  case ID_SO:
611  return &(bmain->sounds);
612  case ID_GR:
613  return &(bmain->collections);
614  case ID_AR:
615  return &(bmain->armatures);
616  case ID_AC:
617  return &(bmain->actions);
618  case ID_NT:
619  return &(bmain->nodetrees);
620  case ID_BR:
621  return &(bmain->brushes);
622  case ID_PA:
623  return &(bmain->particles);
624  case ID_WM:
625  return &(bmain->wm);
626  case ID_GD:
627  return &(bmain->gpencils);
628  case ID_MC:
629  return &(bmain->movieclips);
630  case ID_MSK:
631  return &(bmain->masks);
632  case ID_LS:
633  return &(bmain->linestyles);
634  case ID_PAL:
635  return &(bmain->palettes);
636  case ID_PC:
637  return &(bmain->paintcurves);
638  case ID_CF:
639  return &(bmain->cachefiles);
640  case ID_WS:
641  return &(bmain->workspaces);
642  case ID_CV:
643  return &(bmain->hair_curves);
644  case ID_PT:
645  return &(bmain->pointclouds);
646  case ID_VO:
647  return &(bmain->volumes);
648  case ID_SIM:
649  return &(bmain->simulations);
650  }
651  return NULL;
652 }
653 
654 int set_listbasepointers(Main *bmain, ListBase *lb[/*INDEX_ID_MAX*/])
655 {
656  /* Libraries may be accessed from pretty much any other ID. */
657  lb[INDEX_ID_LI] = &(bmain->libraries);
658 
659  lb[INDEX_ID_IP] = &(bmain->ipo);
660 
661  /* Moved here to avoid problems when freeing with animato (aligorith). */
662  lb[INDEX_ID_AC] = &(bmain->actions);
663 
664  lb[INDEX_ID_KE] = &(bmain->shapekeys);
665 
666  /* Referenced by gpencil, so needs to be before that to avoid crashes. */
667  lb[INDEX_ID_PAL] = &(bmain->palettes);
668 
669  /* Referenced by nodes, objects, view, scene etc, before to free after. */
670  lb[INDEX_ID_GD] = &(bmain->gpencils);
671 
672  lb[INDEX_ID_NT] = &(bmain->nodetrees);
673  lb[INDEX_ID_IM] = &(bmain->images);
674  lb[INDEX_ID_TE] = &(bmain->textures);
675  lb[INDEX_ID_MA] = &(bmain->materials);
676  lb[INDEX_ID_VF] = &(bmain->fonts);
677 
678  /* Important!: When adding a new object type,
679  * the specific data should be inserted here. */
680 
681  lb[INDEX_ID_AR] = &(bmain->armatures);
682 
683  lb[INDEX_ID_CF] = &(bmain->cachefiles);
684  lb[INDEX_ID_ME] = &(bmain->meshes);
685  lb[INDEX_ID_CU_LEGACY] = &(bmain->curves);
686  lb[INDEX_ID_MB] = &(bmain->metaballs);
687  lb[INDEX_ID_CV] = &(bmain->hair_curves);
688  lb[INDEX_ID_PT] = &(bmain->pointclouds);
689  lb[INDEX_ID_VO] = &(bmain->volumes);
690 
691  lb[INDEX_ID_LT] = &(bmain->lattices);
692  lb[INDEX_ID_LA] = &(bmain->lights);
693  lb[INDEX_ID_CA] = &(bmain->cameras);
694 
695  lb[INDEX_ID_TXT] = &(bmain->texts);
696  lb[INDEX_ID_SO] = &(bmain->sounds);
697  lb[INDEX_ID_GR] = &(bmain->collections);
698  lb[INDEX_ID_PAL] = &(bmain->palettes);
699  lb[INDEX_ID_PC] = &(bmain->paintcurves);
700  lb[INDEX_ID_BR] = &(bmain->brushes);
701  lb[INDEX_ID_PA] = &(bmain->particles);
702  lb[INDEX_ID_SPK] = &(bmain->speakers);
703  lb[INDEX_ID_LP] = &(bmain->lightprobes);
704 
705  lb[INDEX_ID_WO] = &(bmain->worlds);
706  lb[INDEX_ID_MC] = &(bmain->movieclips);
707  lb[INDEX_ID_SCR] = &(bmain->screens);
708  lb[INDEX_ID_OB] = &(bmain->objects);
709  lb[INDEX_ID_LS] = &(bmain->linestyles); /* referenced by scenes */
710  lb[INDEX_ID_SCE] = &(bmain->scenes);
711  lb[INDEX_ID_WS] = &(bmain->workspaces); /* before wm, so it's freed after it! */
712  lb[INDEX_ID_WM] = &(bmain->wm);
713  lb[INDEX_ID_MSK] = &(bmain->masks);
714  lb[INDEX_ID_SIM] = &(bmain->simulations);
715 
716  lb[INDEX_ID_NULL] = NULL;
717 
718  return (INDEX_ID_MAX - 1);
719 }
#define G_MAIN
Definition: BKE_global.h:267
bool BKE_idtype_idcode_is_linkable(short idcode)
Definition: idtype.c:175
bool BKE_idtype_idcode_append_is_reusable(short idcode)
Definition: idtype.c:194
@ LIB_ID_FREE_NO_UI_USER
Definition: BKE_lib_id.h:256
@ LIB_ID_FREE_NO_DEG_TAG
Definition: BKE_lib_id.h:254
@ LIB_ID_FREE_NO_USER_REFCOUNT
Definition: BKE_lib_id.h:245
@ LIB_ID_FREE_NO_MAIN
Definition: BKE_lib_id.h:240
void BKE_id_free_ex(struct Main *bmain, void *idv, int flag, bool use_flag_from_idtag)
Definition: lib_id_delete.c:82
#define MAIN_ID_SESSION_UUID_UNSET
Definition: BKE_lib_id.h:82
void BKE_library_foreach_ID_link(struct Main *bmain, struct ID *id, LibraryIDLinkCallback callback, void *user_data, int flag)
Definition: lib_query.c:350
@ IDWALK_INCLUDE_UI
@ IDWALK_READONLY
@ IDWALK_RET_NOP
Definition: BKE_lib_query.h:83
#define FOREACH_MAIN_ID_END
Definition: BKE_main.h:367
#define FOREACH_MAIN_LISTBASE_ID_END
Definition: BKE_main.h:336
#define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)
Definition: BKE_main.h:330
#define FOREACH_MAIN_LISTBASE_END
Definition: BKE_main.h:348
#define BLEN_THUMB_SIZE
Definition: BKE_main.h:446
@ MAINIDRELATIONS_INCLUDE_UI
Definition: BKE_main.h:118
eMainIDRelationsEntryTags
Definition: BKE_main.h:78
#define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb)
Definition: BKE_main.h:341
#define FOREACH_MAIN_ID_BEGIN(_bmain, _id)
Definition: BKE_main.h:361
#define BLEN_THUMB_MEMSIZE(_x, _y)
Definition: BKE_main.h:448
void BKE_main_idmap_destroy(struct IDNameLib_Map *id_map) ATTR_NONNULL()
Definition: main_idmap.c:258
void BKE_main_namemap_destroy(struct UniqueName_Map **r_name_map) ATTR_NONNULL()
#define BLI_assert_unreachable()
Definition: BLI_assert.h:93
#define BLI_assert(a)
Definition: BLI_assert.h:46
struct GSet GSet
Definition: BLI_ghash.h:340
void BLI_ghashIterator_step(GHashIterator *ghi)
Definition: BLI_ghash.c:914
unsigned int BLI_ghashutil_ptrhash(const void *key)
void BLI_ghashIterator_free(GHashIterator *ghi)
Definition: BLI_ghash.c:928
BLI_INLINE void * BLI_ghashIterator_getValue(GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.h:302
GHash * BLI_ghash_new(GHashHashFP hashfp, GHashCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:689
GSet * BLI_gset_new(GSetHashFP hashfp, GSetCmpFP cmpfp, const char *info) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:947
void * BLI_ghash_lookup(const GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:734
bool BLI_ghashutil_ptrcmp(const void *a, const void *b)
unsigned int BLI_ghashutil_strhash_p_murmur(const void *ptr)
GHashIterator * BLI_ghashIterator_new(GHash *gh) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:891
bool BLI_ghash_remove(GHash *gh, const void *key, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:790
void BLI_ghash_insert(GHash *gh, void *key, void *val)
Definition: BLI_ghash.c:710
void ** BLI_ghash_lookup_p(GHash *gh, const void *key) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:748
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
Definition: BLI_ghash.c:863
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.c:755
bool BLI_gset_add(GSet *gs, void *key)
Definition: BLI_ghash.c:969
BLI_INLINE bool BLI_ghashIterator_done(const GHashIterator *ghi) ATTR_WARN_UNUSED_RESULT
Definition: BLI_ghash.h:310
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
Definition: BLI_listbase.h:273
@ BLI_MEMPOOL_NOP
Definition: BLI_mempool.h:99
BLI_mempool * BLI_mempool_create(unsigned int esize, unsigned int elem_num, unsigned int pchunk, unsigned int flag) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
Definition: BLI_mempool.c:253
void * BLI_mempool_alloc(BLI_mempool *pool) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL ATTR_NONNULL(1)
Definition: BLI_mempool.c:319
void BLI_mempool_destroy(BLI_mempool *pool) ATTR_NONNULL(1)
Definition: BLI_mempool.c:707
#define FILE_MAX
char * BLI_strncpy(char *__restrict dst, const char *__restrict src, size_t maxncpy) ATTR_NONNULL()
Definition: string.c:64
unsigned int uint
Definition: BLI_sys_types.h:67
pthread_spinlock_t SpinLock
Definition: BLI_threads.h:110
void BLI_spin_init(SpinLock *spin)
Definition: threads.cc:419
void BLI_spin_unlock(SpinLock *spin)
Definition: threads.cc:452
void BLI_spin_lock(SpinLock *spin)
Definition: threads.cc:433
void BLI_spin_end(SpinLock *spin)
Definition: threads.cc:467
#define UNUSED_VARS_NDEBUG(...)
#define STREQ(a, b)
ID and Library types, which are fundamental for sdna.
@ INDEX_ID_TXT
Definition: DNA_ID.h:1001
@ INDEX_ID_WM
Definition: DNA_ID.h:1054
@ INDEX_ID_VO
Definition: DNA_ID.h:1031
@ INDEX_ID_NULL
Definition: DNA_ID.h:1057
@ INDEX_ID_GD
Definition: DNA_ID.h:990
@ INDEX_ID_CF
Definition: DNA_ID.h:1017
@ INDEX_ID_CV
Definition: DNA_ID.h:1029
@ INDEX_ID_PT
Definition: DNA_ID.h:1030
@ INDEX_ID_GR
Definition: DNA_ID.h:1040
@ INDEX_ID_LA
Definition: DNA_ID.h:1033
@ INDEX_ID_LT
Definition: DNA_ID.h:1032
@ INDEX_ID_PC
Definition: DNA_ID.h:1045
@ INDEX_ID_MA
Definition: DNA_ID.h:1012
@ INDEX_ID_IM
Definition: DNA_ID.h:1007
@ INDEX_ID_OB
Definition: DNA_ID.h:1039
@ INDEX_ID_ME
Definition: DNA_ID.h:1026
@ INDEX_ID_SO
Definition: DNA_ID.h:1002
@ INDEX_ID_VF
Definition: DNA_ID.h:1000
@ INDEX_ID_MC
Definition: DNA_ID.h:1008
@ INDEX_ID_MSK
Definition: DNA_ID.h:1006
@ INDEX_ID_BR
Definition: DNA_ID.h:1046
@ INDEX_ID_WS
Definition: DNA_ID.h:1053
@ INDEX_ID_SIM
Definition: DNA_ID.h:1018
@ INDEX_ID_SCR
Definition: DNA_ID.h:1052
@ INDEX_ID_SPK
Definition: DNA_ID.h:1035
@ INDEX_ID_MB
Definition: DNA_ID.h:1028
@ INDEX_ID_CU_LEGACY
Definition: DNA_ID.h:1027
@ INDEX_ID_LI
Definition: DNA_ID.h:980
@ INDEX_ID_IP
Definition: DNA_ID.h:983
@ INDEX_ID_NT
Definition: DNA_ID.h:996
@ INDEX_ID_WO
Definition: DNA_ID.h:1014
@ INDEX_ID_MAX
Definition: DNA_ID.h:1058
@ INDEX_ID_TE
Definition: DNA_ID.h:1011
@ INDEX_ID_PAL
Definition: DNA_ID.h:1044
@ INDEX_ID_LS
Definition: DNA_ID.h:1013
@ INDEX_ID_SCE
Definition: DNA_ID.h:1049
@ INDEX_ID_LP
Definition: DNA_ID.h:1036
@ INDEX_ID_AC
Definition: DNA_ID.h:984
@ INDEX_ID_CA
Definition: DNA_ID.h:1034
@ INDEX_ID_AR
Definition: DNA_ID.h:1025
@ INDEX_ID_PA
Definition: DNA_ID.h:1019
@ INDEX_ID_KE
Definition: DNA_ID.h:1022
#define MAX_ID_NAME
Definition: DNA_ID.h:337
ID_Type
Definition: DNA_ID_enums.h:44
@ ID_WM
Definition: DNA_ID_enums.h:72
@ ID_CA
Definition: DNA_ID_enums.h:56
@ ID_AR
Definition: DNA_ID_enums.h:66
@ ID_MC
Definition: DNA_ID_enums.h:73
@ ID_CF
Definition: DNA_ID_enums.h:78
@ ID_LI
Definition: DNA_ID_enums.h:46
@ ID_TE
Definition: DNA_ID_enums.h:52
@ ID_IM
Definition: DNA_ID_enums.h:53
@ ID_VO
Definition: DNA_ID_enums.h:83
@ ID_WS
Definition: DNA_ID_enums.h:79
@ ID_NT
Definition: DNA_ID_enums.h:68
@ ID_LA
Definition: DNA_ID_enums.h:55
@ ID_KE
Definition: DNA_ID_enums.h:58
@ ID_TXT
Definition: DNA_ID_enums.h:62
@ ID_SO
Definition: DNA_ID_enums.h:64
@ ID_SCE
Definition: DNA_ID_enums.h:45
@ ID_LS
Definition: DNA_ID_enums.h:75
@ ID_MSK
Definition: DNA_ID_enums.h:74
@ ID_GD
Definition: DNA_ID_enums.h:71
@ ID_CV
Definition: DNA_ID_enums.h:81
@ ID_PAL
Definition: DNA_ID_enums.h:76
@ ID_BR
Definition: DNA_ID_enums.h:69
@ ID_LP
Definition: DNA_ID_enums.h:80
@ ID_WO
Definition: DNA_ID_enums.h:59
@ ID_SIM
Definition: DNA_ID_enums.h:84
@ ID_MA
Definition: DNA_ID_enums.h:51
@ ID_AC
Definition: DNA_ID_enums.h:67
@ ID_SCR
Definition: DNA_ID_enums.h:60
@ ID_CU_LEGACY
Definition: DNA_ID_enums.h:49
@ ID_VF
Definition: DNA_ID_enums.h:61
@ ID_ME
Definition: DNA_ID_enums.h:48
@ ID_IP
Definition: DNA_ID_enums.h:57
@ ID_GR
Definition: DNA_ID_enums.h:65
@ ID_SPK
Definition: DNA_ID_enums.h:63
@ ID_MB
Definition: DNA_ID_enums.h:50
@ ID_LT
Definition: DNA_ID_enums.h:54
@ ID_OB
Definition: DNA_ID_enums.h:47
@ ID_PA
Definition: DNA_ID_enums.h:70
@ ID_PT
Definition: DNA_ID_enums.h:82
@ ID_PC
Definition: DNA_ID_enums.h:77
_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
void IMB_rect_from_float(struct ImBuf *ibuf)
Definition: divers.c:696
struct ImBuf * IMB_allocFromBuffer(const unsigned int *rect, const float *rectf, unsigned int w, unsigned int h, unsigned int channels)
Definition: allocimbuf.c:447
Contains defines and structs used throughout the imbuf module.
Read Guarded memory(de)allocation.
#define MEM_SAFE_FREE(v)
std::string id_name(void *id)
#define GS(x)
Definition: iris.c:225
ID * BKE_main_library_weak_reference_search_item(GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name)
Definition: main.c:431
void BKE_main_library_weak_reference_update_item(GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, ID *old_id, ID *new_id)
Definition: main.c:468
static bool lib_weak_key_cmp(const void *a, const void *b)
Definition: main.c:385
void BKE_main_library_weak_reference_add_item(GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, ID *new_id)
Definition: main.c:440
BlendThumbnail * BKE_main_thumbnail_from_imbuf(Main *bmain, ImBuf *img)
Definition: main.c:508
void BKE_main_library_weak_reference_remove_item(GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, ID *old_id)
Definition: main.c:491
void BKE_main_thumbnail_create(struct Main *bmain)
Definition: main.c:548
void BKE_main_unlock(struct Main *bmain)
Definition: main.c:219
const char * BKE_main_blendfile_path(const Main *bmain)
Definition: main.c:557
void BKE_main_library_weak_reference_destroy(GHash *library_weak_reference_mapping)
Definition: main.c:426
int set_listbasepointers(Main *bmain, ListBase *lb[])
Definition: main.c:654
void BKE_main_relations_tag_set(struct Main *bmain, const eMainIDRelationsEntryTags tag, const bool value)
Definition: main.c:323
ImBuf * BKE_main_thumbnail_to_imbuf(Main *bmain, BlendThumbnail *data)
Definition: main.c:532
void BKE_main_lock(struct Main *bmain)
Definition: main.c:214
void BKE_main_relations_create(Main *bmain, const short flag)
Definition: main.c:276
struct LibWeakRefKey LibWeakRefKey
GSet * BKE_main_gset_create(Main *bmain, GSet *gset)
Definition: main.c:346
GHash * BKE_main_library_weak_reference_create(Main *bmain)
Definition: main.c:394
bool BKE_main_is_empty(struct Main *bmain)
Definition: main.c:204
ListBase * which_libbase(Main *bmain, short type)
Definition: main.c:567
static int main_relations_create_idlink_cb(LibraryIDLinkCallbackData *cb_data)
Definition: main.c:224
Main * BKE_main_new(void)
Definition: main.c:32
void BKE_main_free(Main *mainvar)
Definition: main.c:40
static LibWeakRefKey * lib_weak_key_create(LibWeakRefKey *key, const char *lib_path, const char *id_name)
Definition: main.c:366
void BKE_main_relations_free(Main *bmain)
Definition: main.c:311
static uint lib_weak_key_hash(const void *ptr)
Definition: main.c:378
const char * BKE_main_blendfile_path_from_global(void)
Definition: main.c:562
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
static unsigned a[3]
Definition: RandGen.cpp:78
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
#define hash
Definition: noise.c:153
Definition: DNA_ID.h:368
unsigned int session_uuid
Definition: DNA_ID.h:407
void * next
Definition: DNA_ID.h:369
char name[66]
Definition: DNA_ID.h:378
struct LibraryWeakReference * library_weak_reference
Definition: DNA_ID.h:443
unsigned int * rect
char filepath[FILE_MAX]
Definition: main.c:362
char id_name[MAX_ID_NAME]
Definition: main.c:363
char library_filepath[1024]
Definition: DNA_ID.h:507
char library_id_name[66]
Definition: DNA_ID.h:510
void * first
Definition: DNA_listBase.h:31
struct MainIDRelationsEntryItem * next
Definition: BKE_main.h:50
union MainIDRelationsEntryItem::@39 id_pointer
struct BLI_mempool * entry_items_pool
Definition: BKE_main.h:113
struct GHash * relations_from_pointers
Definition: BKE_main.h:107
Definition: BKE_main.h:121
ListBase volumes
Definition: BKE_main.h:210
ListBase lightprobes
Definition: BKE_main.h:187
ListBase brushes
Definition: BKE_main.h:193
ListBase masks
Definition: BKE_main.h:200
ListBase scenes
Definition: BKE_main.h:168
ListBase wm
Definition: BKE_main.h:197
ListBase textures
Definition: BKE_main.h:175
ListBase actions
Definition: BKE_main.h:191
ListBase texts
Definition: BKE_main.h:185
ListBase meshes
Definition: BKE_main.h:171
char filepath[1024]
Definition: BKE_main.h:124
ListBase movieclips
Definition: BKE_main.h:199
ListBase ipo
Definition: BKE_main.h:180
struct MainLock * lock
Definition: BKE_main.h:226
ListBase hair_curves
Definition: BKE_main.h:208
ListBase lights
Definition: BKE_main.h:178
ListBase paintcurves
Definition: BKE_main.h:196
ListBase fonts
Definition: BKE_main.h:184
ListBase nodetrees
Definition: BKE_main.h:192
BlendThumbnail * blen_thumb
Definition: BKE_main.h:165
ListBase particles
Definition: BKE_main.h:194
ListBase materials
Definition: BKE_main.h:174
ListBase linestyles
Definition: BKE_main.h:201
ListBase pointclouds
Definition: BKE_main.h:209
struct Main * next
Definition: BKE_main.h:122
ListBase lattices
Definition: BKE_main.h:177
ListBase sounds
Definition: BKE_main.h:188
ListBase shapekeys
Definition: BKE_main.h:181
ListBase libraries
Definition: BKE_main.h:169
ListBase cameras
Definition: BKE_main.h:179
ListBase armatures
Definition: BKE_main.h:190
struct IDNameLib_Map * id_map
Definition: BKE_main.h:221
ListBase speakers
Definition: BKE_main.h:186
ListBase curves
Definition: BKE_main.h:172
ListBase worlds
Definition: BKE_main.h:182
ListBase screens
Definition: BKE_main.h:183
ListBase workspaces
Definition: BKE_main.h:203
struct MainIDRelations * relations
Definition: BKE_main.h:218
ListBase palettes
Definition: BKE_main.h:195
ListBase metaballs
Definition: BKE_main.h:173
ListBase collections
Definition: BKE_main.h:189
ListBase simulations
Definition: BKE_main.h:211
ListBase images
Definition: BKE_main.h:176
ListBase gpencils
Definition: BKE_main.h:198
ListBase objects
Definition: BKE_main.h:170
ListBase cachefiles
Definition: BKE_main.h:202
struct UniqueName_Map * name_map
Definition: BKE_main.h:224
PointerRNA * ptr
Definition: wm_files.c:3480