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

Last change on this file since 8 was 8, checked in by Sanahuja Guillaume, 6 years ago

simulator

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