00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <wx/filename.h>
00013 #include <wx/event.h>
00014 #include "rdfparser.h"
00015 #include "../../module.h"
00016 #include "../../geometrynode.h"
00017
00018 using namespace VRUT;
00019
00020
00021 RDFParser::RDFParser(wxInputStream * _inputStream, SCENE_ID _sceneID, const wxString _scenePath, Module * _module)
00022 : inputStream(_inputStream), sceneID(_sceneID), module(_module)
00023 {
00024 fileName = wxFileName(_scenePath).GetName();
00025 }
00026
00027
00028 RDFParser::~RDFParser()
00029 {
00031 }
00032
00033 bool RDFParser::parseASCII(GeometryNode *node, std::vector<VECTOR3> *verts, std::vector<GeometryTriangles::Indice> *indices)
00034 {
00035 TextParser textParser(inputStream, 10000, 1000);
00036
00038 const char *keywords[]={"[MDI_HEADER]", "[UNITS]", "[MODEL]", "[OFFSET]", "[NODES]", "[ELEMENTS]", ""};
00039 while (!textParser.IsEmpty())
00040 {
00041 while (textParser.NextCharIs('$'))
00042 textParser.GetWxLine();
00043 switch (textParser.KeywordsSwitch(keywords))
00044 {
00045 case 0:
00046 {
00047 const char *keywordsH[]={"FILE_TYPE", "FILE_VERSION", "FILE_FORMAT", "(COMMENTS)", "{comment_string)", ""};
00048 while (!textParser.IsEmpty() && !textParser.NextCharIs('['))
00049 {
00050 if (textParser.NextCharIs('$'))
00051 {
00052 textParser.GetWxLine();
00053 continue;
00054 }
00055 switch (textParser.KeywordsSwitch(keywordsH))
00056 {
00057 case 0:
00058 if (readValue(textParser)!=wxT("'rdf'"))
00059 LOGWARNING(wxT("<RDFParser>Wrong file type."));
00060 break;
00061 case 1:
00062 if (readValue(textParser)!=wxT("5.00"))
00063 LOGWARNING(wxT("<RDFParser>Not tested file version."));
00064 break;
00065 case 2:
00066 if (readValue(textParser)!=wxT("'ASCII'"))
00067 LOGWARNING(wxT("<RDFParser>Wrong file format."));
00068 break;
00069 case 3:
00070 break;
00071 case 4:
00072 textParser.GetWxLine();
00073 textParser.GetWxLine();
00074 textParser.GetWxLine();
00075 break;
00076 default:
00077 LOGERROR(wxT("<RDFParser>Unknown keyword: ")+textParser.GetWxLine());
00078 }
00079 }
00080 break;
00081 }
00082 case 1:
00083 {
00084 const char *keywordsU[]={"LENGTH", "FORCE", "ANGLE", "MASS", "TIME", ""};
00085 while (!textParser.IsEmpty() && !textParser.NextCharIs('['))
00086 {
00087 if (textParser.NextCharIs('$'))
00088 {
00089 textParser.GetWxLine();
00090 continue;
00091 }
00092 switch (textParser.KeywordsSwitch(keywordsU))
00093 {
00094 case 0:
00095
00096 if (readValue(textParser)!=wxT("'mm'"))
00097 LOGWARNING(wxT("<RDFParser>Wrong length units."));
00098 break;
00099 case 1:
00100 case 2:
00101 case 3:
00102 case 4:
00103 textParser.GetWxLine();
00104 break;
00105 default:
00106 LOGERROR(wxT("<RDFParser>Unknown keyword: ")+textParser.GetWxLine());
00107 }
00108 }
00109 break;
00110 }
00111 case 2:
00112 {
00113 const char *keywordsM[]={"METHOD", "FUNCTION_NAME", ""};
00114 while (!textParser.IsEmpty() && !textParser.NextCharIs('['))
00115 {
00116 if (textParser.NextCharIs('$'))
00117 {
00118 textParser.GetWxLine();
00119 continue;
00120 }
00121 switch (textParser.KeywordsSwitch(keywordsM))
00122 {
00123 case 0:
00124
00125 if (readValue(textParser)!=wxT("'3D'"))
00126 LOGWARNING(wxT("<RDFParser>Wrong method."));
00127 break;
00128 case 1:
00129 textParser.GetWxLine();
00130 break;
00131 default:
00132 LOGERROR(wxT("<RDFParser>Unknown keyword: ")+textParser.GetWxLine());
00133 }
00134 }
00135 break;
00136 }
00137
00138 case 3:
00139 {
00140 float x=0, y=0, z=0;
00141 const char *keywordsO[]={"X", "Y", "Z", ""};
00142 while (!textParser.IsEmpty() && !textParser.NextCharIs('['))
00143 {
00144 if (textParser.NextCharIs('$'))
00145 {
00146 textParser.GetWxLine();
00147 continue;
00148 }
00149 switch (textParser.KeywordsSwitch(keywordsO))
00150 {
00151 case 0:
00152 x=readFloat(textParser);
00153 break;
00154 case 1:
00155 y=readFloat(textParser);
00156 break;
00157 case 2:
00158 z=readFloat(textParser);
00159 break;
00160 default:
00161 LOGERROR(wxT("<RDFParser>Unknown keyword: ")+textParser.GetWxLine());
00162 }
00163 }
00164
00165 break;
00166 }
00167 case 4:
00168 {
00169 long index=0;
00170 while (!textParser.IsEmpty() && !textParser.NextCharIs('['))
00171 {
00172 if (textParser.NextCharIs('$'))
00173 {
00174 textParser.GetWxLine();
00175 continue;
00176 }
00177 if (!textParser.ParseLong(&index))
00178 {
00179 textParser.GetWxLine();
00180 continue;
00181 }
00182 if (index!=verts->size()+1)
00183 LOGERROR(wxT("<RDFParser>Wrong index of vertex."));
00184 vector3 vertex;
00185 if (textParser.ParseVector(vertex._v, 3, true)!=3)
00186 LOGERROR(wxT("<RDFParser>Wrong format of vertex."));
00187 verts->push_back(vertex);
00188 }
00189 break;
00190 }
00191 case 5:
00192 {
00193 size_t maxVerts=verts->size();
00194 while (!textParser.IsEmpty() && !textParser.NextCharIs('['))
00195 {
00196 if (textParser.NextCharIs('$'))
00197 {
00198 textParser.GetWxLine();
00199 continue;
00200 }
00201 long i, j, k, t;
00202 if (!textParser.ParseLong(&i))
00203 {
00204 textParser.GetWxLine();
00205 continue;
00206 }
00207 if (!textParser.ParseLong(&j))
00208 {
00209 textParser.GetWxLine();
00210 continue;
00211 }
00212 if (!textParser.ParseLong(&k))
00213 {
00214 textParser.GetWxLine();
00215 continue;
00216 }
00217 if (!textParser.ParseLong(&t))
00218 {
00219 textParser.GetWxLine();
00220 continue;
00221 }
00222 if (t!=1)
00223 LOGERROR(wxT("<RDFParser>Wrong number of indices."));
00224 if ((i>maxVerts) || (j>maxVerts) || (k>maxVerts))
00225 LOGERROR(wxT("<RDFParser>Indice out of vertices count."));
00226 indices->push_back(i-1);
00227 indices->push_back(j-1);
00228 indices->push_back(k-1);
00229 }
00230 break;
00231 }
00232 default:
00233 LOGERROR(wxT("<RDFParser>Unexpected token: '" + textParser.GetWxLine() + wxT("'")));
00234 return false;
00235 }
00236 }
00237 return true;
00238 }
00239
00240 bool RDFParser::Parse(const wxString & rootUid)
00241 {
00242 wxCommandEvent evName = Event::GET_EVT_SCENE_NODE_NAME_SET(sceneID, rootUid, fileName);
00243 module->PostToKernel(evName);
00244
00245
00246 Material * material = new Material(wxT("RDFDefault"));
00247 material->diffuse = VECTOR4(0.5, 0.5, 0.5, 1);
00248 material->specular = VECTOR4(0.5, 0.5, 0.5, 1);
00249 material->flags = Material::DOUBLE_SIDED;
00250 wxCommandEvent evMat = Event::GET_EVT_SCENE_MATERIAL_ADD(sceneID, material);
00251 module->PostToKernel(evMat);
00252
00253
00255 wxString nodeName = fileName + wxT("_node");
00256 GeometryNode * node = new GeometryNode(nodeName, nodeName);
00257 wxCommandEvent evNode = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, rootUid);
00258 module->PostToKernel(evNode);
00259 wxCommandEvent evMatSet = Event::GET_EVT_SCENE_NODE_MATERIAL_SET(sceneID, nodeName, material->name);
00260 module->PostToKernel(evMatSet);
00261
00263 GeometryTriangles *geometry = new GeometryTriangles(nodeName);
00264
00266 std::vector<VECTOR3> * verts = &(geometry->vertices);
00267 std::vector<GeometryTriangles::Indice> * indices = &(geometry->indices);
00268 std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_LIST);
00269 geometry->triDescList.push_back(indType);
00270
00271
00272 if (!parseASCII(node, verts, indices))
00273 {
00274 LOGERROR(wxT("<RDFParser>Scene not loaded properly"));
00275 return false;
00276 }
00277 else
00278 {
00280 wxCommandEvent evGeom = Event::GET_EVT_SCENE_GEOMETRY_ADD(sceneID, geometry);
00281 module->PostToKernel(evGeom);
00282 wxCommandEvent evGeomSet = Event::GET_EVT_SCENE_NODE_GEOMETRY_SET(sceneID, nodeName, geometry->GetName());
00283 module->PostToKernel(evGeomSet);
00284 }
00285 return true;
00286 }
00287