00001 #ifndef X3DTK_MESH_SFEDGE_H 00002 #define X3DTK_MESH_SFEDGE_H 00003 00004 #include "MESH_SceneGraphTypes.h" 00005 #include "MESH_SFEdgeContent.h" 00006 00007 namespace X3DTK { 00008 namespace MESH { 00009 00010 template<class VData, class EData, class FData, bool readOnly> class SFVertex; 00011 template<class FData, class VData, class EData, bool readOnly> class SFFace; 00012 00019 template<class EData, class FData, class VData, bool readOnly = true> 00020 class SFEdge 00021 { 00022 template<class A, class B, class C, class D, bool E> friend class Mesh; 00023 template<class A, class B, class C, bool D> friend class SFDirectEdge; 00024 template<class A, class B, class C, bool D> friend class SFIndirectEdge; 00025 template<class A, class B, class C, bool D> friend class SFFace; 00026 public: 00027 typedef EntityMFFace<FData, VData, EData, readOnly> MFFace; 00028 00030 inline SFEdge *getSymetric(); 00032 virtual SFVertex<VData, EData, FData, readOnly> *getFromVertex() const = 0; 00034 virtual SFVertex<VData, EData, FData, readOnly> *getToVertex() const = 0; 00036 virtual const MFFace &getLeftFaces() const = 0; 00038 virtual const MFFace &getRightFaces() const = 0; 00040 MFFace getFaces() const; 00042 inline bool isBoundary() const; 00044 inline bool isNonManifold() const; 00046 inline EData &data(); 00048 inline const EData &data() const; 00050 template<class F> 00051 F &getData(); 00053 template<class F> 00054 F &ogetData(); 00055 00056 protected: 00058 SFEdge(SFEdgeContent<EData, FData, VData, readOnly> *const edgeContent); 00060 virtual ~SFEdge(); 00061 00063 void setSymetric(SFEdge *symetric); 00065 virtual void addLeftFace(SFFace<FData, VData, EData, readOnly> *face) = 0; 00067 virtual void addRightFace(SFFace<FData, VData, EData, readOnly> *face) = 0; 00068 00070 virtual void removeLeftFace(SFFace<FData, VData, EData, readOnly> *face) = 0; 00072 virtual void removeRightFace(SFFace<FData, VData, EData, readOnly> *face) = 0; 00073 00074 private: 00075 SFEdgeContent<EData, FData, VData, readOnly> *const _edgeContent; 00076 SFEdge *_symetric; 00077 00079 void reverse(SFFace<FData, VData, EData, readOnly> *face); 00080 }; 00081 00083 template<class EData, class FData, class VData, bool readOnly> 00084 std::ostream& operator<<(std::ostream& o, const SFEdge<EData, FData, VData, readOnly> &e); 00085 00086 } 00087 } 00088 00089 #include "MESH_SFEdge.inl" 00090 00091 #endif