UI: Windows Shell Links & Improved Mac Aliases
[blender.git] / source / blender / blenkernel / BKE_main.h
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 #ifndef __BKE_MAIN_H__
20 #define __BKE_MAIN_H__
21
22 /** \file
23  * \ingroup bke
24  * \section aboutmain Main struct
25  * Main is the root of the 'data-base' of a Blender context. All data is put into lists, and all
26  * these lists are stored here.
27  *
28  * \note A Blender file is not much more than a binary dump of these lists. This list of lists is
29  * not serialized itself.
30  *
31  * \note `BKE_main` files are for operations over the Main database itself, or generating extra
32  * temp data to help working with it. Those should typically not affect the data-blocks themselves.
33  *
34  * \section Function Names
35  *
36  * - `BKE_main_` should be used for functions in that file.
37  */
38
39 #include "DNA_listBase.h"
40
41 #include "BLI_compiler_attrs.h"
42 #include "BLI_sys_types.h"
43
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 struct BLI_mempool;
49 struct BlendThumbnail;
50 struct GHash;
51 struct GSet;
52 struct ImBuf;
53 struct Library;
54 struct MainLock;
55
56 /* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
57 /* We pack pixel data after that struct. */
58 typedef struct BlendThumbnail {
59   int width, height;
60   char rect[0];
61 } BlendThumbnail;
62
63 /* Structs caching relations between data-blocks in a given Main. */
64 typedef struct MainIDRelationsEntry {
65   struct MainIDRelationsEntry *next;
66   /* WARNING! for user_to_used,
67    * that pointer is really an ID** one, but for used_to_user, it’s only an ID* one! */
68   struct ID **id_pointer;
69   int usage_flag; /* Using IDWALK_ enums, in BKE_lib_query.h */
70 } MainIDRelationsEntry;
71
72 typedef struct MainIDRelations {
73   struct GHash *id_user_to_used;
74   struct GHash *id_used_to_user;
75
76   short flag;
77
78   /* Private... */
79   struct BLI_mempool *entry_pool;
80 } MainIDRelations;
81
82 enum {
83   /* Those bmain relations include pointers/usages from editors. */
84   MAINIDRELATIONS_INCLUDE_UI = 1 << 0,
85 };
86
87 typedef struct Main {
88   struct Main *next, *prev;
89   char name[1024];                   /* 1024 = FILE_MAX */
90   short versionfile, subversionfile; /* see BLENDER_VERSION, BLENDER_SUBVERSION */
91   short minversionfile, minsubversionfile;
92   uint64_t build_commit_timestamp; /* commit's timestamp from buildinfo */
93   char build_hash[16];             /* hash from buildinfo */
94   char recovered;                  /* indicate the main->name (file) is the recovered one */
95   /** All current ID's exist in the last memfile undo step. */
96   char is_memfile_undo_written;
97   /**
98    * An ID needs it's data to be flushed back.
99    * use "needs_flush_to_id" in edit data to flag data which needs updating.
100    */
101   char is_memfile_undo_flush_needed;
102   /**
103    * Indicates that next memfile undo step should not allow to re-use old bmain when re-read, but
104    * instead do a complete full re-read/update from stored memfile.
105    */
106   char use_memfile_full_barrier;
107
108   /**
109    * When linking, disallow creation of new data-blocks.
110    * Make sure we don't do this by accident, see T76738.
111    */
112   char is_locked_for_linking;
113
114   BlendThumbnail *blen_thumb;
115
116   struct Library *curlib;
117   ListBase scenes;
118   ListBase libraries;
119   ListBase objects;
120   ListBase meshes;
121   ListBase curves;
122   ListBase metaballs;
123   ListBase materials;
124   ListBase textures;
125   ListBase images;
126   ListBase lattices;
127   ListBase lights;
128   ListBase cameras;
129   ListBase ipo; /* Deprecated (only for versioning). */
130   ListBase shapekeys;
131   ListBase worlds;
132   ListBase screens;
133   ListBase fonts;
134   ListBase texts;
135   ListBase speakers;
136   ListBase lightprobes;
137   ListBase sounds;
138   ListBase collections;
139   ListBase armatures;
140   ListBase actions;
141   ListBase nodetrees;
142   ListBase brushes;
143   ListBase particles;
144   ListBase palettes;
145   ListBase paintcurves;
146   ListBase wm; /* Singleton (exception). */
147   ListBase gpencils;
148   ListBase movieclips;
149   ListBase masks;
150   ListBase linestyles;
151   ListBase cachefiles;
152   ListBase workspaces;
153   ListBase hairs;
154   ListBase pointclouds;
155   ListBase volumes;
156   ListBase simulations;
157
158   /**
159    * Must be generated, used and freed by same code - never assume this is valid data unless you
160    * know when, who and how it was created.
161    * Used by code doing a lot of remapping etc. at once to speed things up.
162    */
163   struct MainIDRelations *relations;
164
165   struct MainLock *lock;
166 } Main;
167
168 struct Main *BKE_main_new(void);
169 void BKE_main_free(struct Main *mainvar);
170
171 void BKE_main_lock(struct Main *bmain);
172 void BKE_main_unlock(struct Main *bmain);
173
174 void BKE_main_relations_create(struct Main *bmain, const short flag);
175 void BKE_main_relations_free(struct Main *bmain);
176
177 struct GSet *BKE_main_gset_create(struct Main *bmain, struct GSet *gset);
178
179 /* *** Generic utils to loop over whole Main database. *** */
180
181 #define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id) \
182   { \
183     ID *_id_next = (_lb)->first; \
184     for ((_id) = _id_next; (_id) != NULL; (_id) = _id_next) { \
185       _id_next = (_id)->next;
186
187 #define FOREACH_MAIN_LISTBASE_ID_END \
188   } \
189   } \
190   ((void)0)
191
192 #define FOREACH_MAIN_LISTBASE_BEGIN(_bmain, _lb) \
193   { \
194     ListBase *_lbarray[MAX_LIBARRAY]; \
195     int _i = set_listbasepointers((_bmain), _lbarray); \
196     while (_i--) { \
197       (_lb) = _lbarray[_i];
198
199 #define FOREACH_MAIN_LISTBASE_END \
200   } \
201   } \
202   ((void)0)
203
204 /**
205  * DO NOT use break statement with that macro,
206  * use #FOREACH_MAIN_LISTBASE and #FOREACH_MAIN_LISTBASE_ID instead
207  * if you need that kind of control flow. */
208 #define FOREACH_MAIN_ID_BEGIN(_bmain, _id) \
209   { \
210     ListBase *_lb; \
211     FOREACH_MAIN_LISTBASE_BEGIN ((_bmain), _lb) { \
212       FOREACH_MAIN_LISTBASE_ID_BEGIN (_lb, (_id))
213
214 #define FOREACH_MAIN_ID_END \
215   FOREACH_MAIN_LISTBASE_ID_END; \
216   } \
217   FOREACH_MAIN_LISTBASE_END; \
218   } \
219   ((void)0)
220
221 struct BlendThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
222 struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data);
223 void BKE_main_thumbnail_create(struct Main *bmain);
224
225 const char *BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL();
226 const char *BKE_main_blendfile_path_from_global(void);
227
228 struct ListBase *which_libbase(struct Main *mainlib, short type);
229
230 #define MAX_LIBARRAY 41
231 int set_listbasepointers(struct Main *main, struct ListBase *lb[MAX_LIBARRAY]);
232
233 #define MAIN_VERSION_ATLEAST(main, ver, subver) \
234   ((main)->versionfile > (ver) || \
235    ((main)->versionfile == (ver) && (main)->subversionfile >= (subver)))
236
237 #define MAIN_VERSION_OLDER(main, ver, subver) \
238   ((main)->versionfile < (ver) || \
239    ((main)->versionfile == (ver) && (main)->subversionfile < (subver)))
240
241 #define BLEN_THUMB_SIZE 128
242
243 #define BLEN_THUMB_MEMSIZE(_x, _y) \
244   (sizeof(BlendThumbnail) + ((size_t)(_x) * (size_t)(_y)) * sizeof(int))
245 /** Protect against buffer overflow vulnerability & negative sizes. */
246 #define BLEN_THUMB_MEMSIZE_IS_VALID(_x, _y) \
247   (((_x) > 0 && (_y) > 0) && ((uint64_t)(_x) * (uint64_t)(_y) < (SIZE_MAX / (sizeof(int) * 4))))
248
249 #ifdef __cplusplus
250 }
251 #endif
252
253 #endif /* __BKE_MAIN_H__ */