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