00001
00002
00004
00005 #ifndef TEMPLATEEDGE_H
00006 #define TEMPLATEEDGE_H
00007
00008 #include "MESH_SceneGraphTypes.h"
00009 #include "MESH_SFTemplateEdgeContent.h"
00010
00011 namespace X3DTK {
00012 namespace MESH {
00013
00014 template<class A, class B, class C> class SFTemplateVertex;
00015 template<class A, class B, class C> class SFTemplateFace;
00016
00018
00019 template<class EData, class FData, class VData>
00020 class SFTemplateEdge
00021 {
00022 template<class A, class B, class C, class D> friend class TemplateMesh;
00023 template<class A, class B, class C> friend class SFTemplateDirectEdge;
00024 template<class A, class B, class C> friend class SFTemplateIndirectEdge;
00025 public:
00027 inline SFTemplateEdge *getSymetric() {return _symetric;};
00029 inline SFTemplateVertex<VData, EData, FData> *getFromVertex() const {return (_direct ? _edgeContent->getFromVertex() : _edgeContent->getToVertex());};
00031 inline SFTemplateVertex<VData, EData, FData> *getToVertex() const {return (_direct ? _edgeContent->getToVertex() : _edgeContent->getFromVertex());};
00033 inline const MFTemplateFace<FData, VData, EData> &getLeftFaces() const {return (_direct ? _edgeContent->get1Faces() : _edgeContent->get2Faces());};
00035 inline const MFTemplateFace<FData, VData, EData> &getRightFaces() const {return (_direct ? _edgeContent->get2Faces() : _edgeContent->get1Faces());};
00037 MFTemplateFace<FData, VData, EData> getFaces() const
00038 {
00039 MFTemplateFace<FData, VData, EData> faces;
00040 const MFTemplateFace<FData, VData, EData> &r1faces = _edgeContent->get1Faces();
00041 const MFTemplateFace<FData, VData, EData> &r2faces = _edgeContent->get2Faces();
00042
00043
00044 for (typename MFTemplateFace<FData, VData, EData>::const_iterator it = r1faces.begin(); it != r1faces.end(); ++it)
00045 faces.push_back(*it);
00046
00047 for (typename MFTemplateFace<FData, VData, EData>::const_iterator it = r2faces.begin(); it != r2faces.end(); ++it)
00048 faces.push_back(*it);
00049
00050 return faces;
00051 };
00053 inline bool isBoundary() const {return _edgeContent->isBoundary();};
00055 inline EData &data() {return _edgeContent->data();};
00057 inline const EData &data() const {return _edgeContent->data();};
00058
00059 protected:
00060 void setDirect(bool value) {_direct = value;};
00061
00062 private:
00063 SFTemplateEdgeContent<EData, FData, VData> *const _edgeContent;
00064 bool _direct;
00065 SFTemplateEdge *_symetric;
00066
00068 SFTemplateEdge(SFTemplateEdgeContent<EData, FData, VData> *const edgeContent)
00069 : _edgeContent(edgeContent), _symetric(0)
00070 {};
00071
00073 ~SFTemplateEdge() {};
00074
00075 void setSymetric(SFTemplateEdge *symetric) {_symetric = symetric;};
00076
00078 void addLeftFace(SFTemplateFace<FData, VData, EData> *face)
00079 {
00080 if (_direct)
00081 _edgeContent->add1Face(face);
00082 else
00083 _edgeContent->add2Face(face);
00084 };
00086 void addRightFace(SFTemplateFace<FData, VData, EData> *face)
00087 {
00088 if (_direct)
00089 _edgeContent->add2Face(face);
00090 else
00091 _edgeContent->add1Face(face);
00092 };
00093 };
00094
00095
00096 }
00097 }
00098
00099 #endif