Revision: 1386
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1386&view=rev
Author:   rorthomas
Date:     2010-05-16 23:25:41 +0000 (Sun, 16 May 2010)

Log Message:
-----------
updated serializer a bit more: added dummy, initResources() and support for 
some more sections

Modified Paths:
--------------
    trunk/source/serializer/serializationmodules.cpp
    trunk/source/serializer/serializationmodules.h
    trunk/source/serializer/serializer.cpp
    trunk/source/serializer/serializer.h

Modified: trunk/source/serializer/serializationmodules.cpp
===================================================================
--- trunk/source/serializer/serializationmodules.cpp    2010-05-13 23:18:25 UTC 
(rev 1385)
+++ trunk/source/serializer/serializationmodules.cpp    2010-05-16 23:25:41 UTC 
(rev 1386)
@@ -22,12 +22,13 @@
 
 void GlobalsSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->globals = new globals_section_t();
        memset(rig->globals, 0, sizeof(globals_section_t));
        initiated = true;
 }
 
-int GlobalsSerializer::deserialize(char *line, rig_t *rig)
+int GlobalsSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "globals"))
@@ -46,6 +47,11 @@
        return sprintf(line, "globals\n%f, %f, %s\n", rig->globals->truckmass, 
rig->globals->loadmass, rig->globals->texname);
 }
 
+int GlobalsSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
+
 //// NodeSerializer
 NodeSerializer::NodeSerializer(RoRSerializer *s) : RoRSerializationModule(s)
 {
@@ -56,6 +62,7 @@
 
 void NodeSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->nodes = new nodes_section_t();
        memset(rig->nodes, 0, sizeof(nodes_section_t));
        // set some defaults, important!
@@ -63,7 +70,7 @@
        initiated = true;
 }
 
-int NodeSerializer::deserialize(char *line, rig_t *rig)
+int NodeSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "nodes"))
@@ -246,6 +253,12 @@
        return -1;
 }
 
+int NodeSerializer::initResources(Ogre::SceneManager *manager, Ogre::SceneNode 
*node, rig_t *rig)
+{
+       return 0;
+}
+
+
 void NodeSerializer::init_node(rig_t *rig, int pos, float x, float y, float z, 
int type, float m, int iswheel, float friction, int id, int wheelid, float 
nfriction, float nvolume, float nsurface, float nloadweight)
 {
        nodes_section *n = rig->nodes;
@@ -306,6 +319,7 @@
 
 void BeamSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->beams = new beams_section_t();
        memset(rig->beams, 0, sizeof(beams_section_t));
 
@@ -328,7 +342,7 @@
        initiated = true;
 }
 
-int BeamSerializer::deserialize(char *line, rig_t *rig)
+int BeamSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "beams"))
@@ -433,6 +447,63 @@
        return -1;
 }
 
+int BeamSerializer::initResources(Ogre::SceneManager *manager, Ogre::SceneNode 
*node, rig_t *rig)
+{
+       // create visuals for beams
+       // root node
+       rig->beams->beamsRoot = node->createChildSceneNode();
+
+       // then all the beams
+       for(int i = 0; i < rig->beams->free_beam; i++)
+       {
+           beam_t *b = &rig->beams->beams[i];
+           if (b->type != BEAM_VIRTUAL)
+           {
+                   //setup visuals
+                   //the cube is 100x100x100
+                   try
+                   {
+                           b->mEntity = manager->createEntity("beam.mesh");
+                   }catch(...)
+                   {
+                           LogManager::getSingleton().logMessage("error 
loading mesh: beam.mesh");
+                   }
+
+                   // no materialmapping for beams!
+                   //          ec->setCastShadows(false);
+
+                   if (b->mEntity && (b->type == BEAM_HYDRO || b->type == 
BEAM_MARKED))
+                           b->mEntity->setMaterialName("tracks/Chrome");
+                   else if(b->mEntity)
+                           
b->mEntity->setMaterialName(rig->beams->default_beam_material);
+                   b->mSceneNode = 
rig->beams->beamsRoot->createChildSceneNode();
+                   b->mSceneNode->setScale(b->diameter, b->L, b->diameter);
+
+                   // colourize beams in simple mode
+                       /*
+                   ColourValue c = ColourValue::Blue;
+                   if(b->type == BEAM_HYDRO)
+                           c = ColourValue::Red;
+                   else if(b->type == BEAM_HYDRO)
+                           c = ColourValue::Red;
+                   
MaterialFunctionMapper::replaceSimpleMeshMaterials(b->mEntity, c);
+                   b->mSceneNode->attachObject(b->mEntity);
+                   b->mSceneNode->setVisible(true);
+                       */
+
+                       /*
+                   printf("nodes %p, %d, from nodes %d to %d: 
(%3.3f,%3.3f,%3.3f) to (%3.3f,%3.3f,%3.3f)\n",
+                           b, i, b->p1->id, b->p2->id,
+                           b->p1->RelPosition.x, b->p1->RelPosition.y, 
b->p1->RelPosition.z,
+                           b->p2->RelPosition.x, b->p2->RelPosition.y, 
b->p2->RelPosition.z
+                           );
+                       */
+
+           }
+       }
+       return 0;
+}
+
 int BeamSerializer::add_beam(rig_t *rig, node_t *p1, node_t *p2, int type, 
float strength, float spring, float damp, float length, float shortbound, float 
longbound, float precomp, float diameter)
 {
        // shortcuts
@@ -516,12 +587,13 @@
 
 void FileInfoSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->fileinfo = new fileinfo_t();
        memset(rig->fileinfo, 0, sizeof(fileinfo_t));
        initiated = true;
 }
 
-int FileInfoSerializer::deserialize(char *line, rig_t *rig)
+int FileInfoSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        if(!initiated) initData(rig);
        return checkRes(1, sscanf(line, "fileinfo %s, %i, %i", 
rig->fileinfo->uniquetruckid, &rig->fileinfo->categoryid, 
&rig->fileinfo->truckversion));
@@ -531,7 +603,12 @@
        return sprintf(line, "fileinfo %s, %i, %i\n", 
rig->fileinfo->uniquetruckid, rig->fileinfo->categoryid, 
rig->fileinfo->truckversion);
 }
 
+int FileInfoSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
 
+
 //// AuthorSerializer
 AuthorSerializer::AuthorSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
@@ -542,13 +619,14 @@
 
 void AuthorSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->fileauthors = new fileauthors_t();
        // beware or memsetting std::* !
        rig->fileauthors->authors.clear();
        initiated = true;
 }
 
-int AuthorSerializer::deserialize(char *line, rig_t *rig)
+int AuthorSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        if(!initiated) initData(rig);
        fileauthors_t *a = rig->fileauthors;
@@ -588,6 +666,11 @@
        return -1;
 }
 
+int AuthorSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
+
 //// EngineSerializer
 EngineSerializer::EngineSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
@@ -598,12 +681,13 @@
 
 void EngineSerializer::initData(rig_t *rig)
 {
-       rig->engine = new engine_section_t();
-       memset(rig->engine, 0, sizeof(engine_section_t));
+       if(initiated) return;
+       rig->engine_section = new engine_section_t();
+       memset(rig->engine_section, 0, sizeof(engine_section_t));
        initiated = true;
 }
 
-int EngineSerializer::deserialize(char *line, rig_t *rig)
+int EngineSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "engine"))
@@ -612,7 +696,7 @@
        if(!initiated) initData(rig);
 
        // shortcuts
-       engine_section_t *e = rig->engine;
+       engine_section_t *e = rig->engine_section;
        
        //parse engine
        int numgears;
@@ -653,6 +737,10 @@
        return -1;
 }
 
+int EngineSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
 
 //// CamerasSerializer
 CamerasSerializer::CamerasSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
@@ -664,12 +752,13 @@
 
 void CamerasSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->cameras = new cameras_section_t();
        memset(rig->cameras, 0, sizeof(cameras_section_t));
        initiated = true;
 }
 
-int CamerasSerializer::deserialize(char *line, rig_t *rig)
+int CamerasSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "cameras"))
@@ -689,14 +778,14 @@
                return 0;
        }
 
-       if(c->free_camera > MAX_CAMERAS)
+       if(c->free_camera >= MAX_CAMERAS)
        {
                return -1;
        }
 
-       c->cameras[c->free_camera].nodepos  = &n->nodes[node_center];
-       c->cameras[c->free_camera].nodedir  = &n->nodes[node_back];
-       c->cameras[c->free_camera].noderoll = &n->nodes[node_left];
+       c->cameras[c->free_camera].nodepos  = &(n->nodes[node_center]);
+       c->cameras[c->free_camera].nodedir  = &(n->nodes[node_back]);
+       c->cameras[c->free_camera].noderoll = &(n->nodes[node_left]);
        c->free_camera++;
        return result;
 }
@@ -707,6 +796,10 @@
        return -1;
 }
 
+int CamerasSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
 
 //// ShocksSerializer
 ShocksSerializer::ShocksSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
@@ -718,12 +811,13 @@
 
 void ShocksSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->shocks = new shocks_section_t();
        memset(rig->shocks, 0, sizeof(shocks_section_t));
        initiated = true;
 }
 
-int ShocksSerializer::deserialize(char *line, rig_t *rig)
+int ShocksSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "shocks"))
@@ -821,6 +915,10 @@
        return -1;
 }
 
+int ShocksSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
 
 //// HydrosSerializer
 HydrosSerializer::HydrosSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
@@ -832,12 +930,13 @@
 
 void HydrosSerializer::initData(rig_t *rig)
 {
+       if(initiated) return;
        rig->hydros = new hydros_section_t();
        memset(rig->hydros, 0, sizeof(hydros_section_t));
        initiated = true;
 }
 
-int HydrosSerializer::deserialize(char *line, rig_t *rig)
+int HydrosSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
        // ignore section header
        if(!strcmp(line, "hydros"))
@@ -970,6 +1069,10 @@
        return -1;
 }
 
+int HydrosSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
 
 //// HydrosSerializer
 WheelsSerializer::WheelsSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
@@ -977,17 +1080,55 @@
        // setup the base descriptions, etc, then register ourself
        s->registerModuleSerializer(this);
        s->addSectionHandler("wheels", this);
+       s->addSectionHandler("wheels2", this);
 }
 
 void WheelsSerializer::initData(rig_t *rig)
 {
-       rig->hydros = new hydros_section_t();
-       memset(rig->hydros, 0, sizeof(hydros_section_t));
+       if(initiated) return;
+       rig->wheels = new wheels_section_t();
+       memset(rig->wheels, 0, sizeof(wheels_section_t));
        initiated = true;
 }
 
-int WheelsSerializer::deserialize(char *line, rig_t *rig)
+int WheelsSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
 {
+       if(!initiated) initData(rig);
+
+       if (activeSection == "wheels")
+       {
+               // ignore section header
+               if(!strcmp(line, "wheels"))
+                       return 1;
+
+               //parse wheels
+               float radius, width, mass, spring, damp;
+               char texf[256];
+               char texb[256];
+               int rays, node1, node2, snode, braked, propulsed, torquenode;
+               int result = sscanf(line,"%f, %f, %i, %i, %i, %i, %i, %i, %i, 
%f, %f, %f, %s %s",
+                       &radius,
+                       &width,
+                       &rays,
+                       &node1,
+                       &node2,
+                       &snode,
+                       &braked,
+                       &propulsed,
+                       &torquenode,
+                       &mass,
+                       &spring,
+                       &damp,
+                       texf,
+                       texb);
+               if (result < 14 || result == EOF)
+               {
+                       //LogManager::getSingleton().logMessage("Error parsing 
File (Wheel) " + String(fname) +" line " + 
StringConverter::toString(linecounter) + ". trying to continue ...");
+                       return 0;
+               }
+               WheelsSerializer::addWheel(rig, radius, width, rays, node1, 
node2, snode, braked, propulsed, torquenode, mass, spring, damp, texf, texb);
+               return result;
+       }
        return -1;
 }
 
@@ -996,6 +1137,12 @@
        // XXX: TODO
        return -1;
 }
+
+int WheelsSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return -2;
+}
+
 void WheelsSerializer::addWheel(rig_t *rig, float radius, float width, int 
rays, int node1, int node2, int snode, int braked, int propulsed, int 
torquenode, float mass, float wspring, float wdamp, char* texf, char* texb, 
bool meshwheel, float rimradius, bool rimreverse)
 {
        int i;
@@ -1043,6 +1190,9 @@
 
                if (contacter_wheel)
                {
+                       // init contacters if required
+                       s->getSectionModule(rig, "contacters");
+
                        
rig->contacters->contacters[rig->contacters->free_contacter].nodeid      = 
nodebase + i * 2;
                        
rig->contacters->contacters[rig->contacters->free_contacter].contacted   = 0;
                        
rig->contacters->contacters[rig->contacters->free_contacter].opticontact = 0;
@@ -1128,6 +1278,8 @@
        }
        //wheel object
        rig->wheels->wheels[rig->wheels->free_wheel].braked           = braked;
+       rig->wheels->wheels[rig->wheels->free_wheel].nodebase           = 
nodebase;
+       rig->wheels->wheels[rig->wheels->free_wheel].nrays            = rays;
        rig->wheels->wheels[rig->wheels->free_wheel].propulsed        = 
propulsed;
        rig->wheels->wheels[rig->wheels->free_wheel].nbnodes          = 2 * 
rays;
        rig->wheels->wheels[rig->wheels->free_wheel].refnode0         = 
&rig->nodes->nodes[node1];
@@ -1142,6 +1294,11 @@
        rig->wheels->wheels[rig->wheels->free_wheel].arm              = 
&rig->nodes->nodes[torquenode];
        rig->wheels->wheels[rig->wheels->free_wheel].lastContactInner = 
Vector3::ZERO;
        rig->wheels->wheels[rig->wheels->free_wheel].lastContactOuter = 
Vector3::ZERO;
+       rig->wheels->wheels[rig->wheels->free_wheel].rimradius        = 
rimradius;
+       rig->wheels->wheels[rig->wheels->free_wheel].rimreverse       = 
rimreverse;
+       strncpy(rig->wheels->wheels[rig->wheels->free_wheel].texf, texf, 255);
+       strncpy(rig->wheels->wheels[rig->wheels->free_wheel].texb, texb, 255);
+
        if (propulsed>0)
        {
                //for inter-differential locking
@@ -1156,6 +1313,8 @@
                rig->wheels->wheels[rig->wheels->free_wheel].near_attach = 
&rig->nodes->nodes[node1];
        else
                rig->wheels->wheels[rig->wheels->free_wheel].near_attach = 
&rig->nodes->nodes[node2];
+
+       rig->wheels->vwheels[rig->wheels->free_wheel].meshwheel = meshwheel;
        rig->wheels->free_wheel++;
 }
 
@@ -1340,3 +1499,203 @@
 
        rig->wheels->free_wheel++;
 }
+
+
+//// ContactersSerializer
+ContactersSerializer::ContactersSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
+{
+       // setup the base descriptions, etc, then register ourself
+       s->registerModuleSerializer(this);
+       s->addSectionHandler("contacters", this);
+}
+
+void ContactersSerializer::initData(rig_t *rig)
+{
+       if(initiated) return;
+       rig->contacters = new contacters_section_t();
+       memset(rig->contacters, 0, sizeof(contacters_section_t));
+       initiated = true;
+}
+
+int ContactersSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
+{
+       // ignore section header
+       if(!strcmp(line, "contacters"))
+               return 1;
+
+       if(!rig->nodes)
+       {
+               LogManager::getSingleton().logMessage("Contacters section must 
come after the nodes section");
+               return -1;
+       }
+
+       if(!initiated) initData(rig);
+
+       //parse contacters
+       int id1;
+       int result = sscanf(line,"%i", &id1);
+       if (result < 1 || result == EOF)
+       {
+               //LogManager::getSingleton().logMessage("Error parsing File 
(Contacters) " + String(fname) +" line " + 
StringConverter::toString(linecounter) + ". trying to continue ...");
+               return 0;
+       }
+
+       if(rig->contacters->free_contacter >= MAX_CONTACTERS)
+       {
+               //LogManager::getSingleton().logMessage("contacters limit 
reached ("+StringConverter::toString(MAX_CONTACTERS)+"): " + String(fname) +" 
line " + StringConverter::toString(linecounter) + ". trying to continue ...");
+               return -1;
+       }
+
+       rig->contacters->contacters[rig->contacters->free_contacter].nodeid     
 = id1;
+       rig->contacters->contacters[rig->contacters->free_contacter].contacted  
 = 0;
+       
rig->contacters->contacters[rig->contacters->free_contacter].opticontact = 0;
+       rig->nodes->nodes[id1].iIsSkin = true;
+       rig->contacters->free_contacter++;
+
+}
+
+int ContactersSerializer::serialize(char *line, rig_t *rig)
+{
+       // XXX: TODO
+       return -1;
+}
+
+int ContactersSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
+
+
+//// BrakesSerializer
+BrakesSerializer::BrakesSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
+{
+       // setup the base descriptions, etc, then register ourself
+       s->registerModuleSerializer(this);
+       s->addSectionHandler("brakes", this);
+}
+
+void BrakesSerializer::initData(rig_t *rig)
+{
+       if(initiated) return;
+       rig->brakes = new brakes_section_t();
+       memset(rig->brakes, 0, sizeof(brakes_section_t));
+       initiated = true;
+}
+
+int BrakesSerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
+{
+       // ignore section header
+       if(!strcmp(line, "brakes"))
+               return 1;
+
+       if(!initiated) initData(rig);
+
+       // parse brakes
+       int result = sscanf(line,"%f, %f", &rig->brakes->brakeforce, 
&rig->brakes->hbrakeforce);
+       // Read in footbrake force and handbrake force. If handbrakeforce is 
not present, set it to the default value 2*footbrake force to preserve older 
functionality
+       if (result == 1)
+               rig->brakes->hbrakeforce = 2.0f * rig->brakes->brakeforce;
+       return result;
+}
+
+int BrakesSerializer::serialize(char *line, rig_t *rig)
+{
+       // XXX: TODO
+       return -1;
+}
+
+int BrakesSerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}
+
+
+//// DummySerializer : dummy for all not yet implemented sections and commands
+DummySerializer::DummySerializer(RoRSerializer *s) : RoRSerializationModule(s)
+{
+       s->registerModuleSerializer(this);
+       // unsupported sections
+       s->addSectionHandler("cinecam", this);
+       s->addSectionHandler("help", this);
+       s->addSectionHandler("engoption", this);
+       s->addSectionHandler("wheels2", this);
+       s->addSectionHandler("meshwheels", this);
+       s->addSectionHandler("shocks", this);
+       s->addSectionHandler("shocks2", this);
+       s->addSectionHandler("hydros", this);
+       s->addSectionHandler("animators", this);
+       s->addSectionHandler("commands", this);
+       s->addSectionHandler("commands2", this);
+       s->addSectionHandler("rotators", this);
+       s->addSectionHandler("ropes", this);
+       s->addSectionHandler("fixes", this);
+       s->addSectionHandler("minimass", this);
+       s->addSectionHandler("ties", this);
+       s->addSectionHandler("ropables", this);
+       s->addSectionHandler("hookgroup", this);
+       s->addSectionHandler("particles", this);
+       s->addSectionHandler("rigidifiers", this);
+       s->addSectionHandler("torquecurve", this);
+       s->addSectionHandler("axles", this);
+       s->addSectionHandler("managedmaterials", this);
+       s->addSectionHandler("flares", this);
+       s->addSectionHandler("materialflarebindings", this);
+       s->addSectionHandler("flares2", this);
+       s->addSectionHandler("flexbodies", this);
+       s->addSectionHandler("submesh", this);
+       s->addSectionHandler("texcoords", this);
+       s->addSectionHandler("cab", this);
+       s->addSectionHandler("backmesh", this);
+       s->addSectionHandler("exhausts", this);
+       s->addSectionHandler("guisettings", this);
+       s->addSectionHandler("soundsources", this);
+       s->addSectionHandler("props", this);
+       s->addSectionHandler("wings", this);
+       s->addSectionHandler("airbrakes", this);
+       s->addSectionHandler("turboprops", this);
+       s->addSectionHandler("fusedrag", this);
+       s->addSectionHandler("turbojets", this);
+       s->addSectionHandler("pistonprops", this);
+       s->addSectionHandler("screwprops", this);
+       s->addSectionHandler("slidenodes", this);
+       s->addSectionHandler("railgroups", this);
+       s->addSectionHandler("globeams", this);
+
+       // unsupported commands
+       s->addCommandHandler("set_inertia_defaults", this);
+       s->addCommandHandler("forwardcommands", this);
+       s->addCommandHandler("importcommands", this);
+       s->addCommandHandler("set_beam_defaults", this);
+       s->addCommandHandler("set_beam_defaults_scale", this);
+       s->addCommandHandler("set_node_defaults", this);
+       s->addCommandHandler("enable_advanced_deformation", this);
+       s->addCommandHandler("rollon", this);
+       s->addCommandHandler("rescuer", this);
+       s->addCommandHandler("set_managedmaterials_options", this);
+       s->addCommandHandler("add_animation", this);
+       s->addCommandHandler("set_skeleton_settings", this);
+       s->addCommandHandler("disabledefaultsounds", this);
+       s->addCommandHandler("slidenode_connect_instantly", this);
+       s->addCommandHandler("set_collision_range", this);
+}
+
+void DummySerializer::initData(rig_t *rig)
+{
+       initiated = true;
+}
+
+int DummySerializer::deserialize(char *line, rig_t *rig, std::string 
activeSection)
+{
+       // ignore everything
+       return 0;
+}
+
+int DummySerializer::serialize(char *line, rig_t *rig)
+{
+       return 0;
+}
+
+int DummySerializer::initResources(Ogre::SceneManager *manager, 
Ogre::SceneNode *node, rig_t *rig)
+{
+       return 0;
+}

Modified: trunk/source/serializer/serializationmodules.h
===================================================================
--- trunk/source/serializer/serializationmodules.h      2010-05-13 23:18:25 UTC 
(rev 1385)
+++ trunk/source/serializer/serializationmodules.h      2010-05-16 23:25:41 UTC 
(rev 1386)
@@ -13,8 +13,9 @@
 public:
        GlobalsSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 class NodeSerializer : public RoRSerializationModule
@@ -22,8 +23,9 @@
 public:
        NodeSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 //customs:
        static void init_node(rig_t *rig, int pos, float x, float y, float z, 
int type, float m=10, int iswheel=0, float friction=CHASSIS_FRICTION_COEF, int 
id=-1, int wheelid=-1, float nfriction=NODE_FRICTION_COEF_DEFAULT, float 
nvolume=NODE_VOLUME_COEF_DEFAULT, float nsurface=NODE_SURFACE_COEF_DEFAULT, 
float nloadweight=NODE_LOADWEIGHT_DEFAULT);
 
@@ -34,8 +36,9 @@
 public:
        BeamSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 //customs:
        static int add_beam(rig_t *rig, node_t *p1, node_t *p2, int type, float 
strength, float spring, float damp, float length=-1, float shortbound=-1, float 
longbound=-1, float precomp=1, float diameter=DEFAULT_BEAM_DIAMETER);
 };
@@ -46,8 +49,9 @@
 public:
        FileInfoSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 
@@ -56,8 +60,9 @@
 public:
        AuthorSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 
@@ -66,8 +71,9 @@
 public:
        EngineSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 
@@ -76,8 +82,9 @@
 public:
        CamerasSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 
@@ -86,8 +93,9 @@
 public:
        ShocksSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 
@@ -96,8 +104,9 @@
 public:
        HydrosSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 };
 
 class WheelsSerializer : public RoRSerializationModule
@@ -105,11 +114,42 @@
 public:
        WheelsSerializer(RoRSerializer *s);
        void initData(rig_t *rig);
-       int deserialize(char *line, rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
        int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
 //customs:
        static void init_node(rig_t *rig, int pos, float x, float y, float z, 
int type, float m=10, int iswheel=0, float friction=CHASSIS_FRICTION_COEF, int 
id=-1, int wheelid=-1, float nfriction=NODE_FRICTION_COEF_DEFAULT, float 
nvolume=NODE_VOLUME_COEF_DEFAULT, float nsurface=NODE_SURFACE_COEF_DEFAULT, 
float nloadweight=NODE_LOADWEIGHT_DEFAULT);
        void addWheel(rig_t *rig, float radius, float width, int rays, int 
node1, int node2, int snode, int braked, int propulsed, int torquenode, float 
mass, float wspring, float wdamp, char* texf, char* texb, bool meshwheel=false, 
float rimradius=0.0, bool rimreverse=false);
        void addWheel2(rig_t *rig, float radius, float radius2, float width, 
int rays, int node1, int node2, int snode, int braked, int propulsed, int 
torquenode, float mass, float wspring, float wdamp, float wspring2, float 
wdamp2, char* texf, char* texb);
 
 };
+
+class ContactersSerializer : public RoRSerializationModule
+{
+public:
+       ContactersSerializer(RoRSerializer *s);
+       void initData(rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
+       int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
+};
+
+class BrakesSerializer : public RoRSerializationModule
+{
+public:
+       BrakesSerializer(RoRSerializer *s);
+       void initData(rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
+       int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
+};
+
+class DummySerializer : public RoRSerializationModule
+{
+public:
+       DummySerializer(RoRSerializer *s);
+       void initData(rig_t *rig);
+       int deserialize(char *line, rig_t *rig, std::string activeSection = 
std::string());
+       int serialize(char *line, rig_t *rig);
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
+};
\ No newline at end of file

Modified: trunk/source/serializer/serializer.cpp
===================================================================
--- trunk/source/serializer/serializer.cpp      2010-05-13 23:18:25 UTC (rev 
1385)
+++ trunk/source/serializer/serializer.cpp      2010-05-16 23:25:41 UTC (rev 
1386)
@@ -10,7 +10,6 @@
 
 using namespace Ogre;
 
-
 RoRSerializer::RoRSerializer()
 {
        // register all available modules :)
@@ -23,8 +22,15 @@
        new ShocksSerializer(this);
        new HydrosSerializer(this);
 
+       new WheelsSerializer(this);
+       new ContactersSerializer(this);
+
+       new BrakesSerializer(this);
+
        new FileInfoSerializer(this);
        new AuthorSerializer(this);
+
+       new DummySerializer(this);
 }
 
 RoRSerializer::~RoRSerializer()
@@ -98,7 +104,7 @@
 
 int RoRSerializer::registerModuleSerializer(RoRSerializationModule *module)
 {
-       modules[module->getName()] = module;
+       modules.push_back(module);
        return 0;
 }
 void RoRSerializer::addSectionHandler(std::string section, 
RoRSerializationModule *module)
@@ -137,7 +143,7 @@
                        //set section as active
                        activeSection = it->first;
                        // parse this as well, could be that the section header 
contains information as well
-                       return it->second->deserialize(line, rig);
+                       return it->second->deserialize(line, rig, 
activeSection);
                }
        }
 
@@ -145,9 +151,33 @@
        if(!activeSection.empty())
        {
                // just try to use that section and ignore the others
-               return sections[activeSection]->deserialize(line, rig);
+               return sections[activeSection]->deserialize(line, rig, 
activeSection);
        }
 
        // no match
        return -1;
-}
\ No newline at end of file
+}
+
+int RoRSerializer::initResources(Ogre::SceneManager *manager, Ogre::SceneNode 
*node, rig_t *rig)
+{
+       std::vector < RoRSerializationModule *>::iterator it;
+       for(it = modules.begin(); it != modules.end() ; it++)
+       {
+               (*it)->initResources(manager, node, rig);
+       }
+       return 0;
+}
+
+RoRSerializationModule *RoRSerializer::getSectionModule(rig_t *rig, 
std::string section)
+{
+       if(sections.find(section) == sections.end())
+       {
+               // TODO: throw error
+               return 0;
+       }
+       if(!sections[section]->isInitiated())
+       {
+               sections[section]->initData(rig);
+       }
+       return sections[section];
+}

Modified: trunk/source/serializer/serializer.h
===================================================================
--- trunk/source/serializer/serializer.h        2010-05-13 23:18:25 UTC (rev 
1385)
+++ trunk/source/serializer/serializer.h        2010-05-16 23:25:41 UTC (rev 
1386)
@@ -60,14 +60,17 @@
        void addSectionHandler(std::string section, RoRSerializationModule 
*module);
        void addCommandHandler(std::string section, RoRSerializationModule 
*module);
 
+       int initResources(Ogre::SceneManager *manager, Ogre::SceneNode *node, 
rig_t *rig);
+
+       RoRSerializationModule *getSectionModule(rig_t *rig, std::string 
section);
+
 protected:
        int processModules(char *line, rig_t *rig, SerializationContext *ctx, 
std::string &activeSection);
 
 
-
        std::map < std::string, RoRSerializationModule *> sections;
        std::map < std::string, RoRSerializationModule *> commands;
-       std::map < std::string, RoRSerializationModule *> modules;
+       std::vector <RoRSerializationModule *> modules;
 };
 
 class RoRSerializationModule
@@ -83,10 +86,12 @@
 
        ~RoRSerializationModule() {}
 
-       virtual int deserialize(char *line, rig_t *rig) = 0;
+       virtual int deserialize(char *line, rig_t *rig, std::string 
activeSection = std::string()) = 0;
        virtual int serialize(char *line, rig_t *rig) = 0;
+       virtual int initResources(Ogre::SceneManager *manager, Ogre::SceneNode 
*node, rig_t *rig) = 0;
 
        std::string getName() { return name; };
+       bool isInitiated() { return initiated; };
 protected:
        RoRSerializer *s;
        std::string name;


This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.

------------------------------------------------------------------------------

_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to