Sketch Retargetting:
[blender-staging.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         float *no; /* if present, 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         int index;
85         float weight;
86         int     multi_level;
87         struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
88         struct ReebNode *link_up;
89 } ReebNode;
90
91 typedef struct ReebEdge {
92         struct ReebEdge *next, *prev;
93         struct ReebArc  *arc;
94         struct ReebNode *v1, *v2;
95         struct ReebEdge *nextEdge;
96         int flag;
97 } ReebEdge;
98
99 typedef struct ReebArc {
100         void *next, *prev;
101         struct ReebNode *head, *tail;
102         int flag;
103
104         float length;
105
106         int symmetry_level;
107         int symmetry_group;
108         int symmetry_flag;
109         /*********************************/
110
111         ListBase edges;
112         int bcount;
113         struct EmbedBucket *buckets;
114
115         struct GHash *faces;    
116         float angle;
117         struct ReebArc *link_up; /* for multi resolution filtering, points to higher levels */
118 } ReebArc;
119
120 typedef struct ReebArcIterator {
121         struct ReebArc  *arc;
122         int index;
123         int start;
124         int end;
125         int stride; 
126         int length;
127 } ReebArcIterator;
128
129 struct EditMesh;
130 struct EdgeIndex;
131
132 int weightToHarmonic(struct EditMesh *em, struct EdgeIndex *indexed_edges);
133 int weightFromDistance(struct EditMesh *em, struct EdgeIndex *indexed_edges);
134 int weightFromLoc(struct EditMesh *me, int axis);
135 void weightToVCol(struct EditMesh *em, int index);
136 void arcToVCol(struct ReebGraph *rg, struct EditMesh *em, int index);
137 void angleToVCol(struct EditMesh *em, int index);
138 void renormalizeWeight(struct EditMesh *em, float newmax);
139
140 ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
141 ReebGraph * newReebGraph();
142
143 void initArcIterator(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
144 void initArcIterator2(struct ReebArcIterator *iter, struct ReebArc *arc, int start, int end);
145 void initArcIteratorStart(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start);
146 struct EmbedBucket * nextBucket(struct ReebArcIterator *iter);
147 struct EmbedBucket * nextNBucket(ReebArcIterator *iter, int n);
148 struct EmbedBucket * peekBucket(ReebArcIterator *iter, int n);
149 struct EmbedBucket * currentBucket(struct ReebArcIterator *iter);
150 struct EmbedBucket * previousBucket(struct ReebArcIterator *iter);
151 int iteratorStopped(struct ReebArcIterator *iter);
152
153 /* Filtering */
154 void filterNullReebGraph(ReebGraph *rg);
155 int filterSmartReebGraph(ReebGraph *rg, float threshold);
156 int filterExternalReebGraph(ReebGraph *rg, float threshold);
157 int filterInternalReebGraph(ReebGraph *rg, float threshold);
158
159 /* Post-Build processing */
160 void repositionNodes(ReebGraph *rg);
161 void postprocessGraph(ReebGraph *rg, char mode);
162 void removeNormalNodes(ReebGraph *rg);
163
164 void sortNodes(ReebGraph *rg);
165 void sortArcs(ReebGraph *rg);
166
167 /*------------ Sanity check ------------*/
168 void verifyBuckets(ReebGraph *rg);
169 void verifyFaces(ReebGraph *rg);
170
171 /*********************** PUBLIC *********************************/
172
173 #define REEB_MAX_MULTI_LEVEL    10
174
175 ReebGraph *BIF_ReebGraphFromEditMesh(void);
176 ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
177 void BIF_flagMultiArcs(ReebGraph *rg, int flag);
178
179 void BIF_GlobalReebGraphFromEditMesh(void);
180 void BIF_GlobalReebFree(void);
181
182 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
183 ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
184 ReebNode *BIF_lowestLevelNode(ReebNode *node);
185
186 ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
187
188 void REEB_freeGraph(ReebGraph *rg);
189 void REEB_freeArc(BArc *barc);
190 void REEB_exportGraph(ReebGraph *rg, int count);
191 void REEB_draw();
192
193
194 #endif /*REEB_H_*/