Cleanup: replace Main ID's foreach functions by macros.
[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 \ingroup bke
23  *  \section aboutmain Main struct
24  * Main is the root of the 'database' of a Blender context. All data
25  * is stuffed into lists, and all these lists are knotted to here. A
26  * Blender file is not much more but a binary dump of these
27  * lists. This list of lists is not serialized itself.
28  *
29  * Oops... this should be a _types.h file.
30  */
31 #include "DNA_listBase.h"
32
33 #include "BLI_compiler_attrs.h"
34 #include "BLI_sys_types.h"
35
36 #ifdef __cplusplus
37 extern "C" {
38 #endif
39
40 struct BLI_mempool;
41 struct BlendThumbnail;
42 struct Depsgraph;
43 struct GHash;
44 struct GSet;
45 struct ImBuf;
46 struct Library;
47 struct MainLock;
48
49 /* Blender thumbnail, as written on file (width, height, and data as char RGBA). */
50 /* We pack pixel data after that struct. */
51 typedef struct BlendThumbnail {
52         int width, height;
53         char rect[0];
54 } BlendThumbnail;
55
56 /* Structs caching relations between data-blocks in a given Main. */
57 typedef struct MainIDRelationsEntry {
58         struct MainIDRelationsEntry *next;
59         /* WARNING! for user_to_used, that pointer is really an ID** one, but for used_to_user, it’s only an ID* one! */
60         struct ID **id_pointer;
61         int usage_flag;  /* Using IDWALK_ enums, in BKE_library_query.h */
62 } MainIDRelationsEntry;
63
64 typedef struct MainIDRelations {
65         struct GHash *id_user_to_used;
66         struct GHash *id_used_to_user;
67
68         /* Private... */
69         struct BLI_mempool *entry_pool;
70 } MainIDRelations;
71
72 typedef struct Main {
73         struct Main *next, *prev;
74         char name[1024]; /* 1024 = FILE_MAX */
75         short versionfile, subversionfile;  /* see BLENDER_VERSION, BLENDER_SUBVERSION */
76         short minversionfile, minsubversionfile;
77         uint64_t build_commit_timestamp; /* commit's timestamp from buildinfo */
78         char build_hash[16];  /* hash from buildinfo */
79         char recovered; /* indicate the main->name (file) is the recovered one */
80         /** All current ID's exist in the last memfile undo step. */
81         char is_memfile_undo_written;
82
83         BlendThumbnail *blen_thumb;
84
85         struct Library *curlib;
86         ListBase scene;
87         ListBase library;
88         ListBase object;
89         ListBase mesh;
90         ListBase curve;
91         ListBase mball;
92         ListBase mat;
93         ListBase tex;
94         ListBase image;
95         ListBase latt;
96         ListBase lamp;
97         ListBase camera;
98         ListBase ipo;   // XXX deprecated
99         ListBase key;
100         ListBase world;
101         ListBase screen;
102         ListBase vfont;
103         ListBase text;
104         ListBase speaker;
105         ListBase lightprobe;
106         ListBase sound;
107         ListBase collection;
108         ListBase armature;
109         ListBase action;
110         ListBase nodetree;
111         ListBase brush;
112         ListBase particle;
113         ListBase palettes;
114         ListBase paintcurves;
115         ListBase wm;
116         ListBase gpencil;
117         ListBase movieclip;
118         ListBase mask;
119         ListBase linestyle;
120         ListBase cachefiles;
121         ListBase workspaces;
122
123         /* Must be generated, used and freed by same code - never assume this is valid data unless you know
124          * when, who and how it was created.
125          * Used by code doing a lot of remapping etc. at once to speed things up. */
126         struct MainIDRelations *relations;
127
128         struct MainLock *lock;
129 } Main;
130
131 struct Main *BKE_main_new(void);
132 void BKE_main_free(struct Main *mainvar);
133
134 void BKE_main_lock(struct Main *bmain);
135 void BKE_main_unlock(struct Main *bmain);
136
137 void BKE_main_relations_create(struct Main *bmain);
138 void BKE_main_relations_free(struct Main *bmain);
139
140 struct GSet *BKE_main_gset_create(struct Main *bmain, struct GSet *gset);
141
142 /* *** Generic utils to loop over whole Main database. *** */
143
144 #define FOREACH_MAIN_LISTBASE_ID_BEGIN(_lb, _id)                          \
145         for (_id = _lb->first; _id != NULL; _id = _id->next) {                \
146
147 #define FOREACH_MAIN_LISTBASE_ID_END                                      \
148         } ((void)0)
149
150
151 #define FOREACH_MAIN_ID_BEGIN(_bmain, _id)                                \
152         {                                                                     \
153                 ListBase *_lbarray[MAX_LIBARRAY];                                 \
154                 int i = set_listbasepointers(_bmain, _lbarray);                   \
155                 while (i--) {                                                     \
156                         FOREACH_MAIN_LISTBASE_ID_BEGIN(_lbarray[i], _id)              \
157
158 #define FOREACH_MAIN_ID_END                                               \
159                         FOREACH_MAIN_LISTBASE_ID_END;                                 \
160                 }                                                                 \
161         } ((void)0)
162
163 /** \param _do_break A boolean, to allow breaking iteration (only used to break by type,
164  *                   you must also use an explicit `break;` operation if you want to
165  *                   immediately break from inner by-ID loop).
166  */
167 #define FOREACH_MAIN_ID_BREAKABLE_BEGIN(_bmain, _id, _do_break)           \
168         {                                                                     \
169                 ListBase *_lbarray[MAX_LIBARRAY];                                 \
170                 int i = set_listbasepointers(_bmain, _lbarray);                   \
171                 while (i-- && !_do_break) {                                       \
172                         FOREACH_MAIN_LISTBASE_ID_BEGIN(_lbarray[i], _id)              \
173
174 #define FOREACH_MAIN_ID_BREAKABLE_END FOREACH_MAIN_ID_END
175
176
177 struct BlendThumbnail *BKE_main_thumbnail_from_imbuf(struct Main *bmain, struct ImBuf *img);
178 struct ImBuf *BKE_main_thumbnail_to_imbuf(struct Main *bmain, struct BlendThumbnail *data);
179 void BKE_main_thumbnail_create(struct Main *bmain);
180
181 const char *BKE_main_blendfile_path(const struct Main *bmain) ATTR_NONNULL();
182 const char *BKE_main_blendfile_path_from_global(void);
183
184 struct ListBase *which_libbase(struct Main *mainlib, short type);
185
186 #define MAX_LIBARRAY    37
187 int set_listbasepointers(struct Main *main, struct ListBase *lb[MAX_LIBARRAY]);
188
189 #define MAIN_VERSION_ATLEAST(main, ver, subver) \
190         ((main)->versionfile > (ver) || (main->versionfile == (ver) && (main)->subversionfile >= (subver)))
191
192 #define MAIN_VERSION_OLDER(main, ver, subver) \
193         ((main)->versionfile < (ver) || (main->versionfile == (ver) && (main)->subversionfile < (subver)))
194
195 #define BLEN_THUMB_SIZE 128
196
197 #define BLEN_THUMB_MEMSIZE(_x, _y) \
198         (sizeof(BlendThumbnail) + ((size_t)(_x) * (size_t)(_y)) * sizeof(int))
199 /** Protect against buffer overflow vulnerability & negative sizes. */
200 #define BLEN_THUMB_MEMSIZE_IS_VALID(_x, _y) \
201         (((_x) > 0 && (_y) > 0) && \
202          ((uint64_t)(_x) * (uint64_t)(_y) < (SIZE_MAX / (sizeof(int) * 4))))
203
204 #ifdef __cplusplus
205 }
206 #endif
207
208 #endif  /* __BKE_MAIN_H__ */