Add compile time define to disable skeleton generation and retargetting UI (disabled...
[blender.git] / source / blender / include / 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. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * Contributor(s): Martin Poirier
24  *
25  * ***** END GPL LICENSE BLOCK *****
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 } EmbedBucket;
67
68 typedef struct ReebNode {
69         void *next, *prev;
70         float p[3];
71         int flag;
72
73         int degree;
74         struct ReebArc **arcs;
75
76         int subgraph_index;
77
78         int symmetry_level;
79         int symmetry_flag;
80         float symmetry_axis[3];
81         /*********************************/
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         struct ReebArc  *arc;
121         int index;
122         int start;
123         int end;
124         int stride; 
125         int length;
126 } ReebArcIterator;
127
128 struct EditMesh;
129 struct EdgeIndex;
130
131 int weightToHarmonic(struct EditMesh *em, struct EdgeIndex *indexed_edges);
132 int weightFromDistance(struct EditMesh *em, struct EdgeIndex *indexed_edges);
133 int weightFromLoc(struct EditMesh *me, int axis);
134 void weightToVCol(struct EditMesh *em, int index);
135 void arcToVCol(struct ReebGraph *rg, struct EditMesh *em, int index);
136 void angleToVCol(struct EditMesh *em, int index);
137 void renormalizeWeight(struct EditMesh *em, float newmax);
138
139 ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
140 ReebGraph * newReebGraph();
141
142 void initArcIterator(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
143 void initArcIterator2(struct ReebArcIterator *iter, struct ReebArc *arc, int start, int end);
144 void initArcIteratorStart(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start);
145 struct EmbedBucket * nextBucket(struct ReebArcIterator *iter);
146 struct EmbedBucket * nextNBucket(ReebArcIterator *iter, int n);
147 struct EmbedBucket * peekBucket(ReebArcIterator *iter, int n);
148 struct EmbedBucket * currentBucket(struct ReebArcIterator *iter);
149 struct EmbedBucket * previousBucket(struct ReebArcIterator *iter);
150 int iteratorStopped(struct ReebArcIterator *iter);
151
152 /* Filtering */
153 void filterNullReebGraph(ReebGraph *rg);
154 int filterSmartReebGraph(ReebGraph *rg, float threshold);
155 int filterExternalReebGraph(ReebGraph *rg, float threshold);
156 int filterInternalReebGraph(ReebGraph *rg, float threshold);
157
158 /* Post-Build processing */
159 void repositionNodes(ReebGraph *rg);
160 void postprocessGraph(ReebGraph *rg, char mode);
161 void removeNormalNodes(ReebGraph *rg);
162
163 void sortNodes(ReebGraph *rg);
164 void sortArcs(ReebGraph *rg);
165
166 /*------------ Sanity check ------------*/
167 void verifyBuckets(ReebGraph *rg);
168 void verifyFaces(ReebGraph *rg);
169
170 /*********************** PUBLIC *********************************/
171
172 #define REEB_MAX_MULTI_LEVEL    10
173
174 ReebGraph *BIF_ReebGraphFromEditMesh(void);
175 ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
176 void BIF_flagMultiArcs(ReebGraph *rg, int flag);
177
178 void BIF_GlobalReebGraphFromEditMesh(void);
179 void BIF_GlobalReebFree(void);
180
181 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
182 ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
183 ReebNode *BIF_lowestLevelNode(ReebNode *node);
184
185 ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
186
187 void REEB_freeGraph(ReebGraph *rg);
188 void REEB_exportGraph(ReebGraph *rg, int count);
189 void REEB_draw();
190
191
192 #endif /*REEB_H_*/