Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_ID.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
20 /** \file
21  * \ingroup DNA
22  * \brief ID and Library types, which are fundamental for sdna.
23  */
24
25 #ifndef __DNA_ID_H__
26 #define __DNA_ID_H__
27
28 #include "DNA_listBase.h"
29
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33
34 struct FileData;
35 struct GPUTexture;
36 struct ID;
37 struct Library;
38 struct PackedFile;
39
40 /* Runtime display data */
41 struct DrawData;
42 typedef void (*DrawDataInitCb)(struct DrawData *engine_data);
43 typedef void (*DrawDataFreeCb)(struct DrawData *engine_data);
44
45 #
46 #
47 typedef struct DrawData {
48         struct DrawData *next, *prev;
49         struct DrawEngineType *engine_type;
50         /* Only nested data, NOT the engine data itself. */
51         DrawDataFreeCb free;
52         /* Accumulated recalc flags, which corresponds to ID->recalc flags. */
53         int recalc;
54 } DrawData;
55
56 typedef struct DrawDataList {
57         struct DrawData *first, *last;
58 } DrawDataList;
59
60
61 typedef struct IDPropertyData {
62         void *pointer;
63         ListBase group;
64         /** Note, we actually fit a double into these two ints. */
65         int val, val2;
66 } IDPropertyData;
67
68 typedef struct IDProperty {
69         struct IDProperty *next, *prev;
70         char type, subtype;
71         short flag;
72         /** MAX_IDPROP_NAME. */
73         char name[64];
74
75         /* saved is used to indicate if this struct has been saved yet.
76          * seemed like a good idea as a pad var was needed anyway :) */
77         int saved;
78         /** Note, alignment for 64 bits. */
79         IDPropertyData data;
80
81         /* array length, also (this is important!) string length + 1.
82          * the idea is to be able to reuse array realloc functions on strings.*/
83         int len;
84
85         /* Strings and arrays are both buffered, though the buffer isn't saved. */
86         /* totallen is total length of allocated array/string, including a buffer.
87          * Note that the buffering is mild; the code comes from python's list implementation. */
88         int totallen;
89 } IDProperty;
90
91 #define MAX_IDPROP_NAME 64
92 #define DEFAULT_ALLOC_FOR_NULL_STRINGS  64
93
94 /*->type*/
95 enum {
96         IDP_STRING           = 0,
97         IDP_INT              = 1,
98         IDP_FLOAT            = 2,
99         IDP_ARRAY            = 5,
100         IDP_GROUP            = 6,
101         IDP_ID               = 7,
102         IDP_DOUBLE           = 8,
103         IDP_IDPARRAY         = 9,
104         IDP_NUMTYPES         = 10,
105 };
106
107 /*->subtype */
108
109 /* IDP_STRING */
110 enum {
111         IDP_STRING_SUB_UTF8  = 0,  /* default */
112         IDP_STRING_SUB_BYTE  = 1,  /* arbitrary byte array, _not_ null terminated */
113 };
114
115 /* IDP_GROUP */
116 enum {
117         IDP_GROUP_SUB_NONE              = 0,  /* default */
118         IDP_GROUP_SUB_MODE_OBJECT       = 1,  /* object mode settings */
119         IDP_GROUP_SUB_MODE_EDIT         = 2,  /* mesh edit mode settings */
120         IDP_GROUP_SUB_ENGINE_RENDER     = 3,  /* render engine settings */
121         IDP_GROUP_SUB_OVERRIDE          = 4,  /* data override */
122         IDP_GROUP_SUB_MODE_PAINT_WEIGHT = 5,  /* weight paint mode settings */
123         IDP_GROUP_SUB_MODE_PAINT_VERTEX = 6,  /* vertex paint mode settings */
124 };
125
126 /*->flag*/
127 enum {
128         /** This IDProp may be statically overridden.
129          * Should only be used/be relevant for custom properties. */
130         IDP_FLAG_OVERRIDABLE_STATIC = 1 << 0,
131
132         /** This means the property is set but RNA will return false when checking
133          * 'RNA_property_is_set', currently this is a runtime flag */
134         IDP_FLAG_GHOST       = 1 << 7,
135 };
136
137 /* add any future new id property types here.*/
138
139
140 /* Static ID override structs. */
141
142 typedef struct IDOverrideStaticPropertyOperation {
143         struct IDOverrideStaticPropertyOperation *next, *prev;
144
145         /* Type of override. */
146         short operation;
147         short flag;
148         short pad_s1[2];
149
150         /* Sub-item references, if needed (for arrays or collections only).
151          * We need both reference and local values to allow e.g. insertion into collections (constraints, modifiers...).
152          * In collection case, if names are defined, they are used in priority.
153          * Names are pointers (instead of char[64]) to save some space, NULL when unset.
154          * Indices are -1 when unset. */
155         char *subitem_reference_name;
156         char *subitem_local_name;
157         int subitem_reference_index;
158         int subitem_local_index;
159 } IDOverrideStaticPropertyOperation;
160
161 /* IDOverridePropertyOperation->operation. */
162 enum {
163         /* Basic operations. */
164         IDOVERRIDESTATIC_OP_NOOP          =   0,  /* Special value, forbids any overriding. */
165
166         IDOVERRIDESTATIC_OP_REPLACE       =   1,  /* Fully replace local value by reference one. */
167
168         /* Numeric-only operations. */
169         IDOVERRIDESTATIC_OP_ADD           = 101,  /* Add local value to reference one. */
170         /* Subtract local value from reference one (needed due to unsigned values etc.). */
171         IDOVERRIDESTATIC_OP_SUBTRACT      = 102,
172         /* Multiply reference value by local one (more useful than diff for scales and the like). */
173         IDOVERRIDESTATIC_OP_MULTIPLY      = 103,
174
175         /* Collection-only operations. */
176         IDOVERRIDESTATIC_OP_INSERT_AFTER  = 201,  /* Insert after given reference's subitem. */
177         IDOVERRIDESTATIC_OP_INSERT_BEFORE = 202,  /* Insert before given reference's subitem. */
178         /* We can add more if needed (move, delete, ...). */
179 };
180
181 /* IDOverridePropertyOperation->flag. */
182 enum {
183         /** User cannot remove that override operation. */
184         IDOVERRIDESTATIC_FLAG_MANDATORY     =   1 << 0,
185         /** User cannot change that override operation. */
186         IDOVERRIDESTATIC_FLAG_LOCKED        =   1 << 1,
187 };
188
189 /** A single overridden property, contain all operations on this one. */
190 typedef struct IDOverrideStaticProperty {
191         struct IDOverrideStaticProperty *next, *prev;
192
193         /**
194          * Path from ID to overridden property.
195          * *Does not* include indices/names for final arrays/collections items.
196          */
197         char *rna_path;
198
199         /** List of overriding operations (IDOverridePropertyOperation) applied to this property. */
200         ListBase operations;
201 } IDOverrideStaticProperty;
202
203 /* Main container for all overriding data info of a data-block. */
204 typedef struct IDOverrideStatic {
205         /** Reference linked ID which this one overrides. */
206         struct ID *reference;
207         /** List of IDOverrideProperty structs. */
208         ListBase properties;
209
210         short flag;
211         short pad[3];
212
213         /* Read/write data. */
214         /* Temp ID storing extra override data (used for differential operations only currently).
215          * Always NULL outside of read/write context. */
216         struct ID *storage;
217 } IDOverrideStatic;
218
219 enum eStaticOverride_Flag {
220         STATICOVERRIDE_AUTO    = 1 << 0,  /* Allow automatic generation of overriding rules. */
221 };
222
223 /* watch it: Sequence has identical beginning. */
224 /**
225  * ID is the first thing included in all serializable types. It
226  * provides a common handle to place all data in double-linked lists.
227  * */
228
229 /* 2 characters for ID code and 64 for actual name */
230 #define MAX_ID_NAME  66
231
232 /* There's a nasty circular dependency here.... 'void *' to the rescue! I
233  * really wonder why this is needed. */
234 typedef struct ID {
235         void *next, *prev;
236         struct ID *newid;
237         struct Library *lib;
238         /** MAX_ID_NAME. */
239         char name[66];
240         /**
241          * LIB_... flags report on status of the datablock this ID belongs to
242          * (persistent, saved to and read from .blend).
243          */
244         short flag;
245         /**
246          * LIB_TAG_... tags (runtime only, cleared at read time).
247          */
248         int tag;
249         int us;
250         int icon_id;
251         int recalc;
252         int pad;
253         IDProperty *properties;
254
255         /** Reference linked ID which this one overrides. */
256         IDOverrideStatic *override_static;
257
258         /**
259          * Only set for datablocks which are coming from copy-on-write, points to
260          * the original version of it.
261          */
262         struct ID *orig_id;
263
264         void *py_instance;
265 } ID;
266
267 /**
268  * For each library file used, a Library struct is added to Main
269  * WARNING: readfile.c, expand_doit() reads this struct without DNA check!
270  */
271 typedef struct Library {
272         ID id;
273         struct FileData *filedata;
274         /** Path name used for reading, can be relative and edited in the outliner. */
275         char name[1024];
276
277         /**
278          * Absolute filepath, this is only for convenience,
279          * 'name' is the real path used on file read but in
280          * some cases its useful to access the absolute one.
281          * This is set on file read.
282          * Use BKE_library_filepath_set() rather than setting 'name'
283          * directly and it will be kept in sync - campbell */
284         char filepath[1024];
285
286         /** Set for indirectly linked libs, used in the outliner and while reading. */
287         struct Library *parent;
288
289         struct PackedFile *packedfile;
290
291         /* Temp data needed by read/write code. */
292         int temp_index;
293         /** See BLENDER_VERSION, BLENDER_SUBVERSION, needed for do_versions. */
294         short versionfile, subversionfile;
295 } Library;
296
297 enum eIconSizes {
298         ICON_SIZE_ICON = 0,
299         ICON_SIZE_PREVIEW = 1,
300
301         NUM_ICON_SIZES,
302 };
303
304 /* for PreviewImage->flag */
305 enum ePreviewImage_Flag {
306         PRV_CHANGED          = (1 << 0),
307         PRV_USER_EDITED      = (1 << 1),  /* if user-edited, do not auto-update this anymore! */
308 };
309
310 /* for PreviewImage->tag */
311 enum  {
312         PRV_TAG_DEFFERED           = (1 << 0),  /* Actual loading of preview is deferred. */
313         PRV_TAG_DEFFERED_RENDERING = (1 << 1),  /* Deferred preview is being loaded. */
314         PRV_TAG_DEFFERED_DELETE    = (1 << 2),  /* Deferred preview should be deleted asap. */
315 };
316
317 typedef struct PreviewImage {
318         /* All values of 2 are really NUM_ICON_SIZES */
319         unsigned int w[2];
320         unsigned int h[2];
321         short flag[2];
322         short changed_timestamp[2];
323         unsigned int *rect[2];
324
325         /* Runtime-only data. */
326         struct GPUTexture *gputexture[2];
327         /** Used by previews outside of ID context. */
328         int icon_id;
329
330         /** Runtime data. */
331         short tag;
332         char pad[2];
333 } PreviewImage;
334
335 #define PRV_DEFERRED_DATA(prv) \
336         (CHECK_TYPE_INLINE(prv, PreviewImage *), BLI_assert((prv)->tag & PRV_TAG_DEFFERED), (void *)((prv) + 1))
337
338 /**
339  * Defines for working with IDs.
340  *
341  * The tags represent types! This is a dirty way of enabling RTTI. The
342  * sig_byte end endian defines aren't really used much.
343  *
344  **/
345
346 #ifdef __BIG_ENDIAN__
347    /* big endian */
348 #  define MAKE_ID2(c, d)  ((c) << 8 | (d))
349 #else
350    /* little endian  */
351 #  define MAKE_ID2(c, d)  ((d) << 8 | (c))
352 #endif
353
354 /**
355  * ID from database.
356  *
357  * Written to #BHead.code (for file IO)
358  * and the first 2 bytes of #ID.name (for runtime checks, see #GS macro).
359  */
360 typedef enum ID_Type {
361         ID_SCE  = MAKE_ID2('S', 'C'), /* Scene */
362         ID_LI   = MAKE_ID2('L', 'I'), /* Library */
363         ID_OB   = MAKE_ID2('O', 'B'), /* Object */
364         ID_ME   = MAKE_ID2('M', 'E'), /* Mesh */
365         ID_CU   = MAKE_ID2('C', 'U'), /* Curve */
366         ID_MB   = MAKE_ID2('M', 'B'), /* MetaBall */
367         ID_MA   = MAKE_ID2('M', 'A'), /* Material */
368         ID_TE   = MAKE_ID2('T', 'E'), /* Tex (Texture) */
369         ID_IM   = MAKE_ID2('I', 'M'), /* Image */
370         ID_LT   = MAKE_ID2('L', 'T'), /* Lattice */
371         ID_LA   = MAKE_ID2('L', 'A'), /* Lamp */
372         ID_CA   = MAKE_ID2('C', 'A'), /* Camera */
373         ID_IP   = MAKE_ID2('I', 'P'), /* Ipo (depreciated, replaced by FCurves) */
374         ID_KE   = MAKE_ID2('K', 'E'), /* Key (shape key) */
375         ID_WO   = MAKE_ID2('W', 'O'), /* World */
376         ID_SCR  = MAKE_ID2('S', 'R'), /* Screen */
377         ID_VF   = MAKE_ID2('V', 'F'), /* VFont (Vector Font) */
378         ID_TXT  = MAKE_ID2('T', 'X'), /* Text */
379         ID_SPK  = MAKE_ID2('S', 'K'), /* Speaker */
380         ID_SO   = MAKE_ID2('S', 'O'), /* Sound */
381         ID_GR   = MAKE_ID2('G', 'R'), /* Group */
382         ID_AR   = MAKE_ID2('A', 'R'), /* bArmature */
383         ID_AC   = MAKE_ID2('A', 'C'), /* bAction */
384         ID_NT   = MAKE_ID2('N', 'T'), /* bNodeTree */
385         ID_BR   = MAKE_ID2('B', 'R'), /* Brush */
386         ID_PA   = MAKE_ID2('P', 'A'), /* ParticleSettings */
387         ID_GD   = MAKE_ID2('G', 'D'), /* bGPdata, (Grease Pencil) */
388         ID_WM   = MAKE_ID2('W', 'M'), /* WindowManager */
389         ID_MC   = MAKE_ID2('M', 'C'), /* MovieClip */
390         ID_MSK  = MAKE_ID2('M', 'S'), /* Mask */
391         ID_LS   = MAKE_ID2('L', 'S'), /* FreestyleLineStyle */
392         ID_PAL  = MAKE_ID2('P', 'L'), /* Palette */
393         ID_PC   = MAKE_ID2('P', 'C'), /* PaintCurve  */
394         ID_CF   = MAKE_ID2('C', 'F'), /* CacheFile */
395         ID_WS   = MAKE_ID2('W', 'S'), /* WorkSpace */
396         ID_LP   = MAKE_ID2('L', 'P'), /* LightProbe */
397 } ID_Type;
398
399 /* Only used as 'placeholder' in .blend files for directly linked datablocks. */
400 #define ID_ID       MAKE_ID2('I', 'D') /* (internal use only) */
401
402 /* Deprecated. */
403 #define ID_SCRN     MAKE_ID2('S', 'N')
404
405 /* NOTE! Fake IDs, needed for g.sipo->blocktype or outliner */
406 #define ID_SEQ          MAKE_ID2('S', 'Q')
407 /* constraint */
408 #define ID_CO           MAKE_ID2('C', 'O')
409 /* pose (action channel, used to be ID_AC in code, so we keep code for backwards compat) */
410 #define ID_PO           MAKE_ID2('A', 'C')
411 /* used in outliner... */
412 #define ID_NLA          MAKE_ID2('N', 'L')
413 /* fluidsim Ipo */
414 #define ID_FLUIDSIM     MAKE_ID2('F', 'S')
415
416 #define ID_FAKE_USERS(id) ((((ID *)id)->flag & LIB_FAKEUSER) ? 1 : 0)
417 #define ID_REAL_USERS(id) (((ID *)id)->us - ID_FAKE_USERS(id))
418 #define ID_EXTRA_USERS(id) (((ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0)
419
420 #define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM) && (GS((id)->name) != ID_WS))
421
422 #define ID_BLEND_PATH(_bmain, _id) ((_id)->lib ? (_id)->lib->filepath : BKE_main_blendfile_path((_bmain)))
423 #define ID_BLEND_PATH_FROM_GLOBAL(_id) ((_id)->lib ? (_id)->lib->filepath : BKE_main_blendfile_path_from_global())
424
425 #define ID_MISSING(_id) (((_id)->tag & LIB_TAG_MISSING) != 0)
426
427 #define ID_IS_LINKED(_id) (((ID *)(_id))->lib != NULL)
428
429 #define ID_IS_STATIC_OVERRIDE(_id) (((ID *)(_id))->override_static != NULL && \
430                                     ((ID *)(_id))->override_static->reference != NULL)
431
432 #define ID_IS_STATIC_OVERRIDE_TEMPLATE(_id) (((ID *)(_id))->override_static != NULL && \
433                                              ((ID *)(_id))->override_static->reference == NULL)
434
435 #define ID_IS_STATIC_OVERRIDE_AUTO(_id) (!ID_IS_LINKED((_id)) && \
436                                          ID_IS_STATIC_OVERRIDE((_id)) && \
437                                          (((ID *)(_id))->override_static->flag & STATICOVERRIDE_AUTO))
438
439 /* No copy-on-write for these types.
440  * Keep in sync with check_datablocks_copy_on_writable and deg_copy_on_write_is_needed */
441 #define ID_TYPE_IS_COW(_id_type) \
442         (!ELEM(_id_type, ID_BR, ID_LS, ID_PAL, ID_IM))
443
444 #ifdef GS
445 #  undef GS
446 #endif
447 #define GS(a)   (CHECK_TYPE_ANY(a, char *, const char *, char [66], const char[66]), (ID_Type)(*((const short *)(a))))
448
449 #define ID_NEW_SET(_id, _idn) \
450         (((ID *)(_id))->newid = (ID *)(_idn), ((ID *)(_id))->newid->tag |= LIB_TAG_NEW, (void *)((ID *)(_id))->newid)
451 #define ID_NEW_REMAP(a) if ((a) && (a)->id.newid) (a) = (void *)(a)->id.newid
452
453 /* id->flag (persitent). */
454 enum {
455         LIB_FAKEUSER                = 1 << 9,
456 };
457
458 /**
459  * id->tag (runtime-only).
460  *
461  * Those flags belong to three different categories, which have different expected handling in code:
462  *
463  * - RESET_BEFORE_USE: piece of code that wants to use such flag
464  *   has to ensure they are properly 'reset' first.
465  * - RESET_AFTER_USE: piece of code that wants to use such flag has to ensure they are properly
466  *   'reset' after usage
467  *   (though 'lifetime' of those flags is a bit fuzzy, e.g. _RECALC ones are reset on depsgraph
468  *   evaluation...).
469  * - RESET_NEVER: those flags are 'status' one, and never actually need any reset
470  *   (except on initialization during .blend file reading).
471  */
472 enum {
473         /* RESET_NEVER Datablock is from current .blend file. */
474         LIB_TAG_LOCAL           = 0,
475         /* RESET_NEVER Datablock is from a library,
476          * but is used (linked) directly by current .blend file. */
477         LIB_TAG_EXTERN          = 1 << 0,
478         /* RESET_NEVER Datablock is from a library,
479          * and is only used (linked) inderectly through other libraries. */
480         LIB_TAG_INDIRECT        = 1 << 1,
481
482         /* RESET_AFTER_USE Flag used internally in readfile.c,
483          * to mark IDs needing to be expanded (only done once). */
484         LIB_TAG_NEED_EXPAND     = 1 << 3,
485         /* RESET_AFTER_USE Flag used internally in readfile.c to mark ID
486          * placeholders for linked datablocks needing to be read. */
487         LIB_TAG_ID_ID           = 1 << 4,
488         /* RESET_AFTER_USE */
489         LIB_TAG_NEED_LINK       = 1 << 5,
490
491         /* RESET_NEVER tag datablock as a place-holder
492          * (because the real one could not be linked from its library e.g.). */
493         LIB_TAG_MISSING         = 1 << 6,
494
495         /* RESET_NEVER tag datablock as being up-to-date regarding its reference. */
496         LIB_TAG_OVERRIDESTATIC_REFOK = 1 << 9,
497         /* RESET_NEVER tag datablock as needing an auto-override execution, if enabled. */
498         LIB_TAG_OVERRIDESTATIC_AUTOREFRESH = 1 << 17,
499
500         /* tag datablock has having an extra user. */
501         LIB_TAG_EXTRAUSER       = 1 << 2,
502         /* tag datablock has having actually increased usercount for the extra virtual user. */
503         LIB_TAG_EXTRAUSER_SET   = 1 << 7,
504
505         /* RESET_AFTER_USE tag newly duplicated/copied IDs.
506          * Also used internally in readfile.c to mark datablocks needing do_versions. */
507         LIB_TAG_NEW             = 1 << 8,
508         /* RESET_BEFORE_USE free test flag.
509          * TODO make it a RESET_AFTER_USE too. */
510         LIB_TAG_DOIT            = 1 << 10,
511         /* RESET_AFTER_USE tag existing data before linking so we know what is new. */
512         LIB_TAG_PRE_EXISTING    = 1 << 11,
513
514         /* The datablock is a copy-on-write/localized version. */
515         LIB_TAG_COPIED_ON_WRITE               = 1 << 12,
516         LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT   = 1 << 13,
517         LIB_TAG_LOCALIZED = 1 << 14,
518
519         /* RESET_NEVER tag datablock for freeing etc. behavior
520          * (usually set when copying real one into temp/runtime one). */
521         LIB_TAG_NO_MAIN          = 1 << 15,  /* Datablock is not listed in Main database. */
522         LIB_TAG_NO_USER_REFCOUNT = 1 << 16,  /* Datablock does not refcount usages of other IDs. */
523         /* Datablock was not allocated by standard system (BKE_libblock_alloc), do not free its memory
524          * (usual type-specific freeing is called though). */
525         LIB_TAG_NOT_ALLOCATED     = 1 << 18,
526 };
527
528 /* Tag given ID for an update in all the dependency graphs. */
529 typedef enum IDRecalcFlag {
530         /* Individual update tags, this is what ID gets tagged for update with. */
531
532         /* ** Object transformation changed. ** */
533         ID_RECALC_TRANSFORM   = (1 << 0),
534
535         /* ** Object geometry changed. **
536          *
537          * When object of armature type gets tagged with this flag, it's pose is
538          * re-evaluated.
539          * When object of other type is tagged with this flag it makes the modifier
540          * stack to be re-evaluated.
541          * When object data type (mesh, curve, ...) gets tagged with this flag it
542          * makes all objects which shares this datablock to be updated. */
543         ID_RECALC_GEOMETRY    = (1 << 1),
544
545         /* ** Animation or time changed and animation is to be re-evaluated. ** */
546         ID_RECALC_ANIMATION   = (1 << 2),
547
548         /* ** Particle system changed. ** */
549         /* Only do pathcache etc. */
550         ID_RECALC_PSYS_REDO   = (1 << 3),
551         /* Reset everything including pointcache. */
552         ID_RECALC_PSYS_RESET  = (1 << 4),
553         /* Only child settings changed. */
554         ID_RECALC_PSYS_CHILD  = (1 << 5),
555         /* Physics type changed. */
556         ID_RECALC_PSYS_PHYS   = (1 << 6),
557
558         /* ** Material and shading ** */
559
560         /* For materials and node trees this means that topology of the shader tree
561          * changed, and the shader is to be recompiled.
562          * For objects it means that the draw batch cache is to be redone. */
563         ID_RECALC_SHADING             = (1 << 7),
564         /* TODO(sergey): Consider adding an explicit ID_RECALC_SHADING_PARAMATERS
565          * which can be used for cases when only socket value changed, to speed up
566          * redraw update in that case. */
567
568         /* Selection of the ID itself or its components (for example, vertices) did
569          * change, and all the drawing data is to eb updated. */
570         ID_RECALC_SELECT        = (1 << 9),
571         /* Flags on the base did change, and is to be compied onto all the copies of
572          * corresponding objects. */
573         ID_RECALC_BASE_FLAGS    = (1 << 10),
574         ID_RECALC_POINT_CACHE   = (1 << 11),
575         /* Only inform editors about the change. Is used to force update of editors
576          * when datablock which is not a part of dependency graph did change.
577          *
578          * For example, brush texture did change and the preview is to be
579          * re-rendered. */
580         ID_RECALC_EDITORS       = (1 << 12),
581
582         /* ** Update copy on write component. **
583          * This is most generic tag which should only be used when nothing else
584          * matches.
585          */
586         ID_RECALC_COPY_ON_WRITE = (1 << 13),
587
588         /* Aggregate flags, use only for checks on runtime.
589          * Do NOT use those for tagging. */
590
591         /* Identifies that SOMETHING has been changed in this ID. */
592         ID_RECALC_ALL = ~(0),
593         /* Identifies that something in particle system did change. */
594         ID_RECALC_PSYS_ALL    = (ID_RECALC_PSYS_REDO |
595                                  ID_RECALC_PSYS_RESET |
596                                  ID_RECALC_PSYS_CHILD |
597                                  ID_RECALC_PSYS_PHYS),
598
599 } IDRecalcFlag;
600
601 /* To filter ID types (filter_id) */
602 /* XXX We cannot put all needed IDs inside an enum...
603  *     We'll have to see whether we can fit all needed ones inside 32 values,
604  *     or if we need to fallback to longlong defines :/
605  */
606 enum {
607         FILTER_ID_AC        = (1 << 0),
608         FILTER_ID_AR        = (1 << 1),
609         FILTER_ID_BR        = (1 << 2),
610         FILTER_ID_CA        = (1 << 3),
611         FILTER_ID_CU        = (1 << 4),
612         FILTER_ID_GD        = (1 << 5),
613         FILTER_ID_GR        = (1 << 6),
614         FILTER_ID_IM        = (1 << 7),
615         FILTER_ID_LA        = (1 << 8),
616         FILTER_ID_LS        = (1 << 9),
617         FILTER_ID_LT        = (1 << 10),
618         FILTER_ID_MA        = (1 << 11),
619         FILTER_ID_MB        = (1 << 12),
620         FILTER_ID_MC        = (1 << 13),
621         FILTER_ID_ME        = (1 << 14),
622         FILTER_ID_MSK       = (1 << 15),
623         FILTER_ID_NT        = (1 << 16),
624         FILTER_ID_OB        = (1 << 17),
625         FILTER_ID_PAL       = (1 << 18),
626         FILTER_ID_PC        = (1 << 19),
627         FILTER_ID_SCE       = (1 << 20),
628         FILTER_ID_SPK       = (1 << 21),
629         FILTER_ID_SO        = (1 << 22),
630         FILTER_ID_TE        = (1 << 23),
631         FILTER_ID_TXT       = (1 << 24),
632         FILTER_ID_VF        = (1 << 25),
633         FILTER_ID_WO        = (1 << 26),
634         FILTER_ID_PA        = (1 << 27),
635         FILTER_ID_CF        = (1 << 28),
636         FILTER_ID_WS        = (1 << 29),
637         FILTER_ID_LP        = (1u << 31),
638 };
639
640 /* IMPORTANT: this enum matches the order currently use in set_listbasepointers,
641  * keep them in sync! */
642 enum {
643         INDEX_ID_LI = 0,
644         INDEX_ID_IP,
645         INDEX_ID_AC,
646         INDEX_ID_KE,
647         INDEX_ID_PAL,
648         INDEX_ID_GD,
649         INDEX_ID_NT,
650         INDEX_ID_IM,
651         INDEX_ID_TE,
652         INDEX_ID_MA,
653         INDEX_ID_VF,
654         INDEX_ID_AR,
655         INDEX_ID_CF,
656         INDEX_ID_ME,
657         INDEX_ID_CU,
658         INDEX_ID_MB,
659         INDEX_ID_LT,
660         INDEX_ID_LA,
661         INDEX_ID_CA,
662         INDEX_ID_TXT,
663         INDEX_ID_SO,
664         INDEX_ID_GR,
665         INDEX_ID_PC,
666         INDEX_ID_BR,
667         INDEX_ID_PA,
668         INDEX_ID_SPK,
669         INDEX_ID_LP,
670         INDEX_ID_WO,
671         INDEX_ID_MC,
672         INDEX_ID_SCR,
673         INDEX_ID_OB,
674         INDEX_ID_LS,
675         INDEX_ID_SCE,
676         INDEX_ID_WS,
677         INDEX_ID_WM,
678         INDEX_ID_MSK,
679         INDEX_ID_NULL,
680         INDEX_ID_MAX,
681 };
682
683 #ifdef __cplusplus
684 }
685 #endif
686
687 #endif