Main Page   Namespace List   Class Hierarchy   Compound List   File List   Namespace Members   Compound Members   File Members   Related Pages  

X3D_TemplateMeshBuilderGeometry3DVisitor.h

Go to the documentation of this file.
00001 
00002 //                            X3D_TemplateMeshBuilderGeometry3DVisitor.h      //
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     // StateVariables assignation.
00036     stateVariables = GraphTraversal::getInstanceOf<TemplateMeshBuilderStateVariables>();
00037   };
00038   
00040   virtual ~TemplateMeshBuilderGeometry3DVisitor()
00041   {
00042   };
00043 
00045   virtual void enterIndexedFaceSet(IndexedFaceSet *I) const
00046   {
00047     //std::cout << "enterIFS" << std::endl;
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     /*else
00057       std::cout << "IFS already defined" << std::endl;*/
00058       
00059     stateVariables->pushNode(TM);
00060   };
00061 
00063   virtual void leaveIndexedFaceSet(IndexedFaceSet *I) const
00064   {
00065     stateVariables->popNode();
00066     
00067     // future optim? reserve the vertices and edges.
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     // filling the mesh.
00079     TemplateMeshBuilderGeometryTraits<MData, VData, EData, FData, IndexedFaceSet>::init(TM, I);
00080     
00081     SFBool ccw = I->getCcw();
00082     
00083     //iterating the faces
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       // processing the new face.
00098       TemplateMeshBuilderGeometryTraits<MData, VData, EData, FData, IndexedFaceSet>::processNewFace(TM, I, F);
00099 
00100       ++itCoordIndex;
00101     }
00102    
00103     // ending the algorithm.
00104     TemplateMeshBuilderGeometryTraits<MData, VData, EData, FData, IndexedFaceSet>::finish(TM, I);
00105   };
00106   
00107 protected:
00108   TemplateMeshBuilderStateVariables *stateVariables;
00109 };
00110 
00111 }
00112 }
00113 
00114 #endif

Generated on Thu Dec 4 13:25:49 2003 for X3DToolKit by doxygen1.2.18