00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069 #ifndef VRS_ADJACENCY_TOOL_H
00070 #define VRS_ADJACENCY_TOOL_H
00071
00072 #include <vrs/sharedobj.h>
00073 #include <vrs/vector.h>
00074 #include <vrs/vertexdata.h>
00075 #include <vrs/container/dataiterator.h>
00076 #include <utility>
00077
00078 namespace VRS {
00079
00080 template<typename T> class StaticArray;
00081 template<typename T> class Array;
00082 template<typename T> class Iterator;
00083
00091 class VRS_CORE_API AdjacencyTool : public SharedObj {
00092
00093 public:
00094
00095 AdjacencyTool(unsigned int numVertices, Iterator<unsigned int>* indices);
00101 unsigned int getNumVertices() const;
00102 unsigned int getNumIndices() const;
00103 Iterator<unsigned int>* getIndices() const;
00104 unsigned int getIndex(unsigned int i) const;
00105
00106 bool vertexActive(unsigned int v) const;
00110 Iterator<unsigned int>* getAdjacentCorners(unsigned int vertex) const;
00115 Iterator<unsigned int>* getAdjacentFaces(unsigned int vertex) const;
00124 bool isEdge(unsigned int a, unsigned int b) const;
00128 unsigned int countAdjacentFaces(unsigned int vertex) const;
00131 typedef std::pair<unsigned int, unsigned int> Edge;
00132 Iterator<unsigned int>* getAdjacentFaces(const Edge& e) const;
00138 enum EdgeType { Boundary, Inner, NonManifold };
00139 VRS_SERIALIZABLE_CLASS_ENUM(EdgeType);
00140
00141 Iterator<Edge>* getEdgesOfType(EdgeType n);
00150 void markNeighbors(unsigned int v, char mark);
00151 void setMark(unsigned int v, char mark);
00152 char getMark(unsigned int v);
00160 Iterator<unsigned int>* getNeighbors(unsigned int vertex);
00162
00163 Iterator<unsigned int>* getUsualSharedNeighbors(unsigned int a, unsigned int b) const;
00165
00166 class EdgeIterator;
00167 EdgeIterator* getEdges();
00169
00170 unsigned int countNeighbors(unsigned int vertex);
00172 unsigned int countSharedNeighbors(unsigned int a, unsigned int b);
00174
00175 void verticesSwapped(unsigned int a, unsigned int b);
00179 void init();
00184
00185
00186
00187
00188 SO<Iterator<unsigned int> > getTriangleNeighbors(unsigned int triangle) const;
00189
00193 SO<Iterator<SO<Iterator<unsigned int> > > > decomposeConnectedComponents() const;
00194
00195
00196 static StaticArray<Vector>* createNormals(Iterator<Vector>* vertices,
00197 Iterator<unsigned int>* indices);
00201 static DataIterator<VertexData<4, float> >* createNormals(Iterator<VertexData<4, float> >* vertices,
00202 Iterator<UINT>* indices);
00206 protected:
00207 unsigned int numVertices_;
00208 SO<Iterator<unsigned int> > indices_;
00209
00210 SO<StaticArray<unsigned int> > nextIndex_;
00211 SO<StaticArray<unsigned int> > firstIndex_;
00212 SO<StaticArray<char> > marks_;
00213 };
00214
00215 class VRS_CORE_API AdjacencyTool::EdgeIterator : public SharedObj {
00216 public:
00217 void next();
00218 bool valid() const;
00219 Edge current() const;
00220 private:
00221 EdgeIterator(AdjacencyTool* parent, unsigned int numVertices);
00222 unsigned int firstVertex_;
00223 unsigned int neighbor_;
00224 SO<Iterator<unsigned int> > neighborIterator_;
00225 unsigned int iteratorIndex_;
00226 bool valid_;
00227 unsigned int numVertices_;
00228 SO<AdjacencyTool> parent_;
00229 friend class AdjacencyTool;
00230 };
00231
00232 }
00233
00234 #endif // VRS_ADJACENCY_TOOL_H