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