00001
00002
00004
00005 #ifndef TEMPLATEEDGE_H
00006 #define TEMPLATEEDGE_H
00007
00008 #include "MESH_SceneGraphTypes.h"
00009 #include "MESH_SFEdgeContent.h"
00010
00011 namespace X3DTK {
00012 namespace MESH {
00013
00014 template<class VData, class EData, class FData> class SFVertex;
00015 template<class FData, class VData, class EData> class SFFace;
00016
00018
00019 template<class EData, class FData, class VData>
00020 class SFEdge
00021 {
00022 template<class A, class B, class C, class D> friend class Mesh;
00023 template<class A, class B, class C> friend class SFDirectEdge;
00024 template<class A, class B, class C> friend class SFIndirectEdge;
00025 public:
00027 inline SFEdge *getSymetric();
00029 virtual SFVertex<VData, EData, FData> *getFromVertex() const = 0;
00031 virtual SFVertex<VData, EData, FData> *getToVertex() const = 0;
00033 virtual const MFFace<FData, VData, EData> &getLeftFaces() const = 0;
00035 virtual const MFFace<FData, VData, EData> &getRightFaces() const = 0;
00037 MFFace<FData, VData, EData> getFaces() const;
00039 inline bool isBoundary() const;
00041 inline EData &data();
00043 inline const EData &data() const;
00045 template<class F, bool optional>
00046 F &getData();
00047
00048 protected:
00050 SFEdge(SFEdgeContent<EData, FData, VData> *const edgeContent);
00052 virtual ~SFEdge();
00053
00055 void setSymetric(SFEdge *symetric);
00057 virtual void addLeftFace(SFFace<FData, VData, EData> *face) = 0;
00059 virtual void addRightFace(SFFace<FData, VData, EData> *face) = 0;
00060
00061 private:
00062 SFEdgeContent<EData, FData, VData> *const _edgeContent;
00063 SFEdge *_symetric;
00064 };
00065
00066
00067 }
00068 }
00069
00070 #include "MESH_SFEdge.inl"
00071
00072 #endif