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