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