Revision: 1385
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1385&view=rev
Author:   rorthomas
Date:     2010-05-13 23:18:25 +0000 (Thu, 13 May 2010)

Log Message:
-----------
serilizer updates, not done yet

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-10 15:50:17 UTC 
(rev 1384)
+++ trunk/source/serializer/serializationmodules.cpp    2010-05-13 23:18:25 UTC 
(rev 1385)
@@ -16,8 +16,8 @@
 GlobalsSerializer::GlobalsSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "globals";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("globals", this);
 }
 
 void GlobalsSerializer::initData(rig_t *rig)
@@ -43,16 +43,15 @@
 
 int GlobalsSerializer::serialize(char *line, rig_t *rig)
 {
-       // XXX: TODO
-       return -1;
+       return sprintf(line, "globals\n%f, %f, %s\n", rig->globals->truckmass, 
rig->globals->loadmass, rig->globals->texname);
 }
 
 //// NodeSerializer
 NodeSerializer::NodeSerializer(RoRSerializer *s) : RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "nodes";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("nodes", this);
 }
 
 void NodeSerializer::initData(rig_t *rig)
@@ -247,18 +246,85 @@
        return -1;
 }
 
+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;
+       n->nodes[pos].AbsPosition    = Vector3(x, y, z);
+       n->nodes[pos].RelPosition    = Vector3(x, y, z) - n->origin;
+       n->nodes[pos].smoothpos      = n->nodes[pos].AbsPosition;
+       n->nodes[pos].iPosition      = Vector3(x, y, z);
+       if(pos != 0)
+               n->nodes[pos].iDistance  = (n->nodes[0].AbsPosition - 
Vector3(x, y, z)).squaredLength();
+       else
+               n->nodes[pos].iDistance  = 0;
+       n->nodes[pos].Velocity       = Vector3::ZERO;
+       n->nodes[pos].Forces         = Vector3::ZERO;
+       n->nodes[pos].locked         = m < 0.0;
+       n->nodes[pos].mass           = m;
+       n->nodes[pos].iswheel        = iswheel;
+       n->nodes[pos].wheelid        = wheelid;
+       n->nodes[pos].friction_coef  = nfriction;
+       n->nodes[pos].volume_coef    = nvolume;
+       n->nodes[pos].surface_coef   = nsurface;
+       if (nloadweight >= 0.0f)
+       {
+               n->nodes[pos].masstype   = NODE_LOADED;
+               n->nodes[pos].overrideMass = true;
+               n->nodes[pos].mass       = nloadweight;
+       }
+       n->nodes[pos].disable_particles = false;
+       n->nodes[pos].masstype       = type;
+       n->nodes[pos].contactless    = 0;
+       n->nodes[pos].contacted      = 0;
+       n->nodes[pos].lockednode     = 0;
+       n->nodes[pos].buoyanceForce  = Vector3::ZERO;
+       n->nodes[pos].buoyancy       = rig->globals->truckmass / 
15.0f;//DEFAULT_BUOYANCY;
+       n->nodes[pos].lastdrag       = Vector3(0,0,0);
+       // XXX: TOFIX
+       //n->nodes[pos].gravimass      = Vector3(0, 
RoRFrameListener::getGravity()*m, 0);
+       n->nodes[pos].gravimass      = Vector3(0, n->gravitation * m, 0);
+       n->nodes[pos].wetstate       = DRY;
+       n->nodes[pos].isHot          = false;
+       n->nodes[pos].overrideMass   = false;
+       n->nodes[pos].id             = id;
+       n->nodes[pos].colltesttimer  = 0;
+       n->nodes[pos].iIsSkin        = false;
+       n->nodes[pos].isSkin         = n->nodes[pos].iIsSkin;
+       n->nodes[pos].pos            = pos;
+       if (type == NODE_LOADED)
+               n->masscount++;
+}
+
+
 //// BeamSerializer
 BeamSerializer::BeamSerializer(RoRSerializer *s) : RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "beams";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("beams", this);
 }
 
 void BeamSerializer::initData(rig_t *rig)
 {
        rig->beams = new beams_section_t();
        memset(rig->beams, 0, sizeof(beams_section_t));
+
+       // init basics
+       rig->beams->default_spring        = DEFAULT_SPRING;
+       rig->beams->default_spring_scale  = 1;
+       rig->beams->default_damp          = DEFAULT_DAMP;
+       rig->beams->default_damp_scale    = 1;
+       rig->beams->default_deform        = BEAM_DEFORM;
+       rig->beams->default_deform_scale  = 1;
+       rig->beams->default_break         = BEAM_BREAK;
+       rig->beams->default_break_scale   = 1;
+       rig->beams->default_beam_diameter = DEFAULT_BEAM_DIAMETER;
+       strcpy(rig->beams->default_beam_material, "tracks/beam");
+       rig->beams->default_plastic_coef  = 0;
+       rig->beams->beam_creak            = BEAM_CREAK_DEFAULT;
+
+
+       // done
        initiated = true;
 }
 
@@ -367,13 +433,85 @@
        return -1;
 }
 
+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
+       nodes_section_t *n = rig->nodes;
+       beams_section_t *b = rig->beams;
+       
+       int pos = b->free_beam;
 
+       b->beams[pos].p1 = p1;
+       b->beams[pos].p2 = p2;
+       b->beams[pos].p2truck = 0;
+       b->beams[pos].type = type;
+       if (length < 0)
+       {
+               //calculate the length
+               Vector3 t = p1->RelPosition - p2->RelPosition;
+               b->beams[pos].L = precomp * t.length();
+       } else
+       {
+               b->beams[pos].L = length;
+       }
+       b->beams[pos].k                 = spring;
+       b->beams[pos].d                 = damp;
+       b->beams[pos].broken            = 0;
+       b->beams[pos].Lhydro            = b->beams[pos].L;
+       b->beams[pos].refL              = b->beams[pos].L;
+       b->beams[pos].hydroRatio        = 0;
+       b->beams[pos].hydroFlags        = 0;
+       b->beams[pos].animFlags         = 0;
+       b->beams[pos].stress            = 0;
+       b->beams[pos].lastforce         = Vector3::ZERO;
+       b->beams[pos].iscentering       = false;
+       b->beams[pos].isOnePressMode    = 0;
+       b->beams[pos].isforcerestricted = false;
+       b->beams[pos].autoMovingMode    = 0;
+       b->beams[pos].autoMoveLock      = false;
+       b->beams[pos].pressedCenterMode = false;
+       b->beams[pos].disabled          = false;
+       b->beams[pos].shock             = 0;
+       if (b->default_deform < b->beam_creak)
+               b->default_deform = b->beam_creak;
+       b->beams[pos].default_deform    = b->default_deform  * 
b->default_deform_scale;
+       b->beams[pos].minmaxposnegstress = b->default_deform * 
b->default_deform_scale;
+       b->beams[pos].maxposstress      = b->default_deform  * 
b->default_deform_scale;
+       b->beams[pos].maxnegstress      = - b->beams[pos].maxposstress;
+       b->beams[pos].plastic_coef      = b->default_plastic_coef;
+       b->beams[pos].default_plastic_coef = b->default_plastic_coef;
+       b->beams[pos].strength          = strength;
+       b->beams[pos].iStrength         = strength;
+       b->beams[pos].diameter          = b->default_beam_diameter;
+       b->beams[pos].minendmass        = 1;
+       b->beams[pos].diameter          = diameter;
+       b->beams[pos].scale             = 0;
+       if (shortbound != -1.0)
+       {
+               b->beams[pos].bounded       = SHOCK1;
+               b->beams[pos].shortbound    = shortbound;
+               b->beams[pos].longbound     = longbound;
+
+       } else
+       {
+               b->beams[pos].bounded       = NOSHOCK;
+       }
+
+       // no visuals here
+       b->beams[pos].mSceneNode        = 0;
+       b->beams[pos].mEntity           = 0;
+
+       b->free_beam++;
+       return pos;
+}
+
+
 //// FileInfoSerializer
 FileInfoSerializer::FileInfoSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = commandTrigger = "fileinfo";
        s->registerModuleSerializer(this);
+       s->addCommandHandler("fileinfo", this);
 }
 
 void FileInfoSerializer::initData(rig_t *rig)
@@ -398,8 +536,8 @@
 AuthorSerializer::AuthorSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = commandTrigger = "author";
        s->registerModuleSerializer(this);
+       s->addCommandHandler("author", this);
 }
 
 void AuthorSerializer::initData(rig_t *rig)
@@ -454,8 +592,8 @@
 EngineSerializer::EngineSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "engine";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("engine", this);
 }
 
 void EngineSerializer::initData(rig_t *rig)
@@ -520,8 +658,8 @@
 CamerasSerializer::CamerasSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "cameras";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("cameras", this);
 }
 
 void CamerasSerializer::initData(rig_t *rig)
@@ -541,9 +679,10 @@
 
        // shortcuts
        cameras_section_t *c = rig->cameras;
+       nodes_section_t   *n = rig->nodes;
        
-       int nodepos, nodedir, dir;
-       int result = sscanf(line,"%i, %i, %i",&nodepos,&nodedir,&dir);
+       int node_center, node_back, node_left;
+       int result = sscanf(line,"%i, %i, %i", &node_center, &node_back, 
&node_left);
        if (result < 3 || result == EOF)
        {
                //LogManager::getSingleton().logMessage("Error parsing File 
(Camera) " + String(fname) +" line " + StringConverter::toString(linecounter) + 
". trying to continue ...");
@@ -555,9 +694,9 @@
                return -1;
        }
 
-       c->cameras[c->free_camera].nodepos = nodepos;
-       c->cameras[c->free_camera].nodedir = nodedir;
-       c->cameras[c->free_camera].dir = dir;
+       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;
 }
@@ -573,8 +712,8 @@
 ShocksSerializer::ShocksSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "shocks";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("shocks", this);
 }
 
 void ShocksSerializer::initData(rig_t *rig)
@@ -667,7 +806,7 @@
                }
                options_pointer++;
        }
-       int pos = add_beam(rig, &n->nodes[id1], &n->nodes[id2], htype, 
b->default_break * 4.0f, sp, d, -1.0f, sbound, lbound, precomp);
+       int pos = BeamSerializer::add_beam(rig, &n->nodes[id1], &n->nodes[id2], 
htype, b->default_break * 4.0f, sp, d, -1.0f, sbound, lbound, precomp);
        b->beams[pos].shock = &s->shocks[s->free_shock];
        s->shocks[s->free_shock].beamid = pos;
        s->shocks[s->free_shock].flags = shockflag;
@@ -687,8 +826,8 @@
 HydrosSerializer::HydrosSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
        // setup the base descriptions, etc, then register ourself
-       name = sectionTrigger = "hydros";
        s->registerModuleSerializer(this);
+       s->addSectionHandler("hydros", this);
 }
 
 void HydrosSerializer::initData(rig_t *rig)
@@ -765,7 +904,7 @@
                return -1;
        }
 
-       int pos = add_beam(rig, &n->nodes[id1], &n->nodes[id2], htype, 
b->default_break * b->default_break_scale, b->default_spring * 
b->default_spring_scale, b->default_damp * b->default_damp_scale);
+       int pos = BeamSerializer::add_beam(rig, &n->nodes[id1], &n->nodes[id2], 
htype, b->default_break * b->default_break_scale, b->default_spring * 
b->default_spring_scale, b->default_damp * b->default_damp_scale);
        h->hydro[h->free_hydro]=pos;
        h->free_hydro++;
        b->beams[pos].Lhydro = b->beams[pos].L;
@@ -832,124 +971,372 @@
 }
 
 
-//// HELPER functions below
-int 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)
+//// HydrosSerializer
+WheelsSerializer::WheelsSerializer(RoRSerializer *s) : 
RoRSerializationModule(s)
 {
-       // shortcuts
-       nodes_section_t *n = rig->nodes;
-       beams_section_t *b = rig->beams;
-       
-       int pos = b->free_beam;
+       // setup the base descriptions, etc, then register ourself
+       s->registerModuleSerializer(this);
+       s->addSectionHandler("wheels", this);
+}
 
-       b->beams[pos].p1 = p1;
-       b->beams[pos].p2 = p2;
-       b->beams[pos].p2truck = 0;
-       b->beams[pos].type = type;
-       if (length < 0)
+void WheelsSerializer::initData(rig_t *rig)
+{
+       rig->hydros = new hydros_section_t();
+       memset(rig->hydros, 0, sizeof(hydros_section_t));
+       initiated = true;
+}
+
+int WheelsSerializer::deserialize(char *line, rig_t *rig)
+{
+       return -1;
+}
+
+int WheelsSerializer::serialize(char *line, rig_t *rig)
+{
+       // XXX: TODO
+       return -1;
+}
+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;
+       int nodebase = rig->nodes->free_node;
+       int node3;
+       int contacter_wheel=1;
+       //ignore the width parameter
+       width=(rig->nodes->nodes[node1].RelPosition - 
rig->nodes->nodes[node2].RelPosition).length();
+       //enforce the "second node must have a larger Z coordinate than the 
first" constraint
+       if (rig->nodes->nodes[node1].RelPosition.z > 
rig->nodes->nodes[node2].RelPosition.z)
        {
-               //calculate the length
-               Vector3 t = p1->RelPosition - p2->RelPosition;
-               b->beams[pos].L = precomp * t.length();
-       } else
+               //swap
+               node3=node1;
+               node1=node2;
+               node2=node3;
+       }
+       //ignore the sign of snode, just do the thing automatically
+       //if (snode<0) node3=-snode; else node3=snode;
+       if (snode<0) snode=-snode;
+       bool closest1=false;
+       if (snode!=9999) 
closest1=(rig->nodes->nodes[snode].RelPosition-rig->nodes->nodes[node1].RelPosition).length()<(rig->nodes->nodes[snode].RelPosition-rig->nodes->nodes[node2].RelPosition).length();
+
+       //unused:
+       //Real px=rig->nodes->nodes[node1].Position.x;
+       //Real py=rig->nodes->nodes[node1].Position.y;
+       //Real pz=rig->nodes->nodes[node1].Position.z;
+
+       Vector3 
axis=rig->nodes->nodes[node2].RelPosition-rig->nodes->nodes[node1].RelPosition;
+       axis.normalise();
+       Vector3 rayvec = axis.perpendicular() * radius;
+       // old rayvec:
+       //Vector3 rayvec=Vector3(0, radius, 0);
+       Quaternion rayrot=Quaternion(Degree(-360.0/(Real)(rays*2)), axis);
+       for (i=0; i<rays; i++)
        {
-               b->beams[pos].L = length;
+               //with propnodes and variable friction
+//                     init_node(nodebase+i*2, 
px+radius*sin((Real)i*6.283185307179/(Real)rays), 
py+radius*cos((Real)i*6.283185307179/(Real)rays), pz, NODE_NORMAL, 
mass/(2.0*rays),1, WHEEL_FRICTION_COEF*width);
+               Vector3 raypoint;
+               raypoint=rig->nodes->nodes[node1].RelPosition+rayvec;
+               rayvec=rayrot*rayvec;
+               NodeSerializer::init_node(rig, nodebase+i*2, raypoint.x, 
raypoint.y, raypoint.z, NODE_NORMAL, mass/(2.0*rays),1, 
WHEEL_FRICTION_COEF*width, -1, rig->wheels->free_wheel, 
rig->nodes->default_node_friction, rig->nodes->default_node_volume, 
rig->nodes->default_node_surface, NODE_LOADWEIGHT_DEFAULT);
+
+               // outer ring has wheelid%2 != 0
+               rig->nodes->nodes[nodebase+i*2].iswheel = 
rig->wheels->free_wheel*2+1;
+
+               if (contacter_wheel)
+               {
+                       
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;
+                       rig->contacters->free_contacter++;
+               }
+//                     init_node(nodebase+i*2+1, 
px+radius*sin((Real)i*6.283185307179/(Real)rays), 
py+radius*cos((Real)i*6.283185307179/(Real)rays), pz+width, NODE_NORMAL, 
mass/(2.0*rays),1, WHEEL_FRICTION_COEF*width);
+               raypoint=rig->nodes->nodes[node2].RelPosition+rayvec;
+
+               rayvec=rayrot*rayvec;
+               NodeSerializer::init_node(rig, nodebase+i*2+1, raypoint.x, 
raypoint.y, raypoint.z, NODE_NORMAL, mass/(2.0*rays),1, 
WHEEL_FRICTION_COEF*width, -1, rig->wheels->free_wheel, 
rig->nodes->default_node_friction, rig->nodes->default_node_volume, 
rig->nodes->default_node_surface, NODE_LOADWEIGHT_DEFAULT);
+
+               // inner ring has wheelid%2 == 0
+               rig->nodes->nodes[nodebase+i*2+1].iswheel = 
rig->wheels->free_wheel*2+2;
+               if (contacter_wheel)
+               {
+                       
rig->contacters->contacters[rig->contacters->free_contacter].nodeid      = 
nodebase+i*2+1;
+                       
rig->contacters->contacters[rig->contacters->free_contacter].contacted   = 0;
+                       
rig->contacters->contacters[rig->contacters->free_contacter].opticontact = 0;
+                       rig->contacters->free_contacter++;
+               }
+               //wheel object
+               rig->wheels->wheels[rig->wheels->free_wheel].nodes[i*2]   = 
&rig->nodes->nodes[nodebase+i*2];
+               rig->wheels->wheels[rig->wheels->free_wheel].nodes[i*2+1] = 
&rig->nodes->nodes[nodebase+i*2+1];
        }
-       b->beams[pos].k                 = spring;
-       b->beams[pos].d                 = damp;
-       b->beams[pos].broken            = 0;
-       b->beams[pos].Lhydro            = b->beams[pos].L;
-       b->beams[pos].refL              = b->beams[pos].L;
-       b->beams[pos].hydroRatio        = 0;
-       b->beams[pos].hydroFlags        = 0;
-       b->beams[pos].animFlags         = 0;
-       b->beams[pos].stress            = 0;
-       b->beams[pos].lastforce         = Vector3::ZERO;
-       b->beams[pos].iscentering       = false;
-       b->beams[pos].isOnePressMode    = 0;
-       b->beams[pos].isforcerestricted = false;
-       b->beams[pos].autoMovingMode    = 0;
-       b->beams[pos].autoMoveLock      = false;
-       b->beams[pos].pressedCenterMode = false;
-       b->beams[pos].disabled          = false;
-       b->beams[pos].shock             = 0;
-       if (b->default_deform < b->beam_creak)
-               b->default_deform = b->beam_creak;
-       b->beams[pos].default_deform    = b->default_deform  * 
b->default_deform_scale;
-       b->beams[pos].minmaxposnegstress = b->default_deform * 
b->default_deform_scale;
-       b->beams[pos].maxposstress      = b->default_deform  * 
b->default_deform_scale;
-       b->beams[pos].maxnegstress      = - b->beams[pos].maxposstress;
-       b->beams[pos].plastic_coef      = b->default_plastic_coef;
-       b->beams[pos].default_plastic_coef = b->default_plastic_coef;
-       b->beams[pos].strength          = strength;
-       b->beams[pos].iStrength         = strength;
-       b->beams[pos].diameter          = b->default_beam_diameter;
-       b->beams[pos].minendmass        = 1;
-       b->beams[pos].diameter          = diameter;
-       b->beams[pos].scale             = 0;
-       if (shortbound != -1.0)
+       rig->nodes->free_node += 2 * rays;
+       for (i=0; i<rays; i++)
        {
-               b->beams[pos].bounded       = SHOCK1;
-               b->beams[pos].shortbound    = shortbound;
-               b->beams[pos].longbound     = longbound;
+               //bounded
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1],        
  &rig->nodes->nodes[nodebase+i*2],              BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp, -1.0, 0.66, 0.0);
+               //bounded
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node2],        
  &rig->nodes->nodes[nodebase+i*2+1],            BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp, -1.0, 0.66, 0.0);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node2],        
  &rig->nodes->nodes[nodebase+i*2],              BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1],        
  &rig->nodes->nodes[nodebase+i*2+1],            BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               //reinforcement
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1],        
  &rig->nodes->nodes[nodebase+i*2],              BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[nodebase+i*2], 
  &rig->nodes->nodes[nodebase+i*2+1],            BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[nodebase+i*2], 
  &rig->nodes->nodes[nodebase+((i+1)%rays)*2],   BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+i*2+1], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+i*2+1], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2],   BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               //reinforcement
+               //BeamSerializer::add_beam(this, &nodes[nodebase+i*2], 
&nodes[nodebase+((i+1)%rays)*2+1], manager, parent, BEAM_INVISIBLE, 
default_break, wspring, wdamp);
 
-       } else
+               if (snode!=9999)
+               {
+                       //back beams //BEAM_VIRTUAL
+
+                       if (closest1)
+                       {
+                               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[snode], &rig->nodes->nodes[nodebase+i*2],   BEAM_VIRTUAL, 
rig->beams->default_break, wspring, wdamp);
+                       } else
+                       {
+                               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[snode], &rig->nodes->nodes[nodebase+i*2+1], BEAM_VIRTUAL, 
rig->beams->default_break, wspring, wdamp);
+                       }
+
+                       /* THIS ALMOST WORKS BUT IT IS INSTABLE AT SPEED !!!!
+                       //rigidifier version
+                       if(free_rigidifier >= MAX_RIGIDIFIERS)
+                       {
+                               
LogManager::getSingleton().logMessage("rigidifiers limit reached ...");
+                       }
+
+                       int na=(closest1)?node2:node1;
+                       int nb=(closest1)?node1:node2;
+                       int nc=snode;
+                       rigidifiers[free_rigidifier].a=&nodes[na];
+                       rigidifiers[free_rigidifier].b=&nodes[nb];
+                       rigidifiers[free_rigidifier].c=&nodes[nc];
+                       rigidifiers[free_rigidifier].k=wspring;
+                       rigidifiers[free_rigidifier].d=wdamp;
+                       
rigidifiers[free_rigidifier].alpha=2.0*acos((nodes[na].RelPosition-nodes[nb].RelPosition).getRotationTo(nodes[nc].RelPosition-nodes[nb].RelPosition).w);
+                       
rigidifiers[free_rigidifier].lastalpha=rigidifiers[free_rigidifier].alpha;
+                       rigidifiers[free_rigidifier].beama=0;
+                       rigidifiers[free_rigidifier].beamc=0;
+                       //searching for associated beams
+                       for (int i=0; i<free_beam; i++)
+                       {
+                               if ((beams[i].p1==&nodes[na] && 
beams[i].p2==&nodes[nb]) || (beams[i].p2==&nodes[na] && 
beams[i].p1==&nodes[nb])) rigidifiers[free_rigidifier].beama=&beams[i];
+                               if ((beams[i].p1==&nodes[nc] && 
beams[i].p2==&nodes[nb]) || (beams[i].p2==&nodes[nc] && 
beams[i].p1==&nodes[nb])) rigidifiers[free_rigidifier].beamc=&beams[i];
+                       }
+                       free_rigidifier++;
+                       */
+               }
+       }
+       //wheel object
+       rig->wheels->wheels[rig->wheels->free_wheel].braked           = braked;
+       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];
+       rig->wheels->wheels[rig->wheels->free_wheel].refnode1         = 
&rig->nodes->nodes[node2];
+       rig->wheels->wheels[rig->wheels->free_wheel].radius           = radius;
+       rig->wheels->wheels[rig->wheels->free_wheel].speed            = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp               = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp1              = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp2              = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp3              = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].width            = width;
+       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;
+       if (propulsed>0)
        {
-               b->beams[pos].bounded       = NOSHOCK;
+               //for inter-differential locking
+               rig->wheels->proppairs[rig->wheels->proped_wheels] = 
rig->wheels->free_wheel;
+               rig->wheels->proped_wheels++;
        }
-
-       // no visuals here
-       b->beams[pos].mSceneNode        = 0;
-       b->beams[pos].mEntity           = 0;
-
-       b->free_beam++;
-       return pos;
+       if (braked) rig->wheels->braked_wheels++;
+       //find near attach
+       Real l1 = (rig->nodes->nodes[node1].RelPosition - 
rig->nodes->nodes[torquenode].RelPosition).length();
+       Real l2 = (rig->nodes->nodes[node2].RelPosition - 
rig->nodes->nodes[torquenode].RelPosition).length();
+       if (l1 < l2)
+               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->free_wheel++;
 }
 
-void 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)
+void WheelsSerializer::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)
 {
-       nodes_section *n = rig->nodes;
-       n->nodes[pos].AbsPosition    = Vector3(x, y, z);
-       n->nodes[pos].RelPosition    = Vector3(x, y, z) - n->origin;
-       n->nodes[pos].smoothpos      = n->nodes[pos].AbsPosition;
-       n->nodes[pos].iPosition      = Vector3(x, y, z);
-       if(pos != 0)
-               n->nodes[pos].iDistance  = (n->nodes[0].AbsPosition - 
Vector3(x, y, z)).squaredLength();
-       else
-               n->nodes[pos].iDistance  = 0;
-       n->nodes[pos].Velocity       = Vector3::ZERO;
-       n->nodes[pos].Forces         = Vector3::ZERO;
-       n->nodes[pos].locked         = m < 0.0;
-       n->nodes[pos].mass           = m;
-       n->nodes[pos].iswheel        = iswheel;
-       n->nodes[pos].wheelid        = wheelid;
-       n->nodes[pos].friction_coef  = nfriction;
-       n->nodes[pos].volume_coef    = nvolume;
-       n->nodes[pos].surface_coef   = nsurface;
-       if (nloadweight >= 0.0f)
+       int i;
+       int nodebase=rig->nodes->free_node;
+       int node3;
+       int contacter_wheel=1;
+       //ignore the width parameter
+       width=(rig->nodes->nodes[node1].RelPosition - 
rig->nodes->nodes[node2].RelPosition).length();
+       //enforce the "second node must have a larger Z coordinate than the 
first" constraint
+       if (rig->nodes->nodes[node1].RelPosition.z > 
rig->nodes->nodes[node2].RelPosition.z)
        {
-               n->nodes[pos].masstype   = NODE_LOADED;
-               n->nodes[pos].overrideMass = true;
-               n->nodes[pos].mass       = nloadweight;
+               //swap
+               node3=node1;
+               node1=node2;
+               node2=node3;
        }
-       n->nodes[pos].disable_particles = false;
-       n->nodes[pos].masstype       = type;
-       n->nodes[pos].contactless    = 0;
-       n->nodes[pos].contacted      = 0;
-       n->nodes[pos].lockednode     = 0;
-       n->nodes[pos].buoyanceForce  = Vector3::ZERO;
-       n->nodes[pos].buoyancy       = rig->globals->truckmass / 
15.0f;//DEFAULT_BUOYANCY;
-       n->nodes[pos].lastdrag       = Vector3(0,0,0);
-       // XXX: TOFIX
-       //n->nodes[pos].gravimass      = Vector3(0, 
RoRFrameListener::getGravity()*m, 0);
-       n->nodes[pos].gravimass      = Vector3(0, n->gravitation * m, 0);
-       n->nodes[pos].wetstate       = DRY;
-       n->nodes[pos].isHot          = false;
-       n->nodes[pos].overrideMass   = false;
-       n->nodes[pos].id             = id;
-       n->nodes[pos].colltesttimer  = 0;
-       n->nodes[pos].iIsSkin        = false;
-       n->nodes[pos].isSkin         = n->nodes[pos].iIsSkin;
-       n->nodes[pos].pos            = pos;
-       if (type == NODE_LOADED)
-               n->masscount++;
-}
\ No newline at end of file
+       //ignore the sign of snode, just do the thing automatically
+       //if (snode<0) node3=-snode; else node3=snode;
+       if (snode<0) snode=-snode;
+       bool closest1=false;
+       if (snode!=9999) closest1=(rig->nodes->nodes[snode].RelPosition - 
rig->nodes->nodes[node1].RelPosition).length() < 
(rig->nodes->nodes[snode].RelPosition - 
rig->nodes->nodes[node2].RelPosition).length();
+
+       //unused:
+       //Real px=nodes[node1].Position.x;
+       //Real py=nodes[node1].Position.y;
+       //Real pz=nodes[node1].Position.z;
+
+       Vector3 axis = rig->nodes->nodes[node2].RelPosition - 
rig->nodes->nodes[node1].RelPosition;
+       axis.normalise();
+       Vector3 rayvec=Vector3(0, radius, 0);
+       Quaternion rayrot=Quaternion(Degree(-360.0/(Real)rays), axis);
+       Quaternion rayrot2=Quaternion(Degree(-180.0/(Real)rays), axis);
+       Vector3 rayvec2=Vector3(0, radius2, 0);
+       rayvec2=rayrot2*rayvec2;
+       //rim nodes
+       for (i=0; i<rays; i++)
+       {
+               //with propnodes
+               Vector3 raypoint=rig->nodes->nodes[node1].RelPosition+rayvec;
+               NodeSerializer::init_node(rig, nodebase+i*2, raypoint.x, 
raypoint.y, raypoint.z, NODE_NORMAL, mass/(4.0*rays),1, -1, -1, 
rig->wheels->free_wheel, rig->nodes->default_node_friction, 
rig->nodes->default_node_volume, rig->nodes->default_node_surface, 
NODE_LOADWEIGHT_DEFAULT);
+               // outer ring has wheelid%2 != 0
+               rig->nodes->nodes[nodebase+i*2].iswheel = 
rig->wheels->free_wheel*2+1;
+
+               raypoint=rig->nodes->nodes[node2].RelPosition+rayvec;
+               NodeSerializer::init_node(rig, nodebase+i*2+1, raypoint.x, 
raypoint.y, raypoint.z, NODE_NORMAL, mass/(4.0*rays),1, -1, -1, 
rig->wheels->free_wheel, rig->nodes->default_node_friction, 
rig->nodes->default_node_volume, rig->nodes->default_node_surface, 
NODE_LOADWEIGHT_DEFAULT);
+
+               // inner ring has wheelid%2 == 0
+               rig->nodes->nodes[nodebase+i*2+1].iswheel = 
rig->wheels->free_wheel*2+2;
+               //wheel object
+               rig->wheels->wheels[rig->wheels->free_wheel].nodes[i*2]   = 
&rig->nodes->nodes[nodebase+i*2];
+               rig->wheels->wheels[rig->wheels->free_wheel].nodes[i*2+1] = 
&rig->nodes->nodes[nodebase+i*2+1];
+               rayvec=  rayrot*rayvec;
+       }
+       //tire nodes
+       for (i=0; i<rays; i++)
+       {
+               //with propnodes and variable friction
+               Vector3 raypoint=rig->nodes->nodes[node1].RelPosition+rayvec2;
+               NodeSerializer::init_node(rig, nodebase+2*rays+i*2, raypoint.x, 
raypoint.y, raypoint.z, NODE_NORMAL, 0.67*mass/(2.0*rays),1, 
WHEEL_FRICTION_COEF*width, -1, rig->wheels->free_wheel, 
rig->nodes->default_node_friction, rig->nodes->default_node_volume, 
rig->nodes->default_node_surface);
+               // outer ring has wheelid%2 != 0
+               rig->nodes->nodes[nodebase+2*rays+i*2].iswheel = 
rig->wheels->free_wheel*2+1;
+               if (contacter_wheel)
+               {
+                       
rig->contacters->contacters[rig->contacters->free_contacter].nodeid      = 
nodebase+2*rays+i*2;
+                       
rig->contacters->contacters[rig->contacters->free_contacter].contacted   = 0;
+                       
rig->contacters->contacters[rig->contacters->free_contacter].opticontact = 0;
+                       rig->contacters->free_contacter++;;
+               }
+               raypoint=rig->nodes->nodes[node2].RelPosition+rayvec2;
+               NodeSerializer::init_node(rig, nodebase+2*rays+i*2+1, 
raypoint.x, raypoint.y, raypoint.z, NODE_NORMAL, 0.33*mass/(2.0*rays),1, 
WHEEL_FRICTION_COEF*width, -1,  rig->wheels->free_wheel, 
rig->nodes->default_node_friction, rig->nodes->default_node_volume, 
rig->nodes->default_node_surface);
+
+               // inner ring has wheelid%2 == 0
+               rig->nodes->nodes[nodebase+2*rays+i*2+1].iswheel = 
rig->wheels->free_wheel*2+2;
+               if (contacter_wheel)
+               {
+                       
rig->contacters->contacters[rig->contacters->free_contacter].nodeid      = 
nodebase+2*rays+i*2+1;
+                       
rig->contacters->contacters[rig->contacters->free_contacter].contacted   = 0;
+                       
rig->contacters->contacters[rig->contacters->free_contacter].opticontact = 0;
+                       rig->contacters->free_contacter++;;
+               }
+               //wheel object
+//                     
wheels->wheels[free_wheel].nodes[i*2]=&nodes[nodebase+i*2];
+//                     
wheels->wheels[free_wheel].nodes[i*2+1]=&nodes[nodebase+i*2+1];
+               rayvec2=rayrot*rayvec2; //this is not a bug
+       }
+       rig->nodes->free_node += 4 * rays;
+       for (i=0; i<rays; i++)
+       {
+               //rim
+               //bounded
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1], 
&rig->nodes->nodes[nodebase+i*2], BEAM_INVISIBLE, rig->beams->default_break, 
wspring, wdamp, -1.0, 0.66, 0.0);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node2], 
&rig->nodes->nodes[nodebase+i*2+1], BEAM_INVISIBLE, rig->beams->default_break, 
wspring, wdamp, -1.0, 0.66, 0.0);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node2], 
&rig->nodes->nodes[nodebase+i*2], BEAM_INVISIBLE, rig->beams->default_break, 
wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1], 
&rig->nodes->nodes[nodebase+i*2+1], BEAM_INVISIBLE, rig->beams->default_break, 
wspring, wdamp);
+               //reinforcement
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1], 
&rig->nodes->nodes[nodebase+i*2], BEAM_INVISIBLE, rig->beams->default_break, 
wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[nodebase+i*2], 
&rig->nodes->nodes[nodebase+i*2+1], BEAM_INVISIBLE, rig->beams->default_break, 
wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[nodebase+i*2], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+i*2+1], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               BeamSerializer::add_beam(rig, &rig->nodes->nodes[nodebase+i*2], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               //reinforcement
+               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+i*2+1], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring, wdamp);
+               if (snode!=9999)
+               {
+                       //back beams
+                       if (closest1)
+                       {
+                               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[snode], &rig->nodes->nodes[nodebase+i*2], BEAM_VIRTUAL, 
rig->beams->default_break, wspring, wdamp);
+                       } else
+                       {
+                               BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[snode], &rig->nodes->nodes[nodebase+i*2+1], BEAM_VIRTUAL, 
rig->beams->default_break, wspring, wdamp);
+                       }
+               }
+               //tire
+               //band
+               //init_beam(free_beam , &nodes[nodebase+2*rays+i*2], 
&nodes[nodebase+2*rays+i*2+1], BEAM_INVISIBLE, rig->beams->default_break, 
wspring2, wdamp2);
+               //pressure_beams[free_pressure_beam]=free_beam-1; 
free_pressure_beam++;
+               int pos;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2], 
&rig->nodes->nodes[nodebase+2*rays+((i+1)%rays)*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2], 
&rig->nodes->nodes[nodebase+2*rays+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], 
&rig->nodes->nodes[nodebase+2*rays+((i+1)%rays)*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], 
&rig->nodes->nodes[nodebase+2*rays+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               //walls
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2], &rig->nodes->nodes[nodebase+i*2], 
BEAM_INVISIBLE, rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], &rig->nodes->nodes[nodebase+i*2+1], 
BEAM_INVISIBLE, rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               //reinforcement
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2], &rig->nodes->nodes[nodebase+i*2+1], 
BEAM_INVISIBLE, rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], &rig->nodes->nodes[nodebase+i*2], 
BEAM_INVISIBLE, rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], 
&rig->nodes->nodes[nodebase+((i+1)%rays)*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               //backpressure, bounded
+               pos=BeamSerializer::add_beam(rig, &rig->nodes->nodes[node1], 
&rig->nodes->nodes[nodebase+2*rays+i*2], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2, -1.0, radius/radius2, 0.0);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+               pos=BeamSerializer::add_beam(rig, &rig->nodes->nodes[node2], 
&rig->nodes->nodes[nodebase+2*rays+i*2+1], BEAM_INVISIBLE, 
rig->beams->default_break, wspring2, wdamp2, -1.0, radius/radius2, 0.0);
+               rig->beams->pressure_beams[rig->beams->free_pressure_beam]=pos; 
rig->beams->free_pressure_beam++;
+       }
+       //wheel object
+       rig->wheels->wheels[rig->wheels->free_wheel].braked     = braked;
+       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];
+       rig->wheels->wheels[rig->wheels->free_wheel].refnode1   = 
&rig->nodes->nodes[node2];
+       rig->wheels->wheels[rig->wheels->free_wheel].radius     = radius;
+       rig->wheels->wheels[rig->wheels->free_wheel].speed      = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].width      = width;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp         = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp1        = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp2        = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].rp3        = 0;
+       rig->wheels->wheels[rig->wheels->free_wheel].arm        = 
&rig->nodes->nodes[torquenode];
+       if (propulsed)
+       {
+               //for inter-differential locking
+               rig->wheels->proppairs[rig->wheels->proped_wheels] = 
rig->wheels->free_wheel;
+               rig->wheels->proped_wheels++;
+       }
+       if (braked) rig->wheels->braked_wheels++;
+       
+       //find near attach
+       Real l1 = (rig->nodes->nodes[node1].RelPosition - 
rig->nodes->nodes[torquenode].RelPosition).length();
+       Real l2 = (rig->nodes->nodes[node2].RelPosition - 
rig->nodes->nodes[torquenode].RelPosition).length();
+       if (l1 < l2)
+               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->free_wheel++;
+}

Modified: trunk/source/serializer/serializationmodules.h
===================================================================
--- trunk/source/serializer/serializationmodules.h      2010-05-10 15:50:17 UTC 
(rev 1384)
+++ trunk/source/serializer/serializationmodules.h      2010-05-13 23:18:25 UTC 
(rev 1385)
@@ -5,11 +5,6 @@
 // format description:
 // http://wiki.rigsofrods.com/pages/Truck_Description_File
 
-
-// global functions
-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);
-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);
-
 // the serialization modules
 class RoRSerializer;
 
@@ -29,6 +24,9 @@
        void initData(rig_t *rig);
        int deserialize(char *line, rig_t *rig);
        int serialize(char *line, 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);
+
 };
 
 class BeamSerializer : public RoRSerializationModule
@@ -38,6 +36,8 @@
        void initData(rig_t *rig);
        int deserialize(char *line, rig_t *rig);
        int serialize(char *line, 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);
 };
 
 
@@ -99,3 +99,17 @@
        int deserialize(char *line, rig_t *rig);
        int serialize(char *line, rig_t *rig);
 };
+
+class WheelsSerializer : public RoRSerializationModule
+{
+public:
+       WheelsSerializer(RoRSerializer *s);
+       void initData(rig_t *rig);
+       int deserialize(char *line, rig_t *rig);
+       int serialize(char *line, 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);
+
+};

Modified: trunk/source/serializer/serializer.cpp
===================================================================
--- trunk/source/serializer/serializer.cpp      2010-05-10 15:50:17 UTC (rev 
1384)
+++ trunk/source/serializer/serializer.cpp      2010-05-13 23:18:25 UTC (rev 
1385)
@@ -18,12 +18,13 @@
        new NodeSerializer(this);
        new BeamSerializer(this);
 
-       new FileInfoSerializer(this);
-       new AuthorSerializer(this);
        new EngineSerializer(this);
        new CamerasSerializer(this);
        new ShocksSerializer(this);
        new HydrosSerializer(this);
+
+       new FileInfoSerializer(this);
+       new AuthorSerializer(this);
 }
 
 RoRSerializer::~RoRSerializer()
@@ -100,24 +101,37 @@
        modules[module->getName()] = module;
        return 0;
 }
+void RoRSerializer::addSectionHandler(std::string section, 
RoRSerializationModule *module)
+{
+       sections[section] = module;
+}
 
+
+void RoRSerializer::addCommandHandler(std::string command, 
RoRSerializationModule *module)
+{
+       commands[command] = module;
+}
+
 int RoRSerializer::processModules(char *line, rig_t *rig, SerializationContext 
*ctx, std::string &activeSection)
 {
        // parse for commands or other sections
+       // commands
        std::map < std::string, RoRSerializationModule *>::iterator it;
-       for(it = modules.begin(); it != modules.end() ; it++)
+       for(it = commands.begin(); it != commands.end() ; it++)
        {
                // check if that command is matched
-               std::string *cmd = &it->second->commandTrigger;
-               if(cmd->size() && !strncmp(cmd->c_str(), line, cmd->size()))
+               if(it->first.size() && !strncmp(it->first.c_str(), line, 
it->first.size()))
                {
-                       // match, using this module
-                       return it->second->deserialize(line, rig);
+               // match, using this module
+               return it->second->deserialize(line, rig);
                }
+       }
 
+       // sections
+       for(it = sections.begin(); it != sections.end() ; it++)
+       {
                // check for a new section
-               std::string *sec = &it->second->sectionTrigger;
-               if(sec->size() && !strcmp(sec->c_str(), line))
+               if(it->first.size() && !strcmp(it->first.c_str(), line))
                {
                        // match, using this module
                        //set section as active
@@ -131,7 +145,7 @@
        if(!activeSection.empty())
        {
                // just try to use that section and ignore the others
-               return modules[activeSection]->deserialize(line, rig);
+               return sections[activeSection]->deserialize(line, rig);
        }
 
        // no match

Modified: trunk/source/serializer/serializer.h
===================================================================
--- trunk/source/serializer/serializer.h        2010-05-10 15:50:17 UTC (rev 
1384)
+++ trunk/source/serializer/serializer.h        2010-05-13 23:18:25 UTC (rev 
1385)
@@ -57,9 +57,16 @@
        int saveRig(std::string filename, rig_t *rig);
 
        int registerModuleSerializer(RoRSerializationModule *module);
+       void addSectionHandler(std::string section, RoRSerializationModule 
*module);
+       void addCommandHandler(std::string section, RoRSerializationModule 
*module);
+
 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;
 };
 
@@ -70,8 +77,6 @@
        RoRSerializationModule(RoRSerializer *s) :
                s(s),
                name(),
-               commandTrigger(),
-               sectionTrigger(),
                initiated(false)
        {
        }
@@ -85,8 +90,6 @@
 protected:
        RoRSerializer *s;
        std::string name;
-       std::string commandTrigger;
-       std::string sectionTrigger;
        bool initiated;
 
        // some utils


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