merge with trunk r38787
[blender-staging.git] / source / blender / editors / armature / reeb.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  * Contributor(s): Martin Poirier
21  *
22  * ***** END GPL LICENSE BLOCK *****
23  */
24
25 /** \file blender/editors/armature/reeb.h
26  *  \ingroup edarmature
27  */
28
29  
30 #ifndef REEB_H_
31 #define REEB_H_
32
33 #define WITH_BF_REEB
34
35 #include "DNA_listBase.h"
36
37 #include "BLI_graph.h"
38
39 struct GHash;
40 struct EdgeHash;
41 struct ReebArc;
42 struct ReebEdge;
43 struct ReebNode;
44
45 typedef struct ReebGraph {
46         ListBase        arcs;
47         ListBase        nodes;
48         
49         float length;
50         
51         FreeArc                 free_arc;
52         FreeNode                free_node;
53         RadialSymmetry  radial_symmetry;
54         AxialSymmetry   axial_symmetry;
55         /*********************************/
56         
57         int resolution;
58         int totnodes;
59         struct EdgeHash *emap;
60         int multi_level;
61         struct ReebGraph *link_up; /* for multi resolution filtering, points to higher levels */
62 } ReebGraph;
63
64 typedef struct EmbedBucket {
65         float val;
66         int       nv;
67         float p[3];
68         float no[3]; /* if non-null, normal of the bucket */
69 } EmbedBucket;
70
71 typedef struct ReebNode {
72         void *next, *prev;
73         float p[3];
74         int flag;
75
76         int degree;
77         struct ReebArc **arcs;
78
79         int subgraph_index;
80
81         int symmetry_level;
82         int symmetry_flag;
83         float symmetry_axis[3];
84         /*********************************/
85         
86         float no[3];
87
88         int index;
89         float weight;
90         int     multi_level;
91         struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
92         struct ReebNode *link_up;
93 } ReebNode;
94
95 typedef struct ReebEdge {
96         struct ReebEdge *next, *prev;
97         struct ReebArc  *arc;
98         struct ReebNode *v1, *v2;
99         struct ReebEdge *nextEdge;
100         int flag;
101 } ReebEdge;
102
103 typedef struct ReebArc {
104         void *next, *prev;
105         struct ReebNode *head, *tail;
106         int flag;
107
108         float length;
109
110         int symmetry_level;
111         int symmetry_group;
112         int symmetry_flag;
113         /*********************************/
114
115         ListBase edges;
116         int bcount;
117         struct EmbedBucket *buckets;
118
119         struct GHash *faces;    
120         float angle;
121         struct ReebArc *link_up; /* for multi resolution filtering, points to higher levels */
122 } ReebArc;
123
124 typedef struct ReebArcIterator {
125         HeadFct         head;
126         TailFct         tail;
127         PeekFct         peek;
128         NextFct         next;
129         NextNFct        nextN;
130         PreviousFct     previous;
131         StoppedFct      stopped;
132         
133         float *p, *no;
134         float size;
135         
136         int length;
137         int index;
138         /*********************************/
139         struct ReebArc  *arc;
140         int start;
141         int end;
142         int stride;
143 } ReebArcIterator;
144
145 struct EditMesh;
146 struct EdgeIndex;
147
148 int weightToHarmonic(struct EditMesh *em, struct EdgeIndex *indexed_edges);
149 int weightFromDistance(struct EditMesh *em, struct EdgeIndex *indexed_edges);
150 int weightFromLoc(struct EditMesh *me, int axis);
151 void weightToVCol(struct EditMesh *em, int index);
152 void arcToVCol(struct ReebGraph *rg, struct EditMesh *em, int index);
153 void angleToVCol(struct EditMesh *em, int index);
154 void renormalizeWeight(struct EditMesh *em, float newmax);
155
156 ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
157 ReebGraph * newReebGraph(void);
158
159 void initArcIterator(BArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
160 void initArcIterator2(BArcIterator *iter, struct ReebArc *arc, int start, int end);
161 void initArcIteratorStart(BArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start);
162
163 /* Filtering */
164 void filterNullReebGraph(ReebGraph *rg);
165 int filterSmartReebGraph(ReebGraph *rg, float threshold);
166 int filterExternalReebGraph(ReebGraph *rg, float threshold);
167 int filterInternalReebGraph(ReebGraph *rg, float threshold);
168
169 /* Post-Build processing */
170 void repositionNodes(ReebGraph *rg);
171 void postprocessGraph(ReebGraph *rg, char mode);
172 void removeNormalNodes(ReebGraph *rg);
173
174 void sortNodes(ReebGraph *rg);
175 void sortArcs(ReebGraph *rg);
176
177 /*------------ Sanity check ------------*/
178 void verifyBuckets(ReebGraph *rg);
179 void verifyFaces(ReebGraph *rg);
180 void verifyArcs(ReebGraph *rg);
181 void verifyNodeDegree(ReebGraph *rg);
182
183 /*********************** PUBLIC *********************************/
184
185 #define REEB_MAX_MULTI_LEVEL    10
186
187 struct bContext;
188
189 ReebGraph *BIF_ReebGraphFromEditMesh(void);
190 ReebGraph *BIF_ReebGraphMultiFromEditMesh(struct bContext *C);
191 void BIF_flagMultiArcs(ReebGraph *rg, int flag);
192
193 void BIF_GlobalReebGraphFromEditMesh(void);
194 void BIF_GlobalReebFree(void);
195
196 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
197 ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
198 ReebNode *BIF_lowestLevelNode(ReebNode *node);
199
200 ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
201
202 void REEB_freeGraph(ReebGraph *rg);
203 void REEB_freeArc(BArc *barc);
204 void REEB_exportGraph(ReebGraph *rg, int count);
205 void REEB_draw(void);
206
207
208 #endif /*REEB_H_*/