Dual Links for control bones: Control bones that start and end on specific joints...
[blender.git] / source / blender / include / BIF_retarget.h
1 /**
2  * $Id:  $
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 #ifndef BIF_RETARGET_H
24 #define BIF_RETARGET_H
25
26 #include "DNA_listBase.h"
27
28 #include "BLI_graph.h"
29 #include "BLI_ghash.h"
30 #include "BLI_threads.h"
31
32 #include "reeb.h"
33
34 struct EditBone;
35
36 struct RigJoint;
37 struct RigGraph;
38 struct RigNode;
39 struct RigArc;
40 struct RigEdge;
41
42 #define USE_THREADS
43
44 typedef struct RigGraph {
45         ListBase        arcs;
46         ListBase        nodes;
47
48         float length;
49         
50         FreeArc                 free_arc;
51         FreeNode                free_node;
52         RadialSymmetry  radial_symmetry;
53         AxialSymmetry   axial_symmetry;
54         /*********************************/
55
56         ListBase        controls;
57         ListBase*       editbones;
58         
59         struct RigNode *head;
60         ReebGraph *link_mesh;
61         
62         
63         struct ThreadedWorker *worker;
64         
65         GHash *bones_map;       /* map of editbones by name */
66         GHash *controls_map;    /* map of rigcontrols by bone pointer */
67         
68         Object *ob;
69 } RigGraph;
70
71 typedef struct RigNode {
72         void *next, *prev;
73         float p[3];
74         int flag;
75
76         int degree;
77         struct BArc **arcs;
78
79         int subgraph_index;
80
81         int symmetry_level;
82         int symmetry_flag;
83         float symmetry_axis[3];
84         /*********************************/
85
86         ReebNode *link_mesh;
87 } RigNode;
88
89 typedef struct RigArc {
90         void *next, *prev;
91         RigNode *head, *tail;
92         int flag;
93
94         float length;
95
96         int symmetry_level;
97         int symmetry_group;
98         int symmetry_flag;
99         /*********************************/
100         
101         ListBase edges;
102         int count;
103         ReebArc *link_mesh;
104 } RigArc;
105
106 typedef struct RigEdge {
107         struct RigEdge *next, *prev;
108         float head[3], tail[3];
109         float length;
110         float angle;
111         EditBone *bone;
112         float up_axis[3];
113 } RigEdge;
114
115 /* Control flags */
116 #define RIG_CTRL_HEAD_DONE              1
117 #define RIG_CTRL_TAIL_DONE              2
118 #define RIG_CTRL_PARENT_DEFORM  4
119 #define RIG_CTRL_FIT_ROOT               8
120 #define RIG_CTRL_FIT_BONE               16
121
122 #define RIG_CTRL_DONE   (RIG_CTRL_HEAD_DONE|RIG_CTRL_TAIL_DONE)
123
124 /* Control tail flags */
125 typedef enum {
126         TL_NONE = 0,
127         TL_TAIL,
128         TL_HEAD
129 } LinkTailMode;
130
131 typedef struct RigControl {
132         struct RigControl *next, *prev;
133         float head[3], tail[3];
134         EditBone *bone;
135         EditBone *link;
136         EditBone *link_tail;
137         float   up_axis[3];
138         float   offset[3];
139         float   qrot[4]; /* for dual linked bones, store the rotation of the linked bone for the finalization */
140         int             flag;
141         LinkTailMode tail_mode;
142 } RigControl;
143
144 void BIF_retargetArc(ReebArc *earc);
145
146 #endif /* BIF_RETARGET_H */