00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef freecloth_geom_geMeshWingedEdge_h
00020 #define freecloth_geom_geMeshWingedEdge_h
00021
00022 #ifndef freecloth_geom_package_h
00023 #include <freecloth/geom/package.h>
00024 #endif
00025
00026 #ifndef freecloth_geom_geMesh_h
00027 #include <freecloth/geom/geMesh.h>
00028 #endif
00029
00030 #ifndef freecloth_resmgt_rcBase_h
00031 #include <freecloth/resmgt/rcBase.h>
00032 #endif
00033
00034 #ifndef freecloth_resmgt_rcShdPtr_h
00035 #include <freecloth/resmgt/rcShdPtr.h>
00036 #endif
00037
00038 #ifndef freecloth_base_vector
00039 #include <freecloth/base/vector>
00040 #endif
00041
00042 FREECLOTH_NAMESPACE_START
00043
00044
00045
00046
00047 template <class T> class RCShdPtr;
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090 class GeMeshWingedEdge : public RCBase, public GeMeshTypes
00091 {
00092 public:
00093
00094
00095
00096 class HalfEdgeWrapper;
00097
00098 template <bool HALF> class EdgeIteratorBase;
00099
00100 template <bool HALF> class VertexEdgeIteratorBase;
00101
00102 class VertexFaceIterator;
00103
00104
00105
00106 typedef EdgeIteratorBase<true> HalfEdgeIterator;
00107
00108 typedef EdgeIteratorBase<false> EdgeIterator;
00109
00110 typedef VertexEdgeIteratorBase<true> VertexHalfEdgeIterator;
00111
00112 typedef VertexEdgeIteratorBase<false> VertexEdgeIterator;
00113
00114
00115
00116
00117 typedef UInt32 HalfEdgeId;
00118
00119 typedef HalfEdgeWrapper HalfEdgeType;
00120
00121
00122 explicit GeMeshWingedEdge( const RCShdPtr<GeMesh>& );
00123
00124 UInt32 getNbHalfEdges() const;
00125 HalfEdgeType getHalfEdge( HalfEdgeId ) const;
00126
00127 HalfEdgeIterator beginHalfEdge() const;
00128 HalfEdgeIterator endHalfEdge() const;
00129 EdgeIterator beginEdge() const;
00130 EdgeIterator endEdge() const;
00131
00132
00133
00134
00135 VertexHalfEdgeIterator beginVertexHalfEdge( VertexId ) const;
00136 VertexHalfEdgeIterator endVertexHalfEdge( VertexId ) const;
00137
00138
00139
00140 VertexEdgeIterator beginVertexEdge( VertexId ) const;
00141 VertexEdgeIterator endVertexEdge( VertexId ) const;
00142
00143 VertexFaceIterator beginVertexFace( VertexId ) const;
00144 VertexFaceIterator endVertexFace( VertexId ) const;
00145
00146
00147 HalfEdgeId getHalfEdgeFromFaceId( FaceId ) const;
00148
00149 const RCShdPtr<GeMesh>& getMeshPtr() const;
00150 const GeMesh& getMesh() const;
00151
00152 private:
00153
00154
00155 class HalfEdge;
00156 typedef std::vector< HalfEdge > HalfEdgeContainer;
00157
00158
00159 friend class HalfEdgeWrapper;
00160 #ifdef HAVE_TEMPLATE_FRIENDS
00161 template <bool HALF> friend class VertexEdgeIteratorBase;
00162 #else
00163 friend class VertexEdgeIteratorBase<false>;
00164 friend class VertexEdgeIteratorBase<true>;
00165 #endif
00166 friend class VertexFaceIterator;
00167
00168
00169
00170 void build( const GeMesh& );
00171
00172
00173 RCShdPtr<GeMesh> _mesh;
00174 HalfEdgeContainer _halfEdges;
00175
00176 std::vector< HalfEdgeId > _vertexHalfEdgeIds;
00177
00178 std::vector< HalfEdgeId > _faceHalfEdgeIds;
00179 };
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189 class GeMeshWingedEdge::HalfEdge {
00190 public:
00191
00192 enum { ID_INVALID = ~0U };
00193
00194
00195 HalfEdge();
00196 HalfEdge(
00197 VertexId origin,
00198 HalfEdgeId twin,
00199 FaceId face,
00200 HalfEdgeId next
00201 );
00202
00203
00204
00205 VertexId getOriginVertexId() const;
00206 HalfEdgeId getTwinHalfEdgeId() const;
00207 FaceId getFaceId() const;
00208 HalfEdgeId getNextHalfEdgeId() const;
00209
00210 bool hasTwin() const;
00211
00212 private:
00213
00214
00215 friend class GeMeshWingedEdge;
00216
00217
00218 VertexId _origin;
00219 HalfEdgeId _twin;
00220 FaceId _face;
00221 HalfEdgeId _next;
00222
00223
00224 };
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240 class GeMeshWingedEdge::HalfEdgeWrapper : public GeMeshTypes
00241 {
00242 public:
00243
00244 HalfEdgeWrapper( const GeMeshWingedEdge&, HalfEdgeId );
00245
00246
00247 HalfEdgeId getHalfEdgeId() const;
00248
00249
00250 VertexId getOriginVertexId() const;
00251 const VertexType& getOriginVertex() const;
00252
00253 VertexId getTipVertexId() const;
00254 const VertexType& getTipVertex() const;
00255
00256 VertexId getOppositeVertexId() const;
00257 const VertexType& getOppositeVertex() const;
00258
00259 HalfEdgeId getTwinHalfEdgeId() const;
00260 HalfEdgeWrapper getTwinHalfEdge() const;
00261 FaceId getFaceId() const;
00262 GeMesh::FaceWrapper getFace() const;
00263 HalfEdgeId getNextHalfEdgeId() const;
00264 HalfEdgeWrapper getNextHalfEdge() const;
00265 HalfEdgeId getPrevHalfEdgeId() const;
00266 HalfEdgeWrapper getPrevHalfEdge() const;
00267
00268 bool hasTwin() const;
00269
00270 private:
00271
00272 #ifdef HAVE_TEMPLATE_FRIENDS
00273 template <bool HALF> friend class GeMeshWingedEdge::EdgeIteratorBase;
00274 template <bool HALF> friend class GeMeshWingedEdge::VertexEdgeIteratorBase;
00275 #else
00276 friend class GeMeshWingedEdge::EdgeIteratorBase<false>;
00277 friend class GeMeshWingedEdge::EdgeIteratorBase<true>;
00278 friend class GeMeshWingedEdge::VertexEdgeIteratorBase<false>;
00279 friend class GeMeshWingedEdge::VertexEdgeIteratorBase<true>;
00280 #endif
00281 friend class VertexFaceIterator;
00282
00283
00284
00285
00286 HalfEdgeWrapper();
00287 HalfEdgeWrapper( const GeMeshWingedEdge*, HalfEdgeId );
00288 bool isValid() const;
00289 const GeMeshWingedEdge& getMeshWE() const;
00290 const GeMesh& getMesh() const;
00291
00292
00293
00294
00295 const GeMeshWingedEdge* _meshwe;
00296 HalfEdgeId _halfEdgeId;
00297 };
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311 template <bool HALF>
00312 class GeMeshWingedEdge::EdgeIteratorBase : public GeMeshTypes {
00313
00314 public:
00315
00316
00317
00318 static EdgeIteratorBase begin( const GeMeshWingedEdge& );
00319 static EdgeIteratorBase end( const GeMeshWingedEdge& );
00320
00321
00322
00323 EdgeIteratorBase();
00324 EdgeIteratorBase( const GeMeshWingedEdge&, HalfEdgeId );
00325
00326
00327
00328 EdgeIteratorBase& operator++();
00329 EdgeIteratorBase operator++( int );
00330
00331 bool operator==( const EdgeIteratorBase& ) const;
00332 bool operator!=( const EdgeIteratorBase& ) const;
00333
00334 const HalfEdgeWrapper& operator*() const;
00335 const HalfEdgeWrapper* operator->() const;
00336
00337 private:
00338
00339 explicit EdgeIteratorBase( const HalfEdgeWrapper& );
00340
00341
00342 GeMeshWingedEdge::HalfEdgeWrapper _wrapper;
00343 };
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356 template <bool HALF>
00357 class GeMeshWingedEdge::VertexEdgeIteratorBase : public GeMeshTypes {
00358
00359 public:
00360
00361
00362
00363 static VertexEdgeIteratorBase begin(
00364 const GeMeshWingedEdge&,
00365 VertexId vertexId
00366 );
00367 static VertexEdgeIteratorBase end(
00368 const GeMeshWingedEdge&,
00369 VertexId vertexId
00370 );
00371
00372
00373
00374 VertexEdgeIteratorBase();
00375 VertexEdgeIteratorBase(
00376 const GeMeshWingedEdge&,
00377 VertexId vertexId,
00378 HalfEdgeId halfEdgeId
00379 );
00380
00381
00382
00383 VertexEdgeIteratorBase& operator++();
00384 VertexEdgeIteratorBase operator++( int );
00385
00386 bool operator==( const VertexEdgeIteratorBase& ) const;
00387 bool operator!=( const VertexEdgeIteratorBase& ) const;
00388
00389 const HalfEdgeWrapper& operator*() const;
00390 const HalfEdgeWrapper* operator->() const;
00391
00392 private:
00393
00394 enum {
00395 ID_INVALID = GeMeshWingedEdge::HalfEdge::ID_INVALID
00396 };
00397
00398
00399 VertexEdgeIteratorBase( const HalfEdgeWrapper&, VertexId );
00400
00401
00402 GeMeshWingedEdge::HalfEdgeWrapper _wrapper;
00403 VertexId _vertexId;
00404 };
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414 class GeMeshWingedEdge::VertexFaceIterator : public GeMeshTypes {
00415
00416 public:
00417
00418
00419 static VertexFaceIterator begin(
00420 const GeMeshWingedEdge&,
00421 VertexId vertexId
00422 );
00423 static VertexFaceIterator end(
00424 const GeMeshWingedEdge&,
00425 VertexId vertexId
00426 );
00427
00428
00429 VertexFaceIterator();
00430 VertexFaceIterator(
00431 const GeMeshWingedEdge&,
00432 VertexId vertexId,
00433 HalfEdgeId halfEdgeId
00434 );
00435
00436
00437
00438 VertexFaceIterator& operator++();
00439 VertexFaceIterator operator++( int );
00440
00441 bool operator==( const VertexFaceIterator& ) const;
00442 bool operator!=( const VertexFaceIterator& ) const;
00443
00444 const GeMesh::FaceWrapper& operator*() const;
00445 const GeMesh::FaceWrapper* operator->() const;
00446
00447 private:
00448
00449 enum {
00450 ID_INVALID = GeMeshWingedEdge::HalfEdge::ID_INVALID
00451 };
00452
00453
00454 VertexFaceIterator( const HalfEdgeWrapper&, VertexId );
00455
00456
00457 GeMeshWingedEdge::HalfEdgeWrapper _wrapper;
00458 VertexId _vertexId;
00459 GeMesh::FaceWrapper _faceWrapper;
00460 };
00461
00462
00463
00464
00465
00466
00467 std::ostream& operator<<( std::ostream&, const GeMeshWingedEdge& );
00468 std::ostream& operator<<(
00469 std::ostream&,
00470 const GeMeshWingedEdge::HalfEdgeWrapper&
00471 );
00472
00473 FREECLOTH_NAMESPACE_END
00474
00475 #include <freecloth/geom/geMeshWingedEdge.inline.h>
00476
00477 #endif