d3d7d075229bc89855e0265376377dd8d9484e05
[blender.git] / source / blender / makesdna / DNA_ID.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27
28 /** \file DNA_ID.h
29  *  \ingroup DNA
30  *  \brief ID and Library types, which are fundamental for sdna.
31  */
32
33 #ifndef __DNA_ID_H__
34 #define __DNA_ID_H__
35
36 #include "DNA_listBase.h"
37
38 #ifdef __cplusplus
39 extern "C" {
40 #endif
41
42 struct Library;
43 struct FileData;
44 struct ID;
45 struct PackedFile;
46 struct GPUTexture;
47
48 typedef struct IDPropertyData {
49         void *pointer;
50         ListBase group;
51         int val, val2;  /* note, we actually fit a double into these two ints */
52 } IDPropertyData;
53
54 typedef struct IDProperty {
55         struct IDProperty *next, *prev;
56         char type, subtype;
57         short flag;
58         char name[64];  /* MAX_IDPROP_NAME */
59
60         /* saved is used to indicate if this struct has been saved yet.
61          * seemed like a good idea as a pad var was needed anyway :) */
62         int saved;
63         IDPropertyData data;  /* note, alignment for 64 bits */
64
65         /* array length, also (this is important!) string length + 1.
66          * the idea is to be able to reuse array realloc functions on strings.*/
67         int len;
68
69         /* Strings and arrays are both buffered, though the buffer isn't saved. */
70         /* totallen is total length of allocated array/string, including a buffer.
71          * Note that the buffering is mild; the code comes from python's list implementation. */
72         int totallen;
73 } IDProperty;
74
75 #define MAX_IDPROP_NAME 64
76 #define DEFAULT_ALLOC_FOR_NULL_STRINGS  64
77
78 /*->type*/
79 enum {
80         IDP_STRING           = 0,
81         IDP_INT              = 1,
82         IDP_FLOAT            = 2,
83         IDP_ARRAY            = 5,
84         IDP_GROUP            = 6,
85         /* the ID link property type hasn't been implemented yet, this will require
86          * some cleanup of blenkernel, most likely. */
87         IDP_ID               = 7,
88         IDP_DOUBLE           = 8,
89         IDP_IDPARRAY         = 9,
90         IDP_NUMTYPES         = 10,
91 };
92
93 /*->subtype */
94
95 /* IDP_STRING */
96 enum {
97         IDP_STRING_SUB_UTF8  = 0,  /* default */
98         IDP_STRING_SUB_BYTE  = 1,  /* arbitrary byte array, _not_ null terminated */
99 };
100
101 /*->flag*/
102 enum {
103         IDP_FLAG_GHOST       = 1 << 7,  /* this means the property is set but RNA will return false when checking
104                                          * 'RNA_property_is_set', currently this is a runtime flag */
105 };
106
107 /* add any future new id property types here.*/
108
109 /* watch it: Sequence has identical beginning. */
110 /**
111  * ID is the first thing included in all serializable types. It
112  * provides a common handle to place all data in double-linked lists.
113  * */
114
115 /* 2 characters for ID code and 64 for actual name */
116 #define MAX_ID_NAME  66
117
118 /* There's a nasty circular dependency here.... 'void *' to the rescue! I
119  * really wonder why this is needed. */
120 typedef struct ID {
121         void *next, *prev;
122         struct ID *newid;
123         struct Library *lib;
124         char name[66]; /* MAX_ID_NAME */
125         /**
126          * LIB_... flags report on status of the datablock this ID belongs to (persistent, saved to and read from .blend).
127          */
128         short flag;
129         /**
130          * LIB_TAG_... tags (runtime only, cleared at read time).
131          */
132         short tag;
133         short pad_s1;
134         int us;
135         int icon_id;
136         IDProperty *properties;
137 } ID;
138
139 /**
140  * For each library file used, a Library struct is added to Main
141  * WARNING: readfile.c, expand_doit() reads this struct without DNA check!
142  */
143 typedef struct Library {
144         ID id;
145         struct FileData *filedata;
146         char name[1024];  /* path name used for reading, can be relative and edited in the outliner */
147
148         /* absolute filepath, this is only for convenience, 'name' is the real path used on file read but in
149          * some cases its useful to access the absolute one.
150          * This is set on file read.
151          * Use BKE_library_filepath_set() rather than setting 'name' directly and it will be kept in sync - campbell */
152         char filepath[1024];
153
154         struct Library *parent; /* set for indirectly linked libs, used in the outliner and while reading */
155         
156         struct PackedFile *packedfile;
157 } Library;
158
159 enum eIconSizes {
160         ICON_SIZE_ICON = 0,
161         ICON_SIZE_PREVIEW = 1,
162
163         NUM_ICON_SIZES
164 };
165
166 /* for PreviewImage->flag */
167 enum ePreviewImage_Flag {
168         PRV_CHANGED          = (1 << 0),
169         PRV_USER_EDITED      = (1 << 1),  /* if user-edited, do not auto-update this anymore! */
170 };
171
172 typedef struct PreviewImage {
173         /* All values of 2 are really NUM_ICON_SIZES */
174         unsigned int w[2];
175         unsigned int h[2];
176         short flag[2];
177         short changed_timestamp[2];
178         unsigned int *rect[2];
179
180         /* Runtime-only data. */
181         struct GPUTexture *gputexture[2];
182         int icon_id;  /* Used by previews outside of ID context. */
183
184         char pad[3];
185         char use_deferred;  /* for now a mere bool, if we add more deferred loading methods we can switch to bitflag. */
186 } PreviewImage;
187
188 #define PRV_DEFERRED_DATA(prv) \
189         (CHECK_TYPE_INLINE(prv, PreviewImage *), BLI_assert((prv)->use_deferred), (void *)((prv) + 1))
190
191 /**
192  * Defines for working with IDs.
193  *
194  * The tags represent types! This is a dirty way of enabling RTTI. The
195  * sig_byte end endian defines aren't really used much.
196  *
197  **/
198
199 #ifdef __BIG_ENDIAN__
200    /* big endian */
201 #  define MAKE_ID2(c, d)  ((c) << 8 | (d))
202 #else
203    /* little endian  */
204 #  define MAKE_ID2(c, d)  ((d) << 8 | (c))
205 #endif
206
207 /**
208  * ID from database.
209  *
210  * Written to #BHead.code (for file IO)
211  * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
212  */
213 #define ID_SCE          MAKE_ID2('S', 'C') /* Scene */
214 #define ID_LI           MAKE_ID2('L', 'I') /* Library */
215 #define ID_OB           MAKE_ID2('O', 'B') /* Object */
216 #define ID_ME           MAKE_ID2('M', 'E') /* Mesh */
217 #define ID_CU           MAKE_ID2('C', 'U') /* Curve */
218 #define ID_MB           MAKE_ID2('M', 'B') /* MetaBall */
219 #define ID_MA           MAKE_ID2('M', 'A') /* Material */
220 #define ID_TE           MAKE_ID2('T', 'E') /* Tex (Texture) */
221 #define ID_IM           MAKE_ID2('I', 'M') /* Image */
222 #define ID_LT           MAKE_ID2('L', 'T') /* Lattice */
223 #define ID_LA           MAKE_ID2('L', 'A') /* Lamp */
224 #define ID_CA           MAKE_ID2('C', 'A') /* Camera */
225 #define ID_IP           MAKE_ID2('I', 'P') /* Ipo (depreciated, replaced by FCurves) */
226 #define ID_KE           MAKE_ID2('K', 'E') /* Key (shape key) */
227 #define ID_WO           MAKE_ID2('W', 'O') /* World */
228 #define ID_SCR          MAKE_ID2('S', 'R') /* Screen */
229 #define ID_SCRN         MAKE_ID2('S', 'N') /* (depreciated?) */
230 #define ID_VF           MAKE_ID2('V', 'F') /* VFont (Vector Font) */
231 #define ID_TXT          MAKE_ID2('T', 'X') /* Text */
232 #define ID_SPK          MAKE_ID2('S', 'K') /* Speaker */
233 #define ID_SO           MAKE_ID2('S', 'O') /* Sound */
234 #define ID_GR           MAKE_ID2('G', 'R') /* Group */
235 #define ID_ID           MAKE_ID2('I', 'D') /* (internal use only) */
236 #define ID_AR           MAKE_ID2('A', 'R') /* bArmature */
237 #define ID_AC           MAKE_ID2('A', 'C') /* bAction */
238 #define ID_NT           MAKE_ID2('N', 'T') /* bNodeTree */
239 #define ID_BR           MAKE_ID2('B', 'R') /* Brush */
240 #define ID_PA           MAKE_ID2('P', 'A') /* ParticleSettings */
241 #define ID_GD           MAKE_ID2('G', 'D') /* bGPdata, (Grease Pencil) */
242 #define ID_WM           MAKE_ID2('W', 'M') /* WindowManager */
243 #define ID_MC           MAKE_ID2('M', 'C') /* MovieClip */
244 #define ID_MSK          MAKE_ID2('M', 'S') /* Mask */
245 #define ID_LS           MAKE_ID2('L', 'S') /* FreestyleLineStyle */
246 #define ID_PAL          MAKE_ID2('P', 'L') /* Palette */
247 #define ID_PC           MAKE_ID2('P', 'C') /* PaintCurve  */
248
249         /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
250 #define ID_SEQ          MAKE_ID2('S', 'Q')
251                         /* constraint */
252 #define ID_CO           MAKE_ID2('C', 'O')
253                         /* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */
254 #define ID_PO           MAKE_ID2('A', 'C')
255                         /* used in outliner... */
256 #define ID_NLA          MAKE_ID2('N', 'L')
257                         /* fluidsim Ipo */
258 #define ID_FLUIDSIM     MAKE_ID2('F', 'S')
259
260 #define ID_FAKE_USERS(id) ((((ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0)
261 #define ID_REAL_USERS(id) (((ID *)id)->us - ID_FAKE_USERS(id))
262
263 #define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM))
264
265 #define ID_BLEND_PATH(_bmain, _id) ((_id)->lib ? (_id)->lib->filepath : (_bmain)->name)
266
267 #define ID_MISSING(_id) (((_id)->tag & LIB_TAG_MISSING) != 0)
268
269 #ifdef GS
270 #  undef GS
271 #endif
272 #define GS(a)   (CHECK_TYPE_ANY(a, char *, const char *, char [66], const char[66]), (*((const short *)(a))))
273
274 #define ID_NEW(a)               if (      (a) && (a)->id.newid ) (a) = (void *)(a)->id.newid
275 #define ID_NEW_US(a)    if (      (a)->id.newid)       { (a) = (void *)(a)->id.newid;       (a)->id.us++; }
276 #define ID_NEW_US2(a)   if (((ID *)a)->newid)          { (a) = ((ID  *)a)->newid;     ((ID *)a)->us++;    }
277
278 /* id->flag (persitent). */
279 enum {
280         LIB_FAKEUSER        = 1 << 9,
281 };
282
283 /**
284  * id->tag (runtime-only).
285  *
286  * Those flags belong to three different categories, which have different expected handling in code:
287  *
288  *   - RESET_BEFORE_USE: piece of code that wants to use such flag has to ensure they are properly 'reset' first.
289  *   - RESET_AFTER_USE: piece of code that wants to use such flag has to ensure they are properly 'reset' after usage
290  *                      (though 'lifetime' of those flags is a bit fuzzy, e.g. _RECALC ones are reset on depsgraph
291  *                       evaluation...).
292  *   - RESET_NEVER: those flags are 'status' one, and never actually need any reset (except on initialization
293  *                  during .blend file reading).
294  */
295 enum {
296         /* RESET_NEVER Datablock is from current .blend file. */
297         LIB_TAG_LOCAL           = 0,
298         /* RESET_NEVER Datablock is from a library, but is used (linked) directly by current .blend file. */
299         LIB_TAG_EXTERN          = 1 << 0,
300         /* RESET_NEVER Datablock is from a library, and is only used (linked) inderectly through other libraries. */
301         LIB_TAG_INDIRECT        = 1 << 1,
302
303         /* RESET_AFTER_USE Three flags used internally in readfile.c, to mark IDs needing to be read (only done once). */
304         LIB_TAG_NEED_EXPAND     = 1 << 3,
305         LIB_TAG_TESTEXT         = (LIB_TAG_NEED_EXPAND | LIB_TAG_EXTERN),
306         LIB_TAG_TESTIND         = (LIB_TAG_NEED_EXPAND | LIB_TAG_INDIRECT),
307         /* RESET_AFTER_USE Flag used internally in readfile.c, to mark IDs needing to be linked from a library. */
308         LIB_TAG_READ            = 1 << 4,
309         /* RESET_AFTER_USE */
310         LIB_TAG_NEED_LINK       = 1 << 5,
311
312         /* RESET_NEVER tag datablock as a place-holder (because the real one could not be linked from its library e.g.). */
313         LIB_TAG_MISSING         = 1 << 6,
314
315         /* tag datablock has having an extra user. */
316         LIB_TAG_EXTRAUSER       = 1 << 2,
317         /* tag datablock has having actually increased usercount for the extra virtual user. */
318         LIB_TAG_EXTRAUSER_SET   = 1 << 7,
319
320         /* RESET_AFTER_USE tag newly duplicated/copied IDs. */
321         LIB_TAG_NEW             = 1 << 8,
322         /* RESET_BEFORE_USE free test flag.
323      * TODO make it a RESET_AFTER_USE too. */
324         LIB_TAG_DOIT            = 1 << 10,
325         /* RESET_AFTER_USE tag existing data before linking so we know what is new. */
326         LIB_TAG_PRE_EXISTING    = 1 << 11,
327
328         /* RESET_AFTER_USE, used by update code (depsgraph). */
329         LIB_TAG_ID_RECALC       = 1 << 12,
330         LIB_TAG_ID_RECALC_DATA  = 1 << 13,
331         LIB_TAG_ANIM_NO_RECALC  = 1 << 14,
332         LIB_TAG_ID_RECALC_ALL   = (LIB_TAG_ID_RECALC | LIB_TAG_ID_RECALC_DATA),
333 };
334
335 /* To filter ID types (filter_id) */
336 /* XXX We cannot put all needed IDs inside an enum...
337  *     We'll have to see whether we can fit all needed ones inside 32 values,
338  *     or if we need to fallback to longlong defines :/
339  */
340 enum {
341         FILTER_ID_AC        = (1 << 0),
342         FILTER_ID_AR        = (1 << 1),
343         FILTER_ID_BR        = (1 << 2),
344         FILTER_ID_CA        = (1 << 3),
345         FILTER_ID_CU        = (1 << 4),
346         FILTER_ID_GD        = (1 << 5),
347         FILTER_ID_GR        = (1 << 6),
348         FILTER_ID_IM        = (1 << 7),
349         FILTER_ID_LA        = (1 << 8),
350         FILTER_ID_LS        = (1 << 9),
351         FILTER_ID_LT        = (1 << 10),
352         FILTER_ID_MA        = (1 << 11),
353         FILTER_ID_MB        = (1 << 12),
354         FILTER_ID_MC        = (1 << 13),
355         FILTER_ID_ME        = (1 << 14),
356         FILTER_ID_MSK       = (1 << 15),
357         FILTER_ID_NT        = (1 << 16),
358         FILTER_ID_OB        = (1 << 17),
359         FILTER_ID_PAL       = (1 << 18),
360         FILTER_ID_PC        = (1 << 19),
361         FILTER_ID_SCE       = (1 << 20),
362         FILTER_ID_SPK       = (1 << 21),
363         FILTER_ID_SO        = (1 << 22),
364         FILTER_ID_TE        = (1 << 23),
365         FILTER_ID_TXT       = (1 << 24),
366         FILTER_ID_VF        = (1 << 25),
367         FILTER_ID_WO        = (1 << 26),
368         FILTER_ID_PA        = (1 << 27),
369 };
370
371 #ifdef __cplusplus
372 }
373 #endif
374
375 #endif