Cleanup: comment line length (editors)
[blender.git] / source / blender / makesdna / DNA_key_types.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19  * All rights reserved.
20  *
21  * The Original Code is: all of this file.
22  *
23  * Contributor(s): none yet.
24  *
25  * ***** END GPL LICENSE BLOCK *****
26  */
27 #ifndef __DNA_KEY_TYPES_H__
28 #define __DNA_KEY_TYPES_H__
29
30 /** \file DNA_key_types.h
31  *  \ingroup DNA
32  *
33  * This file defines structures for Shape-Keys (not animation keyframes),
34  * attached to Mesh, Curve and Lattice Data. Even though Key's are ID blocks they
35  * aren't intended to be shared between multiple data blocks as with other ID types.
36  */
37
38 #include "DNA_defs.h"
39 #include "DNA_listBase.h"
40 #include "DNA_ID.h"
41
42 struct AnimData;
43 struct Ipo;
44
45 typedef struct KeyBlock {
46         struct KeyBlock *next, *prev;
47
48         float pos;         /* point in time   (Key->type == KEY_NORMAL) only,
49                             * for historic reasons this is relative to (Key->ctime / 100),
50                             * so this value increments by 0.1f per frame. */
51         float curval;      /* influence (typically [0 - 1] but can be more), (Key->type == KEY_RELATIVE) only.*/
52
53         short type;        /* interpolation type (Key->type == KEY_NORMAL) only. */
54         short pad1;
55
56         short relative;    /* relative == 0 means first key is reference, otherwise the index of Key->blocks */
57         short flag;
58
59         int totelem;       /* total number if items in the keyblock (compare with mesh/curve verts to check we match) */
60         int uid;           /* for meshes only, match the unique number with the customdata layer */
61
62         void  *data;       /* array of shape key values, size is (Key->elemsize * KeyBlock->totelem) */
63         char   name[64];   /* MAX_NAME (unique name, user assigned) */
64         char   vgroup[64]; /* MAX_VGROUP_NAME (optional vertex group), array gets allocated into 'weights' when set */
65
66         /* ranges, for RNA and UI only to clamp 'curval' */
67         float slidermin;
68         float slidermax;
69
70 } KeyBlock;
71
72
73 typedef struct Key {
74         ID id;
75         struct AnimData *adt;   /* animation data (must be immediately after id for utilities to use it) */
76
77         /* commonly called 'Basis', (Key->type == KEY_RELATIVE) only.
78          * Looks like this is  _always_ 'key->block.first',
79          * perhaps later on it could be defined as some other KeyBlock - campbell */
80         KeyBlock *refkey;
81
82         /* this is not a regular string, although it is \0 terminated
83          * this is an array of (element_array_size, element_type) pairs
84          * (each one char) used for calculating shape key-blocks */
85         char elemstr[32];
86         int elemsize;  /* size of each element in #KeyBlock.data, use for allocation and stride */
87         int pad;
88
89         ListBase block;  /* list of KeyBlock's */
90         struct Ipo *ipo  DNA_DEPRECATED;  /* old animation system, deprecated for 2.5 */
91
92         ID *from;
93
94         int totkey;  /* (totkey == BLI_listbase_count(&key->block)) */
95         short flag;
96         char type;  /* absolute or relative shape key */
97         char pad2;
98
99         /* only used when (Key->type == KEY_NORMAL), this value is used as a time slider,
100          * rather then using the scenes time, this value can be animated to give greater control */
101         float ctime;
102
103         /* can never be 0, this is used for detecting old data */
104         int uidgen; /* current free uid for keyblocks */
105 } Key;
106
107 /* **************** KEY ********************* */
108
109 /* Key->type: KeyBlocks are interpreted as... */
110 enum {
111         /* Sequential positions over time (using KeyBlock->pos and Key->ctime) */
112         KEY_NORMAL      = 0,
113
114         /* States to blend between (default) */
115         KEY_RELATIVE    = 1
116 };
117
118 /* Key->flag */
119 enum {
120         KEY_DS_EXPAND   = 1
121 };
122
123 /* KeyBlock->type */
124 enum {
125         KEY_LINEAR      = 0,
126         KEY_CARDINAL    = 1,
127         KEY_BSPLINE     = 2,
128         KEY_CATMULL_ROM = 3,
129 };
130
131 /* KeyBlock->flag */
132 enum {
133         KEYBLOCK_MUTE       = (1 << 0),
134         KEYBLOCK_SEL        = (1 << 1),
135         KEYBLOCK_LOCKED     = (1 << 2)
136 };
137
138 #endif /* __DNA_KEY_TYPES_H__  */