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