af2aa0da5ab17c589f1b82b2a810f15cb4be61ab
[blender.git] / source / blender / makesdna / DNA_armature_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
20 /** \file
21  * \ingroup DNA
22  */
23
24 #ifndef __DNA_ARMATURE_TYPES_H__
25 #define __DNA_ARMATURE_TYPES_H__
26
27 #include "DNA_defs.h"
28 #include "DNA_listBase.h"
29 #include "DNA_ID.h"
30
31 struct AnimData;
32
33 /* this system works on different transformation space levels;
34  *
35  * 1) Bone Space;      with each Bone having own (0,0,0) origin
36  * 2) Armature Space;  the rest position, in Object space, Bones Spaces are applied hierarchical
37  * 3) Pose Space;      the animation position, in Object space
38  * 4) World Space;     Object matrix applied to Pose or Armature space
39  */
40
41 typedef struct Bone {
42         /**  Next/prev elements within this list. */
43         struct Bone *next, *prev;
44         /** User-Defined Properties on this Bone. */
45         IDProperty  *prop;
46         /**  Parent (ik parent if appropriate flag is set. */
47         struct Bone *parent;
48         /**  Children   . */
49         ListBase     childbase;
50         /**  Name of the bone - must be unique within the armature, MAXBONENAME. */
51         char         name[64];
52
53         /**  roll is input for editmode, length calculated. */
54         float        roll;
55         float        head[3];
56         /**  head/tail and roll in Bone Space   . */
57         float        tail[3];
58         /**  rotation derived from head/tail/roll. */
59         float        bone_mat[3][3];
60
61         int          flag;
62
63         float        arm_head[3];
64         /**  head/tail in Armature Space (rest pos). */
65         float        arm_tail[3];
66         /**  matrix: (bonemat(b)+head(b))*arm_mat(b-1), rest po.s*/
67         float        arm_mat[4][4];
68         /** Roll in Armature Space (rest pos). */
69         float        arm_roll;
70
71         /**  dist, weight: for non-deformgroup deforms. */
72         float        dist, weight;
73         /**  width: for block bones. keep in this order, transform!. */
74         float        xwidth, length, zwidth;
75         /** Radius for head/tail sphere, defining deform as well, parent->rad_tip overrides rad_head. */
76         float        rad_head, rad_tail;
77
78         /** Curved bones settings - these define the "restpose" for a curved bone. */
79         float        roll1, roll2;
80         float            curveInX, curveInY;
81         float            curveOutX, curveOutY;
82         /** Length of bezier handles. */
83         float        ease1, ease2;
84         float            scaleIn, scaleOut;
85
86         /**  patch for upward compat, UNUSED!. */
87         float        size[3];
88         /** Layers that bone appears on. */
89         int          layer;
90         /**  for B-bones. */
91         short        segments;
92
93         /** Type of next/prev bone handles. */
94         char         bbone_prev_type;
95         char         bbone_next_type;
96         /** Next/prev bones to use as handle references when calculating bbones (optional). */
97         struct Bone *bbone_prev;
98         struct Bone *bbone_next;
99 } Bone;
100
101 typedef struct bArmature {
102         ID          id;
103         struct AnimData *adt;
104
105         ListBase    bonebase;
106         ListBase    chainbase;
107         /** Editbone listbase, we use pointer so we can check state. */
108         ListBase   *edbo;
109
110         /* active bones should work like active object where possible
111          * - active and selection are unrelated
112          * - active & hidden is not allowed
113          * - from the user perspective active == last selected
114          * - active should be ignored when not visible (hidden layer) */
115
116         /** Active bone. */
117         Bone       *act_bone;
118         /** Active editbone (in editmode). */
119         struct EditBone *act_edbone;
120
121         int         flag;
122         int         drawtype;
123         /** How vertex deformation is handled in the ge. */
124         int         gevertdeformer;
125         char _pad[4];
126         short       deformflag;
127         short       pathflag;
128
129         /** For UI, to show which layers are there. */
130         unsigned int layer_used;
131         /** For buttons to work, both variables in this order together. */
132         unsigned int layer, layer_protected;
133 } bArmature;
134
135 /* armature->flag */
136 /* don't use bit 7, was saved in files to disable stuff */
137 typedef enum eArmature_Flag {
138         ARM_RESTPOS         = (1<<0),
139         /** XRAY is here only for backwards converting */
140         ARM_FLAG_UNUSED_1   = (1 << 1),  /* cleared */
141         ARM_DRAWAXES        = (1<<2),
142         ARM_DRAWNAMES       = (1<<3),
143         ARM_POSEMODE        = (1<<4),
144         ARM_FLAG_UNUSED_5   = (1<<5),  /* cleared */
145         ARM_DELAYDEFORM     = (1<<6),
146         ARM_FLAG_UNUSED_7   = (1 << 7),  /* cleared */
147         ARM_MIRROR_EDIT     = (1<<8),
148         ARM_AUTO_IK         = (1<<9),
149         /** made option negative, for backwards compat */
150         ARM_NO_CUSTOM       = (1<<10),
151         /** draw custom colors  */
152         ARM_COL_CUSTOM      = (1<<11),
153         /** when ghosting, only show selected bones (this should belong to ghostflag instead) */
154         ARM_FLAG_UNUSED_12  = (1 << 12), /* cleared */
155         /** dopesheet channel is expanded */
156         ARM_DS_EXPAND       = (1<<13),
157         /** other objects are used for visualizing various states (hack for efficient updates) */
158         ARM_HAS_VIZ_DEPS    = (1<<14),
159 } eArmature_Flag;
160
161 /* armature->drawtype */
162 typedef enum eArmature_Drawtype {
163         ARM_OCTA = 0,
164         ARM_LINE = 1,
165         ARM_B_BONE = 2,
166         ARM_ENVELOPE = 3,
167         ARM_WIRE = 4,
168 } eArmature_Drawtype;
169
170 /* armature->gevertdeformer */
171 typedef enum eArmature_VertDeformer {
172         ARM_VDEF_BLENDER = 0,
173         ARM_VDEF_BGE_CPU = 1,
174 } eArmature_VertDeformer;
175
176 /* armature->deformflag */
177 typedef enum eArmature_DeformFlag {
178         ARM_DEF_VGROUP                  = (1<<0),
179         ARM_DEF_ENVELOPE                = (1<<1),
180         ARM_DEF_QUATERNION              = (1<<2),
181 #ifdef DNA_DEPRECATED
182         ARM_DEF_B_BONE_REST             = (1<<3),       /* deprecated */
183 #endif
184         ARM_DEF_INVERT_VGROUP   = (1<<4),
185 } eArmature_DeformFlag;
186
187 /* armature->pathflag */
188 // XXX deprecated... old animation system (armature only viz)
189 #ifdef DNA_DEPRECATED
190 typedef enum eArmature_PathFlag {
191         ARM_PATH_FNUMS          = (1<<0),
192         ARM_PATH_KFRAS          = (1<<1),
193         ARM_PATH_HEADS          = (1<<2),
194         ARM_PATH_ACFRA          = (1<<3),
195         ARM_PATH_KFNOS          = (1<<4),
196 } eArmature_PathFlag;
197 #endif
198
199 /* bone->flag */
200 typedef enum eBone_Flag {
201         BONE_SELECTED               = (1 << 0),
202         BONE_ROOTSEL                = (1 << 1),
203         BONE_TIPSEL                 = (1 << 2),
204         /** Used instead of BONE_SELECTED during transform (clear before use) */
205         BONE_TRANSFORM              = (1 << 3),
206         /** when bone has a parent, connect head of bone to parent's tail*/
207         BONE_CONNECTED              = (1 << 4),
208         /* 32 used to be quatrot, was always set in files, do not reuse unless you clear it always */
209         /** hidden Bones when drawing PoseChannels */
210         BONE_HIDDEN_P               = (1 << 6),
211         /** For detecting cyclic dependencies */
212         BONE_DONE                   = (1 << 7),
213         /** active is on mouse clicks only - deprecated, ONLY USE FOR DRAWING */
214         BONE_DRAW_ACTIVE            = (1 << 8),
215         /** No parent rotation or scale */
216         BONE_HINGE                  = (1 << 9),
217         /** hidden Bones when drawing Armature Editmode */
218         BONE_HIDDEN_A               = (1 << 10),
219         /** multiplies vgroup with envelope */
220         BONE_MULT_VG_ENV            = (1 << 11),
221         /** bone doesn't deform geometry */
222         BONE_NO_DEFORM              = (1 << 12),
223         /** set to prevent destruction of its unkeyframed pose (after transform) */
224         BONE_UNKEYED                = (1 << 13),
225         /** set to prevent hinge child bones from influencing the transform center */
226         BONE_HINGE_CHILD_TRANSFORM  = (1 << 14),
227         /** No parent scale */
228         BONE_NO_SCALE               = (1 << 15),
229         /** hidden bone when drawing PoseChannels (for ghost drawing) */
230         BONE_HIDDEN_PG              = (1 << 16),
231         /** bone should be drawn as OB_WIRE, regardless of draw-types of view+armature */
232         BONE_DRAWWIRE               = (1 << 17),
233         /** when no parent, bone will not get cyclic offset */
234         BONE_NO_CYCLICOFFSET        = (1 << 18),
235         /** bone transforms are locked in EditMode */
236         BONE_EDITMODE_LOCKED        = (1 << 19),
237         /** Indicates that a parent is also being transformed */
238         BONE_TRANSFORM_CHILD        = (1 << 20),
239         /** bone cannot be selected */
240         BONE_UNSELECTABLE           = (1 << 21),
241         /** bone location is in armature space */
242         BONE_NO_LOCAL_LOCATION      = (1 << 22),
243         /** object child will use relative transform (like deform) */
244         BONE_RELATIVE_PARENTING     = (1 << 23),
245         /** it will add the parent end roll to the inroll */
246         BONE_ADD_PARENT_END_ROLL    = (1 << 24),
247
248 } eBone_Flag;
249
250 /* bone->bbone_prev_type, bbone_next_type */
251 typedef enum eBone_BBoneHandleType {
252         BBONE_HANDLE_AUTO = 0,  /* Default mode based on parents & children. */
253         BBONE_HANDLE_ABSOLUTE,  /* Custom handle in absolute position mode. */
254         BBONE_HANDLE_RELATIVE,  /* Custom handle in relative position mode. */
255         BBONE_HANDLE_TANGENT,   /* Custom handle in tangent mode (use direction, not location). */
256 } eBone_BBoneHandleType;
257
258 #define MAXBONENAME 64
259
260 #endif