VRUT::FHSParser Class Reference

Class for parsing FHS files. More...

#include <fhsparser.h>

List of all members.

Public Member Functions

 FHSParser (wxInputStream *_inputStream, SCENE_ID _sceneID, const wxString _scenePath, Module *_module)
 ~FHSParser ()
 Class destructor.
bool Parse (const wxString &rootUid)

Private Types

enum  ERROR_MSG { EXPECTED, UNEXPECTED, VECTOR, MATERIAL }
 Error message enumeration. More...

Private Member Functions

 WX_DECLARE_STRING_HASH_MAP (bool, NodeUidsList)
bool logErrorMsg (ERROR_MSG msg, const wxString &line, const wxChar *expected=NULL)
const wxString getUniqueUid (const wxString &uid)
 Check if given uid is unique, generate new if not and add to list.
bool parseScale (const wxString &nodeUid)
 Parse SCALE command and apply to node on top of the stack.
bool parseRotate (const wxString &nodeUid)
 Parse ROTATE command and apply to node on top of the stack.
bool parseIndices (std::vector< GeometryTriangles::Indice > *indices, size_t maxInd)
 Parse indices list, common function for parsePolygon, parseTriangles, parseTriangleStrip, parseTriangleFan.
bool parsePolyPool (GeometryTriangles *geometry)
 Parse and add vertices to geometry node's geometry on top of the stack.
bool parsePolyBox (GeometryTriangles *geometry)
 Parse box definition and modify geometry.
bool parseCommonAttribs (wxString &nodeUid)
 Parse common optional attributes.
bool parseCommonBody (const wxString &nodeUid)
 Parse common (assembly like) body.
bool parseMaterialAttribs (Material *material)
 Parse material body with several attributes.
bool parseMaterial ()
 Parse new material definition.
bool parseEnvironmentBody (const wxString &nodeUid)
 Parse environment body.
bool parseEnvironmentAttribs (wxString &nodeUid)
 Parse optional environment attributes.
bool parseEnvironment (const wxString &parentUid)
 Parse environment definition.
bool parseLightBody (Light *light)
 Parse light body.
bool parseLightAttribs (wxString &nodeUid)
 Parse optional light attributes.
bool parseLight (const wxString &parentUid)
 Parse light definition.
bool parseGeometryBody (const wxString &nodeUid, GeometryTriangles *geometry, bool &valid)
 Parse geometry body.
bool parseGeometryAttribs (wxString &nodeUid, GeometryTriangles *geometry)
 Parse optional geometry attributes.
bool parseGeometry (const wxString &parentUid)
 Parse geometry definition.
bool parseSwitchAttribs (wxString &nodeUid)
 Parse optional SWITCH attributes.
bool parseSwitch (const wxString &parentUid)
 Parse SWITCH definition.
bool parseBillboardAttribs (wxString &nodeUid)
 Parse optional BILLBOARD attributes.
bool parseBillboard (const wxString &parentUid)
 Parse BILLBOARD definition.
bool parseLOD (const wxString &parentUid, const bool active)
 Parse LOD definition.
bool parseLODAssemblyBody (const wxString &nodeUid)
 Parse LOD assembly body.
bool parseLODAssembly (const wxString &parentUid)
 Parse LOD assembly definition.
bool parseAssemblyBody (const wxString &nodeUid)
 Parse assembly body.
bool parseAssemblyAttribs (wxString &nodeUid)
 Parse optional assembly attributes.
bool parseAssembly (const wxString &parentUid)
 Parse assembly definition.
bool parseModelAttribs (const wxString &nodeUid)
 Parse optional model attributes.
bool parseModel (const wxString &nodeUid)

Private Attributes

TextParsertextParser
 Input text parser.
SCENE_ID sceneID
 ID of scene to be built.
wxString scenePath
 Path to scene resources, can be archive filename.
Modulemodule
 Parent module's interface.
unsigned nodesImported
 Number of nodes imported.
unsigned nodesGeomImported
 Number of geometry nodes imported.
unsigned materialsImported
 Number of materials imported.
unsigned texturesImported
 Number of textures imported.
unsigned lightsImported
 Number of lights imported.
NodeUidsList nodeUidsList
 List of nodes' uid used during import to assure they are unique.


Detailed Description

Class for parsing FHS files.

Definition at line 26 of file fhsparser.h.


Member Enumeration Documentation

Error message enumeration.

Enumerator:
EXPECTED  Expected something else.
UNEXPECTED  Unexpected token.
VECTOR  Vector parsing error.
MATERIAL  Material not defined error.

Definition at line 53 of file fhsparser.h.

00054               {
00055                      EXPECTED,                   
00056                      UNEXPECTED,                 
00057                      VECTOR,                            
00058                      MATERIAL                    
00059               };


Constructor & Destructor Documentation

FHSParser::FHSParser ( wxInputStream *  _inputStream,
SCENE_ID  _sceneID,
const wxString  _scenePath,
Module _module 
)

Class constructor

Parameters:
[in] _inputStream Stream to read data from
[in] _sceneID Scene ID
[in] _scenePath Path to scene resources (can be an archive filename)
[in] _module Parent module with messaging interface

Definition at line 23 of file fhsparser.cpp.

00024               : module(_module)
00025 {
00026        textParser = new TextParser(_inputStream, 10000, 1000);
00027        wxFileName filename(_scenePath);
00028        scenePath = filename.GetPath() + filename.GetPathSeparator();
00029        sceneID = _sceneID;
00030        nodesImported = nodesGeomImported = materialsImported = texturesImported = lightsImported = 0;
00031 }

FHSParser::~FHSParser (  ) 

Class destructor.

Definition at line 34 of file fhsparser.cpp.

00035 {
00036        delete textParser;
00037 }


Member Function Documentation

VRUT::FHSParser::WX_DECLARE_STRING_HASH_MAP ( bool  ,
NodeUidsList   
) [private]

bool FHSParser::logErrorMsg ( ERROR_MSG  msg,
const wxString &  line,
const wxChar *  expected = NULL 
) [private]

Log error message

Parameters:
[in] msg Error ID
[in] line Part of string parsed with error
[in] expected Expected token if applicable
Returns:
Always false

Definition at line 40 of file fhsparser.cpp.

00041 {
00042        if (module->TestExit())
00043               return false;
00044 
00045        switch (msg)
00046        {
00047        case EXPECTED:
00048               if (expected)
00049               {
00050                      LOGERROR(wxT("<FHSParser>Expected '") + wxString(expected) + wxT("' before '") + line + wxT("'"));
00051                      break;
00052               }
00053        case UNEXPECTED:
00054               if (wxString(line).Trim().IsEmpty())
00055                      LOGERROR(wxT("<FHSParser>Unexpected end of file"));
00056               else
00057                      LOGERROR(wxT("<FHSParser>Unexpected token: '" + line + wxT("'")));
00058               break;
00059        case VECTOR:
00060               LOGERROR(wxT("<FHSParser>Vector parse error, invalid dimension or format: '" + line + wxT("'")));
00061               break;
00062        case MATERIAL:
00063               LOGERROR(wxT("<FHSParser>Material not defined: '" + line + wxT("'")));
00064               break;
00065        }
00066        return false;
00067 }

const wxString FHSParser::getUniqueUid ( const wxString &  uid  )  [private]

Check if given uid is unique, generate new if not and add to list.

Definition at line 70 of file fhsparser.cpp.

00071 {
00072 
00073        wxString unqUid = CloneWxString(uid);
00074        unsigned cnt = 0;
00075        while (nodeUidsList.find(unqUid) != nodeUidsList.end())
00076               unqUid = wxString::Format(wxT("%s_%i"), uid.c_str(), cnt++);
00077        nodeUidsList.insert(NodeUidsList::value_type(unqUid, false));
00078        return unqUid;
00079 }

bool FHSParser::parseScale ( const wxString &  nodeUid  )  [private]

Parse SCALE command and apply to node on top of the stack.

Vector type

Single number type

Definition at line 82 of file fhsparser.cpp.

00083 {
00085        if (textParser->NextCharIs('('))
00086        {
00087               VECTOR3 v;
00088               if (textParser->ParseVector(v._v, 3) != 3)
00089                      return false;
00090               wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::ScaleMat(v));
00091               module->PostToKernel(ev);
00092        }
00094        else
00095        {
00096               float val = 0;
00097               if (textParser->ParseFloat(&val))
00098               {
00099                      wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::ScaleMat(VECTOR3(val, val, val)));
00100                      module->PostToKernel(ev);
00101               }
00102               else
00103                      return logErrorMsg(EXPECTED, textParser->GetWxLine(), wxT("<number>"));
00104        }
00105        return true;
00106 }

bool FHSParser::parseRotate ( const wxString &  nodeUid  )  [private]

Parse ROTATE command and apply to node on top of the stack.

Vector + angle type

XYZ axis + angle type

Definition at line 109 of file fhsparser.cpp.

00110 {
00111        float angle;
00113        if (textParser->NextCharIs('('))
00114        {
00115               VECTOR3 axis;
00116               if ((textParser->ParseVector(axis._v, 3) != 3) || (!textParser->ParseFloat(&angle)))
00117                      return false;
00118               wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::RotationAxis(axis, angle / 180.0 * 3.14159));
00119               module->PostToKernel(ev);
00120        }
00122        else
00123        {
00124               const char *keywords[] = {"XAXIS", "YAXIS", "ZAXIS", ""};
00125               while (!textParser->NextCharIs('}'))
00126               {
00127                      switch (textParser->KeywordsSwitch(keywords))
00128                      {
00129                      case 0://XAXIS
00130                             {
00131                                    if (!textParser->ParseFloat(&angle))
00132                                           return false;
00133                                    wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::RotationX(angle / 180.0 * 3.14159));
00134                                    module->PostToKernel(ev);
00135                             }
00136                             break;
00137                      case 1://YAXIS
00138                             {
00139                                    if (!textParser->ParseFloat(&angle))
00140                                           return false;
00141                                    wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::RotationY(angle / 180.0 * 3.14159));
00142                                    module->PostToKernel(ev);
00143                             }
00144                             break;
00145                      case 2://ZAXIS
00146                             {
00147                                    if (!textParser->ParseFloat(&angle))
00148                                           return false;
00149                                    wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::RotationZ(angle / 180.0 * 3.14159));
00150                                    module->PostToKernel(ev);
00151                             }
00152                             break;
00153                      default:
00154                             return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00155                      }
00156               }
00157        }
00158        return true;
00159 }

bool FHSParser::parseIndices ( std::vector< GeometryTriangles::Indice > *  indices,
size_t  maxInd 
) [private]

Parse indices list, common function for parsePolygon, parseTriangles, parseTriangleStrip, parseTriangleFan.

Definition at line 162 of file fhsparser.cpp.

00163 {
00164        if (textParser->GetChar() != '{')
00165               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00166 
00167        //read indices
00168        while (!textParser->NextCharIs('}', "TNIC= \t\n\r"))
00169        {
00170               long val;
00171               if (!textParser->ParseLong(&val, NULL, false) || (val < 0) || (val > long(maxInd)))
00172                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00173               indices->push_back((GeometryTriangles::Indice)val);
00174        }
00175        if (textParser->GetChar() != '}')
00176               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00177        return true;
00178 }

bool FHSParser::parsePolyPool ( GeometryTriangles geometry  )  [private]

Parse and add vertices to geometry node's geometry on top of the stack.

Definition at line 180 of file fhsparser.cpp.

00181 {
00182        wxASSERT_MSG(geometry->type == Geometry::GEOMETRY_TRIANGLE, wxT("Cannot parse polygon pool for non-triangulated geometry"));
00183        if (textParser->GetChar() != '{')
00184               return logErrorMsg(EXPECTED, textParser->GetWxLine(), wxT("{"));
00185        std::vector<VECTOR3> * verts = &(geometry->vertices);
00186        std::vector<VECTOR3> * normals = &(geometry->normals);
00187        std::vector<GeometryTriangles::TexCoord> * texCoords = &(geometry->texCoords);
00188        bool cycle = true;
00189        while (cycle)
00190        {
00191               switch (textParser->CharsSwitch("PNTC}", " \t\n\r="))
00192               {
00193               case 0://P
00194                      {
00195                             VECTOR3 vert;
00196                             if (textParser->ParseVector(vert._v, 3, false, "= ") != 3)
00197                                    return false;
00198                             verts->push_back(vert);
00199                      }
00200                      break;
00201               case 1://N
00202                      {
00203                             VECTOR3 norm;
00204                             if (textParser->ParseVector(norm._v, 3, false, "= ") != 3)
00205                                    return false;
00206                             for (size_t i=verts->size()-normals->size()-1; i>0; i--)
00207                                    normals->push_back(VECTOR3());
00208                             normals->push_back(norm);
00209                      }
00210                      break;
00211               case 2://T
00212                      {
00213                             GeometryTriangles::TexCoord texCoord;
00214                             if (textParser->ParseVector(texCoord._v, 2, false, "= ") != 2)
00215                                    return false;
00216                             for (size_t i=verts->size()-texCoords->size()-1; i>0; i--)
00217                                    texCoords->push_back(GeometryTriangles::TexCoord());
00218                             texCoords->push_back(texCoord);
00219                      }
00220                      break;
00221               case 3://C
00222                      {//TODO
00223                             VECTOR3 c;
00224                             if (textParser->ParseVector(c._v, 3, false, "= ") != 3)
00225                                    return false;
00226                             //normals->push_back(c);
00227                      }
00228                      break;
00229               case 4://}
00230                      cycle = false;
00231                      break;
00232               default:
00233                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00234               }
00235        }
00236        return true;
00237 }

bool FHSParser::parsePolyBox ( GeometryTriangles geometry  )  [private]

Parse box definition and modify geometry.

Definition at line 240 of file fhsparser.cpp.

00241 {
00242        float box[6];
00243        if (!textParser->ParseVector(box, 6))
00244               return false;
00245        vector3 position(box), size(box + 3);
00246        geometry->AddBox(position, size - position);
00247        return true;
00248 }

bool FHSParser::parseCommonAttribs ( wxString &  nodeUid  )  [private]

Parse common optional attributes.

Definition at line 1007 of file fhsparser.cpp.

01008 {
01009        const char *keywords[] = {"DESCX", "MATRIX", "TRANSLATE", "SCALE", "ROTATE", ""};
01010        while (!textParser->NextCharIs('{'))
01011        {
01012               if (module->TestExit())
01013                      textParser->ForceEmpty();
01014 
01015               switch (textParser->KeywordsSwitch(keywords))
01016               {
01017               case 0://DESCX
01018                      {
01019                             //TODO
01020                             TextParser tmpParser(textParser->GetString().c_str());
01021                             const char *envKeywords[] = {"UID", "SIZES", "TEXTURE_ATTRIBUTES", "LODTYPE", "UNUSED", "MIRROR", "OPENRTBINARY", ""};
01022                             switch (tmpParser.KeywordsSwitch(envKeywords))
01023                             {
01024                             case 0://UID
01025                                    {
01026                                           wxString newUid(getUniqueUid(tmpParser.GetWxString()));
01027                                           wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_UID_SET(sceneID, nodeUid, newUid);
01028                                           module->PostToKernel(ev);
01029                                           nodeUid = newUid;
01030                                    }
01031                                    break;
01032                             case 1://SIZES
01033                                    {
01034                                           int sizes[3];//TODO, ex: "17045 5977 0", "1793 628 0", "<number of points> <number of primitives> <?>"
01035                                           if (!tmpParser.ParseInt(&sizes[0]))
01036                                                  return false;
01037                                           if (!tmpParser.ParseInt(&sizes[1]))
01038                                                  return false;
01039                                           if (!tmpParser.ParseInt(&sizes[2]))
01040                                                  return false;
01041                                    }
01042                                    break;
01043                             case 2://TEXTURE_ATTRIBUTES
01044                                    {//TODO, jsou to parametry pouzite pri mapovani textury ve VD
01045                                           const char *envKeywords[] = {"flip_textureS", "flip_textureT", "planar_scaleS", "planar_scaleT", "planar_translationS", "planar_translationT", ""};
01046                                           int index;
01047                                           while ((index = tmpParser.KeywordsSwitch(envKeywords)) >= 0)
01048                                           {
01049                                                  switch (index)
01050                                                  {
01051                                                  case 0://flip_textureS
01052                                                         {
01053                                                                int flip_textureS;
01054                                                                if (!tmpParser.ParseInt(&flip_textureS))
01055                                                                       return false;
01056                                                         }
01057                                                         break;
01058                                                  case 1://flip_textureT
01059                                                         {
01060                                                                int flip_textureT;
01061                                                                if (!tmpParser.ParseInt(&flip_textureT))
01062                                                                       return false;
01063                                                         }
01064                                                         break;
01065                                                  case 2://planar_scaleS
01066                                                         {
01067                                                                float planar_scaleS;
01068                                                                if (!tmpParser.ParseFloat(&planar_scaleS))
01069                                                                       return false;
01070                                                         }
01071                                                         break;
01072                                                  case 3://planar_scaleT
01073                                                         {
01074                                                                float planar_scaleT;
01075                                                                if (!tmpParser.ParseFloat(&planar_scaleT))
01076                                                                       return false;
01077                                                         }
01078                                                         break;
01079                                                  case 4://planar_translationS
01080                                                         {
01081                                                                float planar_translationS;
01082                                                                if (!tmpParser.ParseFloat(&planar_translationS))
01083                                                                       return false;
01084                                                         }
01085                                                         break;
01086                                                  case 5://planar_translationT
01087                                                         {
01088                                                                float planar_translationT;
01089                                                                if (!tmpParser.ParseFloat(&planar_translationT))
01090                                                                       return false;
01091                                                         }
01092                                                         break;
01093                                                  case 6://planar_translationS
01094                                                         {
01095                                                                float planar_translationS;
01096                                                                if (!tmpParser.ParseFloat(&planar_translationS))
01097                                                                       return false;
01098                                                         }
01099                                                         break;
01100                                                  default:
01101                                                         wxString textureattributes(tmpParser.GetWxLine());
01102                                                         //logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
01103                                                  }
01104                                           }
01105                                    }
01106                                    break;
01107                             case 3://LODTYPE
01108                                    {//TODO, ex: Distance
01109                                           wxString lodtype(tmpParser.GetWxString());
01110                                    }
01111                                    break;
01112                             case 4://UNUSED
01113                                    break;
01114                             case 5://MIRROR
01115                                    break;//urcuje zrcadlo, ponekud podivne je to u geometrie a ne u materialu, mira odrazivosti je urcena asi pomoci TRANSPARENCY
01116                             case 6://OPENRTBINARY
01117                                    {//TODO, patrne nastaveni materialu pro OpenRT RealTime RayTracing
01118                                           wxString openrtbinary(tmpParser.GetWxLine());
01119                                    }
01120                                    break;
01121                             default:
01122                                    logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
01123                             }
01124                      }
01125                      break;
01126               case 1://MATRIX
01127                      {
01128                             MATRIX mat;
01129                             if (textParser->ParseVector(mat._m, 16) != 16)
01130                                    return false;
01131                             wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, mat);
01132                             module->PostToKernel(ev);
01133                      }
01134                      break;
01135               case 2://TRANSLATE
01136                      {
01137                             VECTOR3 v;
01138                             if (textParser->ParseVector(v._v, 3) != 3)
01139                                    return false;
01140                             wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_TRANSFORM(sceneID, nodeUid, MATRIX::Translation(v));
01141                             module->PostToKernel(ev);
01142                      }
01143                      break;
01144               case 3://SCALE
01145                      if (!parseScale(nodeUid))
01146                             return false;
01147                      break;
01148               case 4://ROTATE
01149                      if (!parseRotate(nodeUid))
01150                             return false;
01151                      break;
01152               default:
01153                      return false;
01154               }
01155        }
01156        return true;
01157 }

bool FHSParser::parseCommonBody ( const wxString &  nodeUid  )  [private]

Parse common (assembly like) body.

Definition at line 1160 of file fhsparser.cpp.

01161 {
01162        const char *keywords[] = {"ASSEMBLY", "GEOMETRY", "LODASSEMBLY", "LOD", "LIGHT", "ENVIRONMENT", "BILLBOARD", "SWITCH", ""};
01163        while (!textParser->NextCharIs('}'))
01164        {
01165               if (module->TestExit())
01166                      textParser->ForceEmpty();
01167 
01168               switch (textParser->KeywordsSwitch(keywords))
01169               {
01170               case 0://ASSEMBLY
01171                      if (!parseAssembly(nodeUid))
01172                             return false;
01173                      break;
01174               case 1://GEOMETRY
01175                      if (!parseGeometry(nodeUid))
01176                             return false;
01177                      break;
01178               case 2://LODASSEMBLY
01179                      if (!parseLODAssembly(nodeUid))
01180                             return false;
01181                      break;
01182               case 3://LOD
01183                      if (!parseAssembly(nodeUid))//on this place in FHS file should not be LOD, so read it as assembly
01184                             return false;
01185                      break;
01186               case 4://LIGHT
01187                      if (!parseLight(nodeUid))
01188                             return false;
01189                      break;
01190               case 5://ENVIRONMENT
01191                      if (!parseEnvironment(nodeUid))
01192                             return false;
01193                      break;
01194               case 6://BILLBOARD
01195                      if (!parseBillboard(nodeUid))
01196                             return false;
01197                      break;
01198               case 7://SWITCH
01199                      if (!parseSwitch(nodeUid))
01200                             return false;
01201                      break;
01202               default:
01203                      return false;
01204               }
01205        }
01206        return true;
01207 }

bool FHSParser::parseMaterialAttribs ( Material material  )  [private]

Parse material body with several attributes.

Definition at line 251 of file fhsparser.cpp.

00252 {
00253        if (textParser->GetChar() != '{')
00254               return logErrorMsg(EXPECTED, textParser->GetWxLine(), wxT("{"));
00255        const char *keywords[] = {"AMBIENT", "DIFFUSE", "SPECULAR", "EMISSION", "SHININESS", "TEXTURE", "TEXWRAP", "TEXFILTER", "TEXQUALITY", "TEXBLEND", "TRANSPARENCY", "MATX", "COLOR", "UNLIT", "}", ""};
00256        vector3 color(1, 1, 1);
00257        bool cycle = true;
00258        while (cycle)
00259        {
00260               switch (textParser->KeywordsSwitch(keywords))
00261               {
00262               case 0://AMBIENT
00263                      if (textParser->ParseVector(material->ambient._v, 3) != 3)
00264                             return false;
00265                      break;
00266               case 1://DIFFUSE
00267                      if (textParser->NextCharIs('('))
00268                      {
00269                             if (textParser->ParseVector(material->diffuse._v, 3) != 3)
00270                                    return false;
00271                      }
00272                      else
00273                      {//TODO check correctness
00274                             float diffuse;
00275                             if (!textParser->ParseFloat(&diffuse))
00276                                    return false;
00277                             material->diffuse = VECTOR4(color * diffuse, 1);
00278                      }
00279                      break;
00280               case 2://SPECULAR
00281                      if (textParser->NextCharIs('('))
00282                      {
00283                             if (textParser->ParseVector(material->specular._v, 3) != 3)
00284                                    return false;
00285                      }
00286                      else
00287                      {//TODO check correctness
00288                             float specular;
00289                             if (!textParser->ParseFloat(&specular))
00290                                    return false;
00291                             material->specular = VECTOR4(color * specular, 1);
00292                      }
00293                      break;
00294               case 3://EMISSION
00295                      if (textParser->ParseVector(material->emission._v, 3) != 3)
00296                             return false;
00297                      break;
00298               case 4://SHININESS
00299                      if (!textParser->ParseFloat(&material->shininess))
00300                             return false;
00301                      break;
00302               case 5://TEXTURE
00303                      {
00304                             wxString texPath = scenePath + textParser->GetWxString();
00305                             wxCommandEvent texEvt = Event::GET_EVT_SCENE_IMAGE_ADD(texPath);
00306                             module->PostToKernel(texEvt);
00307                             material->imageName = texPath;
00308 /*                          const Image * img = (((SceneModule*)module)->GetSceneMgr()->GetScene(sceneID))->GetImage(texPath);
00309                             if (!img)
00310                                    module->WaitForEvent(Event::EVT_SCENE_IMAGE_ADDED, 1000, -1, -1, texPath);
00311                             img = (((SceneModule*)module)->GetSceneMgr()->GetScene(sceneID))->GetImage(texPath);
00312                             if (img && img->IsOk() && img->HasTransparency())
00313                             {
00314                                    material->flags |= Material::BLENDED;
00315                                    material->texBlendSrc = GL_SRC_ALPHA;
00316                                    material->texBlendDst = GL_ONE_MINUS_SRC_ALPHA;
00317                             }*/
00318                             texturesImported++;
00319                      }
00320                      break;
00321               case 6://TEXWRAP
00322                      {
00323                             const char *texwraps[] = {"REPEAT", "CLAMP", ""};
00324                             material->texFlags |= ( textParser->KeywordsSwitch(texwraps) ? Material::TEX_UWRAP_CLAMP : Material::TEX_UWRAP_REPEAT );
00325                             material->texFlags |= ( textParser->KeywordsSwitch(texwraps) ? Material::TEX_VWRAP_CLAMP : Material::TEX_VWRAP_REPEAT );
00326                      }
00327                      break;
00328               case 7://TEXFILTER
00329                      {
00330                             const char *texfilters[] = {"POINT", "LINEAR", "MIPMAP", ""};
00331                             int minFilter = textParser->KeywordsSwitch(texfilters);
00332                             switch (minFilter)
00333                             {
00334                             case 0:
00335                                    material->texFlags |= Material::TEX_MIN_FILTER_POINT;
00336                                    break;
00337                             case 1:
00338                                    material->texFlags |= Material::TEX_MIN_FILTER_LINEAR;
00339                                    break;
00340                             default:
00341                                    material->texFlags |= Material::TEX_MIN_FILTER_MIPMAP;
00342                                    break;
00343                             }
00344                             int maxFilter = textParser->KeywordsSwitch(texfilters);
00345                             switch (maxFilter)
00346                             {
00347                             case 0:
00348                                    material->texFlags |= Material::TEX_MAG_FILTER_POINT;
00349                                    break;
00350                             default:
00351                                    material->texFlags |= Material::TEX_MAG_FILTER_LINEAR;
00352                                    break;
00353                             }
00354                      }
00355                      break;
00356               case 8://TEXQUALITY
00357                      {
00358                             wxString texquality(textParser->GetWxString());//TODO
00359                             //known values LOW
00360                      }
00361                      break;
00362               case 9://TEXBLEND
00363                      {
00364                             const char *texblend[] = {"MODULATE", "REPLACE", "DECAL", "BLEND", ""};
00365                             int texBlend = textParser->KeywordsSwitch(texblend);
00366                             switch (texBlend)
00367                             {
00368                             case 0:
00369                                    material->texFlags |= Material::TEX_ENV_MODULATE;
00370                                    break;
00371                             case 1:
00372                                    material->texFlags |= Material::TEX_ENV_REPLACE;
00373                                    break;
00374                             case 2:
00375                                    material->texFlags |= Material::TEX_ENV_DECAL;
00376                                    break;
00377                             case 3:
00378                                    material->texFlags |= Material::TEX_ENV_BLEND;
00379                                    break;
00380                             }
00381                      }
00382                      break;
00383               case 10://TRANSPARENCY
00384                      if (!textParser->ParseFloat(&material->diffuse.w))
00385                             return false;
00386                      material->diffuse.w = 1.0 - material->diffuse.w;
00387                      material->flags |= Material::BLENDED;
00388                      break;
00389               case 11://MATX
00390                      {
00391                             TextParser tmpParser(textParser->GetString().c_str());
00392                             const char *envKeywords[] = {"DEPTHTEST", "DEPTHMASK", "DEPTHFUNC", "UID", "DSIDED", "GENFUNC", "INVERTALPHA", "IGNORECOLORS", "CLEARCOAT",
00393                                                          "SHADERENABLE", "SHADERPROG", "SHADERPARAM", "MIXTEXTURE", "BLENDFUNC", "ACTIVATE", "DEACTIVATE", "CUBETEX", "LINEWIDTH", ""
00394                                                         };
00395                             switch (tmpParser.KeywordsSwitch(envKeywords))
00396                             {
00397                             case 0://DEPTHTEST
00398                                    {
00399                                           int depthtest;
00400                                           if (!tmpParser.ParseInt(&depthtest))
00401                                                  return false;
00402                                           if (depthtest == 0)
00403                                                  material->flags |= Material::DEPTH_TEST_DISABLE;
00404                                    }
00405                                    break;
00406                             case 1://DEPTHMASK
00407                                    {
00408                                           int depthmask;
00409                                           if (!tmpParser.ParseInt(&depthmask))
00410                                                  return false;
00411                                           if (depthmask == 0)
00412                                                  material->flags |= Material::DEPTH_MASK_DISABLE;
00413                                    }
00414                                    break;
00415                             case 2://DEPTHFUNC
00416                                    {
00417                                           int dfunc;
00418                                           if (!tmpParser.ParseInt(&dfunc))
00419                                                  return false;
00420                                           material->depthFunc = dfunc;
00421                                    }
00422                                    break;
00423                             case 3://UID
00424                                    material->uid = tmpParser.GetWxString();
00425                                    break;
00426                             case 4://DSIDED
00427                                    {
00428                                           int dsided;
00429                                           if (!tmpParser.ParseInt(&dsided))
00430                                                  return false;
00431                                           if (dsided)
00432                                                  material->flags |= Material::DOUBLE_SIDED;
00433                                    }
00434                                    break;
00435                             case 5://GENFUNC
00436                                    {
00437                                           bool scoord = tmpParser.GetWxString().IsSameAs('s', false);
00438                                           wxString type(tmpParser.GetWxString());
00439                                           if (type.Matches(wxT("*Eye*")))//TODO: exact name for GL_EYE_LINEAR
00440                                           {
00441                                                  if (scoord)
00442                                                         material->texFlags |= Material::TEX_GEN_FUNC_U_EYE;
00443                                                  else
00444                                                         material->texFlags |= Material::TEX_GEN_FUNC_V_EYE;
00445                                           }
00446                                           else if (type.Matches(wxT("*Object*")))//TODO: exact name for GL_OBJECT_LINEAR
00447                                           {
00448                                                  if (scoord)
00449                                                         material->texFlags |= Material::TEX_GEN_FUNC_U_OBJECT;
00450                                                  else
00451                                                         material->texFlags |= Material::TEX_GEN_FUNC_V_OBJECT;
00452                                           }
00453                                           else if (type.IsSameAs(wxT("Sphere")))
00454                                           {
00455                                                  if (scoord)
00456                                                         material->texFlags |= Material::TEX_GEN_FUNC_U_SPHERE;
00457                                                  else
00458                                                         material->texFlags |= Material::TEX_GEN_FUNC_V_SPHERE;
00459                                           }
00460                                    }
00461                                    break;
00462                             case 6://INVERTALPHA
00463                                    material->flags |= Material::INVERT_ALPHA;
00464                                    break;
00465                             case 7://IGNORECOLORS
00466                                    material->texFlags |= Material::TEX_IGNORE_COLORS;
00467                                    break;
00468                             case 8://CLEARCOAT
00469                                    {//TODO
00470                                           float clearcoat[3];//ex: "1.0 0.0 0.0", "2.66 0.97 0.24"
00471                                           if (tmpParser.ParseVector(clearcoat, 3, true) != 3)
00472                                                  return false;
00473                                    }
00474                                    break;
00475                             case 9://SHADERENABLE
00476                                    {
00477                                           int shaderenable;
00478                                           if (!tmpParser.ParseInt(&shaderenable))
00479                                                  return false;
00480                                           material->shader = new ShaderProgram;
00481                                    }
00482                                    break;
00483                             case 10://SHADERPROG
00484                                    {
00485                                           if (!material->shader)
00486                                           {
00487                                                  LOGERROR(wxT("<FHSParser>Shader defined but not enabled"));
00488                                                  material->shader = new ShaderProgram;
00489                                                  //return false;
00490                                           }
00491                                           const char *keywords[] = {"GLSL", "OPENRT", ""};
00492                                           switch (tmpParser.KeywordsSwitch(keywords))
00493                                           {
00494                                           case 0://GLSL
00495                                                  {
00496                                                         material->shader->type = ShaderProgram::LANG_GLSL;
00497                                                         wxString * target = (wxString *)NULL;
00498                                                         wxString * targetFileName = (wxString *)NULL;
00499                                                         const char *envKeywords[] = {"FS", "VS", ""};
00500                                                         switch (tmpParser.KeywordsSwitch(envKeywords))
00501                                                         {
00502                                                         case 0://FS
00503                                                                target = &material->shader->fsSource;
00504                                                                targetFileName = &material->shader->fsFileName;
00505                                                                break;
00506                                                         case 1://VS
00507                                                                target = &material->shader->vsSource;
00508                                                                targetFileName = &material->shader->vsFileName;
00509                                                                break;
00510                                                         default:
00511                                                                logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
00512                                                         }
00513                                                         wxString shaderfilename(tmpParser.GetWxString().AfterFirst('\'').BeforeLast('\''));
00514                                                         if (target && wxFileName::FileExists(scenePath + shaderfilename))
00515                                                         {
00516                                                                *targetFileName = scenePath + shaderfilename;
00517                                                                wxFileInputStream fin(scenePath + shaderfilename);
00518                                                                wxStringOutputStream ss(target);
00519                                                                fin.Read(ss);
00520                                                         }
00521                                                  }
00522                                                  break;
00523                                           case 1://OPENRT
00524                                                  {//TODO
00525                                                         material->shader->type = ShaderProgram::LANG_OPENRT;
00526                                                         //const char *envKeywords[]={"RTXPhong", "RTXFresnelPhong1", ""};
00527                                                  }
00528                                                  break;
00529                                           default:
00530                                                  logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
00531                                           }
00532                                    }
00533                                    break;
00534                             case 11://SHADERPARAM
00535                                    {
00536                                           if (!material->shader)
00537                                           {
00538                                                  LOGERROR(wxT("<FHSParser>Shader not enabled"));
00539                                                  return false;
00540                                           }
00541                                           ShaderParam param;
00542                                           const char *typeKeywords[] = {"GLSL", "OPENRT", ""};
00543                                           if (tmpParser.KeywordsSwitch(typeKeywords) != 0)
00544                                                  break;
00545                                           //wxString shadertype(tmpParser.GetWxString());
00546                                           param.name = tmpParser.GetWxString();
00547                                           const char *keywords[] = {"FLOAT", "FLOAT3", "FLOAT4", "COLOR", "BOOL", "SAMPLERCUBE", "SAMPLER2D", ""};
00548                                           switch (tmpParser.KeywordsSwitch(keywords))
00549                                           {
00550                                           case 0://FLOAT
00551                                                  {
00552                                                         size_t n = tmpParser.ParseVector(param.fVals, 0, true);
00553                                                         if (n == 0)
00554                                                                return false;
00555                                                         param.type = ShaderParam::PARAM_TYPE(ShaderParam::FLOAT1);
00556                                                  }
00557                                                  break;
00558                                           case 1://FLOAT3
00559                                           case 2://FLOAT4
00560                                           case 3://COLOR
00561                                           case 4://BOOL
00562                                                  {
00563                                                         size_t n = tmpParser.ParseVector(param.fVals, 0, true);
00564                                                         if (n == 0)
00565                                                                return false;
00566                                                         param.type = ShaderParam::PARAM_TYPE(ShaderParam::FLOAT1 + n - 1);
00567                                                  }
00568                                                  break;
00569                                           case 5://SAMPLERCUBE
00570                                           case 6://SAMPLER2D
00571                                                  {
00572                                                         param.type = ShaderParam::SAMPLER;
00573                                                         wxString texPath = scenePath + tmpParser.GetWxLine().AfterFirst('\'').BeforeLast('\'');
00574                                                         wxCommandEvent texEvt = Event::GET_EVT_SCENE_IMAGE_ADD(texPath);
00575                                                         module->PostToKernel(texEvt);
00576                                                         param.imageName = texPath;
00577                                                         texturesImported++;
00578                                                  }
00579                                                  break;
00580                                           default:
00581                                                  logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
00582                                           }
00583                                           material->shader->paramList.push_back(param);
00584                                    }
00585                                    break;
00586                             case 12://MIXTEXTURE
00587                                    {//ve VD2 lze pouzit pouze je-li pouzito DECAL
00588                                           if (!tmpParser.ParseFloat(&material->textureMix))
00589                                                  return false;
00590                                    }
00591                                    break;
00592                             case 13://BLENDFUNC
00593                                    {
00594                                           const char *envKeywords[] = {"None", "Zero", "One", "SrcColor", "OneMinusSrcColor", "DstColor", "OneMinusDstColor", "SrcAlpha", "OneMinusSrcAlpha", "DstAlpha", ""};
00595                                           const GLuint values[] = {GL_ZERO, GL_ZERO, GL_ONE, GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR, GL_DST_COLOR, GL_ONE_MINUS_DST_COLOR, GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_DST_ALPHA};
00596                                           GLuint * funcTgt = &material->texBlendSrc;
00597                                           for (int i = 0; i < 2; i++)
00598                                           {
00599                                                  int index = tmpParser.KeywordsSwitch(envKeywords);
00600                                                  if (i >= 0)
00601                                                         *funcTgt = values[index];
00602                                                  else
00603                                                         logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
00604                                                  funcTgt = &material->texBlendDst;
00605                                           }
00606                                           material->flags |= Material::BLENDED;
00607                                    }
00608                                    break;
00609                             case 14://ACTIVATE
00610                                    {//TODO, //ex: "ACTIVATE Shadow.so:poffset_on "
00611                                           wxString activate(tmpParser.GetWxLine());
00612                                    }
00613                                    break;
00614                             case 15://DEACTIVATE
00615                                    {//TODO, ex: "DEACTIVATE Shadow.so:poffset_off "
00616                                           wxString deactivate(tmpParser.GetWxLine());
00617                                    }
00618                                    break;
00619                             case 16://CUBETEX
00620                                    {//TODO
00621                                           int cubetexindex;
00622                                           if (!tmpParser.ParseInt(&cubetexindex))
00623                                                  return false;
00624                                           wxString cubetexname(tmpParser.GetWxLine());
00625                                    }
00626                                    break;
00627                             case 17://LINEWIDTH
00628                                    {//TODO
00629                                           float linewidth;
00630                                           if (!tmpParser.ParseFloat(&linewidth))
00631                                                  return false;
00632                                    }
00633                                    break;
00634                             default:
00635                                    logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
00636                             }
00637                      }
00638                      break;
00639               case 12://COLOR
00640                      if (!textParser->ParseVector(color._v, 3))
00641                             return false;
00642                      break;
00643               case 13://UNLIT
00644                      material->flags |= Material::UNLIT;
00645                      break;
00646               case 14://}
00647                      cycle = false;
00648                      break;
00649               default:
00650                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00651               }
00652        }
00653        return true;
00654 }

bool FHSParser::parseMaterial (  )  [private]

Parse new material definition.

Definition at line 657 of file fhsparser.cpp.

00658 {
00659        wxString matName = textParser->GetWxString();
00660        Material * material = new Material(matName);
00661        if (parseMaterialAttribs(material))
00662        {
00663               wxCommandEvent ev = Event::GET_EVT_SCENE_MATERIAL_ADD(sceneID, material);
00664               module->PostToKernel(ev);
00665               materialsImported++;
00666               return true;
00667        }
00668        else
00669        {
00670               SAFE_DELETE(material);
00671               LOGERROR(wxT("<FHSParser>Failed parsing material '") + matName + wxT("'"));
00672               return false;
00673        }
00674 }

bool FHSParser::parseEnvironmentBody ( const wxString &  nodeUid  )  [private]

Parse environment body.

Definition at line 677 of file fhsparser.cpp.

00678 {
00679        //TODO: real environment parameters must be assigned
00680        if (textParser->GetChar() != '{')
00681               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00682        const char *keywords[] = {"BACKGROUND", "AMBIENT", "ENVX", "}", ""};
00683        bool cycle = true;
00684        while (cycle)
00685        {
00686               switch (textParser->KeywordsSwitch(keywords))
00687               {
00688               case 0://BACKGROUND
00689                      {
00690                             VECTOR3 background;
00691                             if (textParser->ParseVector(background._v, 3) != 3)
00692                                    return false;
00693                      }
00694                      break;
00695               case 1://AMBIENT
00696                      {
00697                             VECTOR3 ambient;
00698                             if (textParser->ParseVector(ambient._v, 3) != 3)
00699                                    return false;
00700                      }
00701                      break;
00702               case 2://ENVX
00703                      {
00704                             //TODO
00705                             TextParser tmpParser(textParser->GetString().c_str());
00706                             const char *envKeywords[] = {"FOGDENSITY", "FOGCOLOR", ""};
00707                             switch (tmpParser.KeywordsSwitch(envKeywords))
00708                             {
00709                             case 0://FOGDENSITY
00710                                    {
00711                                           float fogdensity;
00712                                           if (!tmpParser.ParseFloat(&fogdensity))
00713                                                  return false;
00714                                    }
00715                                    break;
00716                             case 1://FOGCOLOR
00717                                    {
00718                                           float fogcolor[4];
00719                                           if (tmpParser.ParseVector(fogcolor, 4) != 4)
00720                                                  return false;
00721                                    }
00722                                    break;
00723                             default:
00724                                    logErrorMsg(UNEXPECTED, tmpParser.GetWxLine());
00725                             }
00726                      }
00727                      break;
00728               case 3://}
00729                      cycle = false;
00730                      break;
00731               default:
00732                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00733               }
00734        }
00735        return true;
00736 }

bool FHSParser::parseEnvironmentAttribs ( wxString &  nodeUid  )  [private]

Parse optional environment attributes.

Definition at line 739 of file fhsparser.cpp.

00740 {
00741        if (!parseCommonAttribs(nodeUid))
00742               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00743        return true;
00744 }

bool FHSParser::parseEnvironment ( const wxString &  parentUid  )  [private]

Parse environment definition.

Add new environment node

Definition at line 747 of file fhsparser.cpp.

00748 {
00749        //TODO: correct node type must be used
00751        wxString nodeName = textParser->GetWxString();
00752        wxString nodeUid = getUniqueUid(nodeName);
00753        /*     GeometryNode * node = new GeometryNode(nodeUid, nodeName);
00754               wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
00755               module->PostToKernel(ev);
00756               nodesImported++;*/
00757 
00758        //parse attributes and body
00759        if (!parseEnvironmentAttribs(nodeUid) || !parseEnvironmentBody(nodeUid))
00760        {
00761               LOGERROR(wxT("<FHSParser>Failed parsing environment '") + nodeUid + wxT("'"));
00762               return false;
00763        }
00764        LOGWARNING(wxT("Environment not implemented"));
00765        return true;
00766 }

bool FHSParser::parseLightBody ( Light light  )  [private]

Parse light body.

Definition at line 769 of file fhsparser.cpp.

00770 {
00771        if (textParser->GetChar() != '{')
00772               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00773        const char *keywords[] = {"COLOR", "DIRECTION", "POSITION", "SPOTLIGHT", "LIGHTX", "}", ""};
00774        bool cycle = true;
00775        while (cycle)
00776        {
00777               switch (textParser->KeywordsSwitch(keywords))
00778               {
00779               case 0://COLOR
00780                      if (textParser->ParseVector(light->diffuse._v, 3) != 3)
00781                             return false;
00782                      break;
00783               case 1://DIRECTION
00784                      if (textParser->ParseVector(light->direction._v, 3) != 3)
00785                             return false;
00786                      switch (light->type)
00787                      {
00788                      case Light::UNKNOWN:
00789                      case Light::DIRECTIONAL:
00790                             light->type = Light::DIRECTIONAL;
00791                             break;
00792                      case Light::OMNI:
00793                      case Light::SPOTLIGHT:
00794                             light->type = Light::SPOTLIGHT;
00795                             break;
00796                      }
00797                      break;
00798               case 2://POSITION
00799                      if (textParser->ParseVector(light->position._v, 3) != 3)
00800                             return false;
00801                      switch (light->type)
00802                      {
00803                      case Light::UNKNOWN:
00804                      case Light::OMNI:
00805                             light->type = Light::OMNI;
00806                             break;
00807                      case Light::DIRECTIONAL:
00808                      case Light::SPOTLIGHT:
00809                             light->type = Light::SPOTLIGHT;
00810                             break;
00811                      }
00812                      break;
00813               case 3://SPOTLIGHT
00814                      {
00815                             float spotlight[2];
00816                             if (textParser->ParseVector(spotlight, 2) != 2)
00817                                    return false;
00818                             light->angle = spotlight[0];
00819                             light->exponent = spotlight[1];
00820                             light->type = Light::SPOTLIGHT;
00821                      }
00822                      break;
00823               case 4://LIGHTX
00824                      textParser->GetWxString();//TODO
00825                      break;
00826               case 5://}
00827                      cycle = false;
00828                      break;
00829               default:
00830                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00831               }
00832        }
00833        return true;
00834 }

bool FHSParser::parseLightAttribs ( wxString &  nodeUid  )  [private]

Parse optional light attributes.

Definition at line 837 of file fhsparser.cpp.

00838 {
00839        if (!parseCommonAttribs(nodeUid))
00840               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00841        return true;
00842 }

bool FHSParser::parseLight ( const wxString &  parentUid  )  [private]

Parse light definition.

Add new light node

Definition at line 845 of file fhsparser.cpp.

00846 {
00848        wxString nodeName = textParser->GetWxString();
00849        wxString nodeUid = getUniqueUid(nodeName);
00850        LightNode * node = new LightNode(nodeUid, nodeName);
00851        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
00852        module->PostToKernel(ev);
00853        nodesImported++;
00854 
00855        Light * light = new Light;
00856        //parse attributes and body
00857        if (!parseLightAttribs(nodeUid) || !parseLightBody(light))
00858        {
00859               LOGERROR(wxT("<FHSParser>Failed parsing light '") + nodeUid + wxT("'"));
00860               SAFE_DELETE(light);
00861               return false;
00862        }
00863 
00864        wxCommandEvent ev2 = Event::GET_EVT_SCENE_NODE_LIGHT_SET(sceneID, nodeUid, light);
00865        module->PostToKernel(ev2);
00866        lightsImported++;
00867 
00868        return true;
00869 }

bool FHSParser::parseGeometryBody ( const wxString &  nodeUid,
GeometryTriangles geometry,
bool &  valid 
) [private]

Parse geometry body.

Definition at line 872 of file fhsparser.cpp.

00873 {
00874        valid = true;
00875        if (textParser->GetChar() != '{')
00876               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00877        std::vector<GeometryTriangles::Indice> * indices = &(geometry->indices);
00878        GeometryTriangles::TriDescList * triDescList = &geometry->triDescList;
00879        const char *keywords[] = {"TRIANGLES", "TRIANGLE_STRIP", "TRIFAN", "POLYGON", "LINES", "LINE_STRIP", "POINTS", "QUADS", "PRIMX", "USEMAT", "BOX", "}", ""};
00880        bool cycle = true;
00881        while (cycle)
00882        {
00883               switch (textParser->KeywordsSwitch(keywords))
00884               {
00885               case 0://TRIANGLES
00886                      if (triDescList->empty() || triDescList->back().second != GeometryTriangles::TRI_LIST)
00887                      {
00888                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_LIST);
00889                             triDescList->push_back(indType);
00890                      }
00891                      if (!parseIndices(indices, geometry->vertices.size()))
00892                             return false;
00893                      break;
00894               case 1://TRIANGLE_STRIP
00895                      {
00896                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_STRIP);
00897                             triDescList->push_back(indType);
00898                             if (!parseIndices(indices, geometry->vertices.size()))
00899                                    return false;
00900                      }
00901                      break;
00902               case 2://TRIFAN
00903                      {
00904                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_FAN);
00905                             triDescList->push_back(indType);
00906                      }
00907                      if (!parseIndices(indices, geometry->vertices.size()))
00908                             return false;
00909                      break;
00910               case 3://POLYGON
00911                      {
00912                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::POLYGON);
00913                             triDescList->push_back(indType);
00914                      }
00915                      if (!parseIndices(indices, geometry->vertices.size()))
00916                             return false;
00917                      break;
00918               case 4://LINES
00919                      if (triDescList->empty() || triDescList->back().second != GeometryTriangles::LINES)
00920                      {
00921                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::LINES);
00922                             triDescList->push_back(indType);
00923                      }
00924                      if (!parseIndices(indices, geometry->vertices.size()))
00925                             return false;
00926                      break;
00927               case 5://LINE_STRIP
00928                      {
00929                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::LINE_STRIP);
00930                             triDescList->push_back(indType);
00931                      }
00932                      if (!parseIndices(indices, geometry->vertices.size()))
00933                             return false;
00934                      break;
00935               case 6://POINTS
00936                      if (triDescList->empty() || triDescList->back().second != GeometryTriangles::POINTS)
00937                      {
00938                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::POINTS);
00939                             triDescList->push_back(indType);
00940                      }
00941                      if (!parseIndices(indices, geometry->vertices.size()))
00942                             return false;
00943                      break;
00944               case 7://QUADS
00945                      if (triDescList->empty() || triDescList->back().second != GeometryTriangles::QUADS)
00946                      {
00947                             std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::QUADS);
00948                             triDescList->push_back(indType);
00949                      }
00950                      if (!parseIndices(indices, geometry->vertices.size()))
00951                             return false;
00952                      break;
00953               case 8://PRIMX
00954                      {
00955                             //wxString primx(textParser->GetWxString());
00956                             TextParser txtParser(textParser->GetWxString());
00957                             const char *keywords[] = {"FROM", ""};
00958                             switch (txtParser.KeywordsSwitch(keywords))
00959                             {
00960                             case 0://FROM
00961                                    {
00962                                           wxCommandEvent ev3 = Event::GET_EVT_SCENE_NODE_GEOMETRY_SET(sceneID, nodeUid, txtParser.GetWxString());
00963                                           module->PostToKernel(ev3);
00964                                           SAFE_DELETE(geometry);
00965                                           valid = false;
00966                                           size_t brackCount = 1;
00967                                           while (brackCount > 0)
00968                                           {
00969                                                  switch (textParser->GetChar())
00970                                                  {
00971                                                  case '{':
00972                                                         brackCount++;
00973                                                         break;
00974                                                  case '}':
00975                                                         brackCount--;
00976                                                         break;
00977                                                  }
00978                                           }
00979                                           return true;
00980                                    }
00981                             default:
00982                                    return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
00983                                    break;
00984                             }
00985                      }
00986                      break;
00987               case 9://USEMAT
00988                      {
00989                             //TODO: solve USEMAT between TRIANGLES etc.
00990                             wxString matName(textParser->GetWxString());
00991                      }
00992                      break;
00993               case 10://BOX
00994                      if (!parsePolyBox(geometry))
00995                             return false;
00996                      break;
00997               case 11://}
00998                      cycle = false;
00999                      break;
01000               default:
01001                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01002               }
01003        }
01004        return true;
01005 }

bool FHSParser::parseGeometryAttribs ( wxString &  nodeUid,
GeometryTriangles geometry 
) [private]

Parse optional geometry attributes.

Definition at line 1210 of file fhsparser.cpp.

01211 {
01212        const char *keywords[] = {"USEMAT", "POLYPOOL", "RESOLUTION", ""};//geometry specific attributes
01213        while (!textParser->NextCharIs('{'))
01214        {
01215               if (!parseCommonAttribs(nodeUid))
01216               {
01217                      switch (textParser->KeywordsSwitch(keywords))
01218                      {
01219                      case 0://USEMAT
01220                             {
01221                                    //TODO: solve better missing materials
01222                                    wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_MATERIAL_SET(sceneID, nodeUid, textParser->GetWxString());
01223                                    module->PostToKernel(ev);
01224                             }
01225                             break;
01226                      case 1://POLYPOOL
01227                             if (!parsePolyPool(geometry))
01228                                    return false;
01229                             if (!geometry->texCoords.empty() && ( geometry->texCoords.size() != geometry->vertices.size() ))
01230                             {
01231                                    LOGWARNING(wxT("<FHSParser>Texture coords count and vertices count mismatch"));
01232                                    for (size_t i=geometry->vertices.size()-geometry->texCoords.size(); i>0; i--)
01233                                           geometry->texCoords.push_back(GeometryTriangles::TexCoord());
01234                             }
01235                             if (!geometry->normals.empty() && ( geometry->normals.size() != geometry->vertices.size() ))
01236                             {
01237                                    LOGWARNING(wxT("<FHSParser>Normals count and vertices count mismatch"));
01238                                    for (size_t i=geometry->vertices.size()-geometry->normals.size(); i>0; i--)
01239                                           geometry->normals.push_back(VECTOR3());
01240                             }
01241                             break;
01242                      case 2://RESOLUTION
01243                             {
01244                                    wxString resolution(textParser->GetWxString());//TODO
01245                             }
01246                             break;
01247                      default:
01248                             return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01249                      }
01250               }
01251        }
01252        return true;
01253 }

bool FHSParser::parseGeometry ( const wxString &  parentUid  )  [private]

Parse geometry definition.

Add new geometry node

Create new mesh

Define mesh

Add geometry to scene

Assign geometry to node

Definition at line 1256 of file fhsparser.cpp.

01257 {
01259        wxString nodeName = textParser->GetWxString();
01260        wxString nodeUid = getUniqueUid(nodeName);
01261        GeometryNode *node = new GeometryNode(nodeUid, nodeName);
01262        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
01263        module->PostToKernel(ev);
01264        nodesImported++;
01265        nodesGeomImported++;
01267        //TODO: decide geometry type
01268        GeometryTriangles *geometry = new GeometryTriangles(nodeUid);
01269 
01271        bool valid;
01272        if (!parseGeometryAttribs(nodeUid, geometry) || !parseGeometryBody(nodeUid, geometry, valid))
01273        {
01274               SAFE_DELETE(geometry);
01275               LOGERROR(wxT("<FHSParser>Failed parsing geometry '") + nodeUid + wxT("'"));
01276               return false;
01277        }
01278 
01279        //Do not do in the PRIMX case
01280        if (valid)
01281        {
01283               wxCommandEvent ev2 = Event::GET_EVT_SCENE_GEOMETRY_ADD(sceneID, geometry);
01284               module->PostToKernel(ev2);
01286               wxCommandEvent ev3 = Event::GET_EVT_SCENE_NODE_GEOMETRY_SET(sceneID, nodeUid, geometry->GetName());
01287               module->PostToKernel(ev3);
01288        }
01289        return true;
01290 }

bool FHSParser::parseSwitchAttribs ( wxString &  nodeUid  )  [private]

Parse optional SWITCH attributes.

Definition at line 1293 of file fhsparser.cpp.

01294 {
01295        const char *keywords[] = {"USEMAT", "WHICHCHILD", ""};//assembly specific attributes
01296        while (!textParser->NextCharIs('{'))
01297        {
01298               if (!parseCommonAttribs(nodeUid))
01299               {
01300                      switch (textParser->KeywordsSwitch(keywords))
01301                      {
01302                      case 0://USEMAT
01303                             {
01304                                    //TODO: use it for childrens if they have not material
01305                                    wxString matName(textParser->GetWxString());
01306                             }
01307                             break;
01308                      case 1://WHICHCHILD
01309                             {
01310                                    //TODO
01311                                    wxString whichchild(textParser->GetWxString());
01312                             }
01313                             break;
01314                      default:
01315                             return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01316                      }
01317               }
01318        }
01319        return true;
01320 }

bool FHSParser::parseSwitch ( const wxString &  parentUid  )  [private]

Parse SWITCH definition.

Add new node

Definition at line 1323 of file fhsparser.cpp.

01324 {
01326        wxString nodeName = textParser->GetWxString();
01327        wxString nodeUid = getUniqueUid(nodeName);
01328        SceneNode * node = new SceneNode(nodeUid, nodeName, SceneNode::ASSEMBLY);//TODO use correct node type
01329        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
01330        module->PostToKernel(ev);
01331        nodesImported++;
01332        LOGWARNING(wxT("Swithch not implemented"));
01333        return parseSwitchAttribs(nodeUid) && parseAssemblyBody(nodeUid);
01334 }

bool FHSParser::parseBillboardAttribs ( wxString &  nodeUid  )  [private]

Parse optional BILLBOARD attributes.

Definition at line 1337 of file fhsparser.cpp.

01338 {
01339        const char *keywords[] = {"USEMAT", "AXIS", "XAXIS", "YAXIS", "ZAXIS", ""};//billboard specific attributes
01340        VECTOR3 axis; //TODO use axis from billboard node
01341        while (!textParser->NextCharIs('{'))
01342        {
01343               if (!parseCommonAttribs(nodeUid))
01344               {
01345                      switch (textParser->KeywordsSwitch(keywords))
01346                      {
01347                      case 0://USEMAT
01348                             {
01349                                    //TODO: use it for childrens if they have not material
01350                                    wxString matName(textParser->GetWxString());
01351                             }
01352                             break;
01353                      case 1://AXIS
01354                             if (textParser->ParseVector(axis._v, 3) != 3)
01355                                    return false;
01356                             break;
01357                      case 2://XAXIS
01358                             axis = vector3(1, 0, 0);
01359                             break;
01360                      case 3://YAXIS
01361                             axis = vector3(0, 1, 0);
01362                             break;
01363                      case 4://ZAXIS
01364                             axis = vector3(0, 0, 1);
01365                             break;
01366                      default:
01367                             return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01368                      }
01369               }
01370        }
01371        return true;
01372 }

bool FHSParser::parseBillboard ( const wxString &  parentUid  )  [private]

Parse BILLBOARD definition.

Add new node

Definition at line 1375 of file fhsparser.cpp.

01376 {
01378        wxString nodeName = textParser->GetWxString();
01379        wxString nodeUid = getUniqueUid(nodeName);
01380        SceneNode * node = new SceneNode(nodeUid, nodeName, SceneNode::ASSEMBLY);//TODO use correct node type
01381        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
01382        module->PostToKernel(ev);
01383        nodesImported++;
01384        LOGWARNING(wxT("Billboard not implemented"));
01385        return parseBillboardAttribs(nodeUid) && parseAssemblyBody(nodeUid);
01386 }

bool FHSParser::parseLOD ( const wxString &  parentUid,
const bool  active 
) [private]

Parse LOD definition.

Add new node

Definition at line 1389 of file fhsparser.cpp.

01390 {
01392        wxString nodeName = textParser->GetWxString();//TODO use "name" as distance parameter
01393        wxString nodeUid = getUniqueUid(nodeName);
01394        SceneNode * node = new SceneNode(nodeUid, nodeName, SceneNode::ASSEMBLY);
01395        node->SetActive(active);
01396        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
01397        module->PostToKernel(ev);
01398        nodesImported++;
01399 
01400        return parseAssemblyAttribs(nodeUid) && parseAssemblyBody(nodeUid);
01401 }

bool FHSParser::parseLODAssemblyBody ( const wxString &  nodeUid  )  [private]

Parse LOD assembly body.

Definition at line 1404 of file fhsparser.cpp.

01405 {
01406        if (textParser->GetChar() != '{')
01407               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01408        const char *keywords[] = {"LOD", ""};
01409        bool active=true;
01410        while (!textParser->NextCharIs('}'))
01411        {
01412               if (module->TestExit())
01413                      textParser->ForceEmpty();
01414 
01415               switch (textParser->KeywordsSwitch(keywords))
01416               {
01417               case 0://LOD
01418                      if (!parseLOD(nodeUid, active))
01419                             return false;
01420                      active=false;
01421                      break;
01422               default:
01423                      return false;
01424               }
01425        }
01426        if (textParser->GetChar() != '}')
01427               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01428        return true;
01429 }

bool FHSParser::parseLODAssembly ( const wxString &  parentUid  )  [private]

Parse LOD assembly definition.

Add new node

Definition at line 1432 of file fhsparser.cpp.

01433 {
01435        wxString nodeName = textParser->GetWxString();
01436        wxString nodeUid = getUniqueUid(nodeName);
01437        SceneNode * node = new SceneNode(nodeUid, nodeName, SceneNode::ASSEMBLY);//TODO use correct node type
01438        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
01439        module->PostToKernel(ev);
01440        nodesImported++;
01441        LOGWARNING(wxT("LODAssembly not implemented"));
01442        return parseAssemblyAttribs(nodeUid) && parseLODAssemblyBody(nodeUid);
01443 }

bool FHSParser::parseAssemblyBody ( const wxString &  nodeUid  )  [private]

Parse assembly body.

Definition at line 1446 of file fhsparser.cpp.

01447 {
01448        if (textParser->GetChar() != '{')
01449               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01450        if (!parseCommonBody(nodeUid))
01451               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01452        if (textParser->GetChar() != '}')
01453               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01454        return true;
01455 }

bool FHSParser::parseAssemblyAttribs ( wxString &  nodeUid  )  [private]

Parse optional assembly attributes.

Definition at line 1458 of file fhsparser.cpp.

01459 {
01460        const char *keywords[] = {"USEMAT", ""};//assembly specific attributes
01461        while (!textParser->NextCharIs('{'))
01462        {
01463               if (!parseCommonAttribs(nodeUid))
01464               {
01465                      switch (textParser->KeywordsSwitch(keywords))
01466                      {
01467                      case 0://USEMAT
01468                             {
01469                                    //TODO: use it for childrens if they have not material
01470                                    wxString matName(textParser->GetWxString());
01471                             }
01472                             break;
01473                      default:
01474                             return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01475                      }
01476               }
01477        }
01478        return true;
01479 }

bool FHSParser::parseAssembly ( const wxString &  parentUid  )  [private]

Parse assembly definition.

Add new node

Definition at line 1482 of file fhsparser.cpp.

01483 {
01485        wxString nodeName = textParser->GetWxString();
01486        wxString nodeUid = getUniqueUid(nodeName);
01487        SceneNode * node = new SceneNode(nodeUid, nodeName, SceneNode::ASSEMBLY);
01488        wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, parentUid);
01489        module->PostToKernel(ev);
01490        nodesImported++;
01491 
01492        return parseAssemblyAttribs(nodeUid) && parseAssemblyBody(nodeUid);
01493 }

bool FHSParser::parseModelAttribs ( const wxString &  nodeUid  )  [private]

Parse optional model attributes.

Add geometry to scene

Assign geometry to node

Definition at line 1496 of file fhsparser.cpp.

01497 {
01498        const char *keywords[] = {"FHSVERSION", "POINTORDER", "DEFMAT", "CIRCLE", ""};//model specific attributes
01499        while (!textParser->IsEmpty())
01500        {
01501               if (!parseCommonBody(nodeUid))
01502               {
01503                      switch (textParser->KeywordsSwitch(keywords))
01504                      {
01505                      case 0://FHSVERSION
01506                             if (!textParser->NextKeywordIs("1100"))
01507                                    LOGWARNING(wxT("<FHSParser>Unknown FHSVERSION") + textParser->GetWxLine());
01508                             break;
01509                      case 1://POINTORDER
01510                             if (!textParser->NextKeywordIs("COUNTERCLOCKWISE"))
01511                                    return logErrorMsg(UNEXPECTED, wxT("POINTORDER ") + textParser->GetWxLine());
01512                             break;
01513                      case 2://DEFMAT
01514                             if (!parseMaterial())
01515                                    return false;
01516                             break;
01517                      case 3:
01518                             {
01519                                    //create geometry
01520                                    GeometryNode *node = new GeometryNode(nodeUid+wxT("Geometry"), nodeUid+wxT("Geometry"));
01521                                    wxCommandEvent ev3(Event::GET_EVT_SCENE_NODE_INSERT(sceneID, node, nodeUid));
01522                                    module->PostToKernel(ev3);
01523 
01524                                    //add material to the geometry node
01525                                    wxCommandEvent ev4(Event::GET_EVT_SCENE_NODE_MATERIAL_SET(sceneID, nodeUid+wxT("Geometry"), wxT("CIRCLE")));
01526                                    module->PostToKernel(ev4);
01527 
01528                                    //Create new mesh
01529                                    GeometryTriangles *geometry = new GeometryTriangles(nodeUid+wxT("Geometry"));
01530                                    std::vector<VECTOR3> * verts = &(geometry->vertices);
01531                                    std::vector<VECTOR3> * normals = &(geometry->normals);
01532                                    std::vector<GeometryTriangles::TexCoord> * texCoords = &(geometry->texCoords);
01533                                    std::vector<GeometryTriangles::Indice> * indices = &(geometry->indices);
01534                                    GeometryTriangles::TriDescList * triDescList = &geometry->triDescList;
01535 
01536 /*                                 //smooth road
01537                                    std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_STRIP);
01538                                    triDescList->push_back(indType);
01539                                    float anglestep=360.0f/3600.0f;
01540                                    for (float angle=0; angle<360.0f; angle+=anglestep)
01541                                    {
01542                                           verts->push_back(VECTOR3(170000*cos(angle/180*3.14159),170000*sin(angle/180*3.14159),0));
01543                                           verts->push_back(VECTOR3(180000*cos(angle/180*3.14159),180000*sin(angle/180*3.14159),0));
01544                                           normals->push_back(VECTOR3(0,0,1));
01545                                           normals->push_back(VECTOR3(0,0,1));
01546                                           texCoords->push_back(GeometryTriangles::TexCoord(0,angle/360.0f));
01547                                           texCoords->push_back(GeometryTriangles::TexCoord(1,angle/360.0f));
01548                                           indices->push_back((GeometryTriangles::Indice)indices->size());
01549                                           indices->push_back((GeometryTriangles::Indice)indices->size());
01550                                    }
01551                                    //Last segment
01552                                    verts->push_back(verts->at(0));
01553                                    verts->push_back(verts->at(1));
01554                                    normals->push_back(VECTOR3(0,0,1));
01555                                    normals->push_back(VECTOR3(0,0,1));
01556                                    texCoords->push_back(GeometryTriangles::TexCoord(0,1));
01557                                    texCoords->push_back(GeometryTriangles::TexCoord(1,1));
01558                                    indices->push_back((GeometryTriangles::Indice)indices->size());
01559                                    indices->push_back((GeometryTriangles::Indice)indices->size());
01560 */
01561 
01562                                    //bumpy road
01563                                    std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_STRIP);
01564                                    triDescList->push_back(indType);
01565                                    float anglestep=360.0f/10800.0f;
01566                                    float ih=0.0f, oh=0.0f;
01567                                    for (float angle=0.0f; angle<360.0f; angle+=anglestep)
01568                                    {
01569                                           float ca=cos(angle/180*3.14159);
01570                                           float sa=sin(angle/180*3.14159);
01571                                           ih=(float)rand()/RAND_MAX*50;
01572                                           oh=(float)rand()/RAND_MAX*50;
01573                                           verts->push_back(VECTOR3(170000*sa, 170000*ca-175000,0));
01574                                           verts->push_back(VECTOR3(174000*sa, 174000*ca-175000,ih));
01575                                           LOG(wxString::Format(wxT("%g\t%g"), -175000*sa, 175000*ca-175000));
01576                                           verts->push_back(VECTOR3(176000*sa, 176000*ca-175000,oh));
01577                                           verts->push_back(VECTOR3(180000*sa, 180000*ca-175000,0));
01578                                           normals->push_back(VECTOR3(0,0,1));
01579                                           normals->push_back(VECTOR3(0,0,1));
01580                                           normals->push_back(VECTOR3(0,0,1));
01581                                           normals->push_back(VECTOR3(0,0,1));
01582                                           texCoords->push_back(GeometryTriangles::TexCoord(angle/360.0f, 0));
01583                                           texCoords->push_back(GeometryTriangles::TexCoord(angle/360.0f, 0.4));
01584                                           texCoords->push_back(GeometryTriangles::TexCoord(angle/360.0f, 0.6));
01585                                           texCoords->push_back(GeometryTriangles::TexCoord(angle/360.0f, 1));
01586                                           //inner segment
01587                                           indices->push_back((GeometryTriangles::Indice)verts->size()-3);
01588                                           indices->push_back((GeometryTriangles::Indice)verts->size()-4);
01589                                    }
01590                                    //Last segment
01591                                    verts->push_back(verts->at(0));
01592                                    verts->push_back(verts->at(1));
01593                                    verts->push_back(verts->at(2));
01594                                    verts->push_back(verts->at(3));
01595                                    normals->push_back(VECTOR3(0,0,1));
01596                                    normals->push_back(VECTOR3(0,0,1));
01597                                    normals->push_back(VECTOR3(0,0,1));
01598                                    normals->push_back(VECTOR3(0,0,1));
01599                                    texCoords->push_back(GeometryTriangles::TexCoord(1, 0));
01600                                    texCoords->push_back(GeometryTriangles::TexCoord(1, 0.4));
01601                                    texCoords->push_back(GeometryTriangles::TexCoord(1, 0.6));
01602                                    texCoords->push_back(GeometryTriangles::TexCoord(1, 1));
01603                                    //inner segment
01604                                    indices->push_back((GeometryTriangles::Indice)verts->size()-3);
01605                                    indices->push_back((GeometryTriangles::Indice)verts->size()-4);
01606                                    //middle segment
01607                                    std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType2((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_STRIP);
01608                                    triDescList->push_back(indType2);
01609                                    for (GeometryTriangles::Indice index=1; index<verts->size(); index+=4)
01610                                    {
01611                                           indices->push_back(index+1);
01612                                           indices->push_back(index);
01613                                    }
01614                                    //outer segment
01615                                    std::pair<GeometryTriangles::Indice, GeometryTriangles::PRIMITIVE_TYPE> indType3((GeometryTriangles::Indice)indices->size(), GeometryTriangles::TRI_STRIP);
01616                                    triDescList->push_back(indType3);
01617                                    for (GeometryTriangles::Indice index=2; index<verts->size(); index+=4)
01618                                    {
01619                                           indices->push_back(index+1);
01620                                           indices->push_back(index);
01621                                    }
01622 
01624                                    wxCommandEvent ev5(Event::GET_EVT_SCENE_GEOMETRY_ADD(sceneID, geometry));
01625                                    module->PostToKernel(ev5);
01627                                    wxCommandEvent ev6(Event::GET_EVT_SCENE_NODE_GEOMETRY_SET(sceneID, nodeUid+wxT("Geometry"), geometry->GetName()));
01628                                    module->PostToKernel(ev6);
01629                             }
01630                      default:
01631                             if (textParser->IsEmpty())
01632                                    return true;
01633                             return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01634                      }
01635               }
01636               else if (!textParser->IsEmpty())
01637                      return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01638        }
01639        return true;
01640 }

bool FHSParser::parseModel ( const wxString &  nodeUid  )  [private]

Parsing entry point

Returns:
true if parsing ended up well

Model name

Definition at line 1643 of file fhsparser.cpp.

01644 {
01645        if (textParser->NextKeywordIs("MODEL"))
01646        {
01648               wxCommandEvent ev = Event::GET_EVT_SCENE_NODE_NAME_SET(sceneID, nodeUid, textParser->GetWxString());
01649               module->PostToKernel(ev);
01650               return parseModelAttribs(nodeUid);
01651        }
01652        else
01653               return logErrorMsg(UNEXPECTED, textParser->GetWxLine());
01654 }

bool FHSParser::Parse ( const wxString &  rootUid  ) 

Parse FHS stream and build scene graph

Parameters:
[in] rootUid Uid of node that will be root of imported scene
Returns:
true if successful

Definition at line 1657 of file fhsparser.cpp.

01658 {
01659        if (!parseModel(rootUid))
01660        {
01661               LOGERROR(wxT("<FHSParser>Scene not parsed properly"));
01662               return false;
01663        }
01664        LOG(wxString::Format(
01665                wxT("<FHSParser>Nodes parsed: %i (%i geometry nodes, %i light nodes)"),
01666                nodesImported, nodesGeomImported, lightsImported));
01667        LOG(wxString::Format(
01668                wxT("<FHSParser>Materials parsed: %i\tTextures parsed: %i "),
01669                materialsImported, texturesImported));
01670 
01671        return true;
01672 }


Member Data Documentation

Input text parser.

Definition at line 30 of file fhsparser.h.

ID of scene to be built.

Definition at line 32 of file fhsparser.h.

wxString VRUT::FHSParser::scenePath [private]

Path to scene resources, can be archive filename.

Definition at line 34 of file fhsparser.h.

Parent module's interface.

Definition at line 36 of file fhsparser.h.

unsigned VRUT::FHSParser::nodesImported [private]

Number of nodes imported.

Definition at line 38 of file fhsparser.h.

Number of geometry nodes imported.

Definition at line 40 of file fhsparser.h.

Number of materials imported.

Definition at line 42 of file fhsparser.h.

Number of textures imported.

Definition at line 44 of file fhsparser.h.

unsigned VRUT::FHSParser::lightsImported [private]

Number of lights imported.

Definition at line 46 of file fhsparser.h.

NodeUidsList VRUT::FHSParser::nodeUidsList [private]

List of nodes' uid used during import to assure they are unique.

Definition at line 50 of file fhsparser.h.


The documentation for this class was generated from the following files:

Generated on Tue Mar 10 14:41:40 2009 for VRUT by  doxygen 1.5.5