forked from speed-dreams/speed-dreams-code
add fuel consumption to all sim engines and use it to compute laps remaining in osg hud
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@7036 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: ad6502c587bc7cd80a0add0bbadb03253d01e63f Former-commit-id: 1bef4a5994524ae82eb5a5874eddcebd264b9717
This commit is contained in:
parent
fccb3f00f1
commit
1231a16803
11 changed files with 144 additions and 62 deletions
|
@ -191,6 +191,7 @@ typedef struct
|
|||
tdble distFromStartLine;
|
||||
int currentSector;
|
||||
int nbSectors;
|
||||
double trackLength;
|
||||
double scheduledEventTime;
|
||||
tTrackOwnPit *pit;
|
||||
int event;
|
||||
|
@ -223,6 +224,7 @@ typedef struct
|
|||
#define _distFromStartLine race.distFromStartLine
|
||||
#define _currentSector race.currentSector
|
||||
#define _nbSectors race.nbSectors
|
||||
#define _trackLength race.trackLength
|
||||
#define _pit race.pit
|
||||
#define _scheduledEventTime race.scheduledEventTime
|
||||
#define _event race.event
|
||||
|
|
|
@ -667,17 +667,7 @@ SDHUD::SDHUD()
|
|||
_cameraHUD = new osg::Camera;
|
||||
|
||||
//initialize some vars
|
||||
this->startingFuel = 0.0;
|
||||
this->remainingFuelForLaps = 0.0f;
|
||||
|
||||
//
|
||||
this->laptimeFreezeCountdown = 3.0f; //keep display for x seconds
|
||||
this->laptimeFreezeTime = 0.0f;
|
||||
this->timeDiffFreezeCountdown = 8.0f; //keep display for x seconds
|
||||
this->timeDiffFreezeTime = 0.0f;
|
||||
this->oldSector = 0;
|
||||
this->oldLapNumber = 0;
|
||||
|
||||
this->lastCar = NULL;
|
||||
this->hudScale = 1.0f;
|
||||
}
|
||||
|
||||
|
@ -732,6 +722,17 @@ SDHUD::DispDebug(const tSituation *s, const SDFrameInfo* frame)
|
|||
void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
||||
const tCarElt *currCar)
|
||||
{
|
||||
CarData &data = carData[currCar];
|
||||
|
||||
// reset timers if car changes
|
||||
if (currCar != lastCar)
|
||||
{
|
||||
data.oldSector = currCar->_currentSector;
|
||||
data.oldLapNumber = currCar->_laps;
|
||||
data.laptimeFreezeTime = 0.0;
|
||||
data.timeDiffFreezeTime = 0.0;
|
||||
lastCar = currCar;
|
||||
}
|
||||
|
||||
//update all the graphs
|
||||
typedef std::map<std::string,OSGPLOT* >::iterator it_type;
|
||||
|
@ -848,14 +849,14 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
|||
mapKey.str("");
|
||||
mapKey << "board-player" << id << "-timediff";
|
||||
|
||||
if(this->oldLapNumber != currCar->_laps)
|
||||
if( data.oldLapNumber != currCar->_laps)
|
||||
{
|
||||
this->timeDiffFreezeTime = GfTimeClock();
|
||||
data.timeDiffFreezeTime = GfTimeClock();
|
||||
}
|
||||
|
||||
if ( GfTimeClock() < (this->timeDiffFreezeTime + this->timeDiffFreezeCountdown))
|
||||
if ( GfTimeClock() < (data.timeDiffFreezeTime + data.timeDiffFreezeCountdown))
|
||||
{
|
||||
this->oldLapNumber = currCar->_laps;
|
||||
data.oldLapNumber = currCar->_laps;
|
||||
|
||||
std::ostringstream tempStr;
|
||||
tempStr.str("");
|
||||
|
@ -905,21 +906,20 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
|||
temp.str("");
|
||||
temp << currCar->_laps;
|
||||
hudTextElements["lap-container-currentlap"]->setText(temp.str());
|
||||
//car_->_deltaBestLapTimefuel
|
||||
|
||||
|
||||
//laptime
|
||||
|
||||
if( this->oldSector != currCar->_currentSector)
|
||||
if (data.oldSector != currCar->_currentSector)
|
||||
{
|
||||
this->laptimeFreezeTime = GfTimeClock();
|
||||
this->oldSector = currCar->_currentSector;
|
||||
data.laptimeFreezeTime = GfTimeClock();
|
||||
data.oldSector = currCar->_currentSector;
|
||||
|
||||
if (currCar->_currentSector == 0)
|
||||
{
|
||||
hudTextElements["laptime-last-time"]->setText(formatLaptime(currCar->_lastLapTime,0));
|
||||
|
||||
if(currCar->_lastLapTime == currCar->_bestLapTime)
|
||||
if (currCar->_lastLapTime == currCar->_bestLapTime)
|
||||
{
|
||||
this->hudImgElements["laptime-last-background-green"]->setNodeMask(NODE_MASK_ALL);
|
||||
this->hudImgElements["laptime-last-background-normal"]->setNodeMask(NODE_MASK_NONE);
|
||||
|
@ -935,14 +935,13 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
|||
this->hudImgElements["laptime-last-background-green"]->setNodeMask(NODE_MASK_NONE);
|
||||
this->hudImgElements["laptime-last-background-red"]->setNodeMask(NODE_MASK_NONE);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
float currentPrevSectorSplitTime = currCar->_curSplitTime[currCar->_currentSector - 1]; // our time in the sector we have "just" run over
|
||||
float bestPrevSectorSplitTime = currCar->_bestSplitTime[currCar->_currentSector-1]; // the best split time of the sector we are in this moment
|
||||
|
||||
if(currentPrevSectorSplitTime < bestPrevSectorSplitTime)
|
||||
if (currentPrevSectorSplitTime < bestPrevSectorSplitTime)
|
||||
{
|
||||
this->hudImgElements["laptime-last-background-normal"]->setNodeMask(NODE_MASK_NONE);
|
||||
this->hudImgElements["laptime-last-background-grey"]->setNodeMask(NODE_MASK_NONE);
|
||||
|
@ -961,12 +960,13 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
|||
}
|
||||
}
|
||||
|
||||
if(GfTimeClock() > (this->laptimeFreezeTime + this->laptimeFreezeCountdown)){
|
||||
if (GfTimeClock() > (data.laptimeFreezeTime + data.laptimeFreezeCountdown))
|
||||
{
|
||||
//remember our current sector
|
||||
this->oldSector = currCar->_currentSector;
|
||||
data.oldSector = currCar->_currentSector;
|
||||
|
||||
temp.str("");
|
||||
temp << "S" << (this->oldSector+1);
|
||||
temp << "S" << (data.oldSector+1);
|
||||
hudTextElements["laptime-sector-description"]->setText(temp.str());
|
||||
|
||||
this->hudImgElements["laptime-last-background-normal"]->setNodeMask(NODE_MASK_ALL);
|
||||
|
@ -979,10 +979,12 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
|||
hudTextElements["laptime-last-time"]->setText(formatLaptime(currCar->_curLapTime,0));
|
||||
|
||||
//on the last sector show the total lap time
|
||||
if(currCar->_currentSector == currCar->_nbSectors-1){
|
||||
if (currCar->_currentSector == currCar->_nbSectors-1)
|
||||
{
|
||||
hudTextElements["laptime-best-time"]->setText(formatLaptime(currCar->_bestLapTime,0));
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
tdble bestSplitTime = currCar->_bestSplitTime[currCar->_currentSector]; // the best split time of the sector we are in this moment
|
||||
hudTextElements["laptime-best-time"]->setText(formatLaptime(bestSplitTime,0));
|
||||
}
|
||||
|
@ -997,31 +999,21 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
|
|||
|
||||
temp.str("");
|
||||
|
||||
if (this->startingFuel == 0.0f){
|
||||
this->startingFuel = currCar->_fuel;
|
||||
}
|
||||
|
||||
//when we have done at least one lap calculate remaining fuel
|
||||
#if 0 // dead code
|
||||
if (currCar->_laps < 1){
|
||||
float fuelConsumpionPerLap = 0.1f;
|
||||
}
|
||||
#endif
|
||||
|
||||
if( currCar->_laps > this->carLaps && currCar->_laps > 1){
|
||||
if (currCar->_laps == 2){
|
||||
this->lapLength = this->lapLength - currCar->_distRaced;
|
||||
}
|
||||
float fuelConsumpionPerLap = (this->startingFuel - currCar->_fuel) / (float)(currCar->_laps-1);
|
||||
this->remainingFuelForLaps = currCar->_fuel / fuelConsumpionPerLap;
|
||||
this->carLaps = currCar->_laps;
|
||||
|
||||
if (currCar->_laps > data.carLaps && currCar->_laps > 1)
|
||||
{
|
||||
float fuelConsumpionPerLap = currCar->_fuelTotal / (float)(currCar->_laps-1);
|
||||
data.remainingFuelForLaps = currCar->_fuel / fuelConsumpionPerLap;
|
||||
data.carLaps = currCar->_laps;
|
||||
}
|
||||
|
||||
//if we have fuel for more than one lap display how many
|
||||
if(this->remainingFuelForLaps > 0 ){
|
||||
temp << std::fixed << std::setprecision(0) << this->remainingFuelForLaps;
|
||||
}else{
|
||||
if (data.remainingFuelForLaps > 0 )
|
||||
{
|
||||
temp << std::fixed << std::setprecision(0) << data.remainingFuelForLaps;
|
||||
}
|
||||
else
|
||||
{
|
||||
temp << "---";
|
||||
}
|
||||
|
||||
|
|
|
@ -106,19 +106,25 @@ class SDHUD
|
|||
float *_background_color;
|
||||
|
||||
//car data that need to be remembered between frames for the hud
|
||||
int carLaps;
|
||||
tdble lapLength;
|
||||
float startingFuel;
|
||||
float remainingFuelForLaps;
|
||||
|
||||
//
|
||||
float laptimeFreezeCountdown;//keep display for x seconds
|
||||
float laptimeFreezeTime;
|
||||
float timeDiffFreezeCountdown;//keep display for x seconds
|
||||
float timeDiffFreezeTime;
|
||||
int oldSector;
|
||||
int oldLapNumber;
|
||||
struct CarData {
|
||||
int carLaps;
|
||||
float remainingFuelForLaps;
|
||||
float laptimeFreezeCountdown;//keep display for x seconds
|
||||
float laptimeFreezeTime;
|
||||
float timeDiffFreezeCountdown;//keep display for x seconds
|
||||
float timeDiffFreezeTime;
|
||||
int oldSector;
|
||||
int oldLapNumber;
|
||||
|
||||
CarData() : carLaps(0), remainingFuelForLaps(0), laptimeFreezeCountdown(3.0f),
|
||||
laptimeFreezeTime(0.0f), timeDiffFreezeCountdown(8.0f), timeDiffFreezeTime(0.0f),
|
||||
oldSector(0), oldLapNumber(0)
|
||||
{
|
||||
}
|
||||
};
|
||||
const tCarElt *lastCar;
|
||||
std::map<const tCarElt *, CarData> carData;
|
||||
|
||||
float hudScale;
|
||||
|
||||
//
|
||||
|
|
|
@ -596,8 +596,10 @@ tRmInfo* ReSituationUpdater::initSituation(const tRmInfo* pSource)
|
|||
tCarElt* pTgtCar = &pTarget->carList[nCarInd];
|
||||
tCarElt* pSrcCar = &pSource->carList[nCarInd];
|
||||
|
||||
pTgtCar->_curSplitTime = (double*)malloc(sizeof(double) * (pSource->track->numberOfSectors - 1));
|
||||
pTgtCar->_bestSplitTime = (double*)malloc(sizeof(double) * (pSource->track->numberOfSectors - 1));
|
||||
pTgtCar->_nbSectors = pSource->track->numberOfSectors;
|
||||
pTgtCar->_trackLength = pSource->track->length;
|
||||
pTgtCar->_curSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1));
|
||||
pTgtCar->_bestSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1));
|
||||
|
||||
GF_TAILQ_INIT(&(pTgtCar->_penaltyList)); // Not used by the graphics engine.
|
||||
|
||||
|
|
|
@ -725,6 +725,7 @@ tRmInfo* ReSituationUpdater::initSituation(const tRmInfo* pSource)
|
|||
tCarElt* pSrcCar = &pSource->carList[nCarInd];
|
||||
|
||||
pTgtCar->_nbSectors = pSource->track->numberOfSectors;
|
||||
pTgtCar->_trackLength = pSource->track->length;
|
||||
pTgtCar->_curSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1));
|
||||
pTgtCar->_bestSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1));
|
||||
|
||||
|
|
|
@ -38,6 +38,11 @@ SimCarConfig(tCar *car)
|
|||
int i;
|
||||
tCarElt *carElt = car->carElt;
|
||||
|
||||
car->fuel_time = 0.0;
|
||||
car->fuel_consumption = 0.0;
|
||||
car->carElt->_fuelTotal = 0.0;
|
||||
car->carElt->_fuelInstant = 10.0;
|
||||
|
||||
car->dimension.x = GfParmGetNum(hdle, SECT_CAR, PRM_LEN, (char*)NULL, 4.7f);
|
||||
car->dimension.y = GfParmGetNum(hdle, SECT_CAR, PRM_WIDTH, (char*)NULL, 1.9f);
|
||||
overallwidth = GfParmGetNum(hdle, SECT_CAR, PRM_OVERALLWIDTH, (char*)NULL, car->dimension.y);
|
||||
|
@ -63,6 +68,7 @@ SimCarConfig(tCar *car)
|
|||
if (car->fuel > car->tank) {
|
||||
car->fuel = car->tank;
|
||||
}
|
||||
car->fuel_prev = car->fuel;
|
||||
k = k * k;
|
||||
car->Iinv.x = (tdble) (12.0 / (car->mass * k * (car->dimension.y * car->dimension.y + car->dimension.z * car->dimension.z)));
|
||||
car->Iinv.y = (tdble) (12.0 / (car->mass * k * (car->dimension.x * car->dimension.x + car->dimension.z * car->dimension.z)));
|
||||
|
@ -283,6 +289,22 @@ SimCarUpdateForces(tCar *car)
|
|||
static void
|
||||
SimCarUpdateSpeed(tCar *car)
|
||||
{
|
||||
// fuel consumption
|
||||
tdble delta_fuel = car->fuel_prev - car->fuel;
|
||||
car->fuel_prev = car->fuel;
|
||||
if (delta_fuel > 0) {
|
||||
car->carElt->_fuelTotal += delta_fuel;
|
||||
}
|
||||
tdble fi;
|
||||
tdble as = sqrt(car->airSpeed2);
|
||||
if (as<0.1) {
|
||||
fi = 99.9f;
|
||||
} else {
|
||||
fi = 100000 * delta_fuel / (as*SimDeltaTime);
|
||||
}
|
||||
tdble alpha = 0.1f;
|
||||
car->carElt->_fuelInstant = (tdble)((1.0-alpha)*car->carElt->_fuelInstant + alpha*fi);
|
||||
|
||||
tdble Cosz, Sinz;
|
||||
|
||||
Cosz = car->Cosz;
|
||||
|
|
|
@ -61,6 +61,9 @@ typedef struct
|
|||
|
||||
/* dynamic */
|
||||
tdble fuel; /* current fuel load */
|
||||
tdble fuel_consumption; /* average fuel consumption */
|
||||
tdble fuel_prev; /* average fuel consumption */
|
||||
tdble fuel_time; /* average fuel consumption */
|
||||
tDynPt DynGC; /* GC local data except position */
|
||||
tDynPt DynGCg; /* GC global data */
|
||||
tPosd VelColl; /* resulting velocity after collision */
|
||||
|
|
|
@ -38,6 +38,11 @@ SimCarConfig(tCar *car)
|
|||
int i;
|
||||
tCarElt *carElt = car->carElt;
|
||||
|
||||
car->fuel_time = 0.0;
|
||||
car->fuel_consumption = 0.0;
|
||||
car->carElt->_fuelTotal = 0.0;
|
||||
car->carElt->_fuelInstant = 10.0;
|
||||
|
||||
car->dimension.x = GfParmGetNum(hdle, SECT_CAR, PRM_LEN, (char*)NULL, 4.7f);
|
||||
car->dimension.y = GfParmGetNum(hdle, SECT_CAR, PRM_WIDTH, (char*)NULL, 1.9f);
|
||||
overallwidth = GfParmGetNum(hdle, SECT_CAR, PRM_OVERALLWIDTH, (char*)NULL, car->dimension.y);
|
||||
|
@ -63,6 +68,7 @@ SimCarConfig(tCar *car)
|
|||
if (car->fuel > car->tank) {
|
||||
car->fuel = car->tank;
|
||||
}
|
||||
car->fuel_prev = car->fuel;
|
||||
k = k * k;
|
||||
car->Iinv.x = (tdble) (12.0 / (car->mass * (car->dimension.y * car->dimension.y + car->dimension.z * car->dimension.z)));
|
||||
car->Iinv.y = (tdble) (12.0 / (car->mass * (car->dimension.x * car->dimension.x + car->dimension.z * car->dimension.z)));
|
||||
|
@ -276,6 +282,22 @@ SimCarUpdateForces(tCar *car)
|
|||
static void
|
||||
SimCarUpdateSpeed(tCar *car)
|
||||
{
|
||||
// fuel consumption
|
||||
tdble delta_fuel = car->fuel_prev - car->fuel;
|
||||
car->fuel_prev = car->fuel;
|
||||
if (delta_fuel > 0) {
|
||||
car->carElt->_fuelTotal += delta_fuel;
|
||||
}
|
||||
tdble fi;
|
||||
tdble as = sqrt(car->airSpeed2);
|
||||
if (as<0.1) {
|
||||
fi = 99.9f;
|
||||
} else {
|
||||
fi = 100000 * delta_fuel / (as*SimDeltaTime);
|
||||
}
|
||||
tdble alpha = 0.1f;
|
||||
car->carElt->_fuelInstant = (tdble)((1.0-alpha)*car->carElt->_fuelInstant + alpha*fi);
|
||||
|
||||
tdble Cosz, Sinz;
|
||||
|
||||
Cosz = car->Cosz;
|
||||
|
|
|
@ -61,6 +61,9 @@ typedef struct
|
|||
|
||||
/* dynamic */
|
||||
tdble fuel; /* current fuel load */
|
||||
tdble fuel_consumption; /* average fuel consumption */
|
||||
tdble fuel_prev; /* average fuel consumption */
|
||||
tdble fuel_time; /* average fuel consumption */
|
||||
tDynPt DynGC; /* GC local data except position */
|
||||
tDynPt DynGCg; /* GC global data */
|
||||
tPosd VelColl; /* resulting velocity after collision */
|
||||
|
|
|
@ -42,6 +42,12 @@ SimCarConfig(tCar *car)
|
|||
tdble overallwidth;
|
||||
int i;
|
||||
tCarElt *carElt = car->carElt;
|
||||
|
||||
car->fuel_time = 0.0;
|
||||
car->fuel_consumption = 0.0;
|
||||
car->carElt->_fuelTotal = 0.0;
|
||||
car->carElt->_fuelInstant = 10.0;
|
||||
|
||||
const char *enabling;
|
||||
tCarSetupItem *setupGcfr = &(car->carElt->setup.FRWeightRep);
|
||||
tCarSetupItem *setupGcfrl = &(car->carElt->setup.FRLWeightRep);
|
||||
|
@ -114,6 +120,10 @@ SimCarConfig(tCar *car)
|
|||
gcrl = gcfr * gcfrl + (1 - gcfr) * gcrrl;
|
||||
|
||||
car->tank = GfParmGetNum(hdle, SECT_CAR, PRM_TANK, (char*)NULL, 80);
|
||||
if (car->fuel > car->tank) {
|
||||
car->fuel = car->tank;
|
||||
}
|
||||
car->fuel_prev = car->fuel;
|
||||
|
||||
setupFuel->desired_value = setupFuel->min = setupFuel->max = 80.0;
|
||||
GfParmGetNumWithLimits(hdle, SECT_CAR, PRM_FUEL, (char*)NULL, &(setupFuel->desired_value), &(setupFuel->min), &(setupFuel->max));
|
||||
|
@ -640,6 +650,22 @@ SimCarUpdateForces(tCar *car)
|
|||
static void
|
||||
SimCarUpdateSpeed(tCar *car)
|
||||
{
|
||||
// fuel consumption
|
||||
tdble delta_fuel = car->fuel_prev - car->fuel;
|
||||
car->fuel_prev = car->fuel;
|
||||
if (delta_fuel > 0) {
|
||||
car->carElt->_fuelTotal += delta_fuel;
|
||||
}
|
||||
tdble fi;
|
||||
tdble as = sqrt(car->airSpeed2);
|
||||
if (as<0.1) {
|
||||
fi = 99.9f;
|
||||
} else {
|
||||
fi = 100000 * delta_fuel / (as*SimDeltaTime);
|
||||
}
|
||||
tdble alpha = 0.1f;
|
||||
car->carElt->_fuelInstant = (tdble)((1.0-alpha)*car->carElt->_fuelInstant + alpha*fi);
|
||||
|
||||
tdble Cosz, Sinz;
|
||||
//tdble mass;
|
||||
|
||||
|
|
|
@ -61,6 +61,9 @@ typedef struct
|
|||
|
||||
/* dynamic */
|
||||
tdble fuel; /* current fuel load */
|
||||
tdble fuel_consumption; /* average fuel consumption */
|
||||
tdble fuel_prev; /* average fuel consumption */
|
||||
tdble fuel_time; /* average fuel consumption */
|
||||
tDynPt DynGC; /* GC local data except position */
|
||||
tDynPt DynGCg; /* GC global data */
|
||||
tPosd VelColl; /* resulting velocity after collision */
|
||||
|
|
Loading…
Reference in a new issue