[162] | 1 |
|
---|
| 2 | #include "X3dParser.h"
|
---|
| 3 |
|
---|
| 4 |
|
---|
| 5 | bool
|
---|
| 6 | X3dParser::ParseFile(const string filename,
|
---|
| 7 | SceneGraphNode **root)
|
---|
| 8 | {
|
---|
| 9 |
|
---|
| 10 |
|
---|
| 11 |
|
---|
| 12 | }
|
---|
| 13 |
|
---|
| 14 |
|
---|
| 15 | namespace X3DTK {
|
---|
| 16 | namespace MESH {
|
---|
| 17 |
|
---|
| 18 | MyStructureComputer::MyStructureComputer()
|
---|
| 19 | {
|
---|
| 20 | setGraphTraversal(new DFSGraphTraversal());
|
---|
| 21 | setComponentVisitor(new MyStructureComputerCoreVisitor());
|
---|
| 22 | }
|
---|
| 23 |
|
---|
| 24 | MyStructureComputer::~MyStructureComputer()
|
---|
| 25 | {
|
---|
| 26 | Singleton<MyStructureComputerStateVariables>::removeInstance();
|
---|
| 27 | }
|
---|
| 28 |
|
---|
| 29 | MySimpleMesh *MyStructureComputer::compute(SFNode N)
|
---|
| 30 | {
|
---|
| 31 | Singleton<MyStructureComputerStateVariables>::getInstance()->init();
|
---|
| 32 | traverse(N);
|
---|
| 33 | Singleton<MyStructureComputerStateVariables>::getInstance()->finish();
|
---|
| 34 |
|
---|
| 35 | return Singleton<MyStructureComputerStateVariables>::getInstance()->getMesh();
|
---|
| 36 | }
|
---|
| 37 |
|
---|
| 38 |
|
---|
| 39 | MyStructureComputerCoreVisitor::MyStructureComputerCoreVisitor()
|
---|
| 40 | {
|
---|
| 41 | // Enter functions.
|
---|
| 42 | define(Recorder<Mesh>::getEnterFunction(&MyStructureComputerCoreVisitor::enterMesh));
|
---|
| 43 | define(Recorder<Transform>::getEnterFunction(&MyStructureComputerCoreVisitor::enterTransform));
|
---|
| 44 | // Leave function.
|
---|
| 45 | define(Recorder<X3DGroupingNode>::getLeaveFunction(&MyStructureComputerCoreVisitor::leaveX3DGroupingNode));
|
---|
| 46 | }
|
---|
| 47 |
|
---|
| 48 | void MyStructureComputerCoreVisitor::enterMesh(Mesh *M)
|
---|
| 49 | {
|
---|
| 50 | // StateVariables assignation.
|
---|
| 51 | MyStructureComputerStateVariables *stateVariables = Singleton<MyStructureComputerStateVariables>::getInstance();
|
---|
| 52 |
|
---|
| 53 | SFMatrix34f T = stateVariables->getMatrix();
|
---|
| 54 |
|
---|
| 55 | // Beginning a new Mesh by memorizing the current vertex index.
|
---|
| 56 | stateVariables->beginNewMesh();
|
---|
| 57 |
|
---|
| 58 | // filling the vertices.
|
---|
| 59 | for (Mesh::MFVertex::const_iterator v = M->getVertices().begin(); v != M->getVertices().end(); ++v)
|
---|
| 60 | {
|
---|
| 61 | SFPoint3f P = T*(*v)->data().getPoint();
|
---|
| 62 | stateVariables->addVertex(P.x, P.y, P.z);
|
---|
| 63 | }
|
---|
| 64 |
|
---|
| 65 | // filling the faces.
|
---|
| 66 | for (Mesh::MFFace::const_iterator
|
---|
| 67 | f = M->getFaces().begin(); f != M->getFaces().end(); ++f)
|
---|
| 68 | {
|
---|
| 69 | const SFFace::MFEdge &edges = (*f)->getEdges();
|
---|
| 70 | list<unsigned int> indexList;
|
---|
| 71 | for (SFFace::MFEdge::const_iterator e = edges.begin(); e != edges.end(); ++e)
|
---|
| 72 | indexList.push_back((*e)->getFromVertex()->getIndex());
|
---|
| 73 |
|
---|
| 74 | stateVariables->addFace(indexList);
|
---|
| 75 | }
|
---|
| 76 | }
|
---|
| 77 |
|
---|
| 78 | void MyStructureComputerCoreVisitor::enterTransform(Transform *T)
|
---|
| 79 | {
|
---|
| 80 | Singleton<MyStructureComputerStateVariables>::getInstance()->pushMatrix(T->getTransform());
|
---|
| 81 | }
|
---|
| 82 |
|
---|
| 83 | void MyStructureComputerCoreVisitor::leaveX3DGroupingNode(X3DGroupingNode *)
|
---|
| 84 | {
|
---|
| 85 | Singleton<MyStructureComputerStateVariables>::getInstance()->popMatrix();
|
---|
| 86 | }
|
---|
| 87 |
|
---|
| 88 | : StateVariables(), _mesh(0), _decal(0)
|
---|
| 89 | {
|
---|
| 90 | }
|
---|
| 91 |
|
---|
| 92 | void MyStructureComputerStateVariables::init()
|
---|
| 93 | {
|
---|
| 94 | _mesh = new MySimpleMesh();
|
---|
| 95 | _matrixStack.push_front(SFMatrix34f::identity);
|
---|
| 96 | }
|
---|
| 97 |
|
---|
| 98 | void MyStructureComputerStateVariables::finish()
|
---|
| 99 | {
|
---|
| 100 | _matrixStack.clear();
|
---|
| 101 | }
|
---|
| 102 |
|
---|
| 103 | void MyStructureComputerStateVariables::beginNewMesh()
|
---|
| 104 | {
|
---|
| 105 | _decal = _mesh->getVertexArray().size();
|
---|
| 106 | }
|
---|
| 107 |
|
---|
| 108 | void MyStructureComputerStateVariables::addFace(const Face &face)
|
---|
| 109 | {
|
---|
| 110 | // MyFace decalFace = face;
|
---|
| 111 | // for (MyFace::iterator it = decalFace.begin(); it != decalFace.end(); ++it)
|
---|
| 112 | // *it = _decal + *it;
|
---|
| 113 |
|
---|
| 114 | // _mesh->addFace(decalFace);
|
---|
| 115 | };
|
---|
| 116 |
|
---|
| 117 | void MyStructureComputerStateVariables::pushMatrix(const SFMatrix34f &transformation)
|
---|
| 118 | {
|
---|
| 119 | _matrixStack.push_front(_matrixStack.front()*transformation);
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | void MyStructureComputerStateVariables::popMatrix()
|
---|
| 123 | {
|
---|
| 124 | _matrixStack.pop_front();
|
---|
| 125 | }
|
---|
| 126 |
|
---|
| 127 | }
|
---|
| 128 |
|
---|