merge runk 16887:16950
[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 #include "DNA_listBase.h"
32
33 #include "BLI_graph.h"
34
35 struct GHash;
36 struct EdgeHash;
37 struct ReebArc;
38 struct ReebEdge;
39 struct ReebNode;
40
41 typedef struct ReebGraph {
42         ListBase        arcs;
43         ListBase        nodes;
44         
45         float length;
46         
47         FreeArc                 free_arc;
48         FreeNode                free_node;
49         RadialSymmetry  radial_symmetry;
50         AxialSymmetry   axial_symmetry;
51         /*********************************/
52         
53         int resolution;
54         int totnodes;
55         struct EdgeHash *emap;
56         int multi_level;
57         struct ReebGraph *link_up; /* for multi resolution filtering, points to higher levels */
58 } ReebGraph;
59
60 typedef struct EmbedBucket {
61         float val;
62         int       nv;
63         float p[3];
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         int index;
82         float weight;
83         int     multi_level;
84         struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
85         struct ReebNode *link_up;
86 } ReebNode;
87
88 typedef struct ReebEdge {
89         struct ReebEdge *next, *prev;
90         struct ReebArc  *arc;
91         struct ReebNode *v1, *v2;
92         struct ReebEdge *nextEdge;
93         int flag;
94 } ReebEdge;
95
96 typedef struct ReebArc {
97         void *next, *prev;
98         struct ReebNode *head, *tail;
99         int flag;
100
101         float length;
102
103         int symmetry_level;
104         int symmetry_group;
105         int symmetry_flag;
106         /*********************************/
107
108         ListBase edges;
109         int bcount;
110         struct EmbedBucket *buckets;
111
112         struct GHash *faces;    
113         float angle;
114         struct ReebArc *link_up; /* for multi resolution filtering, points to higher levels */
115 } ReebArc;
116
117 typedef struct ReebArcIterator {
118         struct ReebArc  *arc;
119         int index;
120         int start;
121         int end;
122         int stride; 
123         int length;
124 } ReebArcIterator;
125
126 struct EditMesh;
127 struct EdgeIndex;
128
129 int weightToHarmonic(struct EditMesh *em, struct EdgeIndex *indexed_edges);
130 int weightFromDistance(struct EditMesh *em, struct EdgeIndex *indexed_edges);
131 int weightFromLoc(struct EditMesh *me, int axis);
132 void weightToVCol(struct EditMesh *em, int index);
133 void arcToVCol(struct ReebGraph *rg, struct EditMesh *em, int index);
134 void angleToVCol(struct EditMesh *em, int index);
135 void renormalizeWeight(struct EditMesh *em, float newmax);
136
137 ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
138 ReebGraph * newReebGraph();
139
140 void initArcIterator(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
141 void initArcIterator2(struct ReebArcIterator *iter, struct ReebArc *arc, int start, int end);
142 void initArcIteratorStart(struct ReebArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start);
143 struct EmbedBucket * nextBucket(struct ReebArcIterator *iter);
144 struct EmbedBucket * nextNBucket(ReebArcIterator *iter, int n);
145 struct EmbedBucket * peekBucket(ReebArcIterator *iter, int n);
146 struct EmbedBucket * currentBucket(struct ReebArcIterator *iter);
147 struct EmbedBucket * previousBucket(struct ReebArcIterator *iter);
148 int iteratorStopped(struct ReebArcIterator *iter);
149
150 /* Filtering */
151 void filterNullReebGraph(ReebGraph *rg);
152 int filterSmartReebGraph(ReebGraph *rg, float threshold);
153 int filterExternalReebGraph(ReebGraph *rg, float threshold);
154 int filterInternalReebGraph(ReebGraph *rg, float threshold);
155
156 /* Post-Build processing */
157 void repositionNodes(ReebGraph *rg);
158 void postprocessGraph(ReebGraph *rg, char mode);
159 void removeNormalNodes(ReebGraph *rg);
160
161 void sortNodes(ReebGraph *rg);
162 void sortArcs(ReebGraph *rg);
163
164 /*------------ Sanity check ------------*/
165 void verifyBuckets(ReebGraph *rg);
166 void verifyFaces(ReebGraph *rg);
167
168 /*********************** PUBLIC *********************************/
169
170 #define REEB_MAX_MULTI_LEVEL    10
171
172 ReebGraph *BIF_ReebGraphFromEditMesh(void);
173 ReebGraph *BIF_ReebGraphMultiFromEditMesh(void);
174 void BIF_flagMultiArcs(ReebGraph *rg, int flag);
175
176 void BIF_GlobalReebGraphFromEditMesh(void);
177 void BIF_GlobalReebFree(void);
178
179 ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
180 ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
181 ReebNode *BIF_lowestLevelNode(ReebNode *node);
182
183 ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
184
185 void REEB_freeGraph(ReebGraph *rg);
186 void REEB_exportGraph(ReebGraph *rg, int count);
187 void REEB_draw();
188
189
190 #endif /*REEB_H_*/