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