Merge branch 'blender2.7'
[blender.git] / source / blender / makesdna / DNA_ID.h
index 20a3aa1..5815a91 100644 (file)
@@ -17,9 +17,9 @@
  * All rights reserved.
  */
 
-/** \file DNA_ID.h
- *  \ingroup DNA
- *  \brief ID and Library types, which are fundamental for sdna.
+/** \file
+ * \ingroup DNA
+ * \brief ID and Library types, which are fundamental for sdna.
  */
 
 #ifndef __DNA_ID_H__
@@ -37,22 +37,46 @@ struct ID;
 struct Library;
 struct PackedFile;
 
+/* Runtime display data */
+struct DrawData;
+typedef void (*DrawDataInitCb)(struct DrawData *engine_data);
+typedef void (*DrawDataFreeCb)(struct DrawData *engine_data);
+
+#
+#
+typedef struct DrawData {
+       struct DrawData *next, *prev;
+       struct DrawEngineType *engine_type;
+       /* Only nested data, NOT the engine data itself. */
+       DrawDataFreeCb free;
+       /* Accumulated recalc flags, which corresponds to ID->recalc flags. */
+       int recalc;
+} DrawData;
+
+typedef struct DrawDataList {
+       struct DrawData *first, *last;
+} DrawDataList;
+
+
 typedef struct IDPropertyData {
        void *pointer;
        ListBase group;
-       int val, val2;  /* note, we actually fit a double into these two ints */
+       /** Note, we actually fit a double into these two ints. */
+       int val, val2;
 } IDPropertyData;
 
 typedef struct IDProperty {
        struct IDProperty *next, *prev;
        char type, subtype;
        short flag;
-       char name[64];  /* MAX_IDPROP_NAME */
+       /** MAX_IDPROP_NAME. */
+       char name[64];
 
        /* saved is used to indicate if this struct has been saved yet.
         * seemed like a good idea as a pad var was needed anyway :) */
        int saved;
-       IDPropertyData data;  /* note, alignment for 64 bits */
+       /** Note, alignment for 64 bits. */
+       IDPropertyData data;
 
        /* array length, also (this is important!) string length + 1.
         * the idea is to be able to reuse array realloc functions on strings.*/
@@ -88,14 +112,114 @@ enum {
        IDP_STRING_SUB_BYTE  = 1,  /* arbitrary byte array, _not_ null terminated */
 };
 
+/* IDP_GROUP */
+enum {
+       IDP_GROUP_SUB_NONE              = 0,  /* default */
+       IDP_GROUP_SUB_MODE_OBJECT       = 1,  /* object mode settings */
+       IDP_GROUP_SUB_MODE_EDIT         = 2,  /* mesh edit mode settings */
+       IDP_GROUP_SUB_ENGINE_RENDER     = 3,  /* render engine settings */
+       IDP_GROUP_SUB_OVERRIDE          = 4,  /* data override */
+       IDP_GROUP_SUB_MODE_PAINT_WEIGHT = 5,  /* weight paint mode settings */
+       IDP_GROUP_SUB_MODE_PAINT_VERTEX = 6,  /* vertex paint mode settings */
+};
+
 /*->flag*/
 enum {
-       IDP_FLAG_GHOST       = 1 << 7,  /* this means the property is set but RNA will return false when checking
-                                        * 'RNA_property_is_set', currently this is a runtime flag */
+       /** This IDProp may be statically overridden.
+        * Should only be used/be relevant for custom properties. */
+       IDP_FLAG_OVERRIDABLE_STATIC = 1 << 0,
+
+       /** This means the property is set but RNA will return false when checking
+        * 'RNA_property_is_set', currently this is a runtime flag */
+       IDP_FLAG_GHOST       = 1 << 7,
 };
 
 /* add any future new id property types here.*/
 
+
+/* Static ID override structs. */
+
+typedef struct IDOverrideStaticPropertyOperation {
+       struct IDOverrideStaticPropertyOperation *next, *prev;
+
+       /* Type of override. */
+       short operation;
+       short flag;
+       short pad_s1[2];
+
+       /* Sub-item references, if needed (for arrays or collections only).
+        * We need both reference and local values to allow e.g. insertion into collections (constraints, modifiers...).
+        * In collection case, if names are defined, they are used in priority.
+        * Names are pointers (instead of char[64]) to save some space, NULL when unset.
+        * Indices are -1 when unset. */
+       char *subitem_reference_name;
+       char *subitem_local_name;
+       int subitem_reference_index;
+       int subitem_local_index;
+} IDOverrideStaticPropertyOperation;
+
+/* IDOverridePropertyOperation->operation. */
+enum {
+       /* Basic operations. */
+       IDOVERRIDESTATIC_OP_NOOP          =   0,  /* Special value, forbids any overriding. */
+
+       IDOVERRIDESTATIC_OP_REPLACE       =   1,  /* Fully replace local value by reference one. */
+
+       /* Numeric-only operations. */
+       IDOVERRIDESTATIC_OP_ADD           = 101,  /* Add local value to reference one. */
+       /* Subtract local value from reference one (needed due to unsigned values etc.). */
+       IDOVERRIDESTATIC_OP_SUBTRACT      = 102,
+       /* Multiply reference value by local one (more useful than diff for scales and the like). */
+       IDOVERRIDESTATIC_OP_MULTIPLY      = 103,
+
+       /* Collection-only operations. */
+       IDOVERRIDESTATIC_OP_INSERT_AFTER  = 201,  /* Insert after given reference's subitem. */
+       IDOVERRIDESTATIC_OP_INSERT_BEFORE = 202,  /* Insert before given reference's subitem. */
+       /* We can add more if needed (move, delete, ...). */
+};
+
+/* IDOverridePropertyOperation->flag. */
+enum {
+       /** User cannot remove that override operation. */
+       IDOVERRIDESTATIC_FLAG_MANDATORY     =   1 << 0,
+       /** User cannot change that override operation. */
+       IDOVERRIDESTATIC_FLAG_LOCKED        =   1 << 1,
+};
+
+/** A single overridden property, contain all operations on this one. */
+typedef struct IDOverrideStaticProperty {
+       struct IDOverrideStaticProperty *next, *prev;
+
+       /**
+        * Path from ID to overridden property.
+        * *Does not* include indices/names for final arrays/collections items.
+        */
+       char *rna_path;
+
+       /** List of overriding operations (IDOverridePropertyOperation) applied to this property. */
+       ListBase operations;
+} IDOverrideStaticProperty;
+
+/* Main container for all overriding data info of a data-block. */
+typedef struct IDOverrideStatic {
+       /** Reference linked ID which this one overrides. */
+       struct ID *reference;
+       /** List of IDOverrideProperty structs. */
+       ListBase properties;
+
+       short flag;
+       short pad[3];
+
+       /* Read/write data. */
+       /* Temp ID storing extra override data (used for differential operations only currently).
+        * Always NULL outside of read/write context. */
+       struct ID *storage;
+} IDOverrideStatic;
+
+enum eStaticOverride_Flag {
+       STATICOVERRIDE_AUTO    = 1 << 0,  /* Allow automatic generation of overriding rules. */
+};
+
 /* watch it: Sequence has identical beginning. */
 /**
  * ID is the first thing included in all serializable types. It
@@ -111,9 +235,11 @@ typedef struct ID {
        void *next, *prev;
        struct ID *newid;
        struct Library *lib;
-       char name[66]; /* MAX_ID_NAME */
+       /** MAX_ID_NAME. */
+       char name[66];
        /**
-        * LIB_... flags report on status of the datablock this ID belongs to (persistent, saved to and read from .blend).
+        * LIB_... flags report on status of the datablock this ID belongs to
+        * (persistent, saved to and read from .blend).
         */
        short flag;
        /**
@@ -126,6 +252,15 @@ typedef struct ID {
        int pad;
        IDProperty *properties;
 
+       /** Reference linked ID which this one overrides. */
+       IDOverrideStatic *override_static;
+
+       /**
+        * Only set for datablocks which are coming from copy-on-write, points to
+        * the original version of it.
+        */
+       struct ID *orig_id;
+
        void *py_instance;
 } ID;
 
@@ -136,28 +271,34 @@ typedef struct ID {
 typedef struct Library {
        ID id;
        struct FileData *filedata;
-       char name[1024];  /* path name used for reading, can be relative and edited in the outliner */
+       /** Path name used for reading, can be relative and edited in the outliner. */
+       char name[1024];
 
-       /* absolute filepath, this is only for convenience, 'name' is the real path used on file read but in
+       /**
+        * Absolute filepath, this is only for convenience,
+        * 'name' is the real path used on file read but in
         * some cases its useful to access the absolute one.
         * This is set on file read.
-        * Use BKE_library_filepath_set() rather than setting 'name' directly and it will be kept in sync - campbell */
+        * Use BKE_library_filepath_set() rather than setting 'name'
+        * directly and it will be kept in sync - campbell */
        char filepath[1024];
 
-       struct Library *parent; /* set for indirectly linked libs, used in the outliner and while reading */
+       /** Set for indirectly linked libs, used in the outliner and while reading. */
+       struct Library *parent;
 
        struct PackedFile *packedfile;
 
        /* Temp data needed by read/write code. */
        int temp_index;
-       short versionfile, subversionfile;  /* see BLENDER_VERSION, BLENDER_SUBVERSION, needed for do_versions */
+       /** See BLENDER_VERSION, BLENDER_SUBVERSION, needed for do_versions. */
+       short versionfile, subversionfile;
 } Library;
 
 enum eIconSizes {
        ICON_SIZE_ICON = 0,
        ICON_SIZE_PREVIEW = 1,
 
-       NUM_ICON_SIZES
+       NUM_ICON_SIZES,
 };
 
 /* for PreviewImage->flag */
@@ -183,9 +324,11 @@ typedef struct PreviewImage {
 
        /* Runtime-only data. */
        struct GPUTexture *gputexture[2];
-       int icon_id;  /* Used by previews outside of ID context. */
+       /** Used by previews outside of ID context. */
+       int icon_id;
 
-       short tag;  /* Runtime data. */
+       /** Runtime data. */
+       short tag;
        char pad[2];
 } PreviewImage;
 
@@ -249,6 +392,8 @@ typedef enum ID_Type {
        ID_PAL  = MAKE_ID2('P', 'L'), /* Palette */
        ID_PC   = MAKE_ID2('P', 'C'), /* PaintCurve  */
        ID_CF   = MAKE_ID2('C', 'F'), /* CacheFile */
+       ID_WS   = MAKE_ID2('W', 'S'), /* WorkSpace */
+       ID_LP   = MAKE_ID2('L', 'P'), /* LightProbe */
 } ID_Type;
 
 /* Only used as 'placeholder' in .blend files for directly linked datablocks. */
@@ -272,7 +417,7 @@ typedef enum ID_Type {
 #define ID_REAL_USERS(id) (((ID *)id)->us - ID_FAKE_USERS(id))
 #define ID_EXTRA_USERS(id) (((ID *)id)->tag & LIB_TAG_EXTRAUSER ? 1 : 0)
 
-#define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM))
+#define ID_CHECK_UNDO(id) ((GS((id)->name) != ID_SCR) && (GS((id)->name) != ID_WM) && (GS((id)->name) != ID_WS))
 
 #define ID_BLEND_PATH(_bmain, _id) ((_id)->lib ? (_id)->lib->filepath : BKE_main_blendfile_path((_bmain)))
 #define ID_BLEND_PATH_FROM_GLOBAL(_id) ((_id)->lib ? (_id)->lib->filepath : BKE_main_blendfile_path_from_global())
@@ -281,6 +426,21 @@ typedef enum ID_Type {
 
 #define ID_IS_LINKED(_id) (((ID *)(_id))->lib != NULL)
 
+#define ID_IS_STATIC_OVERRIDE(_id) (((ID *)(_id))->override_static != NULL && \
+                                    ((ID *)(_id))->override_static->reference != NULL)
+
+#define ID_IS_STATIC_OVERRIDE_TEMPLATE(_id) (((ID *)(_id))->override_static != NULL && \
+                                             ((ID *)(_id))->override_static->reference == NULL)
+
+#define ID_IS_STATIC_OVERRIDE_AUTO(_id) (!ID_IS_LINKED((_id)) && \
+                                         ID_IS_STATIC_OVERRIDE((_id)) && \
+                                         (((ID *)(_id))->override_static->flag & STATICOVERRIDE_AUTO))
+
+/* No copy-on-write for these types.
+ * Keep in sync with check_datablocks_copy_on_writable and deg_copy_on_write_is_needed */
+#define ID_TYPE_IS_COW(_id_type) \
+       (!ELEM(_id_type, ID_BR, ID_LS, ID_PAL, ID_IM))
+
 #ifdef GS
 #  undef GS
 #endif
@@ -292,7 +452,7 @@ typedef enum ID_Type {
 
 /* id->flag (persitent). */
 enum {
-       LIB_FAKEUSER        = 1 << 9,
+       LIB_FAKEUSER                = 1 << 9,
 };
 
 /**
@@ -332,6 +492,11 @@ enum {
         * (because the real one could not be linked from its library e.g.). */
        LIB_TAG_MISSING         = 1 << 6,
 
+       /* RESET_NEVER tag datablock as being up-to-date regarding its reference. */
+       LIB_TAG_OVERRIDESTATIC_REFOK = 1 << 9,
+       /* RESET_NEVER tag datablock as needing an auto-override execution, if enabled. */
+       LIB_TAG_OVERRIDESTATIC_AUTOREFRESH = 1 << 17,
+
        /* tag datablock has having an extra user. */
        LIB_TAG_EXTRAUSER       = 1 << 2,
        /* tag datablock has having actually increased usercount for the extra virtual user. */
@@ -346,22 +511,92 @@ enum {
        /* RESET_AFTER_USE tag existing data before linking so we know what is new. */
        LIB_TAG_PRE_EXISTING    = 1 << 11,
 
-       /* RESET_NEVER tag datablock for freeing etc. behavior (usually set when copying real one into temp/runtime one). */
-       LIB_TAG_NO_MAIN          = 1 << 12,  /* Datablock is not listed in Main database. */
-       LIB_TAG_NO_USER_REFCOUNT = 1 << 13,  /* Datablock does not refcount usages of other IDs. */
+       /* The datablock is a copy-on-write/localized version. */
+       LIB_TAG_COPIED_ON_WRITE               = 1 << 12,
+       LIB_TAG_COPIED_ON_WRITE_EVAL_RESULT   = 1 << 13,
+       LIB_TAG_LOCALIZED = 1 << 14,
+
+       /* RESET_NEVER tag datablock for freeing etc. behavior
+        * (usually set when copying real one into temp/runtime one). */
+       LIB_TAG_NO_MAIN          = 1 << 15,  /* Datablock is not listed in Main database. */
+       LIB_TAG_NO_USER_REFCOUNT = 1 << 16,  /* Datablock does not refcount usages of other IDs. */
        /* Datablock was not allocated by standard system (BKE_libblock_alloc), do not free its memory
         * (usual type-specific freeing is called though). */
-       LIB_TAG_NOT_ALLOCATED     = 1 << 14,
+       LIB_TAG_NOT_ALLOCATED     = 1 << 18,
 };
 
-enum {
-       /* RESET_AFTER_USE, used by update code (depsgraph). */
-       ID_RECALC_NONE  = 0,
-       ID_RECALC       = 1 << 0,
-       ID_RECALC_DATA  = 1 << 1,
-       ID_RECALC_SKIP_ANIM_TAG  = 1 << 2,
-       ID_RECALC_ALL   = (ID_RECALC | ID_RECALC_DATA),
-};
+/* Tag given ID for an update in all the dependency graphs. */
+typedef enum IDRecalcFlag {
+       /* Individual update tags, this is what ID gets tagged for update with. */
+
+       /* ** Object transformation changed. ** */
+       ID_RECALC_TRANSFORM   = (1 << 0),
+
+       /* ** Object geometry changed. **
+        *
+        * When object of armature type gets tagged with this flag, it's pose is
+        * re-evaluated.
+        * When object of other type is tagged with this flag it makes the modifier
+        * stack to be re-evaluated.
+        * When object data type (mesh, curve, ...) gets tagged with this flag it
+        * makes all objects which shares this datablock to be updated. */
+       ID_RECALC_GEOMETRY    = (1 << 1),
+
+       /* ** Animation or time changed and animation is to be re-evaluated. ** */
+       ID_RECALC_ANIMATION   = (1 << 2),
+
+       /* ** Particle system changed. ** */
+       /* Only do pathcache etc. */
+       ID_RECALC_PSYS_REDO   = (1 << 3),
+       /* Reset everything including pointcache. */
+       ID_RECALC_PSYS_RESET  = (1 << 4),
+       /* Only child settings changed. */
+       ID_RECALC_PSYS_CHILD  = (1 << 5),
+       /* Physics type changed. */
+       ID_RECALC_PSYS_PHYS   = (1 << 6),
+
+       /* ** Material and shading ** */
+
+       /* For materials and node trees this means that topology of the shader tree
+        * changed, and the shader is to be recompiled.
+        * For objects it means that the draw batch cache is to be redone. */
+       ID_RECALC_SHADING             = (1 << 7),
+       /* TODO(sergey): Consider adding an explicit ID_RECALC_SHADING_PARAMATERS
+        * which can be used for cases when only socket value changed, to speed up
+        * redraw update in that case. */
+
+       /* Selection of the ID itself or its components (for example, vertices) did
+        * change, and all the drawing data is to eb updated. */
+       ID_RECALC_SELECT        = (1 << 9),
+       /* Flags on the base did change, and is to be compied onto all the copies of
+        * corresponding objects. */
+       ID_RECALC_BASE_FLAGS    = (1 << 10),
+       ID_RECALC_POINT_CACHE   = (1 << 11),
+       /* Only inform editors about the change. Is used to force update of editors
+        * when datablock which is not a part of dependency graph did change.
+        *
+        * For example, brush texture did change and the preview is to be
+        * re-rendered. */
+       ID_RECALC_EDITORS       = (1 << 12),
+
+       /* ** Update copy on write component. **
+        * This is most generic tag which should only be used when nothing else
+        * matches.
+        */
+       ID_RECALC_COPY_ON_WRITE = (1 << 13),
+
+       /* Aggregate flags, use only for checks on runtime.
+        * Do NOT use those for tagging. */
+
+       /* Identifies that SOMETHING has been changed in this ID. */
+       ID_RECALC_ALL = ~(0),
+       /* Identifies that something in particle system did change. */
+       ID_RECALC_PSYS_ALL    = (ID_RECALC_PSYS_REDO |
+                                ID_RECALC_PSYS_RESET |
+                                ID_RECALC_PSYS_CHILD |
+                                ID_RECALC_PSYS_PHYS),
+
+} IDRecalcFlag;
 
 /* To filter ID types (filter_id) */
 /* XXX We cannot put all needed IDs inside an enum...
@@ -398,15 +633,18 @@ enum {
        FILTER_ID_WO        = (1 << 26),
        FILTER_ID_PA        = (1 << 27),
        FILTER_ID_CF        = (1 << 28),
+       FILTER_ID_WS        = (1 << 29),
+       FILTER_ID_LP        = (1u << 31),
 };
 
-/* IMPORTANT: this enum matches the order currently use in set_lisbasepointers,
+/* IMPORTANT: this enum matches the order currently use in set_listbasepointers,
  * keep them in sync! */
 enum {
        INDEX_ID_LI = 0,
        INDEX_ID_IP,
        INDEX_ID_AC,
        INDEX_ID_KE,
+       INDEX_ID_PAL,
        INDEX_ID_GD,
        INDEX_ID_NT,
        INDEX_ID_IM,
@@ -424,20 +662,22 @@ enum {
        INDEX_ID_TXT,
        INDEX_ID_SO,
        INDEX_ID_GR,
-       INDEX_ID_PAL,
        INDEX_ID_PC,
        INDEX_ID_BR,
        INDEX_ID_PA,
        INDEX_ID_SPK,
+       INDEX_ID_LP,
        INDEX_ID_WO,
        INDEX_ID_MC,
        INDEX_ID_SCR,
        INDEX_ID_OB,
        INDEX_ID_LS,
        INDEX_ID_SCE,
+       INDEX_ID_WS,
        INDEX_ID_WM,
        INDEX_ID_MSK,
        INDEX_ID_NULL,
+       INDEX_ID_MAX,
 };
 
 #ifdef __cplusplus