Revision: 1556
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=1556&view=rev
Author:   aperion
Date:     2010-12-19 05:45:25 +0000 (Sun, 19 Dec 2010)

Log Message:
-----------
small cleanup of engine code as well as conversion  from float * to 
std::vector<float>. which in turn allowed the removal of limits on gears. This 
change also removes the requirement that the gear ratio list ends with  -1.0

Modified Paths:
--------------
    trunk/source/main/BeamLoadTruck.cpp
    trunk/source/main/engine.cpp
    trunk/source/main/engine.h

Modified: trunk/source/main/BeamLoadTruck.cpp
===================================================================
--- trunk/source/main/BeamLoadTruck.cpp 2010-12-18 23:44:25 UTC (rev 1555)
+++ trunk/source/main/BeamLoadTruck.cpp 2010-12-19 05:45:25 UTC (rev 1556)
@@ -1481,29 +1481,53 @@
                else if (mode==9)
                {
                        //parse engine
-                       float minrpm, maxrpm, torque, dratio, rear;
-                       float gears[16];
-                       int numgears;
                        if(driveable == MACHINE)
                                continue;
 
                        driveable=TRUCK;
-                       int result = sscanf(line,"%f, %f, %f, %f, %f, %f, %f, 
%f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f, %f", &minrpm, &maxrpm, 
&torque, &dratio, &rear, 
&gears[0],&gears[1],&gears[2],&gears[3],&gears[4],&gears[5],&gears[6],&gears[7],&gears[8],&gears[9],&gears[10],&gears[11],&gears[12],&gears[13],&gears[14],&gears[15]);
-                       if (result < 7 || result == EOF) {
+                       Ogre::vector<Ogre::String>::type tmp = 
Ogre::StringUtil::split(line, ", ");
+                       if (tmp.size() < 7) {
                                LogManager::getSingleton().logMessage("Error 
parsing File (Engine) " + String(fname) +" line " + 
StringConverter::toString(linecounter) + ". trying to continue ...");
                                continue;
                        }
-                       for (numgears=0; numgears<16; numgears++)
-                               if (gears[numgears]<=0)
-                                       break;
-                       if (numgears < 3)
+
+                       float minrpm = Ogre::StringConverter::parseReal(tmp[0]);
+                       tmp.erase(tmp.begin());
+                       float maxrpm = Ogre::StringConverter::parseReal(tmp[0]);
+                       tmp.erase(tmp.begin());
+                       float torque = Ogre::StringConverter::parseReal(tmp[0]);
+                       tmp.erase(tmp.begin());
+                       float dratio = Ogre::StringConverter::parseReal(tmp[0]);
+                       tmp.erase(tmp.begin());
+
+                       std::vector<float> gears;
+
+                       for(Ogre::vector< Ogre::String >::type::iterator it = 
tmp.begin(); it != tmp.end(); it++)
                        {
+                               float tmpf = 
Ogre::StringConverter::parseReal((*it), -1.0);
+                               if( tmpf <= 0.0f ) break;
+                               gears.push_back(tmpf);
+                       }
+                       if (gears.size() < 5) // 5 -2 = 3, 2 extra gears that 
don't count, one for reverse and one for neutral
+                       {
                                LogManager::getSingleton().logMessage("Trucks 
with less than 3 gears are not supported! " + String(fname) +" line " + 
StringConverter::toString(linecounter) + ". trying to continue ...");
                                continue;
                        }
                        //if (audio) audio->setupEngine();
 
-                       engine = new BeamEngine(minrpm, maxrpm, torque, rear, 
numgears - 1, gears, dratio, trucknum);
+                       engine = new BeamEngine(minrpm, maxrpm, torque, gears, 
dratio, trucknum);
+
+                       // are there any startup shifter settings?
+                       Ogre::String gearboxMode = 
SETTINGS.getSetting("GearboxMode");
+                       if (gearboxMode == "Manual shift - Auto clutch")
+                               engine->setAutoMode(SEMIAUTO);
+                       else if (gearboxMode == "Fully Manual: sequential 
shift")
+                               engine->setAutoMode(MANUAL);
+                       else if (gearboxMode == "Fully Manual: stick shift")
+                               engine->setAutoMode(MANUAL_STICK);
+                       else if (gearboxMode == "Fully Manual: stick shift with 
ranges")
+                               engine->setAutoMode(MANUAL_RANGES);
+                       
                        //engine->start();
                }
 

Modified: trunk/source/main/engine.cpp
===================================================================
--- trunk/source/main/engine.cpp        2010-12-18 23:44:25 UTC (rev 1555)
+++ trunk/source/main/engine.cpp        2010-12-19 05:45:25 UTC (rev 1556)
@@ -20,70 +20,73 @@
 #include "engine.h"
 #include "SoundScriptManager.h"
 #include "TorqueCurve.h"
-#include "Settings.h"
 
 #ifdef USE_ANGELSCRIPT
 #include "ScriptEngine.h"
 #endif
 
-BeamEngine::BeamEngine(float iddle, float max, float torque, float rear, int 
numgears, float *gears, float diff, int trucknum)
-{
-       int i;
-       this->trucknum=trucknum;
+BeamEngine::BeamEngine(
+float iddle
+, float max
+, float torque
+, std::vector<float> gears
+, float diff
+, int trucknum)
+
+: clutch_time(0.2f)
+, shift_time(0.5f)
+, post_shift_time(0.2f)
+
+, numGears(gears.size() - 2)
+, gearsRatio( gears )
+, inertia(10.0)
+, clutchForce(10000.0f)
+
+, curGear(0)
+
+, curEngineRPM(0.0f)
+, curGearboxRPM(0.0f)
+, curClutch(0.0f)
+, curAcc(0.0f)
+, curClutchTorque(0.0f)
+
+, shifting(0)
+, postshifting(0)
+
+, autocurAcc(0)
+, starter(0)
+, autoselect(DRIVE)
+
+, curTurboRPM(0.0f)
+, apressure(0)
+, automode(AUTOMATIC)
+, trucknum(trucknum)
+
 #ifdef USE_OPENAL
-       ssm=SoundScriptManager::getSingleton();
+,      ssm(SoundScriptManager::getSingleton())
 #endif //OPENAL
-       torqueCurve = new TorqueCurve();
-       automode=AUTOMATIC;
-       iddleRPM=iddle;
-       maxRPM=max;
-       engineTorque=torque;
-       brakingTorque=-engineTorque/5.0f;
-       engineTorque-=brakingTorque;
-       reverseRatio=rear*diff;
-       numGears=numgears;
-       numGearsRanges = numGears/6+1; 
-       gearsRatio = new float[numGears + 1];
-       for (i=1; i<numGears+1; i++) gearsRatio[i]=gears[i]*diff;
-       curGear=0;
-       curEngineRPM=0;
-       curGearboxRPM=0;
-       curTurboRPM=0;
-       curClutch=0;
-       running=0;
-       contact=0;
-       curAcc=0;
-       autocurAcc=0;
-       curClutchTorque=0.0f;
-       inertia=10.0;
-       clutchForce=10000.0f;
-       stallRPM=300.0f;
-       shifting=0;
-       postshifting=0;
-       starter=0;
-       prime=0;
-       hydropump=0.0;
-       apressure=0;
-       autoselect=DRIVE;
-       hasturbo=true;
-       hasair=true;
-       type='t';
+, torqueCurve (new TorqueCurve())
 
-       // are there any startup shifter settings?
-       Ogre::String gearboxMode = SETTINGS.getSetting("GearboxMode");
-       if (gearboxMode == "Manual shift - Auto clutch")
-               automode = SEMIAUTO;
-       else if (gearboxMode == "Fully Manual: sequential shift")
-               automode = MANUAL;
-       else if (gearboxMode == "Fully Manual: stick shift")
-               automode = MANUAL_STICK;
-       else if (gearboxMode == "Fully Manual: stick shift with ranges")
-               automode = MANUAL_RANGES;
 
-       // set previous hardcoded clutch/shift time defaults
-       clutch_time     = 0.2f;
-       shift_time      = 0.5f;
-       post_shift_time = 0.2f;
+, iddleRPM(iddle)
+, maxRPM(max)
+, stallRPM(300.0f)
+, brakingTorque(-torque/5.0f)
+, engineTorque(torque - brakingTorque)
+
+, hasturbo(true)
+, hasair(true)
+, type('t')
+, running(0)
+, contact(0)
+, hydropump(0.0)
+, prime(0)
+{
+       gearsRatio[0] = -gearsRatio[0];
+       for(std::vector< float >::iterator it = gearsRatio.begin(); it != 
gearsRatio.end(); it++)
+       {
+               (*it) *= diff;
+       }
 }
 
 void BeamEngine::setOptions(float einertia, char etype, float eclutch, float 
ctime, float stime, float pstime)
@@ -151,7 +154,7 @@
        float rpmRatio = curEngineRPM / maxRPM;
        if (rpmRatio > 1.0f) rpmRatio = 1.0f;
        if (torqueCurve) tqValue = torqueCurve->getEngineTorque(rpmRatio);
-       if (contact && running && curEngineRPM<(maxRPM*1.25) && 
curEngineRPM>stallRPM)
+       if (running && contact && curEngineRPM<(maxRPM*1.25) && 
curEngineRPM>stallRPM)
                totaltorque += engineTorque * curAcc * tqValue;
        if (running && curEngineRPM<stallRPM) stop();
        //starter
@@ -166,21 +169,20 @@
        }
        //clutch
        float retorque=0.0f;
-       if (curGear<0) 
-               retorque=-curClutchTorque/reverseRatio;
-       else if (curGear>0)
-               retorque=curClutchTorque/gearsRatio[curGear];
-       totaltorque-=retorque;
+       if (curGear)
+               retorque=curClutchTorque/gearsRatio[curGear + 1];
+       
+       totaltorque -= retorque;
+       
        //integration
-       curEngineRPM+=dt*totaltorque/inertia;
+       curEngineRPM += dt*totaltorque/inertia;
 
        //update clutch torque
        float gearboxspinner=0.0f;
-       if (curGear<0) 
-               gearboxspinner=-curEngineRPM/reverseRatio;
-       else if (curGear>0)
-               gearboxspinner=curEngineRPM/gearsRatio[curGear];
-       if (curGear!=0) 
curClutchTorque=(gearboxspinner-curGearboxRPM)*curClutch*clutchForce;
+       if (curGear){
+               gearboxspinner = curEngineRPM/gearsRatio[curGear + 1];
+               curClutchTorque = 
(gearboxspinner-curGearboxRPM)*curClutch*clutchForce;
+       }       
        else curClutchTorque=0.0f;
 
        if (curEngineRPM<0.0f) curEngineRPM=0.0f;
@@ -190,23 +192,31 @@
                //autoshift
                if (shifting)
                {
-                       shiftclock+=dt;
+                       shiftclock += dt;
+                       
                        //clutch
-                       if (shiftclock<clutch_time) 
curClutch=1.0f-(shiftclock/clutch_time);
-                       else if (shiftclock>(shift_time-clutch_time)) 
curClutch=1.0f-(shift_time-shiftclock)/clutch_time;
-                       else curClutch=0.0f;
+                       if (shiftclock < clutch_time)
+                               curClutch = 1.0f - (shiftclock/clutch_time);
+                       else if (shiftclock > (shift_time - clutch_time))
+                               curClutch = 1.0f - (shift_time - 
shiftclock)/clutch_time;
+                       else curClutch = 0.0f;
+                       
                        //shift
                        if (shiftval && shiftclock>clutch_time/2)
                        {
 #ifdef USE_OPENAL
                                if(ssm) ssm->trigStart(trucknum, SS_TRIG_SHIFT);
 #endif //OPENAL
-                               curGear+=shiftval;
-                               if (automode==AUTOMATIC) while (curGear>2 && 
curGearboxRPM*gearsRatio[curGear]<iddleRPM) curGear-=2;
-                               if (curGear<-1) curGear=-1;
-                               if (curGear>numGears) curGear=numGears;
-                               shiftval=0;
+                               curGear += shiftval;
+                               if (automode == AUTOMATIC)
+                                       while (curGear > 2 && curGearboxRPM * 
gearsRatio[curGear + 1] < iddleRPM)
+                                               curGear -= 2;
+                               
+                               if (curGear < -1) curGear = -1;
+                               if (curGear > numGears) curGear = numGears;
+                               shiftval = 0;
                        };
+                       
                        //end of shifting
                        if (shiftclock>shift_time)
                        {
@@ -220,6 +230,7 @@
                                postshiftclock=0.0;
                        }
                }
+               
                if (postshifting)
                {
                        postshiftclock+=dt;
@@ -234,48 +245,65 @@
                } else if (postshifting)
                {
                        //we are postshifting, no gear change
-                       if (curEngineRPM<stallRPM*1.2 && curAcc<0.5) 
curClutch=0; else curClutch=1.0;
-               } else
+                       if (curEngineRPM<stallRPM*1.2 && curAcc<0.5) 
curClutch=0;
+                       else curClutch=1.0;
+               } else if (curEngineRPM<stallRPM*1.2 && curAcc<0.5)
                {
-                       //we are normal
-                       if (curEngineRPM<stallRPM*1.2 && curAcc<0.5) 
{curClutch=0; /*curGear=0;*/} else
+                       curClutch=0; /*curGear=0;*/
+               } else if (curGear==1 || curGear==-1)
+               {
+                       //1st gear : special
+                       if (curEngineRPM>iddleRPM)
                        {
-                               //if (curGear==0 && curEngineRPM>iddleRPM && 
curAcc>0.5) curGear=1;
-                               if (curGear==1 || curGear==-1)
-                               {
-                                       //1st gear : special
-                                       if (curEngineRPM>iddleRPM) 
{curClutch=((curEngineRPM-iddleRPM)/(maxRPM-iddleRPM));if (curClutch>1.0) 
curClutch=1.0;}
-                                       else curClutch=0.0;
-                               }
-                               else curClutch=1.0;
+                               curClutch = ((curEngineRPM - iddleRPM)/(maxRPM 
- iddleRPM));
+                               if (curClutch>1.0) curClutch=1.0;
                        }
+                       else curClutch=0.0;
                }
+               else curClutch=1.0;
        }
-       //audio stuff
+
+       //audio stuff   
+       updateAudio(doUpdate);
+}
+
+void BeamEngine::updateAudio(int doUpdate)
+{
 #ifdef USE_OPENAL
-       if (hasturbo && ssm) ssm->modulate(trucknum, SS_MOD_TURBO, curTurboRPM);
+       
+       // check if we have audio now instead of multiple places
+       if( !ssm ) return;
+       
+       if (hasturbo) ssm->modulate(trucknum, SS_MOD_TURBO, curTurboRPM);
        if (doUpdate)
        {
-               if(ssm) ssm->modulate(trucknum, SS_MOD_ENGINE, curEngineRPM);
-               if(ssm) ssm->modulate(trucknum, SS_MOD_TORQUE, curClutchTorque);
-               if(ssm) ssm->modulate(trucknum, SS_MOD_GEARBOX, curGearboxRPM);
+               ssm->modulate(trucknum, SS_MOD_ENGINE, curEngineRPM);
+               ssm->modulate(trucknum, SS_MOD_TORQUE, curClutchTorque);
+               ssm->modulate(trucknum, SS_MOD_GEARBOX, curGearboxRPM);
                //gear hack
                if (curGear<0 || automode!=AUTOMATIC) return;
-               if (!shifting && !postshifting && curEngineRPM>maxRPM-100.0 && 
curGear<numGears && autoselect==DRIVE) shift(1);
-               if (!shifting && !postshifting && curEngineRPM<iddleRPM && 
curGear>1 && autoselect==DRIVE) shift(-1);
+               
+               if (!shifting && !postshifting && autoselect == DRIVE)
+               {
+                       if(curEngineRPM > maxRPM-100.0 && curGear < numGears ) 
shift(1);
+                       else if(curEngineRPM < iddleRPM && curGear > 1 ) 
shift(-1);
+               }
+               
        }
        // reverse gear beep
-       if (curGear==-1 && running && ssm) 
+       if (curGear==-1 && running) 
        {
                ssm->trigStart(trucknum, SS_TRIG_REVERSE_GEAR);
        }
-       else if(ssm)
+       else
        {
                ssm->trigStop(trucknum, SS_TRIG_REVERSE_GEAR);
        }
 #endif //OPENAL
+       
 }
 
+
 float BeamEngine::getRPM()
 {
        return curEngineRPM;
@@ -307,6 +335,11 @@
        return automode;
 }
 
+void BeamEngine::setAutoMode(int mode)
+{
+       automode = mode;
+}
+
 void BeamEngine::setAcc(float val)
 {
        if (prime)
@@ -588,6 +621,6 @@
 BeamEngine::~BeamEngine()
 {
        // delete NULL is safe
-       delete gearsRatio; gearsRatio = NULL;
+       //delete gearsRatio; gearsRatio = NULL;
        delete torqueCurve; torqueCurve = NULL;
 }

Modified: trunk/source/main/engine.h
===================================================================
--- trunk/source/main/engine.h  2010-12-18 23:44:25 UTC (rev 1555)
+++ trunk/source/main/engine.h  2010-12-19 05:45:25 UTC (rev 1556)
@@ -20,20 +20,15 @@
 #ifndef __Engine_H__
 #define __Engine_H__
 
-#include "Ogre.h"
-#if OGRE_PLATFORM == OGRE_PLATFORM_WIN32
-#include <windows.h>
-#endif
 
 class SoundScriptManager;
 class TorqueCurve;
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <vector>
 #include "rormemory.h"
 
-//#include "Ogre.h"
-//using namespace Ogre;
 #define AUTOMATIC 0
 #define SEMIAUTO 1
 #define MANUAL 2
@@ -49,10 +44,8 @@
        float shift_time;
        float post_shift_time;
 
-       float reverseRatio;
        int numGears;
-       int numGearsRanges;
-       float *gearsRatio;
+       std::vector<float> gearsRatio;
        float inertia;
        float clutchForce;
 
@@ -86,8 +79,8 @@
        float iddleRPM;
        float maxRPM;
        float stallRPM;
-       float engineTorque;
        float brakingTorque;
+       float engineTorque;
 
        bool hasturbo;
        bool hasair;
@@ -98,13 +91,17 @@
        float hydropump;
        int prime;
 
-       BeamEngine(float iddle, float max, float torque, float rear, int 
numgears, float *gears, float diff, int trucknum);
+       BeamEngine(float iddle, float max, float torque, std::vector<float> 
gears, float diff, int trucknum);
        void setOptions(float einertia, char etype, float eclutch, float ctime, 
float stime, float pstime);
        void update(float dt, int doUpdate);
+       void updateAudio(int doUpdate);
        float getRPM();
        void setRPM(float value);
+       
        void toggleAutoMode();
        int getAutoMode();
+       void setAutoMode(int mode);
+       
        void setAcc(float val);
        float getTurboPSI();
        float getAcc();
@@ -138,11 +135,12 @@
        void autoShiftDown();
        int getAutoShift();
        void setManualClutch(float val);
-       int getNumGears() { return numGears; };
-       int getNumGearsRanges() {return numGearsRanges; }
+       int getNumGears() { return gearsRatio.size() - 2; };
+       int getNumGearsRanges() {return getNumGears()/6+1; }
        float getMaxRPM() { return maxRPM; };
        TorqueCurve *getTorqueCurve() { return torqueCurve; };
        ~BeamEngine();
 };
 
+
 #endif


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

------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Rigsofrods-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to