source: flair-src/trunk/lib/FlairSimulator/src/Parser.cpp @ 138

Last change on this file since 138 was 138, checked in by Sanahuja Guillaume, 5 years ago

color cylinder

File size: 9.2 KB
Line 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5//  created:    2013/08/02
6//  filename:   Parser.cpp
7//
8//  author:     César Richard
9//              Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11//  version:    $Id: $
12//
13//  purpose:    classe chargeant un XML decrivant une map
14//
15/*********************************************************************/
16#ifdef GL
17
18#include "Parser.h"
19#include "Simulator.h"
20#include "FixedCamera.h"
21#include "GenericObject.h"
22#include <vector3d.h>
23#include <Vector3D.h>
24#include <IrrlichtDevice.h>
25#include <IFileSystem.h>
26#include <IAnimatedMesh.h>
27#include <IGeometryCreator.h>
28#include <ISceneManager.h>
29
30using namespace irr;
31using namespace irr::core;
32using namespace irr::scene;
33using namespace irr::video;
34using namespace flair::core;
35using namespace flair::simulator;
36
37// todo: getMeshVect doit plutot donner point3D et euler
38// adaptr le xml et la dtd
39
40namespace flair {
41namespace simulator {
42Parser::Parser(Simulator *parent, int app_width, int app_height,
43               int scene_width, int scene_height, std::string media_path,
44               std::string xmlFile)
45    : Gui(parent, "Parser", app_width, app_height, scene_width, scene_height,
46          media_path) {
47  this->media_path = media_path;
48  this->parent = parent;
49  xmlNode *root_element = NULL;
50  doc = xmlReadFile(xmlFile.c_str(), NULL, 0);
51  xmlDtdPtr dtd = NULL;
52  dtd = xmlParseDTD(NULL,
53                    (const xmlChar *)(media_path.append("/scene.dtd").c_str()));
54
55  if (dtd == NULL) {
56    // xmlGenericError(xmlGenericErrorContext,
57    Err("Could not parse DTD scene.dtd\n");
58  } else {
59    xmlValidCtxt cvp;
60    cvp.userData = (void *)stderr;
61    cvp.error = (xmlValidityErrorFunc)fprintf;
62    cvp.warning = (xmlValidityWarningFunc)fprintf;
63    if (!xmlValidateDtd(&cvp, doc, dtd)) {
64      // xmlGenericError(xmlGenericErrorContext,
65      Err("Document does not validate against scene.dtd\n");
66    }
67  }
68
69  if (doc == NULL) {
70    Err("error: could not parse file %s\n", xmlFile.c_str());
71  } else {
72    /*
73     * Get the root element node
74     */
75    root_element = xmlDocGetRootElement(doc);
76    processElements(root_element);
77  }
78}
79
80Parser::~Parser() {
81  if (doc != NULL) {
82    /*
83     * free the document
84     */
85    xmlFreeDoc(doc);
86    ;
87  }
88  /*
89   *Free the global variables that may
90   *have been allocated by the parser.
91   */
92  xmlCleanupParser();
93}
94
95/* Recursive function that prints the XML structure */
96void Parser::processElements(xmlNode *a_node) {
97  xmlNode *cur_node = NULL;
98  for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
99    if (cur_node->type == XML_ELEMENT_NODE) {
100      if (xmlStrEqual(cur_node->name, (xmlChar *)"params")) {
101        processParams(cur_node->children);
102      } else if (xmlStrEqual(cur_node->name, (xmlChar *)"objects")) {
103        processObjects(cur_node->children);
104      } else {
105        processElements(cur_node->children);
106      }
107    }
108  }
109}
110
111void Parser::processObjects(xmlNode *a_node) {
112  xmlNode *cur_node = NULL;
113
114  for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
115    if (xmlStrEqual(cur_node->name, (xmlChar *)"mesh")) {
116                        FILE *fp;
117                        std::string fileName = this->media_path+"/";
118      fp = NULL;
119      fp = fopen(fileName.append((char *)xmlGetProp(
120                                     cur_node, (xmlChar *)"model")).c_str(),"rb");
121      if (fp != NULL) {
122        GenericObject *object =
123            new GenericObject(parent, getGui()->getMesh((char *)xmlGetProp(cur_node, (xmlChar *)"model")));
124        object->setPosition(
125            getMeshVect(cur_node->children, (xmlChar *)"position"));
126        object->setRotation(
127            getMeshVect(cur_node->children, (xmlChar *)"rotation"));
128        object->setScale(getMeshVect(cur_node->children, (xmlChar *)"scale"));
129      } else {
130        Err("FATAL ERROR : File %s %s doesn't exist !\r\n",
131            (char *)xmlGetProp(cur_node, (xmlChar *)"model"),fileName.c_str());
132      }
133    } else if (xmlStrEqual(cur_node->name, (xmlChar *)"cylinder")) {
134                        const IGeometryCreator *geo;
135                        geo = getGui()->getSceneManager()->getGeometryCreator();
136                        IMesh* mesh=geo->createCylinderMesh(
137          ToIrrlichtScale(atof((char *)xmlGetProp(cur_node, (xmlChar *)"radius"))),
138          ToIrrlichtScale(atof((char *)xmlGetProp(cur_node, (xmlChar *)"length"))),
139          atof((char *)xmlGetProp(cur_node, (xmlChar *)"tesselation")),
140          getScolor(cur_node->children));
141          //SColor(100, 255, 100, 100));
142      GenericObject *object = new GenericObject(parent, mesh);
143      object->setPosition(getMeshVect(cur_node->children, (xmlChar *)"position"));
144      object->setRotation(getMeshVect(cur_node->children, (xmlChar *)"rotation"));
145      object->setScale(getMeshVect(cur_node->children, (xmlChar *)"scale"));
146    } else if (xmlStrEqual(cur_node->name, (xmlChar *)"eight")) {
147                        const IGeometryCreator *geo;
148                        geo = getGui()->getSceneManager()->getGeometryCreator();
149                        IMesh* mesh=geo->createCubeMesh(
150          vector3df(atof((char *)xmlGetProp(cur_node, (xmlChar *)"length")),
151                    atof((char *)xmlGetProp(cur_node, (xmlChar *)"width")),
152                    atof((char *)xmlGetProp(cur_node, (xmlChar *)"eight"))));
153                       
154      GenericObject *object =
155          new GenericObject(parent, mesh);
156      object->setPosition(
157          getMeshVect(cur_node->children, (xmlChar *)"position"));
158      object->setRotation(
159          getMeshVect(cur_node->children, (xmlChar *)"rotation"));
160      object->setScale(getMeshVect(cur_node->children, (xmlChar *)"scale"));
161    }
162  }
163}
164
165void Parser::processParams(xmlNode *a_node) {
166
167  xmlNode *cur_node = NULL;
168  for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
169    if (xmlStrEqual(cur_node->name, (xmlChar *)"archive")) {
170      std::string file =
171          media_path + "/" + (char *)xmlGetProp(cur_node, (xmlChar *)"path");
172      getDevice()->getFileSystem()->addFileArchive(file.c_str());
173    } else if (xmlStrEqual(cur_node->name, (xmlChar *)"mesh")) {
174      setMesh((char *)xmlGetProp(cur_node, (xmlChar *)"model"),
175              getSceneVect(cur_node->children, (xmlChar *)"position"),
176              getSceneVect(cur_node->children, (xmlChar *)"rotation"),
177              getSceneVect(cur_node->children, (xmlChar *)"scale", true));
178    } else if (xmlStrEqual(cur_node->name, (xmlChar *)"camera")) {
179      FixedCamera* fixedCamera=new FixedCamera(std::string((char *)xmlGetProp(cur_node, (xmlChar *)"name")),
180                                               getMeshVector3D(cur_node->children, (xmlChar *)"position"),
181                                               getMeshVector3D(cur_node->children, (xmlChar *)"lookat"));
182    }
183  }
184}
185
186SColor Parser::getScolor(xmlNode *mesh_node) {
187  xmlNode *cur_node = NULL;
188  for (cur_node = mesh_node; cur_node; cur_node = cur_node->next) {
189    if (xmlStrEqual(cur_node->name, (xmlChar *)"color")) {
190      return SColor(atoi((char *)xmlGetProp(cur_node, (xmlChar *)"a")),
191                       atoi((char *)xmlGetProp(cur_node, (xmlChar *)"r")),
192                       atoi((char *)xmlGetProp(cur_node, (xmlChar *)"g")),
193                       atoi((char *)xmlGetProp(cur_node, (xmlChar *)"b")));
194    }
195  }
196  return SColor(255,0, 0, 0);
197}
198
199// todo rendre un vector3D framework
200// retirer irr::core::vector3df ToIrrlichtCoordinates(irr::core::vector3df
201// vect);
202vector3df Parser::getMeshVect(xmlNode *mesh_node, xmlChar *param) {
203  xmlNode *cur_node = NULL;
204  for (cur_node = mesh_node; cur_node; cur_node = cur_node->next) {
205    if (xmlStrEqual(cur_node->name, param)) {
206      return vector3df(atof((char *)xmlGetProp(cur_node, (xmlChar *)"x")),
207                       atof((char *)xmlGetProp(cur_node, (xmlChar *)"y")),
208                       atof((char *)xmlGetProp(cur_node, (xmlChar *)"z")));
209    }
210  }
211  return vector3df(0, 0, 0);
212}
213
214Vector3D Parser::getMeshVector3D(xmlNode *mesh_node, xmlChar *param) {
215  xmlNode *cur_node = NULL;
216  for (cur_node = mesh_node; cur_node; cur_node = cur_node->next) {
217    if (xmlStrEqual(cur_node->name, param)) {
218      return Vector3D(atof((char *)xmlGetProp(cur_node, (xmlChar *)"x")),
219                       atof((char *)xmlGetProp(cur_node, (xmlChar *)"y")),
220                       atof((char *)xmlGetProp(cur_node, (xmlChar *)"z")));
221    }
222  }
223  return Vector3D(0, 0, 0);
224}
225
226vector3df Parser::getSceneVect(xmlNode *mesh_node, xmlChar *param,
227                               bool isScale) {
228  xmlNode *cur_node = NULL;
229  for (cur_node = mesh_node; cur_node; cur_node = cur_node->next) {
230    if (xmlStrEqual(cur_node->name, param)) {
231      if (isScale) {
232        return vector3df(atof((char *)xmlGetProp(cur_node, (xmlChar *)"x")),
233                         atof((char *)xmlGetProp(cur_node, (xmlChar *)"z")),
234                         atof((char *)xmlGetProp(cur_node, (xmlChar *)"y")));
235      }
236      return vector3df(atof((char *)xmlGetProp(cur_node, (xmlChar *)"x")),
237                       -atof((char *)xmlGetProp(cur_node, (xmlChar *)"z")),
238                       atof((char *)xmlGetProp(cur_node, (xmlChar *)"y")));
239    }
240  }
241  return vector3df(0, 0, 0);
242}
243
244} // end namespace simulator
245} // end namespace flair
246#endif // GL
Note: See TracBrowser for help on using the repository browser.