Blender  V2.93
BKE_main.h
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  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19 #pragma once
20 
38 #include "DNA_listBase.h"
39 
40 #include "BLI_compiler_attrs.h"
41 #include "BLI_sys_types.h"
42 
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46 
47 struct BLI_mempool;
48 struct BlendThumbnail;
49 struct GHash;
50 struct GSet;
51 struct ImBuf;
52 struct Library;
53 struct MainLock;
54 
55 /* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
56 /* We pack pixel data after that struct. */
57 typedef struct BlendThumbnail {
58  int width, height;
59  char rect[0];
61 
62 /* Structs caching relations between data-blocks in a given Main. */
63 typedef struct MainIDRelationsEntryItem {
65 
66  union {
67  /* For `from_ids` list, a user of the hashed ID. */
68  struct ID *from;
69  /* For `to_ids` list, an ID used by the hashed ID. */
70  struct ID **to;
72  /* Session uuid of the `id_pointer`. */
74 
75  int usage_flag; /* Using IDWALK_ enums, defined in BKE_lib_query.h */
77 
78 typedef struct MainIDRelationsEntry {
79  /* Linked list of IDs using that ID. */
81  /* Linked list of IDs used by that ID. */
83 
84  /* Session uuid of the ID matching that entry. */
86 
87  /* Runtime tags, users should ensure those are reset after usage. */
90 
91 /* MainIDRelationsEntry.tags */
93  /* Generic tag marking the entry as to be processed. */
95  /* Generic tag marking the entry as processed. */
98 
99 typedef struct MainIDRelations {
100  /* Mapping from an ID pointer to all of its parents (IDs using it) and children (IDs it uses).
101  * Values are `MainIDRelationsEntry` pointers. */
103  /* Note: we could add more mappings when needed (e.g. from session uuid?). */
104 
105  short flag;
106 
107  /* Private... */
110 
111 enum {
112  /* Those bmain relations include pointers/usages from editors. */
114 };
115 
116 typedef struct Main {
117  struct Main *next, *prev;
118  char name[1024]; /* 1024 = FILE_MAX */
119  short versionfile, subversionfile; /* see BLENDER_FILE_VERSION, BLENDER_FILE_SUBVERSION */
121  uint64_t build_commit_timestamp; /* commit's timestamp from buildinfo */
122  char build_hash[16]; /* hash from buildinfo */
123  char recovered; /* indicate the main->name (file) is the recovered one */
136 
142 
144 
145  struct Library *curlib;
158  ListBase ipo; /* Deprecated (only for versioning). */
175  ListBase wm; /* Singleton (exception). */
186 
193 
194  struct MainLock *lock;
196 
197 struct Main *BKE_main_new(void);
198 void BKE_main_free(struct Main *mainvar);
199 
200 void BKE_main_lock(struct Main *bmain);
201 void BKE_main_unlock(struct Main *bmain);
202 
203 void BKE_main_relations_create(struct Main *bmain, const short flag);
204 void BKE_main_relations_free(struct Main *bmain);
205 void BKE_main_relations_tag_set(struct Main *bmain,
206  const MainIDRelationsEntryTags tag,
207  const bool value);
208 
209 struct GSet *BKE_main_gset_create(struct Main *bmain, struct GSet *gset);
210 
211 /* *** Generic utils to loop over whole Main database. *** */
212 
213 #define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id) \
214  { \
215  ID *_id_next = (_lb)->first; \
216  for ((_id) = _id_next; (_id) != NULL; (_id) = _id_next) { \
217  _id_next = (_id)->next;
218 
219 #define FOREACH_MAIN_LISTBASE_ID_END \
220  } \
221  } \
222  ((void)0)
223 
224 #define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb) \
225  { \
226  ListBase *_lbarray[INDEX_ID_MAX]; \
227  int _i = set_listbasepointers((_bmain), _lbarray); \
228  while (_i--) { \
229  (_lb) = _lbarray[_i];
230 
231 #define FOREACH_MAIN_LISTBASE_END \
232  } \
233  } \
234  ((void)0)
235 
244 #define FOREACH_MAIN_ID_BEGIN(_bmain, _id) \
245  { \
246  ListBase *_lb; \
247  FOREACH_MAIN_LISTBASE_BEGIN ((_bmain), _lb) { \
248  FOREACH_MAIN_LISTBASE_ID_BEGIN (_lb, (_id))
249 
250 #define FOREACH_MAIN_ID_END \
251  FOREACH_MAIN_LISTBASE_ID_END; \
252  } \
253  FOREACH_MAIN_LISTBASE_END; \
254  } \
255  ((void)0)
256 
257 struct BlendThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
258 struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data);
259 void BKE_main_thumbnail_create(struct Main *bmain);
260 
261 const char *BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL();
262 const char *BKE_main_blendfile_path_from_global(void);
263 
264 struct ListBase *which_libbase(struct Main *bmain, short type);
265 
266 //#define INDEX_ID_MAX 41
267 int set_listbasepointers(struct Main *main, struct ListBase *lb[]);
268 
269 #define MAIN_VERSION_ATLEAST(main, ver, subver) \
270  ((main)->versionfile > (ver) || \
271  ((main)->versionfile == (ver) && (main)->subversionfile >= (subver)))
272 
273 #define MAIN_VERSION_OLDER(main, ver, subver) \
274  ((main)->versionfile < (ver) || \
275  ((main)->versionfile == (ver) && (main)->subversionfile < (subver)))
276 
277 #define BLEN_THUMB_SIZE 128
278 
279 #define BLEN_THUMB_MEMSIZE(_x, _y) \
280  (sizeof(BlendThumbnail) + ((size_t)(_x) * (size_t)(_y)) * sizeof(int))
282 #define BLEN_THUMB_MEMSIZE_IS_VALID(_x, _y) \
283  (((_x) > 0 && (_y) > 0) && ((uint64_t)(_x) * (uint64_t)(_y) < (SIZE_MAX / (sizeof(int) * 4))))
284 
285 #ifdef __cplusplus
286 }
287 #endif
struct Main * BKE_main_new(void)
Definition: main.c:45
@ MAINIDRELATIONS_INCLUDE_UI
Definition: BKE_main.h:113
struct ImBuf * BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data)
Definition: main.c:394
struct MainIDRelationsEntryItem MainIDRelationsEntryItem
void BKE_main_relations_create(struct Main *bmain, const short flag)
Definition: main.c:265
int set_listbasepointers(struct Main *main, struct ListBase *lb[])
struct BlendThumbnail BlendThumbnail
void BKE_main_relations_tag_set(struct Main *bmain, const MainIDRelationsEntryTags tag, const bool value)
Definition: main.c:313
MainIDRelationsEntryTags
Definition: BKE_main.h:92
@ MAINIDRELATIONS_ENTRY_TAGS_PROCESSED
Definition: BKE_main.h:96
@ MAINIDRELATIONS_ENTRY_TAGS_DOIT
Definition: BKE_main.h:94
void BKE_main_thumbnail_create(struct Main *bmain)
Definition: main.c:416
void BKE_main_unlock(struct Main *bmain)
Definition: main.c:207
const char * BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL()
void BKE_main_lock(struct Main *bmain)
Definition: main.c:202
void BKE_main_relations_free(struct Main *bmain)
Definition: main.c:300
struct MainIDRelations MainIDRelations
struct BlendThumbnail * BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img)
Definition: main.c:363
struct Main Main
struct ListBase * which_libbase(struct Main *bmain, short type)
Definition: main.c:447
void BKE_main_free(struct Main *mainvar)
Definition: main.c:53
struct GSet * BKE_main_gset_create(struct Main *bmain, struct GSet *gset)
Definition: main.c:342
struct MainIDRelationsEntry MainIDRelationsEntry
const char * BKE_main_blendfile_path_from_global(void)
Definition: main.c:439
#define ATTR_NONNULL(...)
struct GSet GSet
Definition: BLI_ghash.h:189
unsigned int uint
Definition: BLI_sys_types.h:83
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)
Definition: msgfmt.c:457
unsigned __int64 uint64_t
Definition: stdint.h:93
char rect[0]
Definition: BKE_main.h:59
Definition: DNA_ID.h:273
struct MainIDRelationsEntryItem * next
Definition: BKE_main.h:64
union MainIDRelationsEntryItem::@40 id_pointer
struct MainIDRelationsEntryItem * to_ids
Definition: BKE_main.h:82
struct MainIDRelationsEntryItem * from_ids
Definition: BKE_main.h:80
struct BLI_mempool * entry_items_pool
Definition: BKE_main.h:108
struct GHash * relations_from_pointers
Definition: BKE_main.h:102
Definition: BKE_main.h:116
ListBase volumes
Definition: BKE_main.h:184
ListBase lightprobes
Definition: BKE_main.h:165
ListBase brushes
Definition: BKE_main.h:171
ListBase masks
Definition: BKE_main.h:178
char recovered
Definition: BKE_main.h:123
ListBase scenes
Definition: BKE_main.h:146
char is_locked_for_linking
Definition: BKE_main.h:141
ListBase wm
Definition: BKE_main.h:175
short subversionfile
Definition: BKE_main.h:119
ListBase textures
Definition: BKE_main.h:153
ListBase actions
Definition: BKE_main.h:169
ListBase texts
Definition: BKE_main.h:163
char is_memfile_undo_flush_needed
Definition: BKE_main.h:130
ListBase meshes
Definition: BKE_main.h:149
char is_memfile_undo_written
Definition: BKE_main.h:125
ListBase movieclips
Definition: BKE_main.h:177
ListBase ipo
Definition: BKE_main.h:158
struct MainLock * lock
Definition: BKE_main.h:194
ListBase lights
Definition: BKE_main.h:156
ListBase paintcurves
Definition: BKE_main.h:174
ListBase fonts
Definition: BKE_main.h:162
ListBase nodetrees
Definition: BKE_main.h:170
BlendThumbnail * blen_thumb
Definition: BKE_main.h:143
ListBase particles
Definition: BKE_main.h:172
ListBase materials
Definition: BKE_main.h:152
ListBase linestyles
Definition: BKE_main.h:179
ListBase pointclouds
Definition: BKE_main.h:183
short minversionfile
Definition: BKE_main.h:120
uint64_t build_commit_timestamp
Definition: BKE_main.h:121
struct Main * next
Definition: BKE_main.h:117
ListBase lattices
Definition: BKE_main.h:155
ListBase sounds
Definition: BKE_main.h:166
ListBase shapekeys
Definition: BKE_main.h:159
ListBase libraries
Definition: BKE_main.h:147
ListBase cameras
Definition: BKE_main.h:157
char name[1024]
Definition: BKE_main.h:118
ListBase armatures
Definition: BKE_main.h:168
ListBase speakers
Definition: BKE_main.h:164
ListBase curves
Definition: BKE_main.h:150
char build_hash[16]
Definition: BKE_main.h:122
ListBase worlds
Definition: BKE_main.h:160
short minsubversionfile
Definition: BKE_main.h:120
ListBase screens
Definition: BKE_main.h:161
short versionfile
Definition: BKE_main.h:119
ListBase workspaces
Definition: BKE_main.h:181
struct MainIDRelations * relations
Definition: BKE_main.h:192
ListBase palettes
Definition: BKE_main.h:173
ListBase hairs
Definition: BKE_main.h:182
ListBase metaballs
Definition: BKE_main.h:151
struct Main * prev
Definition: BKE_main.h:117
ListBase collections
Definition: BKE_main.h:167
ListBase simulations
Definition: BKE_main.h:185
ListBase images
Definition: BKE_main.h:154
ListBase gpencils
Definition: BKE_main.h:176
char use_memfile_full_barrier
Definition: BKE_main.h:135
ListBase objects
Definition: BKE_main.h:148
struct Library * curlib
Definition: BKE_main.h:145
ListBase cachefiles
Definition: BKE_main.h:180