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