Merge branch 'master' into blender2.8
[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         IDP_ID               = 7,
86         IDP_DOUBLE           = 8,
87         IDP_IDPARRAY         = 9,
88         IDP_NUMTYPES         = 10,
89 };
90
91 /*->subtype */
92
93 /* IDP_STRING */
94 enum {
95         IDP_STRING_SUB_UTF8  = 0,  /* default */
96         IDP_STRING_SUB_BYTE  = 1,  /* arbitrary byte array, _not_ null terminated */
97 };
98
99 /* IDP_GROUP */
100 enum {
101         IDP_GROUP_SUB_NONE              = 0,  /* default */
102         IDP_GROUP_SUB_MODE_OBJECT       = 1,  /* object mode settings */
103         IDP_GROUP_SUB_MODE_EDIT         = 2,  /* mesh edit mode settings */
104         IDP_GROUP_SUB_ENGINE_RENDER     = 3,  /* render engine settings */
105         IDP_GROUP_SUB_OVERRIDE          = 4,  /* data override */
106         IDP_GROUP_SUB_MODE_PAINT_WEIGHT = 5,  /* weight paint mode settings */
107         IDP_GROUP_SUB_MODE_PAINT_VERTEX = 6,  /* vertex paint mode settings */
108 };
109
110 /*->flag*/
111 enum {
112         IDP_FLAG_GHOST       = 1 << 7,  /* this means the property is set but RNA will return false when checking
113                                          * 'RNA_property_is_set', currently this is a runtime flag */
114 };
115
116 /* add any future new id property types here.*/
117
118 /* watch it: Sequence has identical beginning. */
119 /**
120  * ID is the first thing included in all serializable types. It
121  * provides a common handle to place all data in double-linked lists.
122  * */
123
124 /* 2 characters for ID code and 64 for actual name */
125 #define MAX_ID_NAME  66
126
127 /* There's a nasty circular dependency here.... 'void *' to the rescue! I
128  * really wonder why this is needed. */
129 typedef struct ID {
130         void *next, *prev;
131         struct ID *newid;
132         struct Library *lib;
133         char name[66]; /* MAX_ID_NAME */
134         /**
135          * LIB_... flags report on status of the datablock this ID belongs to (persistent, saved to and read from .blend).
136          */
137         short flag;
138         /**
139          * LIB_TAG_... tags (runtime only, cleared at read time).
140          */
141         int tag;
142         int us;
143         int icon_id;
144         IDProperty *properties;
145         void *py_instance;
146 } ID;
147
148 /**
149  * For each library file used, a Library struct is added to Main
150  * WARNING: readfile.c, expand_doit() reads this struct without DNA check!
151  */
152 typedef struct Library {
153         ID id;
154         struct FileData *filedata;
155         char name[1024];  /* path name used for reading, can be relative and edited in the outliner */
156
157         /* absolute filepath, this is only for convenience, 'name' is the real path used on file read but in
158          * some cases its useful to access the absolute one.
159          * This is set on file read.
160          * Use BKE_library_filepath_set() rather than setting 'name' directly and it will be kept in sync - campbell */
161         char filepath[1024];
162
163         struct Library *parent; /* set for indirectly linked libs, used in the outliner and while reading */
164         
165         struct PackedFile *packedfile;
166
167         /* Temp data needed by read/write code. */
168         int temp_index;
169         short versionfile, subversionfile;  /* see BLENDER_VERSION, BLENDER_SUBVERSION, needed for do_versions */
170 } Library;
171
172 enum eIconSizes {
173         ICON_SIZE_ICON = 0,
174         ICON_SIZE_PREVIEW = 1,
175
176         NUM_ICON_SIZES
177 };
178
179 /* for PreviewImage->flag */
180 enum ePreviewImage_Flag {
181         PRV_CHANGED          = (1 << 0),
182         PRV_USER_EDITED      = (1 << 1),  /* if user-edited, do not auto-update this anymore! */
183 };
184
185 /* for PreviewImage->tag */
186 enum  {
187         PRV_TAG_DEFFERED           = (1 << 0),  /* Actual loading of preview is deffered. */
188         PRV_TAG_DEFFERED_RENDERING = (1 << 1),  /* Deffered preview is being loaded. */
189         PRV_TAG_DEFFERED_DELETE    = (1 << 2),  /* Deffered preview should be deleted asap. */
190 };
191
192 typedef struct PreviewImage {
193         /* All values of 2 are really NUM_ICON_SIZES */
194         unsigned int w[2];
195         unsigned int h[2];
196         short flag[2];
197         short changed_timestamp[2];
198         unsigned int *rect[2];
199
200         /* Runtime-only data. */
201         struct GPUTexture *gputexture[2];
202         int icon_id;  /* Used by previews outside of ID context. */
203
204         short tag;  /* Runtime data. */
205         char pad[2];
206 } PreviewImage;
207
208 #define PRV_DEFERRED_DATA(prv) \
209         (CHECK_TYPE_INLINE(prv, PreviewImage *), BLI_assert((prv)->tag & PRV_TAG_DEFFERED), (void *)((prv) + 1))
210
211 /**
212  * Defines for working with IDs.
213  *
214  * The tags represent types! This is a dirty way of enabling RTTI. The
215  * sig_byte end endian defines aren't really used much.
216  *
217  **/
218
219 #ifdef __BIG_ENDIAN__
220    /* big endian */
221 #  define MAKE_ID2(c, d)  ((c) << 8 | (d))
222 #else
223    /* little endian  */
224 #  define MAKE_ID2(c, d)  ((d) << 8 | (c))
225 #endif
226
227 /**
228  * ID from database.
229  *
230  * Written to #BHead.code (for file IO)
231  * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
232  */
233 typedef enum ID_Type {
234         ID_SCE  = MAKE_ID2('S', 'C'), /* Scene */
235         ID_LI   = MAKE_ID2('L', 'I'), /* Library */
236         ID_OB   = MAKE_ID2('O', 'B'), /* Object */
237         ID_ME   = MAKE_ID2('M', 'E'), /* Mesh */
238         ID_CU   = MAKE_ID2('C', 'U'), /* Curve */
239         ID_MB   = MAKE_ID2('M', 'B'), /* MetaBall */
240         ID_MA   = MAKE_ID2('M', 'A'), /* Material */
241         ID_TE   = MAKE_ID2('T', 'E'), /* Tex (Texture) */
242         ID_IM   = MAKE_ID2('I', 'M'), /* Image */
243         ID_LT   = MAKE_ID2('L', 'T'), /* Lattice */
244         ID_LA   = MAKE_ID2('L', 'A'), /* Lamp */
245         ID_CA   = MAKE_ID2('C', 'A'), /* Camera */
246         ID_IP   = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */
247         ID_KE   = MAKE_ID2('K', 'E'), /* Key (shape key) */
248         ID_WO   = MAKE_ID2('W', 'O'), /* World */
249         ID_SCR  = MAKE_ID2('S', 'R'), /* Screen */
250         ID_VF   = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */
251         ID_TXT  = MAKE_ID2('T', 'X'), /* Text */
252         ID_SPK  = MAKE_ID2('S', 'K'), /* Speaker */
253         ID_SO   = MAKE_ID2('S', 'O'), /* Sound */
254         ID_GR   = MAKE_ID2('G', 'R'), /* Group */
255         ID_AR   = MAKE_ID2('A', 'R'), /* bArmature */
256         ID_AC   = MAKE_ID2('A', 'C'), /* bAction */
257         ID_NT   = MAKE_ID2('N', 'T'), /* bNodeTree */
258         ID_BR   = MAKE_ID2('B', 'R'), /* Brush */
259         ID_PA   = MAKE_ID2('P', 'A'), /* ParticleSettings */
260         ID_GD   = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */
261         ID_WM   = MAKE_ID2('W', 'M'), /* WindowManager */
262         ID_MC   = MAKE_ID2('M', 'C'), /* MovieClip */
263         ID_MSK  = MAKE_ID2('M', 'S'), /* Mask */
264         ID_LS   = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */
265         ID_PAL  = MAKE_ID2('P', 'L'), /* Palette */
266         ID_PC   = MAKE_ID2('P', 'C'), /* PaintCurve  */
267         ID_CF   = MAKE_ID2('C', 'F'), /* CacheFile */
268         ID_WS   = MAKE_ID2('W', 'S'), /* WorkSpace */
269         ID_LP   = MAKE_ID2('L', 'P'), /* LightProbe */
270 } ID_Type;
271
272 /* Only used as 'placeholder' in .blend files for directly linked datablocks. */
273 #define ID_ID       MAKE_ID2('I', 'D') /* (internal use only) */
274
275 /* Deprecated. */
276 #define ID_SCRN     MAKE_ID2('S', 'N')
277
278 /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
279 #define ID_SEQ          MAKE_ID2('S', 'Q')
280                         /* constraint */
281 #define ID_CO           MAKE_ID2('C', 'O')
282                         /* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */
283 #define ID_PO           MAKE_ID2('A', 'C')
284                         /* used in outliner... */
285 #define ID_NLA          MAKE_ID2('N', 'L')
286                         /* fluidsim Ipo */
287 #define ID_FLUIDSIM     MAKE_ID2('F', 'S')
288
289 #define ID_FAKE_USERS(id) ((((ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0)
290 #define ID_REAL_USERS(id) (((ID *)id)->us - ID_FAKE_USERS(id))
291 #define ID_EXTRA_USERS(id) (((ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0)
292
293 #define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM) && (GS((id)->name) != ID_WS))
294
295 #define ID_BLEND_PATH(_bmain, _id) ((_id)->lib ? (_id)->lib->filepath : (_bmain)->name)
296
297 #define ID_MISSING(_id) (((_id)->tag & LIB_TAG_MISSING) != 0)
298
299 #define ID_IS_LINKED_DATABLOCK(_id) (((ID *)(_id))->lib != NULL)
300
301 #ifdef GS
302 #  undef GS
303 #endif
304 #define GS(a)   (CHECK_TYPE_ANY(a, char *, const char *, char [66], const char[66]), (ID_Type)(*((const short *)(a))))
305
306 #define ID_NEW_SET(_id, _idn) \
307         (((ID *)(_id))->newid = (ID *)(_idn), ((ID *)(_id))->newid->tag |= LIB_TAG_NEW, (void *)((ID *)(_id))->newid)
308 #define ID_NEW_REMAP(a) if ((a) && (a)->id.newid) (a) = (void *)(a)->id.newid
309
310 /* id->flag (persitent). */
311 enum {
312         LIB_FAKEUSER        = 1 << 9,
313 };
314
315 /**
316  * id->tag (runtime-only).
317  *
318  * Those flags belong to three different categories, which have different expected handling in code:
319  *
320  *   - RESET_BEFORE_USE: piece of code that wants to use such flag has to ensure they are properly 'reset' first.
321  *   - RESET_AFTER_USE: piece of code that wants to use such flag has to ensure they are properly 'reset' after usage
322  *                      (though 'lifetime' of those flags is a bit fuzzy, e.g. _RECALC ones are reset on depsgraph
323  *                       evaluation...).
324  *   - RESET_NEVER: those flags are 'status' one, and never actually need any reset (except on initialization
325  *                  during .blend file reading).
326  */
327 enum {
328         /* RESET_NEVER Datablock is from current .blend file. */
329         LIB_TAG_LOCAL           = 0,
330         /* RESET_NEVER Datablock is from a library, but is used (linked) directly by current .blend file. */
331         LIB_TAG_EXTERN          = 1 << 0,
332         /* RESET_NEVER Datablock is from a library, and is only used (linked) inderectly through other libraries. */
333         LIB_TAG_INDIRECT        = 1 << 1,
334
335         /* RESET_AFTER_USE Three flags used internally in readfile.c, to mark IDs needing to be read (only done once). */
336         LIB_TAG_NEED_EXPAND     = 1 << 3,
337         LIB_TAG_TESTEXT         = (LIB_TAG_NEED_EXPAND | LIB_TAG_EXTERN),
338         LIB_TAG_TESTIND         = (LIB_TAG_NEED_EXPAND | LIB_TAG_INDIRECT),
339         /* RESET_AFTER_USE Flag used internally in readfile.c, to mark IDs needing to be linked from a library. */
340         LIB_TAG_READ            = 1 << 4,
341         /* RESET_AFTER_USE */
342         LIB_TAG_NEED_LINK       = 1 << 5,
343
344         /* RESET_NEVER tag datablock as a place-holder (because the real one could not be linked from its library e.g.). */
345         LIB_TAG_MISSING         = 1 << 6,
346
347         /* tag datablock has having an extra user. */
348         LIB_TAG_EXTRAUSER       = 1 << 2,
349         /* tag datablock has having actually increased usercount for the extra virtual user. */
350         LIB_TAG_EXTRAUSER_SET   = 1 << 7,
351
352         /* RESET_AFTER_USE tag newly duplicated/copied IDs.
353          * Also used internally in readfile.c to mark datablocks needing do_versions. */
354         LIB_TAG_NEW             = 1 << 8,
355         /* RESET_BEFORE_USE free test flag.
356      * TODO make it a RESET_AFTER_USE too. */
357         LIB_TAG_DOIT            = 1 << 10,
358         /* RESET_AFTER_USE tag existing data before linking so we know what is new. */
359         LIB_TAG_PRE_EXISTING    = 1 << 11,
360
361         /* RESET_AFTER_USE, used by update code (depsgraph). */
362         LIB_TAG_ID_RECALC       = 1 << 12,
363         LIB_TAG_ID_RECALC_DATA  = 1 << 13,
364         LIB_TAG_ANIM_NO_RECALC  = 1 << 14,
365         LIB_TAG_ID_RECALC_ALL   = (LIB_TAG_ID_RECALC | LIB_TAG_ID_RECALC_DATA),
366
367         /* The datablock is a copy-on-write version. */
368         LIB_TAG_COPY_ON_WRITE   = 1 << 15,
369
370         /* RESET_NEVER tag datablock for freeing etc. behavior (usually set when copying real one into temp/runtime one). */
371         LIB_TAG_NO_MAIN          = 1 << 16,  /* Datablock is not listed in Main database. */
372         LIB_TAG_NO_USER_REFCOUNT = 1 << 17,  /* Datablock does not refcount usages of other IDs. */
373         /* Datablock was not allocated by standard system (BKE_libblock_alloc), do not free its memory
374          * (usual type-specific freeing is called though). */
375         LIB_TAG_NOT_ALLOCATED     = 1 << 18,
376 };
377
378 /* To filter ID types (filter_id) */
379 /* XXX We cannot put all needed IDs inside an enum...
380  *     We'll have to see whether we can fit all needed ones inside 32 values,
381  *     or if we need to fallback to longlong defines :/
382  */
383 enum {
384         FILTER_ID_AC        = (1 << 0),
385         FILTER_ID_AR        = (1 << 1),
386         FILTER_ID_BR        = (1 << 2),
387         FILTER_ID_CA        = (1 << 3),
388         FILTER_ID_CU        = (1 << 4),
389         FILTER_ID_GD        = (1 << 5),
390         FILTER_ID_GR        = (1 << 6),
391         FILTER_ID_IM        = (1 << 7),
392         FILTER_ID_LA        = (1 << 8),
393         FILTER_ID_LS        = (1 << 9),
394         FILTER_ID_LT        = (1 << 10),
395         FILTER_ID_MA        = (1 << 11),
396         FILTER_ID_MB        = (1 << 12),
397         FILTER_ID_MC        = (1 << 13),
398         FILTER_ID_ME        = (1 << 14),
399         FILTER_ID_MSK       = (1 << 15),
400         FILTER_ID_NT        = (1 << 16),
401         FILTER_ID_OB        = (1 << 17),
402         FILTER_ID_PAL       = (1 << 18),
403         FILTER_ID_PC        = (1 << 19),
404         FILTER_ID_SCE       = (1 << 20),
405         FILTER_ID_SPK       = (1 << 21),
406         FILTER_ID_SO        = (1 << 22),
407         FILTER_ID_TE        = (1 << 23),
408         FILTER_ID_TXT       = (1 << 24),
409         FILTER_ID_VF        = (1 << 25),
410         FILTER_ID_WO        = (1 << 26),
411         FILTER_ID_PA        = (1 << 27),
412         FILTER_ID_CF        = (1 << 28),
413         FILTER_ID_WS        = (1 << 29),
414         FILTER_ID_LP        = (1u << 31),
415 };
416
417 /* IMPORTANT: this enum matches the order currently use in set_listbasepointers,
418  * keep them in sync! */
419 enum {
420         INDEX_ID_LI = 0,
421         INDEX_ID_IP,
422         INDEX_ID_AC,
423         INDEX_ID_KE,
424         INDEX_ID_GD,
425         INDEX_ID_NT,
426         INDEX_ID_IM,
427         INDEX_ID_TE,
428         INDEX_ID_MA,
429         INDEX_ID_VF,
430         INDEX_ID_AR,
431         INDEX_ID_CF,
432         INDEX_ID_ME,
433         INDEX_ID_CU,
434         INDEX_ID_MB,
435         INDEX_ID_LT,
436         INDEX_ID_LA,
437         INDEX_ID_CA,
438         INDEX_ID_TXT,
439         INDEX_ID_SO,
440         INDEX_ID_GR,
441         INDEX_ID_PAL,
442         INDEX_ID_PC,
443         INDEX_ID_BR,
444         INDEX_ID_PA,
445         INDEX_ID_SPK,
446         INDEX_ID_LP,
447         INDEX_ID_WO,
448         INDEX_ID_MC,
449         INDEX_ID_SCR,
450         INDEX_ID_OB,
451         INDEX_ID_LS,
452         INDEX_ID_SCE,
453         INDEX_ID_WS,
454         INDEX_ID_WM,
455         INDEX_ID_MSK,
456         INDEX_ID_NULL,
457 };
458
459 #ifdef __cplusplus
460 }
461 #endif
462
463 #endif