Fix sculpt not updating on undo with EEVEE enabled
[blender.git] / source / blender / makesdna / DNA_key_types.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 #ifndef __DNA_KEY_TYPES_H__
20 #define __DNA_KEY_TYPES_H__
21
22 /** \file
23  * \ingroup DNA
24  *
25  * This file defines structures for Shape-Keys (not animation keyframes),
26  * attached to Mesh, Curve and Lattice Data. Even though Key's are ID blocks they
27  * aren't intended to be shared between multiple data blocks as with other ID types.
28  */
29
30 #include "DNA_defs.h"
31 #include "DNA_listBase.h"
32 #include "DNA_ID.h"
33
34 struct AnimData;
35 struct Ipo;
36
37 typedef struct KeyBlock {
38   struct KeyBlock *next, *prev;
39
40   /**
41    * point in time   (Key->type == KEY_NORMAL) only,
42    * for historic reasons this is relative to (Key->ctime / 100),
43    * so this value increments by 0.1f per frame.
44    */
45   float pos;
46   /** influence (typically [0 - 1] but can be more), (Key->type == KEY_RELATIVE) only.*/
47   float curval;
48
49   /** interpolation type (Key->type == KEY_NORMAL) only. */
50   short type;
51   char _pad1[2];
52
53   /** relative == 0 means first key is reference, otherwise the index of Key->blocks */
54   short relative;
55   short flag;
56
57   /** total number if items in the keyblock (compare with mesh/curve verts to check we match) */
58   int totelem;
59   /** for meshes only, match the unique number with the customdata layer */
60   int uid;
61
62   /** array of shape key values, size is (Key->elemsize * KeyBlock->totelem) */
63   void *data;
64   /** MAX_NAME (unique name, user assigned) */
65   char name[64];
66   /** MAX_VGROUP_NAME (optional vertex group), array gets allocated into 'weights' when set */
67   char vgroup[64];
68
69   /** ranges, for RNA and UI only to clamp 'curval' */
70   float slidermin;
71   float slidermax;
72
73 } KeyBlock;
74
75 typedef struct Key {
76   ID id;
77   /** Animation data (must be immediately after id for utilities to use it). */
78   struct AnimData *adt;
79
80   /**
81    * commonly called 'Basis', (Key->type == KEY_RELATIVE) only.
82    * Looks like this is  _always_ 'key->block.first',
83    * perhaps later on it could be defined as some other KeyBlock - campbell
84    */
85   KeyBlock *refkey;
86
87   /**
88    * This is not a regular string, although it is \0 terminated
89    * this is an array of (element_array_size, element_type) pairs
90    * (each one char) used for calculating shape key-blocks. */
91   char elemstr[32];
92   /** Size of each element in #KeyBlock.data, use for allocation and stride. */
93   int elemsize;
94   char _pad[4];
95
96   /** list of KeyBlock's */
97   ListBase block;
98   /** old animation system, deprecated for 2.5 */
99   struct Ipo *ipo DNA_DEPRECATED;
100
101   ID *from;
102
103   /** (totkey == BLI_listbase_count(&key->block)) */
104   int totkey;
105   short flag;
106   /** absolute or relative shape key */
107   char type;
108   char _pad2;
109
110   /** Only used when (Key->type == KEY_NORMAL), this value is used as a time slider,
111    * rather then using the scenes time, this value can be animated to give greater control */
112   float ctime;
113
114   /**
115    * Can never be 0, this is used for detecting old data.
116    * current free uid for keyblocks
117    */
118   int uidgen;
119 } Key;
120
121 /* **************** KEY ********************* */
122
123 /* Key->type: KeyBlocks are interpreted as... */
124 enum {
125   /* Sequential positions over time (using KeyBlock->pos and Key->ctime) */
126   KEY_NORMAL = 0,
127
128   /* States to blend between (default) */
129   KEY_RELATIVE = 1,
130 };
131
132 /* Key->flag */
133 enum {
134   KEY_DS_EXPAND = 1,
135 };
136
137 /* KeyBlock->type */
138 enum {
139   KEY_LINEAR = 0,
140   KEY_CARDINAL = 1,
141   KEY_BSPLINE = 2,
142   KEY_CATMULL_ROM = 3,
143 };
144
145 /* KeyBlock->flag */
146 enum {
147   KEYBLOCK_MUTE = (1 << 0),
148   KEYBLOCK_SEL = (1 << 1),
149   KEYBLOCK_LOCKED = (1 << 2),
150 };
151
152 #define KEYELEM_FLOAT_LEN_COORD 3
153
154 /* Curve key data layout constants */
155 #define KEYELEM_ELEM_SIZE_CURVE 3
156
157 #define KEYELEM_ELEM_LEN_BPOINT 2
158 #define KEYELEM_FLOAT_LEN_BPOINT (KEYELEM_ELEM_LEN_BPOINT * KEYELEM_ELEM_SIZE_CURVE)
159
160 #define KEYELEM_ELEM_LEN_BEZTRIPLE 4
161 #define KEYELEM_FLOAT_LEN_BEZTRIPLE (KEYELEM_ELEM_LEN_BEZTRIPLE * KEYELEM_ELEM_SIZE_CURVE)
162
163 #endif /* __DNA_KEY_TYPES_H__  */