Re #660: current car is class member now

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@4976 30fe4595-0a0c-4342-8851-515496e4dcbd

Former-commit-id: ba901a33b5291fac5a00c71e4d2ea6fc7000b87a
Former-commit-id: b92b6eca824fdb6735aecfdf4488c265b9f8aacf
This commit is contained in:
kmetykog 2012-10-02 21:50:57 +00:00
parent 40fc431611
commit ad34bed43b
2 changed files with 213 additions and 211 deletions

View file

@ -180,12 +180,10 @@ cGrBoard::selectBoard(int val)
* 3 - Like 2 + the segment the car is on, car's distance from startline, current camera
*
* @param s[in] The current situation
* @param car[in] The current car
* @param frame[in] Frame info to display
*/
void
cGrBoard::grDispDebug(const tSituation *s, const tCarElt *car,
const cGrFrameInfo* frame)
cGrBoard::grDispDebug(const tSituation *s, const cGrFrameInfo* frame)
{
char buf[BUFSIZE];
snprintf(buf, sizeof(buf), "FPS: %.1f(%.1f) ",
@ -216,16 +214,16 @@ cGrBoard::grDispDebug(const tSituation *s, const tCarElt *car,
} else if (debugFlag == 3) {
// Only display detailed information in Debug Mode > 1
// Display segment name in 2nd column
snprintf(buf, sizeof(buf), "Seg: %s", car->_trkPos.seg->name);
snprintf(buf, sizeof(buf), "Seg: %s", car_->_trkPos.seg->name);
GfuiDrawString(buf, grWhite, GFUI_FONT_SMALL_C, x2, y);
// Display distance from start in 2nd row, 1st column
y -= dy;
snprintf(buf, sizeof(buf), "DfS: %5.0f", car->_distFromStartLine);
snprintf(buf, sizeof(buf), "DfS: %5.0f", car_->_distFromStartLine);
GfuiDrawString(buf, grWhite, GFUI_FONT_SMALL_C, x, y);
// Display current camera in 2nd row, 2nd column
tRoadCam *curCam = car->_trkPos.seg->cam;
tRoadCam *curCam = car_->_trkPos.seg->cam;
if (curCam) {
snprintf(buf, sizeof(buf), "Cam: %s", curCam->name);
GfuiDrawString(buf, grWhite, GFUI_FONT_SMALL_C, x2, y);
@ -235,7 +233,7 @@ cGrBoard::grDispDebug(const tSituation *s, const tCarElt *car,
void
cGrBoard::grDispGGraph(const tCarElt *car)
cGrBoard::grDispGGraph()
{
// Position the graph
const tdble X1 = (tdble)(rightAnchor - 100);
@ -262,8 +260,8 @@ cGrBoard::grDispGGraph(const tCarElt *car)
glColor4f(0.0, 0.0, 1.0, 1.0);
glVertex2f(X1 - THNSS, Y1);
glVertex2f(X1 + THNSS, Y1);
glVertex2f(X1 + THNSS, Y1 + car->ctrl.accelCmd * 50.0f);
glVertex2f(X1 - THNSS, Y1 + car->ctrl.accelCmd * 50.0f);
glVertex2f(X1 + THNSS, Y1 + car_->ctrl.accelCmd * 50.0f);
glVertex2f(X1 - THNSS, Y1 + car_->ctrl.accelCmd * 50.0f);
// Draw the brake gauge (vertical thick segment, starting in X1,Y1,
// going downward, length proportional to the brake command,
@ -271,8 +269,8 @@ cGrBoard::grDispGGraph(const tCarElt *car)
// a) Detect wheel blocking, and change current color to red if so.
for (int xx = 0; xx < 4; ++xx)
{
if (fabs(car->_speed_x)
- fabs(car->_wheelSpinVel(xx) * car->_wheelRadius(xx)) > 5.0f)
if (fabs(car_->_speed_x)
- fabs(car_->_wheelSpinVel(xx) * car_->_wheelRadius(xx)) > 5.0f)
{
glColor4f(1.0, 0.0, 0.0, 1.0);
break;
@ -282,8 +280,8 @@ cGrBoard::grDispGGraph(const tCarElt *car)
// b) Draw the gauge.
glVertex2f(X1 - THNSS, Y1);
glVertex2f(X1 + THNSS, Y1);
glVertex2f(X1 + THNSS, Y1 - car->ctrl.brakeCmd * 50.0f);
glVertex2f(X1 - THNSS, Y1 - car->ctrl.brakeCmd * 50.0f);
glVertex2f(X1 + THNSS, Y1 - car_->ctrl.brakeCmd * 50.0f);
glVertex2f(X1 - THNSS, Y1 - car_->ctrl.brakeCmd * 50.0f);
// Back to normal blue color.
glColor4f(0.0, 0.0, 1.0, 1.0);
@ -293,22 +291,22 @@ cGrBoard::grDispGGraph(const tCarElt *car)
// length proportional to the steer command).
glVertex2f(X1, Y1 - THNSS);
glVertex2f(X1, Y1 + THNSS);
glVertex2f(X1 - car->ctrl.steer * 50.0f, Y1 + THNSS);
glVertex2f(X1 - car->ctrl.steer * 50.0f, Y1 - THNSS);
glVertex2f(X1 - car_->ctrl.steer * 50.0f, Y1 + THNSS);
glVertex2f(X1 - car_->ctrl.steer * 50.0f, Y1 - THNSS);
// Draw the clutch gauge (vertical thick segment, starting in xc, yc,
// going upwards, length proportional to the clutch command).
glVertex2f(XC - THNSS, YC);
glVertex2f(XC + THNSS, YC);
glVertex2f(XC + THNSS, YC + car->ctrl.clutchCmd * 100.0f);
glVertex2f(XC - THNSS, YC + car->ctrl.clutchCmd * 100.0f);
glVertex2f(XC + THNSS, YC + car_->ctrl.clutchCmd * 100.0f);
glVertex2f(XC - THNSS, YC + car_->ctrl.clutchCmd * 100.0f);
glEnd();
// Draw the acceleration gauge (thin segment, starting in X1, Y1,
// going in the direction of the acceleration vector).
const tdble X2 = -car->_DynGC.acc.y / 9.81f * 25.0f + X1;
const tdble Y2 = car->_DynGC.acc.x / 9.81f * 25.0f + Y1;
const tdble X2 = -car_->_DynGC.acc.y / 9.81f * 25.0f + X1;
const tdble Y2 = car_->_DynGC.acc.x / 9.81f * 25.0f + Y1;
glBegin(GL_LINES);
glColor4f(1.0, 0.0, 0.0, 1.0);
@ -320,7 +318,7 @@ cGrBoard::grDispGGraph(const tCarElt *car)
void
cGrBoard::grDrawGauge(tdble X1, tdble Y1, tdble H,
float *clr1, float *clr2,
float *color1, float *color2,
tdble val, const char *title)
{
tdble curH = MAX(MIN(val, 1.0), 0.0);
@ -337,13 +335,13 @@ cGrBoard::grDrawGauge(tdble X1, tdble Y1, tdble H,
glVertex2f(X1 + (THNSSBG + THNSSFG), Y1 + H + THNSSBG);
glVertex2f(X1 - (THNSSBG + THNSSFG), Y1 + H + THNSSBG);
glColor4fv(clr2);
glColor4fv(color2);
glVertex2f(X1 - THNSSFG, Y1 + curH);
glVertex2f(X1 + THNSSFG, Y1 + curH);
glVertex2f(X1 + THNSSFG, Y1 + H);
glVertex2f(X1 - THNSSFG, Y1 + H);
glColor4fv(clr1);
glColor4fv(color1);
glVertex2f(X1 - THNSSFG, Y1);
glVertex2f(X1 + THNSSFG, Y1);
glVertex2f(X1 + THNSSFG, Y1 + curH);
@ -389,12 +387,12 @@ cGrBoard::grDispMisc(bool bCurrentScreen)
// @return void
//
void
cGrBoard::grDispCarBoard1(const tCarElt *car, const tSituation *s)
cGrBoard::grDispCarBoard1(const tSituation *s)
{
char buf[BUFSIZE];
// Populate buf to get the width of the drawing area
snprintf(buf, sizeof(buf), "%s: %d/%d", car->_name, car->_pos, s->_ncars);
snprintf(buf, sizeof(buf), "%s: %d/%d", car_->_name, car_->_pos, s->_ncars);
int dy = GfuiFontHeight(GFUI_FONT_MEDIUM_C);
static const int dy2 = GfuiFontHeight(GFUI_FONT_SMALL_C);
@ -422,50 +420,50 @@ cGrBoard::grDispCarBoard1(const tCarElt *car, const tSituation *s)
// Display fuel
GfuiDrawString("Fuel:", grWhite, GFUI_FONT_SMALL_C, x, y);
float *clr = (car->_fuel < 5.0) ? grRed : grWhite; // Display low fuel in red
snprintf(buf, sizeof(buf), "%.1f l", car->_fuel);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
float *color = (car_->_fuel < 5.0) ? grRed : grWhite; // Display low fuel in red
snprintf(buf, sizeof(buf), "%.1f l", car_->_fuel);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
y -= dy;
// Display damage
clr = (car->_state & RM_CAR_STATE_BROKEN) ? grRed: grWhite;
GfuiDrawString("Damage:", clr, GFUI_FONT_SMALL_C, x, y);
snprintf(buf, sizeof(buf), "%d", car->_dammage);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
color = (car_->_state & RM_CAR_STATE_BROKEN) ? grRed: grWhite;
GfuiDrawString("Damage:", color, GFUI_FONT_SMALL_C, x, y);
snprintf(buf, sizeof(buf), "%d", car_->_dammage);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
y -= dy;
// Display lap counter
clr = grWhite;
color = grWhite;
char const* lapsTimeLabel;
grGetLapsTime(s, car, buf, &lapsTimeLabel);
GfuiDrawString(lapsTimeLabel, clr, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
grGetLapsTime(s, buf, &lapsTimeLabel);
GfuiDrawString(lapsTimeLabel, color, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
y -= dy;
// Display total race time
GfuiDrawString("Total:", clr, GFUI_FONT_SMALL_C, x, y);
grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, dxc, s->currentTime, 0);
GfuiDrawString("Total:", color, GFUI_FONT_SMALL_C, x, y);
grWriteTime(color, GFUI_FONT_SMALL_C, x2, y, dxc, s->currentTime, 0);
y -= dy;
// Display current lap time
GfuiDrawString("Curr:", clr, GFUI_FONT_SMALL_C, x, y);
grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, dxc, car->_curLapTime, 0);
GfuiDrawString("Curr:", color, GFUI_FONT_SMALL_C, x, y);
grWriteTime(color, GFUI_FONT_SMALL_C, x2, y, dxc, car_->_curLapTime, 0);
y -= dy;
// Display last lap time
GfuiDrawString("Last:", clr, GFUI_FONT_SMALL_C, x, y);
grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, dxc, car->_lastLapTime, 0);
GfuiDrawString("Last:", color, GFUI_FONT_SMALL_C, x, y);
grWriteTime(color, GFUI_FONT_SMALL_C, x2, y, dxc, car_->_lastLapTime, 0);
y -= dy;
// Display best lap time
GfuiDrawString("Best:", clr, GFUI_FONT_SMALL_C, x, y);
grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, dxc, car->_bestLapTime, 0);
GfuiDrawString("Best:", color, GFUI_FONT_SMALL_C, x, y);
grWriteTime(color, GFUI_FONT_SMALL_C, x2, y, dxc, car_->_bestLapTime, 0);
y -= dy;
// Display top speed
GfuiDrawString("Top Speed:", clr, GFUI_FONT_SMALL_C, x, y);
snprintf(buf, sizeof(buf), "%d", (int)(car->_topSpeed * 3.6));
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
GfuiDrawString("Top Speed:", color, GFUI_FONT_SMALL_C, x, y);
snprintf(buf, sizeof(buf), "%d", (int)(car_->_topSpeed * 3.6));
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
y -= dy;
} // grDispCarBoard1
@ -480,7 +478,7 @@ cGrBoard::grDispCarBoard1(const tCarElt *car, const tSituation *s)
// @return void
//
void
cGrBoard::grDispCarBoard2(const tCarElt *car, const tSituation *s)
cGrBoard::grDispCarBoard2(const tSituation *s)
{
// Font sizes
int dy = GfuiFontHeight(GFUI_FONT_MEDIUM_C);
@ -496,7 +494,7 @@ cGrBoard::grDispCarBoard2(const tCarElt *car, const tSituation *s)
// Populate buf to get the width of the drawing area
char buf[BUFSIZE];
snprintf(buf, sizeof(buf), "%s: %d/%d", car->_name, car->_pos, s->_ncars);
snprintf(buf, sizeof(buf), "%s: %d/%d", car_->_name, car_->_pos, s->_ncars);
const int dx = MAX(GfuiFontWidth(GFUI_FONT_MEDIUM_C, buf), (xr - x));
// Display board
@ -512,97 +510,97 @@ cGrBoard::grDispCarBoard2(const tCarElt *car, const tSituation *s)
// Display fuel
GfuiDrawString("Fuel:", grWhite, GFUI_FONT_SMALL_C, x, y);
float *clr = (car->_fuel < 5.0) ? grRed : grWhite;
snprintf(buf, sizeof(buf), "%.1f l", car->_fuel);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
float *color = (car_->_fuel < 5.0) ? grRed : grWhite;
snprintf(buf, sizeof(buf), "%.1f l", car_->_fuel);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
y -= dy;
clr = grWhite;
color = grWhite;
// Display lap counter
char const *lapsTimeLabel;
grGetLapsTime(s, car, buf, &lapsTimeLabel);
GfuiDrawString(lapsTimeLabel, clr, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
grGetLapsTime(s, buf, &lapsTimeLabel);
GfuiDrawString(lapsTimeLabel, color, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x2, y, dxc, GFUI_ALIGN_HR);
y -= dy;
// Display best lap time and diff of last and best lap
GfuiDrawString("Best:", clr, GFUI_FONT_SMALL_C, x, y);
grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, dxc, car->_bestLapTime, 0);
grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, dxc, car->_deltaBestLapTime, 1);
GfuiDrawString("Best:", color, GFUI_FONT_SMALL_C, x, y);
grWriteTime(color, GFUI_FONT_SMALL_C, x2, y, dxc, car_->_bestLapTime, 0);
grWriteTime(color, GFUI_FONT_SMALL_C, x3, y, dxc, car_->_deltaBestLapTime, 1);
y -= dy;
// Display current lap time and split times
GfuiDrawString("Time:", clr, GFUI_FONT_SMALL_C, x, y);
grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, dxc, car->_curLapTime, 0);
GfuiDrawString("Time:", color, GFUI_FONT_SMALL_C, x, y);
grWriteTime(color, GFUI_FONT_SMALL_C, x2, y, dxc, car_->_curLapTime, 0);
double time;
if (grGetSplitTime(s, car, false, time, NULL, &clr))
grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, dxc, time, 1);
clr = grWhite;
if (grGetSplitTime(s, false, time, NULL, &color))
grWriteTime(color, GFUI_FONT_SMALL_C, x3, y, dxc, time, 1);
color = grWhite;
y -= dy;
y -= dy;
// Display car ahead and diff
clr = grCyan;
if (car->_pos != 1) {
snprintf(buf, sizeof(buf), "%s", s->cars[car->_pos - 2]->_name);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x, y);
color = grCyan;
if (car_->_pos != 1) {
snprintf(buf, sizeof(buf), "%s", s->cars[car_->_pos - 2]->_name);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x, y);
if (s->_raceType == RM_TYPE_RACE) {
if (s->cars[car->_pos - 2]->_laps == car->_laps) {
grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, dxc,
s->cars[car->_pos - 2]->_curTime-car->_curTime, 1);
if (s->cars[car_->_pos - 2]->_laps == car_->_laps) {
grWriteTime(color, GFUI_FONT_SMALL_C, x3, y, dxc,
s->cars[car_->_pos - 2]->_curTime-car_->_curTime, 1);
} else {
GfuiDrawString("--:---", clr, GFUI_FONT_SMALL_C, x3, y, dxc,
GfuiDrawString("--:---", color, GFUI_FONT_SMALL_C, x3, y, dxc,
GFUI_ALIGN_HR);
}
} else {
if (car->_bestLapTime > 0.0f) {
grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, dxc,
car->_bestLapTime - s->cars[car->_pos - 2]->_bestLapTime, 1);
if (car_->_bestLapTime > 0.0f) {
grWriteTime(color, GFUI_FONT_SMALL_C, x3, y, dxc,
car_->_bestLapTime - s->cars[car_->_pos - 2]->_bestLapTime, 1);
} else {
GfuiDrawString("--:---", clr, GFUI_FONT_SMALL_C, x3, y, dxc,
GfuiDrawString("--:---", color, GFUI_FONT_SMALL_C, x3, y, dxc,
GFUI_ALIGN_HR);
}
}
} else {
GfuiDrawString(" ", clr, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString("--:---", clr, GFUI_FONT_SMALL_C, x3, y, dxc, GFUI_ALIGN_HR);
GfuiDrawString(" ", color, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString("--:---", color, GFUI_FONT_SMALL_C, x3, y, dxc, GFUI_ALIGN_HR);
}
y -= dy;
// Display car behind and diff
clr = grWhite;
if (car->_pos != s->_ncars) {
snprintf(buf, sizeof(buf), "%s", s->cars[car->_pos]->_name);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x, y);
color = grWhite;
if (car_->_pos != s->_ncars) {
snprintf(buf, sizeof(buf), "%s", s->cars[car_->_pos]->_name);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x, y);
if (s->_raceType == RM_TYPE_RACE) {
if (s->cars[car->_pos]->_laps == car->_laps) {
grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, dxc,
s->cars[car->_pos]->_curTime-car->_curTime, 1);
if (s->cars[car_->_pos]->_laps == car_->_laps) {
grWriteTime(color, GFUI_FONT_SMALL_C, x3, y, dxc,
s->cars[car_->_pos]->_curTime - car_->_curTime, 1);
} else {
GfuiDrawString("--:---", clr, GFUI_FONT_SMALL_C, x3, y, dxc,
GfuiDrawString("--:---", color, GFUI_FONT_SMALL_C, x3, y, dxc,
GFUI_ALIGN_HR);
}
} else {
if (s->cars[car->_pos]->_bestLapTime > 0.0f) {
grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, dxc,
s->cars[car->_pos]->_bestLapTime - car->_bestLapTime, 1);
if (s->cars[car_->_pos]->_bestLapTime > 0.0f) {
grWriteTime(color, GFUI_FONT_SMALL_C, x3, y, dxc,
s->cars[car_->_pos]->_bestLapTime - car_->_bestLapTime, 1);
} else {
GfuiDrawString("--:---", clr, GFUI_FONT_SMALL_C, x3, y, dxc,
GfuiDrawString("--:---", color, GFUI_FONT_SMALL_C, x3, y, dxc,
GFUI_ALIGN_HR);
}
}
} else {
GfuiDrawString(" ", clr, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString("--:---", clr, GFUI_FONT_SMALL_C, x3, y, dxc, GFUI_ALIGN_HR);
GfuiDrawString(" ", color, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString("--:---", color, GFUI_FONT_SMALL_C, x3, y, dxc, GFUI_ALIGN_HR);
}
y -= dy;
// Display control messages
// (lines 3 and 4 only, ABS TCS SPD goes to separate indicator)
for (int i = 2; i < 4; ++i) {
if (car->ctrl.msg[i]) {
GfuiDrawString(car->ctrl.msg[i], (float*)(car->ctrl.msgColor),
if (car_->ctrl.msg[i]) {
GfuiDrawString(car_->ctrl.msg[i], (float*)(car_->ctrl.msgColor),
GFUI_FONT_SMALL_C, x, y);
y -= dy;
}
@ -611,22 +609,22 @@ cGrBoard::grDispCarBoard2(const tCarElt *car, const tSituation *s)
void
cGrBoard::grDispCarBoard(const tCarElt *car, const tSituation *s)
cGrBoard::grDispCarBoard(const tSituation *s)
{
switch (boardFlag) {
case 0:
break;
case 1:
grDispCarBoard1(car, s);
grDispCarBoard1(s);
if (true)
grDispIndicators(car, false);
grDispIndicators(false);
break;
case 2:
grDispCarBoard2(car, s);
grDispCarBoard2(s);
if (true)
grDispIndicators(car, false);
grDispIndicators(false);
break;
default:
@ -640,7 +638,7 @@ cGrBoard::grDispCarBoard(const tCarElt *car, const tSituation *s)
#define ALIGN_RIGHT 2
void
cGrBoard::grDispEngineLeds(const tCarElt *car, int X, int Y, int align, bool bg)
cGrBoard::grDispEngineLeds(int X, int Y, int align, bool bg)
{
// Green LED
GLfloat ledcolg[2][3] = {
@ -658,8 +656,8 @@ cGrBoard::grDispEngineLeds(const tCarElt *car, int X, int Y, int align, bool bg)
int ledHeight = 10;
int ledWidth = 5;
int ledSpace = 2;
int ledRed = (int)((car->_enginerpmRedLine * 0.9 / car->_enginerpmMax) * (tdble)ledNb);
int ledLit = (int)((car->_enginerpm / car->_enginerpmMax) * (tdble)ledNb);
int ledRed = (int)((car_->_enginerpmRedLine * 0.9 / car_->_enginerpmMax) * (tdble)ledNb);
int ledLit = (int)((car_->_enginerpm / car_->_enginerpmMax) * (tdble)ledNb);
int x;
switch (align) {
@ -734,28 +732,27 @@ cGrBoard::grDispEngineLeds(const tCarElt *car, int X, int Y, int align, bool bg)
*
* Displays the leader board (in the lower left corner of the screen)
* If [drawLaps] is on, writes the lap counter on the top of the list.
* @param car[in] the car currently being viewed
* @param s[in] situation provided by the sim
*/
void
cGrBoard::grDispLeaderBoard(const tCarElt *car, const tSituation *s)
cGrBoard::grDispLeaderBoard(const tSituation *s)
{
double time_left;
if (leaderFlag == 4) {
// Scrolling line in the top of the screen
grDispLeaderBoardScrollLine(car, s);
grDispLeaderBoardScrollLine(s);
} else if (leaderFlag == 3 && leaderNb < s->_ncars) {
// This mode is only reasonable if there are more drivers
// than the leaderboard can display at once.
// Scrolling results in the top left corner
grDispLeaderBoardScroll(car, s);
grDispLeaderBoardScroll(s);
} else {
// Static leaderboard
char buf[BUFSIZE];
int current = 0; // Position of the currently displayed car
for (int i = 0; i < s->_ncars; ++i) {
if (car == s->cars[i]) {
if (car_ == s->cars[i]) {
current = i;
break;
}
@ -797,28 +794,28 @@ cGrBoard::grDispLeaderBoard(const tCarElt *car, const tSituation *s)
// Set colour of the drivers to that
// defined in the drivers' XML file.
// Current driver is yellow.
float *clr = (i == current)
float *color = (i == current)
? grYellow : grCarInfo[s->cars[i]->index].iconColor;
if (i == current)
clr = grYellow;
color = grYellow;
else if (i < current)
clr = grCyan;
color = grCyan;
else
clr = grWhite;
color = grWhite;
// Driver position + name
snprintf(buf, sizeof(buf), "%3d: %s", i + 1, s->cars[i]->_name);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x, y);
// Display driver time / time behind leader / laps behind leader
string sEntry = grGenerateLeaderBoardEntry(s->cars[i], s, (i == 0));
if (s->cars[i]->_state & RM_CAR_STATE_DNF
|| s->cars[i]->_state & RM_CAR_STATE_PIT) {
// driver DNF or in pit, show 'out' in red
clr = grRed;
color = grRed;
}
GfuiDrawString(sEntry.c_str(), clr, GFUI_FONT_SMALL_C, x2, y, dxc,
GfuiDrawString(sEntry.c_str(), color, GFUI_FONT_SMALL_C, x2, y, dxc,
GFUI_ALIGN_HR);
y += dy; // 'Line feed'
@ -857,10 +854,10 @@ cGrBoard::grDispLeaderBoard(const tCarElt *car, const tSituation *s)
void
cGrBoard::grDispCounterBoard2(const tCarElt *car)
cGrBoard::grDispCounterBoard2()
{
// RPM
tgrCarInstrument *curInst = &(grCarInfo[car->index].instrument[0]);
tgrCarInstrument *curInst = &(grCarInfo[car_->index].instrument[0]);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -888,10 +885,10 @@ cGrBoard::grDispCounterBoard2(const tCarElt *car)
// Show gear
char buf[32];
if (car->_gear <= 0)
snprintf(buf, sizeof(buf), "%s", car->_gear == 0 ? "N" : "R");
if (car_->_gear <= 0)
snprintf(buf, sizeof(buf), "%s", car_->_gear == 0 ? "N" : "R");
else
snprintf(buf, sizeof(buf), "%d", car->_gear);
snprintf(buf, sizeof(buf), "%d", car_->_gear);
GfuiDrawString(buf, curInst->needleColor, GFUI_FONT_LARGE_C,
(int)curInst->digitXCenter - 30,
(int)curInst->digitYCenter,
@ -900,7 +897,7 @@ cGrBoard::grDispCounterBoard2(const tCarElt *car)
glTranslatef(-centerAnchor, -BOTTOM_ANCHOR, 0);
// Speedo
curInst = &(grCarInfo[car->index].instrument[1]);
curInst = &(grCarInfo[car_->index].instrument[1]);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@ -932,7 +929,7 @@ cGrBoard::grDispCounterBoard2(const tCarElt *car)
if (curInst->digital) {
// Do not add "%3d" or something, because the digital font
// DOES NOT SUPPORT BLANKS!!!!
snprintf(buf, sizeof(buf), "%d", abs((int)(car->_speed_x * 3.6)));
snprintf(buf, sizeof(buf), "%d", abs((int)(car_->_speed_x * 3.6)));
GfuiDrawString(buf, curInst->needleColor, GFUI_FONT_LARGE_C,
(int)curInst->digitXCenter - 30,
(int)curInst->digitYCenter,
@ -943,17 +940,17 @@ cGrBoard::grDispCounterBoard2(const tCarElt *car)
// Fuel and damage meter
if (counterFlag == 1) {
float *clr;
if (car->_fuel < 5.0f) {
clr = grRed;
float *color;
if (car_->_fuel < 5.0f) {
color = grRed;
} else {
clr = grYellow;
color = grYellow;
}
grDrawGauge(centerAnchor + 140, BOTTOM_ANCHOR + 25, 100, clr,
grBackground, car->_fuel / car->_tank, "F");
grDrawGauge(centerAnchor + 140, BOTTOM_ANCHOR + 25, 100, color,
grBackground, car_->_fuel / car_->_tank, "F");
grDrawGauge(centerAnchor + 155, BOTTOM_ANCHOR + 25, 100, grRed,
grBackground, (tdble)(car->_dammage) / grMaxDammage, "D");
grBackground, (tdble)(car_->_dammage) / grMaxDammage, "D");
}
glTranslatef(0, -(speedoRise * TOP_ANCHOR / 100), 0);
@ -978,22 +975,23 @@ cGrBoard::shutdown(void)
void
cGrBoard::grDispArcade(const tCarElt *car, const tSituation *s)
cGrBoard::grDispArcade(const tSituation *s)
{
#define XM 15 // X margin
#define YM 10 // Y margin
// We are ARCADE, we draw BIIIIG
int dy = GfuiFontHeight(GFUI_FONT_BIG_C);
int dxc = 100;
const int dxc = 100;
int x = leftAnchor + XM;
int x2 = x + 50;
const int x = leftAnchor + XM;
const int x2 = x + 50;
const int width = rightAnchor - leftAnchor - 2 * XM;
int y = TOP_ANCHOR - YM - dy;
// Display driver name and race position
char buf[BUFSIZE];
snprintf(buf, sizeof(buf), "%d/%d", car->_pos, s->_ncars);
snprintf(buf, sizeof(buf), "%d/%d", car_->_pos, s->_ncars);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_BIG_C, x, y);
dy = GfuiFontHeight(GFUI_FONT_LARGE_C);
@ -1001,43 +999,52 @@ cGrBoard::grDispArcade(const tCarElt *car, const tSituation *s)
// Display current lap time
GfuiDrawString("Time:", grDefaultClr, GFUI_FONT_LARGE_C, x, y);
grWriteTime(grDefaultClr, GFUI_FONT_LARGE_C, x2, y, dxc, car->_curLapTime, 0);
grWriteTime(grDefaultClr, GFUI_FONT_LARGE_C, x2, y, dxc,
car_->_curLapTime, 0);
y -= dy;
// Display best lap time
GfuiDrawString("Best:", grDefaultClr, GFUI_FONT_LARGE_C, x, y);
grWriteTime(grDefaultClr, GFUI_FONT_LARGE_C, x2, y, dxc, car->_bestLapTime, 0);
grWriteTime(grDefaultClr, GFUI_FONT_LARGE_C, x2, y, dxc,
car_->_bestLapTime, 0);
y = TOP_ANCHOR - YM - dy;
grGetLapsTime (s, car, buf, NULL);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_LARGE_C, x, y, rightAnchor - leftAnchor - 2*XM, GFUI_ALIGN_HR);
grGetLapsTime (s, buf, NULL);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_LARGE_C, x, y,
width, GFUI_ALIGN_HR);
// Display driver name
snprintf(buf, sizeof(buf), "%s", car->_name);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_LARGE_C, x, y, rightAnchor - leftAnchor - 2*XM, GFUI_ALIGN_HC);
snprintf(buf, sizeof(buf), "%s", car_->_name);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_LARGE_C, x, y,
width, GFUI_ALIGN_HC);
// Draw fuel/damage gauges
float *clr = (car->_fuel < 5.0) ? grRed : grYellow;
grDrawGauge(leftAnchor + XM, BOTTOM_ANCHOR + 25, 100, clr, grBackground, car->_fuel / car->_tank, "F");
grDrawGauge(leftAnchor + XM + 15, BOTTOM_ANCHOR + 25, 100, grRed, grBackground, (tdble)(car->_dammage) / grMaxDammage, "D");
float *color = (car_->_fuel < 5.0) ? grRed : grYellow;
grDrawGauge(leftAnchor + XM, BOTTOM_ANCHOR + 25, 100, color,
grBackground, car_->_fuel / car_->_tank, "F");
grDrawGauge(leftAnchor + XM + 15, BOTTOM_ANCHOR + 25, 100, grRed,
grBackground, (tdble)(car_->_dammage) / grMaxDammage, "D");
// Display ABS/TCS/SPD indicators
grDispIndicators(car, true);
grDispIndicators(true);
// Display speed and gear
dy = GfuiFontHeight(GFUI_FONT_LARGE_C);
y = YM + dy;
snprintf(buf, sizeof(buf), "%3d km/h", abs((int)(car->_speed_x * 3.6)));
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_BIG_C, x, y, rightAnchor - leftAnchor - 2*XM, GFUI_ALIGN_HR);
snprintf(buf, sizeof(buf), "%3d km/h", abs((int)(car_->_speed_x * 3.6)));
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_BIG_C, x, y,
width, GFUI_ALIGN_HR);
y = YM;
if (car->_gear <= 0)
snprintf(buf, sizeof(buf), "%s", car->_gear == 0 ? "N" : "R");
if (car_->_gear <= 0)
snprintf(buf, sizeof(buf), "%s", car_->_gear == 0 ? "N" : "R");
else
snprintf(buf, sizeof(buf), "%d", car->_gear);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_LARGE_C, x, y, rightAnchor - leftAnchor - 2*XM, GFUI_ALIGN_HR);
snprintf(buf, sizeof(buf), "%d", car_->_gear);
GfuiDrawString(buf, grDefaultClr, GFUI_FONT_LARGE_C, x, y,
width, GFUI_ALIGN_HR);
// Display engine LED scale
grDispEngineLeds(car, rightAnchor - XM, YM + dy + GfuiFontHeight (GFUI_FONT_BIG_C), ALIGN_RIGHT, false);
grDispEngineLeds(rightAnchor - XM, YM + dy + GfuiFontHeight (GFUI_FONT_BIG_C),
ALIGN_RIGHT, false);
} // grDispArcade
@ -1046,22 +1053,20 @@ cGrBoard::grDispArcade(const tCarElt *car, const tSituation *s)
* split time is.
*
* @param s[in] A pointer to the current situation
* @param car[in] A pointer to the car to calculate the split time for
* @param gap_inrace[in] True if it must display the gap during races, false if compares the current lap with the personal best lap
* @param time[out] The split difference time
* @param laps_different[out] Contains the number of laps behind / for at the split point
* @param color[out] The color which can be used to display the split time
* @return true if there is a split time to be displayed, false otherwise
*/
bool cGrBoard::grGetSplitTime(const tSituation *s, const tCarElt *car,
bool gap_inrace, double &time,
bool cGrBoard::grGetSplitTime(const tSituation *s, bool gap_inrace, double &time,
int *laps_different, float **color)
{
tdble curSplit;
tdble bestSplit;
tdble bestSessionSplit;
const tCarElt *ocar = car;
const tCarElt *fcar = car;
const tCarElt *ocar = car_;
const tCarElt *fcar = car_;
int sign = 1;
int laps;
@ -1069,17 +1074,17 @@ bool cGrBoard::grGetSplitTime(const tSituation *s, const tCarElt *car,
*laps_different = 0;
if (s->_raceType != RM_TYPE_RACE || s->_ncars == 1) {
if (car->_currentSector == 0)
if (car_->_currentSector == 0)
return false;
curSplit = car->_curSplitTime[car->_currentSector - 1];
bestSplit = car->_bestSplitTime[car->_currentSector - 1];
curSplit = car_->_curSplitTime[car_->_currentSector - 1];
bestSplit = car_->_bestSplitTime[car_->_currentSector - 1];
if (car->_curLapTime - curSplit > 5.0f)
if (car_->_curLapTime - curSplit > 5.0f)
return false; /* Only display split for five seconds */
if (s->_ncars > 1) {
bestSessionSplit = s->cars[0]->_bestSplitTime[car->_currentSector - 1];
bestSessionSplit = s->cars[0]->_bestSplitTime[car_->_currentSector - 1];
if (bestSessionSplit <= 0.0f)
return false;
@ -1103,7 +1108,7 @@ bool cGrBoard::grGetSplitTime(const tSituation *s, const tCarElt *car,
*color = grWhite;
}
} else if (gap_inrace) {
if (car->_pos == 1) {
if (car_->_pos == 1) {
fcar = s->cars[1];
sign = -1;
}
@ -1137,16 +1142,16 @@ bool cGrBoard::grGetSplitTime(const tSituation *s, const tCarElt *car,
*color = grWhite;
} else {
if (car->_currentSector == 0)
if (car_->_currentSector == 0)
return false;
curSplit = car->_curSplitTime[car->_currentSector - 1];
bestSplit = car->_bestSplitTime[car->_currentSector - 1];
curSplit = car_->_curSplitTime[car_->_currentSector - 1];
bestSplit = car_->_bestSplitTime[car_->_currentSector - 1];
if (bestSplit < 0.0f)
return false;
if (car->_curLapTime - curSplit > 5.0f)
if (car_->_curLapTime - curSplit > 5.0f)
return false;
time = curSplit - bestSplit;
@ -1167,8 +1172,8 @@ bool cGrBoard::grGetSplitTime(const tSituation *s, const tCarElt *car,
* @param result[out] An already existing string of len BUFSIZE which will contain the text
* @param label[out] The label (Lap: or Time: ) If zero, then the label is added to @p result.
*/
void cGrBoard::grGetLapsTime(const tSituation *s, const tCarElt *car,
char* result, char const **label) const
void cGrBoard::grGetLapsTime(const tSituation *s, char* result,
char const **label) const
{
bool time = true;
double cur_left;
@ -1188,7 +1193,7 @@ void cGrBoard::grGetLapsTime(const tSituation *s, const tCarElt *car,
// Show only lap counts before start or after race
if (!time) {
snprintf(result, BUFSIZE, "%s%d/%d", loc_label, car->_laps, s->_totLaps);
snprintf(result, BUFSIZE, "%s%d/%d", loc_label, car_->_laps, s->_totLaps);
} else {
cur_left = s->_totTime - s->currentTime;
if (s->currentTime < 0.0f)
@ -1203,24 +1208,26 @@ void cGrBoard::grGetLapsTime(const tSituation *s, const tCarElt *car,
}
}
void cGrBoard::refreshBoard(tSituation *s, const cGrFrameInfo* frameInfo,
const tCarElt *currCar, bool isCurrScreen)
{
car_ = currCar;
grDispMisc(isCurrScreen);
if (arcadeFlag) {
grDispArcade(currCar, s);
grDispArcade(s);
} else {
if (debugFlag)
grDispDebug(s, currCar, frameInfo);
grDispDebug(s, frameInfo);
if (GFlag)
grDispGGraph(currCar);
grDispGGraph();
if (boardFlag)
grDispCarBoard(currCar, s);
grDispCarBoard(s);
if (leaderFlag)
grDispLeaderBoard(currCar, s);
grDispLeaderBoard(s);
if (counterFlag)
grDispCounterBoard2(currCar);
grDispCounterBoard2();
}
trackMap->display(currCar, s, 0, 0, rightAnchor, TOP_ANCHOR);
@ -1470,11 +1477,10 @@ void grShutdownBoardCar(void)
* Displays the leaderboard in a vertical scrolled fashion,
* if there are more than 10 names to display.
*
* @param car[in] pointer to the currently displayed car
* @param s[in] current situation, provided by the sim
*/
void
cGrBoard::grDispLeaderBoardScroll(const tCarElt *car, const tSituation *s)
cGrBoard::grDispLeaderBoardScroll(const tSituation *s)
{
// Scrolling
if (iTimer == 0 || s->currentTime < iTimer)
@ -1488,7 +1494,7 @@ cGrBoard::grDispLeaderBoardScroll(const tCarElt *car, const tSituation *s)
int current = 0; // Position of the currently displayed car
for (int i = 0; i < s->_ncars; ++i) {
if (car == s->cars[i]) {
if (car_ == s->cars[i]) {
current = i;
break;
}
@ -1523,21 +1529,21 @@ cGrBoard::grDispLeaderBoardScroll(const tCarElt *car, const tSituation *s)
// Set colour of the drivers to that
// defined in the drivers' XML file.
// Current driver is yellow...
float *clr = (i == current)
float *color = (i == current)
? grDefaultClr : grCarInfo[s->cars[i]->index].iconColor;
// Driver position + name
snprintf(buf, sizeof(buf), "%3d: %s", i + 1, s->cars[i]->_name);
GfuiDrawString(buf, clr, GFUI_FONT_SMALL_C, x, y);
GfuiDrawString(buf, color, GFUI_FONT_SMALL_C, x, y);
// Display driver time / time behind leader / laps behind leader
string sEntry = grGenerateLeaderBoardEntry(s->cars[i], s, (i == 0));
if (s->cars[i]->_state & RM_CAR_STATE_DNF
|| s->cars[i]->_state & RM_CAR_STATE_PIT) {
// driver DNF or in pit, show 'out' in red
clr = grRed;
color = grRed;
}
GfuiDrawString(sEntry.c_str(), clr, GFUI_FONT_SMALL_C, x2, y, dxc,
GfuiDrawString(sEntry.c_str(), color, GFUI_FONT_SMALL_C, x2, y, dxc,
GFUI_ALIGN_HR);
} // else i
y += dy; // 'Line feed'
@ -1562,11 +1568,10 @@ cGrBoard::grDispLeaderBoardScroll(const tCarElt *car, const tSituation *s)
*
* Scrolls the leaderboard on the bottom line, as seen on TV broadcasts.
*
* @param car[in] pointer to the currently displayed car
* @param s[in] current situation, provided by the sim
*/
void
cGrBoard::grDispLeaderBoardScrollLine(const tCarElt *car, const tSituation *s)
cGrBoard::grDispLeaderBoardScrollLine(const tSituation *s)
{
// At the start of the race or when first engaging this mode,
// we generate the 3-letter names to be used
@ -1639,13 +1644,11 @@ cGrBoard::grDispLeaderBoardScrollLine(const tCarElt *car, const tSituation *s)
* in the line, but colour handling and positioning
* is not available then.
*
* @param car
* @param isLeader
* @return string
*/
string
cGrBoard::grGenerateLeaderBoardEntry(const tCarElt* car,
const tSituation* s,
cGrBoard::grGenerateLeaderBoardEntry(const tCarElt *car, const tSituation* s,
const bool isLeader) const
{
char buf[BUFSIZE];
@ -1784,20 +1787,20 @@ cGrBoard::grSetupDrawingArea(int xl, int yb, int xr, int yt) const
void
cGrBoard::grDispIndicators(const tCarElt* car, const bool arcade)
cGrBoard::grDispIndicators(const bool arcade)
{
// Only useful for humans - maybe robots should show that, too?
if (car->_driverType == RM_DRV_HUMAN) {
if (car_->_driverType == RM_DRV_HUMAN) {
bool abs = false; // Show ABS indicator?
bool tcs = false; // Show TCS indicator?
bool spd = false; // Show speed limiter indicator?
// Parse control messages if they include ABS / TCS / SPD
for (int i = 0; i < 4; i++) {
if (car->ctrl.msg[i]) {
abs = abs || strstr(car->ctrl.msg[i], "ABS");
tcs = tcs || strstr(car->ctrl.msg[i], "TCS");
spd = spd || strstr(car->ctrl.msg[i], "Speed Limiter On");
if (car_->ctrl.msg[i]) {
abs = abs || strstr(car_->ctrl.msg[i], "ABS");
tcs = tcs || strstr(car_->ctrl.msg[i], "TCS");
spd = spd || strstr(car_->ctrl.msg[i], "Speed Limiter On");
}
}

View file

@ -33,6 +33,7 @@ class cGrBoard
{
protected:
int id; // Board Id
const tCarElt* car_;
int boardFlag;
int leaderFlag;
@ -54,36 +55,34 @@ class cGrBoard
std::string st; // This is the line we will display in the bottom
private:
void grDispDebug(const tSituation *s, const tCarElt *car,
const cGrFrameInfo* frame);
void grDispGGraph(const tCarElt *car);
void grDispDebug(const tSituation *s, const cGrFrameInfo* frame);
void grDispGGraph();
void grDispMisc(bool bCurrentScreen);
void grDrawGauge(tdble X1, tdble Y1, tdble H, float *clr1,
float *clr2, tdble val, const char *title);
void grDispEngineLeds(const tCarElt *car, int X, int Y, int align, bool bg);
void grDispEngineLeds(int X, int Y, int align, bool bg);
void grDispCarBoard(const tCarElt *car, const tSituation *s);
void grDispCarBoard1(const tCarElt *car, const tSituation *s);
void grDispCarBoard2(const tCarElt *car, const tSituation *s);
void grDispCarBoard(const tSituation *s);
void grDispCarBoard1(const tSituation *s);
void grDispCarBoard2(const tSituation *s);
void grDispIndicators(const tCarElt *car, const bool arcade);
void grDispIndicators(const bool arcade);
void grDispLeaderBoard(const tCarElt *car, const tSituation *s);
void grDispCounterBoard2(const tCarElt *car);
void grDispLeaderBoardScroll(const tCarElt *car, const tSituation *s);
void grDispLeaderBoardScrollLine(const tCarElt *car, const tSituation *s);
void grDispLeaderBoard(const tSituation *s);
void grDispCounterBoard2();
void grDispLeaderBoardScroll(const tSituation *s);
void grDispLeaderBoardScrollLine(const tSituation *s);
void grDispArcade(const tCarElt *car, const tSituation *s);
std::string grGenerateLeaderBoardEntry(const tCarElt *car,
const tSituation *s, const bool isLeader) const;
void grDispArcade(const tSituation *s);
std::string grGenerateLeaderBoardEntry(const tCarElt *car, const tSituation *s,
const bool isLeader) const;
// Track overview object
cGrTrackMap *trackMap;
bool grGetSplitTime(const tSituation *s, const tCarElt *car,
bool gap_inrace, double &time,
int *laps_different, float **color);
void grGetLapsTime(const tSituation *s, const tCarElt *car,
char* result, char const** label) const;
bool grGetSplitTime(const tSituation *s, bool gap_inrace,
double &time, int *laps_different, float **color);
void grGetLapsTime(const tSituation *s, char* result,
char const** label) const;
void grMakeThreeLetterNames(const tSituation *s);
void grSetupDrawingArea(int xl, int yb, int xr, int yt) const;