Blender  V3.3
BKE_main.h
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 #pragma once
4 
22 #include "DNA_listBase.h"
23 
24 #include "BLI_compiler_attrs.h"
25 #include "BLI_sys_types.h"
26 
27 #ifdef __cplusplus
28 extern "C" {
29 #endif
30 
31 struct BLI_mempool;
32 struct BlendThumbnail;
33 struct GHash;
34 struct GSet;
35 struct IDNameLib_Map;
36 struct ImBuf;
37 struct Library;
38 struct MainLock;
39 struct UniqueName_Map;
40 
41 /* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
42 /* We pack pixel data after that struct. */
43 typedef struct BlendThumbnail {
44  int width, height;
45  char rect[0];
47 
48 /* Structs caching relations between data-blocks in a given Main. */
49 typedef struct MainIDRelationsEntryItem {
51 
52  union {
53  /* For `from_ids` list, a user of the hashed ID. */
54  struct ID *from;
55  /* For `to_ids` list, an ID used by the hashed ID. */
56  struct ID **to;
58  /* Session uuid of the `id_pointer`. */
60 
61  int usage_flag; /* Using IDWALK_ enums, defined in BKE_lib_query.h */
63 
64 typedef struct MainIDRelationsEntry {
65  /* Linked list of IDs using that ID. */
67  /* Linked list of IDs used by that ID. */
69 
70  /* Session uuid of the ID matching that entry. */
72 
73  /* Runtime tags, users should ensure those are reset after usage. */
76 
79  /* Generic tag marking the entry as to be processed. */
81 
82  /* Generic tag marking the entry as processed in the `to` direction (i.e. the IDs used by this
83  * item have been processed). */
85  /* Generic tag marking the entry as processed in the `from` direction (i.e. the IDs using this
86  * item have been processed). */
88  /* Generic tag marking the entry as processed. */
91 
92  /* Generic tag marking the entry as being processed in the `to` direction (i.e. the IDs used by
93  * this item are being processed). Useful for dependency loops detection and handling. */
95  /* Generic tag marking the entry as being processed in the `from` direction (i.e. the IDs using
96  * this item are being processed). Useful for dependency loops detection and handling. */
98  /* Generic tag marking the entry as being processed. Useful for dependency loops detection and
99  * handling. */
103 
104 typedef struct MainIDRelations {
105  /* Mapping from an ID pointer to all of its parents (IDs using it) and children (IDs it uses).
106  * Values are `MainIDRelationsEntry` pointers. */
108  /* NOTE: we could add more mappings when needed (e.g. from session uuid?). */
109 
110  short flag;
111 
112  /* Private... */
115 
116 enum {
117  /* Those bmain relations include pointers/usages from editors. */
119 };
120 
121 typedef struct Main {
122  struct Main *next, *prev;
124  char filepath[1024]; /* 1024 = FILE_MAX */
125  short versionfile, subversionfile; /* see BLENDER_FILE_VERSION, BLENDER_FILE_SUBVERSION */
133 
134  uint64_t build_commit_timestamp; /* commit's timestamp from buildinfo */
135  char build_hash[16]; /* hash from buildinfo */
136 
138  char recovered;
151 
157 
164 
166 
167  struct Library *curlib;
180  ListBase ipo; /* Deprecated (only for versioning). */
197  ListBase wm; /* Singleton (exception). */
212 
219 
220  /* IDMap of IDs. Currently used when reading (expanding) libraries. */
222 
223  /* Used for efficient calculations of unique names. */
225 
226  struct MainLock *lock;
228 
229 struct Main *BKE_main_new(void);
230 void BKE_main_free(struct Main *mainvar);
231 
235 bool BKE_main_is_empty(struct Main *bmain);
236 
237 void BKE_main_lock(struct Main *bmain);
238 void BKE_main_unlock(struct Main *bmain);
239 
241 void BKE_main_relations_create(struct Main *bmain, short flag);
242 void BKE_main_relations_free(struct Main *bmain);
244 void BKE_main_relations_tag_set(struct Main *bmain, eMainIDRelationsEntryTags tag, bool value);
245 
252 struct GSet *BKE_main_gset_create(struct Main *bmain, struct GSet *gset);
253 
254 /* Temporary runtime API to allow re-using local (already appended)
255  * IDs instead of appending a new copy again. */
256 
267 void BKE_main_library_weak_reference_destroy(struct GHash *library_weak_reference_mapping)
268  ATTR_NONNULL();
279  struct GHash *library_weak_reference_mapping,
280  const char *library_filepath,
281  const char *library_id_name) ATTR_NONNULL();
291 void BKE_main_library_weak_reference_add_item(struct GHash *library_weak_reference_mapping,
292  const char *library_filepath,
293  const char *library_id_name,
294  struct ID *new_id) ATTR_NONNULL();
309 void BKE_main_library_weak_reference_update_item(struct GHash *library_weak_reference_mapping,
310  const char *library_filepath,
311  const char *library_id_name,
312  struct ID *old_id,
313  struct ID *new_id) ATTR_NONNULL();
323 void BKE_main_library_weak_reference_remove_item(struct GHash *library_weak_reference_mapping,
324  const char *library_filepath,
325  const char *library_id_name,
326  struct ID *old_id) ATTR_NONNULL();
327 
328 /* *** Generic utils to loop over whole Main database. *** */
329 
330 #define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id) \
331  { \
332  ID *_id_next = (ID *)(_lb)->first; \
333  for ((_id) = _id_next; (_id) != NULL; (_id) = _id_next) { \
334  _id_next = (ID *)(_id)->next;
335 
336 #define FOREACH_MAIN_LISTBASE_ID_END \
337  } \
338  } \
339  ((void)0)
340 
341 #define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb) \
342  { \
343  ListBase *_lbarray[INDEX_ID_MAX]; \
344  int _i = set_listbasepointers((_bmain), _lbarray); \
345  while (_i--) { \
346  (_lb) = _lbarray[_i];
347 
348 #define FOREACH_MAIN_LISTBASE_END \
349  } \
350  } \
351  ((void)0)
352 
361 #define FOREACH_MAIN_ID_BEGIN(_bmain, _id) \
362  { \
363  ListBase *_lb; \
364  FOREACH_MAIN_LISTBASE_BEGIN ((_bmain), _lb) { \
365  FOREACH_MAIN_LISTBASE_ID_BEGIN (_lb, (_id))
366 
367 #define FOREACH_MAIN_ID_END \
368  FOREACH_MAIN_LISTBASE_ID_END; \
369  } \
370  FOREACH_MAIN_LISTBASE_END; \
371  } \
372  ((void)0)
373 
381 struct BlendThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
389 struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data);
393 void BKE_main_thumbnail_create(struct Main *bmain);
394 
398 const char *BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL();
405 const char *BKE_main_blendfile_path_from_global(void);
406 
410 struct ListBase *which_libbase(struct Main *bmain, short type);
411 
412 //#define INDEX_ID_MAX 41
425 int set_listbasepointers(struct Main *main, struct ListBase *lb[]);
426 
427 #define MAIN_VERSION_ATLEAST(main, ver, subver) \
428  ((main)->versionfile > (ver) || \
429  ((main)->versionfile == (ver) && (main)->subversionfile >= (subver)))
430 
431 #define MAIN_VERSION_OLDER(main, ver, subver) \
432  ((main)->versionfile < (ver) || \
433  ((main)->versionfile == (ver) && (main)->subversionfile < (subver)))
434 
435 #define MAIN_VERSION_FILE_OLDER_OR_EQUAL(main, ver, subver) \
436  ((main)->versionfile < (ver) || \
437  ((main)->versionfile == (ver) && (main)->subversionfile <= (subver)))
438 
446 #define BLEN_THUMB_SIZE 128
447 
448 #define BLEN_THUMB_MEMSIZE(_x, _y) \
449  (sizeof(BlendThumbnail) + ((size_t)(_x) * (size_t)(_y)) * sizeof(int))
451 #define BLEN_THUMB_MEMSIZE_IS_VALID(_x, _y) \
452  (((_x) > 0 && (_y) > 0) && ((uint64_t)(_x) * (uint64_t)(_y) < (SIZE_MAX / (sizeof(int) * 4))))
453 
454 #ifdef __cplusplus
455 }
456 #endif
void BKE_main_library_weak_reference_add_item(struct GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, struct ID *new_id) ATTR_NONNULL()
Definition: main.c:440
struct Main * BKE_main_new(void)
Definition: main.c:32
struct ImBuf * BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data)
Definition: main.c:532
struct MainIDRelationsEntryItem MainIDRelationsEntryItem
int set_listbasepointers(struct Main *main, struct ListBase *lb[])
Definition: main.c:654
struct ID * BKE_main_library_weak_reference_search_item(struct GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name) ATTR_NONNULL()
Definition: main.c:431
struct BlendThumbnail BlendThumbnail
struct GHash * BKE_main_library_weak_reference_create(struct Main *bmain) ATTR_NONNULL()
Definition: main.c:394
void BKE_main_relations_tag_set(struct Main *bmain, eMainIDRelationsEntryTags tag, bool value)
Definition: main.c:323
void BKE_main_library_weak_reference_destroy(struct GHash *library_weak_reference_mapping) ATTR_NONNULL()
Definition: main.c:426
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 struct Main *bmain) ATTR_NONNULL()
@ MAINIDRELATIONS_INCLUDE_UI
Definition: BKE_main.h:118
eMainIDRelationsEntryTags
Definition: BKE_main.h:78
@ MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS_FROM
Definition: BKE_main.h:97
@ MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_TO
Definition: BKE_main.h:84
@ MAINIDRELATIONS_ENTRY_TAGS_PROCESSED
Definition: BKE_main.h:89
@ MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS
Definition: BKE_main.h:100
@ MAINIDRELATIONS_ENTRY_TAGS_DOIT
Definition: BKE_main.h:80
@ MAINIDRELATIONS_ENTRY_TAGS_PROCESSED_FROM
Definition: BKE_main.h:87
@ MAINIDRELATIONS_ENTRY_TAGS_INPROGRESS_TO
Definition: BKE_main.h:94
void BKE_main_relations_create(struct Main *bmain, short flag)
Definition: main.c:276
void BKE_main_library_weak_reference_remove_item(struct GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, struct ID *old_id) ATTR_NONNULL()
Definition: main.c:491
void BKE_main_lock(struct Main *bmain)
Definition: main.c:214
void BKE_main_relations_free(struct Main *bmain)
Definition: main.c:311
struct MainIDRelations MainIDRelations
struct BlendThumbnail * BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img)
Definition: main.c:508
struct Main Main
struct ListBase * which_libbase(struct Main *bmain, short type)
Definition: main.c:567
bool BKE_main_is_empty(struct Main *bmain)
Definition: main.c:204
void BKE_main_library_weak_reference_update_item(struct GHash *library_weak_reference_mapping, const char *library_filepath, const char *library_id_name, struct ID *old_id, struct ID *new_id) ATTR_NONNULL()
Definition: main.c:468
void BKE_main_free(struct Main *mainvar)
Definition: main.c:40
struct GSet * BKE_main_gset_create(struct Main *bmain, struct GSet *gset)
Definition: main.c:346
struct MainIDRelationsEntry MainIDRelationsEntry
const char * BKE_main_blendfile_path_from_global(void)
Definition: main.c:562
#define ATTR_NONNULL(...)
struct GSet GSet
Definition: BLI_ghash.h:340
unsigned int uint
Definition: BLI_sys_types.h:67
These structs are the foundation for all linked lists in the library system.
_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
int main(int argc, char *argv[])
unsigned __int64 uint64_t
Definition: stdint.h:90
char rect[0]
Definition: BKE_main.h:45
Definition: DNA_ID.h:368
struct MainIDRelationsEntryItem * next
Definition: BKE_main.h:50
union MainIDRelationsEntryItem::@39 id_pointer
struct MainIDRelationsEntryItem * to_ids
Definition: BKE_main.h:68
struct MainIDRelationsEntryItem * from_ids
Definition: BKE_main.h:66
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
char recovered
Definition: BKE_main.h:138
ListBase scenes
Definition: BKE_main.h:168
char is_locked_for_linking
Definition: BKE_main.h:156
ListBase wm
Definition: BKE_main.h:197
short subversionfile
Definition: BKE_main.h:125
bool has_forward_compatibility_issues
Definition: BKE_main.h:132
ListBase textures
Definition: BKE_main.h:175
ListBase actions
Definition: BKE_main.h:191
ListBase texts
Definition: BKE_main.h:185
char is_memfile_undo_flush_needed
Definition: BKE_main.h:145
ListBase meshes
Definition: BKE_main.h:171
char is_memfile_undo_written
Definition: BKE_main.h:140
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
short minversionfile
Definition: BKE_main.h:126
uint64_t build_commit_timestamp
Definition: BKE_main.h:134
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
char build_hash[16]
Definition: BKE_main.h:135
ListBase worlds
Definition: BKE_main.h:182
short minsubversionfile
Definition: BKE_main.h:126
ListBase screens
Definition: BKE_main.h:183
short versionfile
Definition: BKE_main.h:125
ListBase workspaces
Definition: BKE_main.h:203
bool is_read_invalid
Definition: BKE_main.h:163
struct MainIDRelations * relations
Definition: BKE_main.h:218
ListBase palettes
Definition: BKE_main.h:195
ListBase metaballs
Definition: BKE_main.h:173
struct Main * prev
Definition: BKE_main.h:122
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
char use_memfile_full_barrier
Definition: BKE_main.h:150
ListBase objects
Definition: BKE_main.h:170
struct Library * curlib
Definition: BKE_main.h:167
ListBase cachefiles
Definition: BKE_main.h:202
struct UniqueName_Map * name_map
Definition: BKE_main.h:224