doxygen: blender/editors tagged.
[blender.git] / source / blender / editors / armature / 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/editors/armature/BIF_retarget.h
24  *  \ingroup edarmature
25  */
26
27
28 #ifndef BIF_RETARGET_H
29 #define BIF_RETARGET_H
30
31 #include "DNA_listBase.h"
32
33 #include "BLI_graph.h"
34 #include "BLI_ghash.h"
35 #include "BLI_threads.h"
36
37 #include "reeb.h"
38
39 struct Object;
40 struct bArmature;
41 struct bContext;
42
43 struct EditBone;
44
45 struct RigJoint;
46 struct RigGraph;
47 struct RigNode;
48 struct RigArc;
49 struct RigEdge;
50
51 #define USE_THREADS
52
53 typedef struct RigGraph {
54         ListBase        arcs;
55         ListBase        nodes;
56
57         float length;
58         
59         FreeArc                 free_arc;
60         FreeNode                free_node;
61         RadialSymmetry  radial_symmetry;
62         AxialSymmetry   axial_symmetry;
63         /*********************************/
64         
65         int                     flag;
66
67         ListBase        controls;
68         ListBase*       editbones;
69         
70         struct RigNode *head;
71         ReebGraph *link_mesh;
72         
73         
74         struct ThreadedWorker *worker;
75         
76         GHash *bones_map;       /* map of editbones by name */
77         GHash *controls_map;    /* map of rigcontrols by bone pointer */
78         
79         struct Object *ob;
80 } RigGraph;
81
82 typedef struct RigNode {
83         void *next, *prev;
84         float p[3];
85         int flag;
86
87         int degree;
88         struct BArc **arcs;
89
90         int subgraph_index;
91
92         int symmetry_level;
93         int symmetry_flag;
94         float symmetry_axis[3];
95         /*********************************/
96
97         ReebNode *link_mesh;
98 } RigNode;
99
100 typedef struct RigArc {
101         void *next, *prev;
102         RigNode *head, *tail;
103         int flag;
104
105         float length;
106
107         int symmetry_level;
108         int symmetry_group;
109         int symmetry_flag;
110         /*********************************/
111         
112         ListBase edges;
113         int count;
114         ReebArc *link_mesh;
115 } RigArc;
116
117 typedef struct RigEdge {
118         struct RigEdge *next, *prev;
119         float head[3], tail[3];
120         float length;
121         float angle; /* angle to next edge */
122         float up_angle; /* angle between up_axis and the joint normal (defined as Previous edge CrossProduct Current edge */
123         struct EditBone *bone;
124         float up_axis[3];
125 } RigEdge;
126
127 /* Graph flags */
128 #define RIG_FREE_BONELIST               1
129
130 /* Control flags */
131 #define RIG_CTRL_HEAD_DONE              1
132 #define RIG_CTRL_TAIL_DONE              2
133 #define RIG_CTRL_PARENT_DEFORM  4
134 #define RIG_CTRL_FIT_ROOT               8
135 #define RIG_CTRL_FIT_BONE               16
136
137 #define RIG_CTRL_DONE   (RIG_CTRL_HEAD_DONE|RIG_CTRL_TAIL_DONE)
138
139 /* Control tail flags */
140 typedef enum {
141         TL_NONE = 0,
142         TL_TAIL,
143         TL_HEAD
144 } LinkTailMode;
145
146 typedef struct RigControl {
147         struct RigControl *next, *prev;
148         float head[3], tail[3];
149         struct EditBone *bone;
150         struct EditBone *link;
151         struct EditBone *link_tail;
152         float   up_axis[3];
153         float   offset[3];
154         float   qrot[4]; /* for dual linked bones, store the rotation of the linked bone for the finalization */
155         int             flag;
156         LinkTailMode tail_mode;
157 } RigControl;
158
159 void BIF_retargetArc(struct bContext *C, ReebArc *earc, RigGraph *template_rigg);
160 RigGraph *RIG_graphFromArmature(const struct bContext *C, struct Object *ob, struct bArmature *arm);
161 int RIG_nbJoints(RigGraph *rg);
162 const char *RIG_nameBone(RigGraph *rg, int arc_index, int bone_index);
163 void RIG_freeRigGraph(BGraph *rg);
164
165 /* UNUSED */
166 void BIF_retargetArmature(bContext *C);
167 void BIF_adjustRetarget(bContext *C);
168 /* UNUSED / print funcs */
169 void RIG_printArc(struct RigGraph *rg, struct RigArc *arc);
170 void RIG_printGraph(struct RigGraph *rg);
171 void RIG_printArcBones(struct RigArc *arc);
172
173 #endif /* BIF_RETARGET_H */