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;
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

View file

@ -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 << "---";
}

View file

@ -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;
//

View file

@ -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.

View file

@ -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));

View file

@ -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;

View file

@ -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 */

View file

@ -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;

View file

@ -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 */

View file

@ -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;

View file

@ -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 */