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:
iobyte 2020-05-10 19:25:34 +00:00
parent fccb3f00f1
commit 1231a16803
11 changed files with 144 additions and 62 deletions

View file

@ -191,6 +191,7 @@ typedef struct
tdble distFromStartLine; tdble distFromStartLine;
int currentSector; int currentSector;
int nbSectors; int nbSectors;
double trackLength;
double scheduledEventTime; double scheduledEventTime;
tTrackOwnPit *pit; tTrackOwnPit *pit;
int event; int event;
@ -223,6 +224,7 @@ typedef struct
#define _distFromStartLine race.distFromStartLine #define _distFromStartLine race.distFromStartLine
#define _currentSector race.currentSector #define _currentSector race.currentSector
#define _nbSectors race.nbSectors #define _nbSectors race.nbSectors
#define _trackLength race.trackLength
#define _pit race.pit #define _pit race.pit
#define _scheduledEventTime race.scheduledEventTime #define _scheduledEventTime race.scheduledEventTime
#define _event race.event #define _event race.event

View file

@ -667,17 +667,7 @@ SDHUD::SDHUD()
_cameraHUD = new osg::Camera; _cameraHUD = new osg::Camera;
//initialize some vars //initialize some vars
this->startingFuel = 0.0; this->lastCar = NULL;
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->hudScale = 1.0f; this->hudScale = 1.0f;
} }
@ -732,6 +722,17 @@ SDHUD::DispDebug(const tSituation *s, const SDFrameInfo* frame)
void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo, void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
const tCarElt *currCar) 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 //update all the graphs
typedef std::map<std::string,OSGPLOT* >::iterator it_type; typedef std::map<std::string,OSGPLOT* >::iterator it_type;
@ -848,14 +849,14 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
mapKey.str(""); mapKey.str("");
mapKey << "board-player" << id << "-timediff"; 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; std::ostringstream tempStr;
tempStr.str(""); tempStr.str("");
@ -905,21 +906,20 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
temp.str(""); temp.str("");
temp << currCar->_laps; temp << currCar->_laps;
hudTextElements["lap-container-currentlap"]->setText(temp.str()); hudTextElements["lap-container-currentlap"]->setText(temp.str());
//car_->_deltaBestLapTimefuel
//laptime //laptime
if( this->oldSector != currCar->_currentSector) if (data.oldSector != currCar->_currentSector)
{ {
this->laptimeFreezeTime = GfTimeClock(); data.laptimeFreezeTime = GfTimeClock();
this->oldSector = currCar->_currentSector; data.oldSector = currCar->_currentSector;
if (currCar->_currentSector == 0) if (currCar->_currentSector == 0)
{ {
hudTextElements["laptime-last-time"]->setText(formatLaptime(currCar->_lastLapTime,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-green"]->setNodeMask(NODE_MASK_ALL);
this->hudImgElements["laptime-last-background-normal"]->setNodeMask(NODE_MASK_NONE); 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-green"]->setNodeMask(NODE_MASK_NONE);
this->hudImgElements["laptime-last-background-red"]->setNodeMask(NODE_MASK_NONE); this->hudImgElements["laptime-last-background-red"]->setNodeMask(NODE_MASK_NONE);
} }
} }
else else
{ {
float currentPrevSectorSplitTime = currCar->_curSplitTime[currCar->_currentSector - 1]; // our time in the sector we have "just" run over 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 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-normal"]->setNodeMask(NODE_MASK_NONE);
this->hudImgElements["laptime-last-background-grey"]->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 //remember our current sector
this->oldSector = currCar->_currentSector; data.oldSector = currCar->_currentSector;
temp.str(""); temp.str("");
temp << "S" << (this->oldSector+1); temp << "S" << (data.oldSector+1);
hudTextElements["laptime-sector-description"]->setText(temp.str()); hudTextElements["laptime-sector-description"]->setText(temp.str());
this->hudImgElements["laptime-last-background-normal"]->setNodeMask(NODE_MASK_ALL); 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)); hudTextElements["laptime-last-time"]->setText(formatLaptime(currCar->_curLapTime,0));
//on the last sector show the total lap time //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)); 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 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)); hudTextElements["laptime-best-time"]->setText(formatLaptime(bestSplitTime,0));
} }
@ -997,31 +999,21 @@ void SDHUD::Refresh(tSituation *s, const SDFrameInfo* frameInfo,
temp.str(""); temp.str("");
if (this->startingFuel == 0.0f){
this->startingFuel = currCar->_fuel;
}
//when we have done at least one lap calculate remaining fuel //when we have done at least one lap calculate remaining fuel
#if 0 // dead code if (currCar->_laps > data.carLaps && currCar->_laps > 1)
if (currCar->_laps < 1){ {
float fuelConsumpionPerLap = 0.1f; float fuelConsumpionPerLap = currCar->_fuelTotal / (float)(currCar->_laps-1);
} data.remainingFuelForLaps = currCar->_fuel / fuelConsumpionPerLap;
#endif data.carLaps = currCar->_laps;
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 we have fuel for more than one lap display how many //if we have fuel for more than one lap display how many
if(this->remainingFuelForLaps > 0 ){ if (data.remainingFuelForLaps > 0 )
temp << std::fixed << std::setprecision(0) << this->remainingFuelForLaps; {
}else{ temp << std::fixed << std::setprecision(0) << data.remainingFuelForLaps;
}
else
{
temp << "---"; temp << "---";
} }

View file

@ -106,18 +106,24 @@ class SDHUD
float *_background_color; float *_background_color;
//car data that need to be remembered between frames for the hud //car data that need to be remembered between frames for the hud
int carLaps; struct CarData {
tdble lapLength; int carLaps;
float startingFuel; float remainingFuelForLaps;
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),
float laptimeFreezeCountdown;//keep display for x seconds laptimeFreezeTime(0.0f), timeDiffFreezeCountdown(8.0f), timeDiffFreezeTime(0.0f),
float laptimeFreezeTime; oldSector(0), oldLapNumber(0)
float timeDiffFreezeCountdown;//keep display for x seconds {
float timeDiffFreezeTime; }
int oldSector; };
int oldLapNumber; const tCarElt *lastCar;
std::map<const tCarElt *, CarData> carData;
float hudScale; float hudScale;

View file

@ -596,8 +596,10 @@ tRmInfo* ReSituationUpdater::initSituation(const tRmInfo* pSource)
tCarElt* pTgtCar = &pTarget->carList[nCarInd]; tCarElt* pTgtCar = &pTarget->carList[nCarInd];
tCarElt* pSrcCar = &pSource->carList[nCarInd]; tCarElt* pSrcCar = &pSource->carList[nCarInd];
pTgtCar->_curSplitTime = (double*)malloc(sizeof(double) * (pSource->track->numberOfSectors - 1)); pTgtCar->_nbSectors = pSource->track->numberOfSectors;
pTgtCar->_bestSplitTime = (double*)malloc(sizeof(double) * (pSource->track->numberOfSectors - 1)); 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. GF_TAILQ_INIT(&(pTgtCar->_penaltyList)); // Not used by the graphics engine.

View file

@ -725,6 +725,7 @@ tRmInfo* ReSituationUpdater::initSituation(const tRmInfo* pSource)
tCarElt* pSrcCar = &pSource->carList[nCarInd]; tCarElt* pSrcCar = &pSource->carList[nCarInd];
pTgtCar->_nbSectors = pSource->track->numberOfSectors; pTgtCar->_nbSectors = pSource->track->numberOfSectors;
pTgtCar->_trackLength = pSource->track->length;
pTgtCar->_curSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1)); pTgtCar->_curSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1));
pTgtCar->_bestSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1)); pTgtCar->_bestSplitTime = (double*)malloc(sizeof(double) * (pTgtCar->_nbSectors - 1));

View file

@ -38,6 +38,11 @@ SimCarConfig(tCar *car)
int i; int i;
tCarElt *carElt = car->carElt; 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.x = GfParmGetNum(hdle, SECT_CAR, PRM_LEN, (char*)NULL, 4.7f);
car->dimension.y = GfParmGetNum(hdle, SECT_CAR, PRM_WIDTH, (char*)NULL, 1.9f); 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); overallwidth = GfParmGetNum(hdle, SECT_CAR, PRM_OVERALLWIDTH, (char*)NULL, car->dimension.y);
@ -63,6 +68,7 @@ SimCarConfig(tCar *car)
if (car->fuel > car->tank) { if (car->fuel > car->tank) {
car->fuel = car->tank; car->fuel = car->tank;
} }
car->fuel_prev = car->fuel;
k = k * k; 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.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))); 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 static void
SimCarUpdateSpeed(tCar *car) 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 Cosz, Sinz;
Cosz = car->Cosz; Cosz = car->Cosz;

View file

@ -61,6 +61,9 @@ typedef struct
/* dynamic */ /* dynamic */
tdble fuel; /* current fuel load */ 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 DynGC; /* GC local data except position */
tDynPt DynGCg; /* GC global data */ tDynPt DynGCg; /* GC global data */
tPosd VelColl; /* resulting velocity after collision */ tPosd VelColl; /* resulting velocity after collision */

View file

@ -38,6 +38,11 @@ SimCarConfig(tCar *car)
int i; int i;
tCarElt *carElt = car->carElt; 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.x = GfParmGetNum(hdle, SECT_CAR, PRM_LEN, (char*)NULL, 4.7f);
car->dimension.y = GfParmGetNum(hdle, SECT_CAR, PRM_WIDTH, (char*)NULL, 1.9f); 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); overallwidth = GfParmGetNum(hdle, SECT_CAR, PRM_OVERALLWIDTH, (char*)NULL, car->dimension.y);
@ -63,6 +68,7 @@ SimCarConfig(tCar *car)
if (car->fuel > car->tank) { if (car->fuel > car->tank) {
car->fuel = car->tank; car->fuel = car->tank;
} }
car->fuel_prev = car->fuel;
k = k * k; 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.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))); 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 static void
SimCarUpdateSpeed(tCar *car) 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 Cosz, Sinz;
Cosz = car->Cosz; Cosz = car->Cosz;

View file

@ -61,6 +61,9 @@ typedef struct
/* dynamic */ /* dynamic */
tdble fuel; /* current fuel load */ 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 DynGC; /* GC local data except position */
tDynPt DynGCg; /* GC global data */ tDynPt DynGCg; /* GC global data */
tPosd VelColl; /* resulting velocity after collision */ tPosd VelColl; /* resulting velocity after collision */

View file

@ -42,6 +42,12 @@ SimCarConfig(tCar *car)
tdble overallwidth; tdble overallwidth;
int i; int i;
tCarElt *carElt = car->carElt; 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; const char *enabling;
tCarSetupItem *setupGcfr = &(car->carElt->setup.FRWeightRep); tCarSetupItem *setupGcfr = &(car->carElt->setup.FRWeightRep);
tCarSetupItem *setupGcfrl = &(car->carElt->setup.FRLWeightRep); tCarSetupItem *setupGcfrl = &(car->carElt->setup.FRLWeightRep);
@ -114,6 +120,10 @@ SimCarConfig(tCar *car)
gcrl = gcfr * gcfrl + (1 - gcfr) * gcrrl; gcrl = gcfr * gcfrl + (1 - gcfr) * gcrrl;
car->tank = GfParmGetNum(hdle, SECT_CAR, PRM_TANK, (char*)NULL, 80); 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; setupFuel->desired_value = setupFuel->min = setupFuel->max = 80.0;
GfParmGetNumWithLimits(hdle, SECT_CAR, PRM_FUEL, (char*)NULL, &(setupFuel->desired_value), &(setupFuel->min), &(setupFuel->max)); GfParmGetNumWithLimits(hdle, SECT_CAR, PRM_FUEL, (char*)NULL, &(setupFuel->desired_value), &(setupFuel->min), &(setupFuel->max));
@ -640,6 +650,22 @@ SimCarUpdateForces(tCar *car)
static void static void
SimCarUpdateSpeed(tCar *car) 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 Cosz, Sinz;
//tdble mass; //tdble mass;

View file

@ -61,6 +61,9 @@ typedef struct
/* dynamic */ /* dynamic */
tdble fuel; /* current fuel load */ 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 DynGC; /* GC local data except position */
tDynPt DynGCg; /* GC global data */ tDynPt DynGCg; /* GC global data */
tPosd VelColl; /* resulting velocity after collision */ tPosd VelColl; /* resulting velocity after collision */