00001 #ifndef X3DTK_MESH_MESH_H 00002 #define X3DTK_MESH_MESH_H 00003 00004 #include "MESH_X3DMeshNode.h" 00005 #include "MESH_SFVertex.h" 00006 #include "MESH_Vertex.h" 00007 #include "MESH_SFDirectEdge.h" 00008 #include "MESH_SFIndirectEdge.h" 00009 #include "MESH_SFFace.h" 00010 #include "MESH_MeshData.h" 00011 00012 #include <iostream> 00013 #include <typeinfo> 00014 00015 namespace X3DTK { 00016 namespace MESH { 00017 00027 template<class MData, class VData, class EData, class FData, bool readOnly = true> 00028 class Mesh : public X3DMeshNode 00029 { 00030 public: 00032 typedef SFVertex<VData, EData, FData, readOnly> SFVertex; 00034 typedef MeshMFVertex<VData, EData, FData, readOnly> MFVertex; 00036 typedef SFEdge<EData, FData, VData, readOnly> SFEdge; 00038 typedef MeshMFEdge<EData, FData, VData, readOnly> MFEdge; 00040 typedef SFFace<FData, VData, EData, readOnly> SFFace; 00042 typedef MeshMFFace<FData, VData, EData, readOnly> MFFace; 00043 00045 Mesh(); 00047 virtual SFNode clone() const; 00049 virtual ~Mesh(); 00050 00052 void setVertex(Vertex<VData, EData, FData, readOnly> *vertexSet); 00054 virtual MFAbstractNode getChildList() const; 00055 00058 bool addChild(const SFAbstractNode &N); 00061 bool setChild(const SFAbstractNode &N); 00063 bool removeChild(const SFAbstractNode &N); 00064 00066 SFEdge *getEdge(SFVertex *from, SFVertex *to); 00068 const MFVertex &getVertices() const; 00069 00071 inline const MFEdge &getEdges() const; 00073 inline const MFFace &getFaces() const; 00075 inline MData &data(); 00077 inline const MData &data() const; 00079 template<class F> 00080 F &getData(); 00082 template<class F> 00083 F &ogetData(); 00084 00087 SFFace *createFace(const MFInt32 &coordIndex, bool ccw = true); 00089 SFFace *createFace(unsigned int i, const MFInt32 &coordIndex, bool ccw = true); 00090 00092 void removeFace(SFFace *face); 00094 void removeFace(unsigned int i); 00095 00096 protected: 00098 Mesh(const Mesh &N); 00099 00100 private: 00101 MFEdge _edges; 00102 MFFace _faces; 00103 MData _data; 00104 00106 SFEdge *createEdge(SFVertex *from, SFVertex *to); 00107 }; 00108 00111 typedef Mesh<MeshData, VertexData, EdgeData, FaceData, true> DefMesh; 00112 typedef SFVertex<VertexData, EdgeData, FaceData, true> DefSFVertex; 00113 typedef SFEdge<EdgeData, FaceData, VertexData, true> DefSFEdge; 00114 typedef SFFace<FaceData, VertexData, EdgeData, true> DefSFFace; 00115 00116 } 00117 } 00118 00119 #include "MESH_Mesh.inl" 00120 00121 #endif