00001
00002
00004
00005 #ifndef TEMPLATEMESHBUILDERGEOMETRY3DVISITOR_H
00006 #define TEMPLATEMESHBUILDERGEOMETRY3DVISITOR_H
00007
00008 #include "X3D_Geometry3DVisitor.h"
00009 #include "X3D_TemplateMeshBuilderStateVariables.h"
00010 #include "X3D_TemplateMeshBuilderTraits.h"
00011 #include "X3D_Coordinate.h"
00012 #include "X3D_Box.h"
00013 #include "X3D_Cone.h"
00014 #include "X3D_Cylinder.h"
00015 #include "X3D_IndexedFaceSet.h"
00016 #include "X3D_Sphere.h"
00017 #include "MESH_TemplateMesh.h"
00018
00019 namespace X3DTK {
00020 namespace X3D {
00021
00023
00024 template<class MData, class VData, class EData, class FData>
00025 class TemplateMeshBuilderGeometry3DVisitor : public Geometry3DVisitor
00026 {
00027 public:
00029 TemplateMeshBuilderGeometry3DVisitor()
00030 : Geometry3DVisitor()
00031 {
00032 defineEnterFunction(&TemplateMeshBuilderGeometry3DVisitor::enterIndexedFaceSet);
00033 defineLeaveFunction(&TemplateMeshBuilderGeometry3DVisitor::leaveIndexedFaceSet);
00034
00035
00036 stateVariables = GraphTraversal::getInstanceOf<TemplateMeshBuilderStateVariables>();
00037 };
00038
00040 virtual ~TemplateMeshBuilderGeometry3DVisitor()
00041 {
00042 };
00043
00045 virtual void enterIndexedFaceSet(IndexedFaceSet *I) const
00046 {
00047
00048 MESH::TemplateMesh<MData, VData, EData, FData> *TM = dynamic_cast<MESH::TemplateMesh<MData, VData, EData, FData> *>(stateVariables->getNode(I));
00049 if (TM == 0)
00050 {
00051 TM = new MESH::TemplateMesh<MData, VData, EData, FData>();
00052 TM->setX3DAppearanceNodeChild(stateVariables->getX3DAppearanceNode());
00053
00054 stateVariables->addCoupleNode(I, TM);
00055 }
00056
00057
00058
00059 stateVariables->pushNode(TM);
00060 };
00061
00063 virtual void leaveIndexedFaceSet(IndexedFaceSet *I) const
00064 {
00065 stateVariables->popNode();
00066
00067
00068
00069 typedef MESH::SFTemplateVertex<VData, EData, FData> SFVertex;
00070 typedef MESH::MFTemplateVertex<VData, EData, FData> MFVertex;
00071 typedef MESH::SFTemplateEdge<EData, FData, VData> SFEdge;
00072 typedef MESH::MFTemplateEdge<EData, FData, VData> MFEdge;
00073 typedef MESH::SFTemplateFace<FData, VData, EData> SFFace;
00074 typedef MESH::MFTemplateFace<FData, VData, EData> MFFace;
00075
00076 MESH::TemplateMesh<MData, VData, EData, FData> *TM = dynamic_cast<MESH::TemplateMesh<MData, VData, EData, FData> *>(stateVariables->getNode(I));
00077
00078
00079 TemplateMeshBuilderGeometryTraits<MData, VData, EData, FData, IndexedFaceSet>::init(TM, I);
00080
00081 SFBool ccw = I->getCcw();
00082
00083
00084 const MFInt32 &coordIndex = I->getCoordIndex();
00085 MFInt32::const_iterator itCoordIndex = coordIndex.begin();
00086
00087 while (itCoordIndex != coordIndex.end())
00088 {
00089 MFInt32 faceCoordIndex;
00090 while (*itCoordIndex != -1)
00091 {
00092 faceCoordIndex.push_back(*itCoordIndex);
00093 ++itCoordIndex;
00094 }
00095 SFFace *F = TM->createFace(faceCoordIndex, ccw);
00096
00097
00098 TemplateMeshBuilderGeometryTraits<MData, VData, EData, FData, IndexedFaceSet>::processNewFace(TM, I, F);
00099
00100 ++itCoordIndex;
00101 }
00102
00103
00104 TemplateMeshBuilderGeometryTraits<MData, VData, EData, FData, IndexedFaceSet>::finish(TM, I);
00105 };
00106
00107 protected:
00108 TemplateMeshBuilderStateVariables *stateVariables;
00109 };
00110
00111 }
00112 }
00113
00114 #endif