Re #1070: add visual indicator for tire wear and temperature (ssggraph)
git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@7166 30fe4595-0a0c-4342-8851-515496e4dcbd Former-commit-id: 61d0d2caad77b452f8798b017e51c660f7331d7c Former-commit-id: a3222233075b20f60022d851187cadfc3ab8837d
This commit is contained in:
parent
a2f2de1f4d
commit
9ab0a7bac7
3 changed files with 185 additions and 12 deletions
|
@ -307,7 +307,8 @@ typedef struct {
|
|||
int state; /**< wheel state */
|
||||
tTrackSeg *seg; /**< Track segment where the wheel is */
|
||||
tdble rollRes; /**< rolling resistance, useful for sound */
|
||||
tdble temp_in, temp_mid, temp_out;
|
||||
tdble temp_in, temp_mid, temp_out; /*tire temperature inside, middle and outside of tread*/
|
||||
tdble temp_opt; /*optimal tire temperature*/
|
||||
tdble condition; /**< tire condition, between 0 and 1 */
|
||||
tdble treadDepth; /**< tread depth, between 0 and 1 */
|
||||
tdble critTreadDepth; /**< critical tread depth, when grip falls off suddenly, between 0 and treadDepth */
|
||||
|
@ -335,6 +336,7 @@ typedef struct {
|
|||
#define _tyreT_in(i) priv.wheel[i].temp_in
|
||||
#define _tyreT_mid(i) priv.wheel[i].temp_mid
|
||||
#define _tyreT_out(i) priv.wheel[i].temp_out
|
||||
#define _tyreT_opt(i) priv.wheel[i].temp_opt
|
||||
#define _tyreCondition(i) priv.wheel[i].condition
|
||||
#define _tyreTreadDepth(i) priv.wheel[i].treadDepth
|
||||
#define _tyreCritTreadDepth(i) priv.wheel[i].critTreadDepth
|
||||
|
|
|
@ -381,9 +381,9 @@ cGrBoard::grDispGGraph()
|
|||
glVertex2f(XC + THNSS, YC + car_->ctrl.clutchCmd * 100.0f);
|
||||
glVertex2f(XC - THNSS, YC + car_->ctrl.clutchCmd * 100.0f);
|
||||
|
||||
// Draw the tire slip color gauges
|
||||
// Draw the tire slip and the tire temperature & wear color gauges
|
||||
if (GFlag == 2) {
|
||||
tdble s;
|
||||
tdble s, height;
|
||||
// FR wheel
|
||||
s = car_->_wheelSlipNorm(0)/car_->_wheelSlipOpt(0);
|
||||
if (s > 1.0) {
|
||||
|
@ -396,6 +396,47 @@ cGrBoard::grDispGGraph()
|
|||
glVertex2f(X1 + 50.0f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 50.0f, Y1 + 50.0f);
|
||||
glVertex2f(X1 + 40.0f, Y1 + 50.0f);
|
||||
|
||||
height = 20.0f * MAX(car_->_tyreTreadDepth(0), 0.1f);
|
||||
s = 10.0f*(car_->_tyreT_out(0)/car_->_tyreT_opt(0)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 + 31.67f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 35.0f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 35.0f, Y1 + 30.0f+height);
|
||||
glVertex2f(X1 + 31.67f, Y1 + 30.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_mid(0)/car_->_tyreT_opt(0)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 + 28.33f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 31.67f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 31.67f, Y1 + 30.0f+height);
|
||||
glVertex2f(X1 + 28.33f, Y1 + 30.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_in(0)/car_->_tyreT_opt(0)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 + 25.0f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 28.33f, Y1 + 30.0f);
|
||||
glVertex2f(X1 + 28.33f, Y1 + 30.0f+height);
|
||||
glVertex2f(X1 + 25.0f, Y1 + 30.0f+height);
|
||||
|
||||
// FL wheel
|
||||
s = car_->_wheelSlipNorm(1)/car_->_wheelSlipOpt(1);
|
||||
if (s > 1.0) {
|
||||
|
@ -408,6 +449,47 @@ cGrBoard::grDispGGraph()
|
|||
glVertex2f(X1 - 40.0f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 40.0f, Y1 + 50.0f);
|
||||
glVertex2f(X1 - 50.0f, Y1 + 50.0f);
|
||||
|
||||
height = 20.0f * MAX(car_->_tyreTreadDepth(1), 0.1f);
|
||||
s = 10.0f*(car_->_tyreT_out(1)/car_->_tyreT_opt(1)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 - 31.67f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 35.0f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 35.0f, Y1 + 30.0f+height);
|
||||
glVertex2f(X1 - 31.67f, Y1 + 30.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_mid(1)/car_->_tyreT_opt(1)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 - 28.33f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 31.67f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 31.67f, Y1 + 30.0f+height);
|
||||
glVertex2f(X1 - 28.33f, Y1 + 30.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_in(1)/car_->_tyreT_opt(1)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 - 25.0f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 28.33f, Y1 + 30.0f);
|
||||
glVertex2f(X1 - 28.33f, Y1 + 30.0f+height);
|
||||
glVertex2f(X1 - 25.0f, Y1 + 30.0f+height);
|
||||
|
||||
// RR wheel
|
||||
s = car_->_wheelSlipNorm(2)/car_->_wheelSlipOpt(2);
|
||||
if (s > 1.0) {
|
||||
|
@ -420,6 +502,47 @@ cGrBoard::grDispGGraph()
|
|||
glVertex2f(X1 + 50.0f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 50.0f, Y1 - 30.0f);
|
||||
glVertex2f(X1 + 40.0f, Y1 - 30.0f);
|
||||
|
||||
height = 20.0f * MAX(car_->_tyreTreadDepth(2), 0.1f);
|
||||
s = 10.0f*(car_->_tyreT_out(2)/car_->_tyreT_opt(2)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 + 31.67f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 35.0f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 35.0f, Y1 - 50.0f+height);
|
||||
glVertex2f(X1 + 31.67f, Y1 - 50.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_mid(2)/car_->_tyreT_opt(2)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 + 28.33f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 31.67f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 31.67f, Y1 - 50.0f+height);
|
||||
glVertex2f(X1 + 28.33f, Y1 - 50.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_in(2)/car_->_tyreT_opt(2)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 + 25.0f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 28.33f, Y1 - 50.0f);
|
||||
glVertex2f(X1 + 28.33f, Y1 - 50.0f+height);
|
||||
glVertex2f(X1 + 25.0f, Y1 - 50.0f+height);
|
||||
|
||||
// RL wheel
|
||||
s = car_->_wheelSlipNorm(3)/car_->_wheelSlipOpt(3);
|
||||
if (s > 1.0) {
|
||||
|
@ -432,6 +555,46 @@ cGrBoard::grDispGGraph()
|
|||
glVertex2f(X1 - 40.0f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 40.0f, Y1 - 30.0f);
|
||||
glVertex2f(X1 - 50.0f, Y1 - 30.0f);
|
||||
|
||||
height = 20.0f * MAX(car_->_tyreTreadDepth(3), 0.1f);
|
||||
s = 10.0f*(car_->_tyreT_out(3)/car_->_tyreT_opt(3)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 - 31.67f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 35.0f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 35.0f, Y1 - 50.0f+height);
|
||||
glVertex2f(X1 - 31.67f, Y1 - 50.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_mid(3)/car_->_tyreT_opt(3)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 - 28.33f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 31.67f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 31.67f, Y1 - 50.0f+height);
|
||||
glVertex2f(X1 - 28.33f, Y1 - 50.0f+height);
|
||||
|
||||
s = 10.0f*(car_->_tyreT_in(3)/car_->_tyreT_opt(3)-1.0f);
|
||||
if (s >= 0.0f) {
|
||||
s = MIN(1.0f, s);
|
||||
glColor4f(1.0f, s, 0.0f, 0.9f);
|
||||
} else {
|
||||
s = MIN(1.0f, -s);
|
||||
glColor4f(1.0f - s, 0.0f, s, 0.9f);
|
||||
}
|
||||
glVertex2f(X1 - 25.0f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 28.33f, Y1 - 50.0f);
|
||||
glVertex2f(X1 - 28.33f, Y1 - 50.0f+height);
|
||||
glVertex2f(X1 - 25.0f, Y1 - 50.0f+height);
|
||||
}
|
||||
|
||||
glEnd();
|
||||
|
|
|
@ -99,12 +99,19 @@ void SimWheelConfig(tCar *car, int index)
|
|||
|
||||
/* temperature and degradation */
|
||||
wheel->Tinit = GfParmGetNum(hdle, WheelSect[index], PRM_INITTEMP, (char*)NULL, Tair);
|
||||
wheel->Ttire = wheel->Tinit;
|
||||
wheel->treadDepth = 1.0;
|
||||
wheel->Topt = GfParmGetNum(hdle, WheelSect[index], PRM_OPTTEMP, (char*)NULL, 350.0f);
|
||||
if (car->features & FEAT_TIRETEMPDEG)
|
||||
{
|
||||
wheel->Ttire = wheel->Tinit;
|
||||
}
|
||||
else
|
||||
{
|
||||
wheel->Ttire = wheel->Topt;
|
||||
}
|
||||
tdble coldmufactor = GfParmGetNum(hdle, WheelSect[index], PRM_COLDMUFACTOR, (char*)NULL, 1.0f);
|
||||
coldmufactor = MIN(MAX(coldmufactor, 0.0f), 1.0f);
|
||||
wheel->muTmult = (1 - coldmufactor) / ((wheel->Topt - Tair) * (wheel->Topt - Tair));
|
||||
wheel->muTmult = (1 - coldmufactor) / ((wheel->Topt - 273) * (wheel->Topt - 273));
|
||||
wheel->heatingm = GfParmGetNum(hdle, WheelSect[index], PRM_HEATINGMULT, (char*)NULL, (tdble) 6e-5);
|
||||
wheel->aircoolm = GfParmGetNum(hdle, WheelSect[index], PRM_AIRCOOLINGMULT, (char*)NULL, (tdble) 12e-4);
|
||||
wheel->speedcoolm = GfParmGetNum(hdle, WheelSect[index], PRM_SPEEDCOOLINGMULT, (char*)NULL, (tdble) 0.25);
|
||||
|
@ -136,13 +143,14 @@ void SimWheelConfig(tCar *car, int index)
|
|||
carElt->_brakeDiskRadius(index) = wheel->brake.radius;
|
||||
carElt->_wheelRadius(index) = wheel->radius;
|
||||
|
||||
if (car->features & FEAT_TIRETEMPDEG)
|
||||
{
|
||||
// Assume new wheels
|
||||
carElt->_tyreCondition(index) = 1.0;
|
||||
car->carElt->_tyreTreadDepth(index) = wheel->treadDepth;
|
||||
car->carElt->_tyreCritTreadDepth(index) = wheel->critTreadDepth;
|
||||
}
|
||||
/* initialize carElt values even if tire temperature and wear feature is not enabled */
|
||||
carElt->_tyreT_opt(index) = wheel->Topt;
|
||||
carElt->_tyreT_in(index) = wheel->Ttire;
|
||||
carElt->_tyreT_mid(index) = wheel->Ttire;
|
||||
carElt->_tyreT_out(index) = wheel->Ttire;
|
||||
carElt->_tyreCondition(index) = 1.0;
|
||||
carElt->_tyreTreadDepth(index) = wheel->treadDepth;
|
||||
carElt->_tyreCritTreadDepth(index) = wheel->critTreadDepth;
|
||||
|
||||
wheel->mfC = (tdble)(2.0 - asin(RFactor) * 2.0 / PI);
|
||||
wheel->mfB = Ca / wheel->mfC;
|
||||
|
|
Loading…
Reference in a new issue