Merge branch 'blender2.7'
[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 \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_defs.h"
30 #include "DNA_listBase.h"
31 #include "DNA_ID.h"
32
33 struct AnimData;
34 struct Ipo;
35
36 typedef struct KeyBlock {
37         struct KeyBlock *next, *prev;
38
39         /**
40          * point in time   (Key->type == KEY_NORMAL) only,
41          * for historic reasons this is relative to (Key->ctime / 100),
42          * so this value increments by 0.1f per frame.
43          */
44         float pos;
45         /** influence (typically [0 - 1] but can be more), (Key->type == KEY_RELATIVE) only.*/
46         float curval;
47
48         /** interpolation type (Key->type == KEY_NORMAL) only. */
49         short type;
50         short pad1;
51
52         /** relative == 0 means first key is reference, otherwise the index of Key->blocks */
53         short relative;
54         short flag;
55
56         /** total number if items in the keyblock (compare with mesh/curve verts to check we match) */
57         int totelem;
58         /** for meshes only, match the unique number with the customdata layer */
59         int uid;
60
61         /** array of shape key values, size is (Key->elemsize * KeyBlock->totelem) */
62         void  *data;
63         /** MAX_NAME (unique name, user assigned) */
64         char   name[64];
65         /** MAX_VGROUP_NAME (optional vertex group), array gets allocated into 'weights' when set */
66         char   vgroup[64];
67
68         /** ranges, for RNA and UI only to clamp 'curval' */
69         float slidermin;
70         float slidermax;
71
72 } KeyBlock;
73
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         int pad;
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__  */