TORCS  1.3.9
The Open Racing Car Simulator
grboard.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  file : grboard.cpp
4  created : Thu Aug 17 23:52:20 CEST 2000
5  copyright : (C) 2000-2017 by Eric Espie, Bernhard Wymann
6  email : torcs@free.fr
7  version : $Id$
8 
9  ***************************************************************************/
10 
11 /***************************************************************************
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * *
18  ***************************************************************************/
19 
20 
21 #include <stdlib.h>
22 #include <stdio.h>
23 #include <math.h>
24 #include <plib/ssg.h>
25 #include <portability.h>
26 
27 #include "grcam.h"
28 #include "grboard.h"
29 #include "grssgext.h"
30 #include "grshadow.h"
31 #include "grskidmarks.h"
32 #include "grsmoke.h"
33 #include "grcar.h"
34 #include "grmain.h"
35 #include "grutil.h"
36 #include <robottools.h>
37 #include <tgfclient.h>
38 
39 #include "grboard.h"
40 
41 static float grWhite[4] = {1.0, 1.0, 1.0, 1.0};
42 static float grRed[4] = {1.0, 0.0, 0.0, 1.0};
43 static float grBlue[4] = {0.0, 0.0, 1.0, 1.0};
44 static float grGreen[4] = {0.0, 1.0, 0.0, 1.0};
45 static float grBlack[4] = {0.0, 0.0, 0.0, 1.0};
46 static float grDefaultClr[4] = {0.9, 0.9, 0.15, 1.0};
47 
48 #define NB_BOARDS 3
49 #define NB_LBOARDS 3
50 #define NB_CBOARDS 3
51 
52 static int Winx = 0;
53 static int Winw = 800;
54 static int Winy = 0;
55 static int Winh = 600;
56 
57 cGrBoard::cGrBoard (int myid) {
58  id = myid;
59  trackMap = NULL;
60  Winw = grWinw*600/grWinh;
61 }
62 
63 
65  trackMap = NULL;
66 }
67 
68 
69 void
71 {
72  const int BUFSIZE=1024;
73  char path[BUFSIZE];
74  snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
75 
76  debugFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_DEBUG, NULL, 1);
77  boardFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_BOARD, NULL, 2);
78  leaderFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_LEADER, NULL, 1);
79  leaderNb = (int)GfParmGetNum(grHandle, path, GR_ATT_NBLEADER, NULL, 10);
80  counterFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_COUNTER, NULL, 1);
81  GFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_GGRAPH, NULL, 1);
82  arcadeFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_ARCADE, NULL, 0);
83 
85 
86  if (curCar->_driverType == RM_DRV_HUMAN) {
87  snprintf(path, BUFSIZE, "%s/%s", GR_SCT_DISPMODE, curCar->_name);
93  GFlag = (int)GfParmGetNum(grHandle, path, GR_ATT_GGRAPH, NULL, GFlag);
96  }
97 }
98 
99 
100 void
102 {
103  const int BUFSIZE=1024;
104  char path[BUFSIZE];
105  snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
106 
107  switch (val) {
108  case 0:
109  boardFlag = (boardFlag + 1) % NB_BOARDS;
110  GfParmSetNum(grHandle, path, GR_ATT_BOARD, (char*)NULL, (tdble)boardFlag);
111  break;
112  case 1:
114  GfParmSetNum(grHandle, path, GR_ATT_COUNTER, (char*)NULL, (tdble)counterFlag);
115  break;
116  case 2:
117  leaderFlag = (leaderFlag + 1) % NB_LBOARDS;
118  GfParmSetNum(grHandle, path, GR_ATT_LEADER, (char*)NULL, (tdble)leaderFlag);
119  break;
120  case 3:
121  debugFlag = 1 - debugFlag;
122  GfParmSetNum(grHandle, path, GR_ATT_DEBUG, (char*)NULL, (tdble)debugFlag);
123  break;
124  case 4:
125  GFlag = 1 - GFlag;
126  GfParmSetNum(grHandle, path, GR_ATT_GGRAPH, (char*)NULL, (tdble)GFlag);
127  break;
128  case 5:
129  arcadeFlag = 1 - arcadeFlag;
130  GfParmSetNum(grHandle, path, GR_ATT_ARCADE, (char*)NULL, (tdble)arcadeFlag);
131  break;
132  }
133  GfParmWriteFile(NULL, grHandle, "graph");
134 }
135 
136 
137 void
139 {
140  const int BUFSIZE=256;
141  char buf[BUFSIZE];
142  int x, y;
143 
144  x = Winx + Winw - 100;
145  y = Winy + Winh - 30;
146 
147  snprintf(buf, BUFSIZE, "FPS: %.1f", fps);
149  return;
150 
151  /*
152  tRoadCam *curCam;
153 
154  curCam = car->_trkPos.seg->cam;
155 
156  y -= 15;
157  snprintf(buf, BUFSIZE, "Seg: %s", car->_trkPos.seg->name);
158  GfuiPrintString(buf, grWhite, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
159  y -= 15;
160  if (curCam) {
161  snprintf(buf, BUFSIZE, "Cam: %s", curCam->name);
162  GfuiPrintString(buf, grWhite, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
163  y -= 15;
164  }
165  */
166 }
167 
168 void
170 {
171  tdble X1, Y1, X2, Y2, xc, yc;
172 
173  X1 = (tdble)(Winx + Winw - 100);
174  Y1 = (tdble)(Winy + 100);
175  xc = (tdble)(Winx + Winw - 30);
176  yc = (tdble)(Y1 - 50);
177 
178  X2 = -car->_DynGC.acc.y / 9.81f * 25.0f + X1;
179  Y2 = car->_DynGC.acc.x / 9.81f * 25.0f + Y1;
180  glBegin(GL_LINES);
181  glColor4f(1.0, 1.0, 1.0, 1.0);
182  glVertex2f(X1-50, Y1);
183  glVertex2f(X1+50, Y1);
184  glVertex2f(X1, Y1-50);
185  glVertex2f(X1, Y1+50);
186  glVertex2f(xc, yc);
187  glVertex2f(xc, yc+100);
188  glEnd();
189 
190  const tdble THNSS = 2.0f;
191 
192  glBegin(GL_QUADS);
193  glColor4f(0.0, 0.0, 1.0, 1.0);
194  glVertex2f(X1 - THNSS, Y1);
195  glVertex2f(X1 + THNSS, Y1);
196  glVertex2f(X1 + THNSS, Y1 + car->ctrl.accelCmd * 50.0f);
197  glVertex2f(X1 - THNSS, Y1 + car->ctrl.accelCmd * 50.0f);
198 
199  glVertex2f(X1 - THNSS, Y1);
200  glVertex2f(X1 + THNSS, Y1);
201  glVertex2f(X1 + THNSS, Y1 - car->ctrl.brakeCmd * 50.0f);
202  glVertex2f(X1 - THNSS, Y1 - car->ctrl.brakeCmd * 50.0f);
203 
204  glVertex2f(X1, Y1 - THNSS);
205  glVertex2f(X1, Y1 + THNSS);
206  glVertex2f(X1 - car->ctrl.steer * 50.0f, Y1 + THNSS);
207  glVertex2f(X1 - car->ctrl.steer * 50.0f, Y1 - THNSS);
208 
209  glVertex2f(xc - THNSS, yc);
210  glVertex2f(xc + THNSS, yc);
211  glVertex2f(xc + THNSS, yc + car->ctrl.clutchCmd * 100.0f);
212  glVertex2f(xc - THNSS, yc + car->ctrl.clutchCmd * 100.0f);
213 
214  glEnd();
215 
216  glBegin(GL_LINES);
217  glColor4f(1.0, 0.0, 0.0, 1.0);
218  glVertex2f(X1, Y1);
219  glVertex2f(X2, Y2);
220  glEnd();
221 }
222 
223 
224 void
225 cGrBoard::grDrawGauge(tdble X1, tdble Y1, tdble H, float *clr1, float *clr2, tdble val, const char *title)
226 {
227  tdble curH;
228 
229  curH = MIN(val, 1.0);
230  curH = MAX(curH, 0.0);
231  curH *= H;
232 
233 #define THNSSBG 2.0
234 #define THNSSFG 2.0
235  glBegin(GL_QUADS);
236  glColor4fv(grBlack);
237  glVertex2f(X1 - (THNSSBG + THNSSFG), Y1 - THNSSBG);
238  glVertex2f(X1 + (THNSSBG + THNSSFG), Y1 - THNSSBG);
239  glVertex2f(X1 + (THNSSBG + THNSSFG), Y1 + H + THNSSBG);
240  glVertex2f(X1 - (THNSSBG + THNSSFG), Y1 + H + THNSSBG);
241 
242  glColor4fv(clr2);
243  glVertex2f(X1 - THNSSFG, Y1 + curH);
244  glVertex2f(X1 + THNSSFG, Y1 + curH);
245  glVertex2f(X1 + THNSSFG, Y1 + H);
246  glVertex2f(X1 - THNSSFG, Y1 + H);
247 
248  glColor4fv(clr1);
249  glVertex2f(X1 - THNSSFG, Y1);
250  glVertex2f(X1 + THNSSFG, Y1);
251  glVertex2f(X1 + THNSSFG, Y1 + curH);
252  glVertex2f(X1 - THNSSFG, Y1 + curH);
253  glEnd();
255 }
256 
257 void
259 {
260  float *clr;
261 
262  if (car->_fuel < 5.0f) {
263  clr = grRed;
264  } else {
265  clr = grWhite;
266  }
267 
268  tdble fw = Winw/800.0f;
269 
270  grDrawGauge(545.0f*fw, 20.0f*fw, 80.0f, clr, grBlack, car->_fuel / car->_tank, "F");
271  grDrawGauge(560.0f*fw, 20.0f*fw, 80.0f, grRed, grGreen, (tdble)(car->_dammage) / grMaxDammage, "D");
272 }
273 
274 void
276 {
277  int x, x2, y;
278  const int BUFSIZE=256;
279  char buf[BUFSIZE];
280  float *clr;
281  int dy, dy2, dx;
282 
283  x = 10;
284  x2 = 110;
287  y = Winy + Winh - dy - 5;
288  snprintf(buf, BUFSIZE, "%d/%d - %s", car->_pos, s->_ncars, car->_name);
290  dx = MAX(dx, (x2-x));
291 
292  glEnable(GL_BLEND);
293  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
294  glBegin(GL_QUADS);
295  glColor4f(0.1, 0.1, 0.1, 0.8);
296  glVertex2f(x-5, y + dy);
297  glVertex2f(x+dx+5, y + dy);
298  glVertex2f(x+dx+5, y-5 - dy2 * 9 /* lines */);
299  glVertex2f(x-5, y-5 - dy2 * 9 /* lines */);
300  glEnd();
301  glDisable(GL_BLEND);
302 
304  y -= dy;
305 
307 
309  if (car->_fuel < 5.0) {
310  clr = grRed;
311  } else {
312  clr = grWhite;
313  }
314  snprintf(buf, BUFSIZE, "%.1f l", car->_fuel);
316  y -= dy;
317 
318  if (car->_state & RM_CAR_STATE_BROKEN) {
319  clr = grRed;
320  } else {
321  clr = grWhite;
322  }
323 
324  GfuiPrintString("Damage:", clr, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
325  snprintf(buf, BUFSIZE, "%d", car->_dammage);
327  y -= dy;
328  clr = grWhite;
329 
331  snprintf(buf, BUFSIZE, "%d / %d", car->_laps, s->_totLaps);
333  y -= dy;
334 
336  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, s->currentTime, 0);
337  y -= dy;
338 
340  if (!car->_commitBestLapTime) {
341  clr = grRed;
342  }
343  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_curLapTime, 0);
344  y -= dy;
345  clr = grWhite;
346 
348  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_lastLapTime, 0);
349  y -= dy;
350 
352  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_bestLapTime, 0);
353  y -= dy;
354 
355  GfuiPrintString("Penalty:", clr, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
356  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_penaltyTime, 0);
357  y -= dy;
358 
359  GfuiPrintString("Top Speed:", clr, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
360  snprintf(buf, BUFSIZE, "%d", (int)(car->_topSpeed * 3.6));
362 }
363 
364 void
366 {
367  int x, x2, x3, y;
368  const int BUFSIZE=256;
369  char buf[BUFSIZE];
370  float *clr;
371  int dy, dy2, dx;
372  int i;
373 
374  x = 10;
375  x2 = 110;
376  x3 = 186;
379 
380  y = Winy + Winh - dy - 5;
381 
382  snprintf(buf, BUFSIZE, "%d/%d - %s", car->_pos, s->_ncars, car->_name);
384  dx = MAX(dx, (x3-x));
385 
386  glEnable(GL_BLEND);
387  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
388  glBegin(GL_QUADS);
389  glColor4f(0.1, 0.1, 0.1, 0.8);
390  glVertex2f(x-5, y + dy);
391  glVertex2f(x+dx+5, y + dy);
392  int y2 = y-5 - dy2 * 7;
393  glVertex2f(x+dx+5, y2);
394  glVertex2f(x-5, y2);
395  glEnd();
396 
397  if (car->info.skillLevel == 3) {
398  glBegin(GL_QUADS);
399  glVertex2f(x-5, y2 - 2);
400  glVertex2f(x+dx+5, y2 - 2);
401  y2 = y2 - 2 - dy2 * 6;
402  glVertex2f(x+dx+5, y2);
403  glVertex2f(x-5, y2);
404  glEnd();
405  }
406 
407  glBegin(GL_QUADS);
408  glVertex2f(x-5, y2 - 2);
409  glVertex2f(x+dx+5, y2 - 2);
410  y2 = y2 - 2 - dy2 * 4;
411  glVertex2f(x+dx+5, y2);
412  glVertex2f(x-5, y2);
413  glEnd();
414  glDisable(GL_BLEND);
415 
417  y -= dy;
418 
420 
422  if (car->_fuel < 5.0) {
423  clr = grRed;
424  } else {
425  clr = grWhite;
426  }
427  snprintf(buf, BUFSIZE, "%.1f l", car->_fuel);
429  y -= dy;
430 
431  clr = grWhite;
432 
434  snprintf(buf, BUFSIZE, "%d / %d", car->_laps, s->_totLaps);
436  y -= dy;
437 
439  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_bestLapTime, 0);
440  grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, car->_deltaBestLapTime, 1);
441  y -= dy;
442 
444  if (!car->_commitBestLapTime) {
445  clr = grRed;
446  }
447  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_curLapTime, 0);
448  y -= dy;
449  clr = grWhite;
450 
451  GfuiPrintString("Penalty:", clr, GFUI_FONT_SMALL_C, x, y, GFUI_ALIGN_HL_VB);
452  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, car->_penaltyTime, 0);
453  y -= dy;
454 
455  if (car->_pos != 1) {
456  snprintf(buf, BUFSIZE, "<- %s", s->cars[car->_pos - 2]->_name);
458  if (s->cars[car->_pos - 2]->_laps == car->_laps) {
459  grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, s->cars[car->_pos - 2]->_curTime-car->_curTime, 1);
460  } else {
461  GfuiPrintString(" --:--", clr, GFUI_FONT_SMALL_C, x3, y, GFUI_ALIGN_HR_VB);
462  }
463  } else {
465  GfuiPrintString(" --:--", clr, GFUI_FONT_SMALL_C, x3, y, GFUI_ALIGN_HR_VB);
466  }
467  y -= dy;
468 
469  if (car->_pos != s->_ncars) {
470  snprintf(buf, BUFSIZE, "-> %s", s->cars[car->_pos]->_name);
472  if (s->cars[car->_pos]->_laps == car->_laps) {
473  grWriteTime(clr, GFUI_FONT_SMALL_C, x3, y, s->cars[car->_pos]->_curTime-car->_curTime, 1);
474  } else {
475  GfuiPrintString(" --:--", clr, GFUI_FONT_SMALL_C, x3, y, GFUI_ALIGN_HR_VB);
476  }
477  } else {
479  GfuiPrintString(" --:--", clr, GFUI_FONT_SMALL_C, x3, y, GFUI_ALIGN_HR_VB);
480  }
481  y -= dy+5;
482 
483  if (car->info.skillLevel == 3) {
484  static const char* wheellabel[4] = {"FR", "FL", "RR", "RL"};
485 
486  GfuiPrintString("T[Celsius], P[Bar], Wear[-], Grain[-]", grWhite, GFUI_FONT_SMALL_C, x, y-5*dy, GFUI_ALIGN_HL_VB);
487 
488  static const int tx0 = 45;
489  static const int tdx = 47;
490 
491  for (i = 0; i < 4; i++) {
492  const tWheelState* const wheel = &(car->priv.wheel[i]);
493 
494  GfuiPrintString(wheellabel[i], grWhite, GFUI_FONT_SMALL_C, tx0+i*tdx, y, GFUI_ALIGN_HR_VB);
495 
496  snprintf(buf, BUFSIZE, "%4.1f", wheel->currentTemperature - 273.15f);
498  snprintf(buf, BUFSIZE, "%4.3f", (wheel->currentPressure - car->priv.localPressure)/100000.0f);
500  snprintf(buf, BUFSIZE, "%5.4f", wheel->currentWear);
502  snprintf(buf, BUFSIZE, "%5.4f", wheel->currentGraining);
504  }
505 
506  y -= dy*6+2;
507  }
508 
509  for (i = 0; i < 4; i++) {
510  if (car->ctrl.msg[i]) {
512  y -= dy;
513  }
514  }
515 }
516 
517 void
519 {
520  switch(boardFlag) {
521  case 0:
522  break;
523  case 1:
524  grDispCarBoard1(car, s);
525  break;
526  case 2:
527  grDispCarBoard2(car, s);
528  break;
529  default:
530  break;
531  }
532 }
533 
534 static const char *gearStr[MAX_GEARS] = {"R", "N", "1", "2", "3", "4", "5", "6", "7", "8"};
535 
536 #define ALIGN_CENTER 0
537 #define ALIGN_LEFT 1
538 #define ALIGN_RIGHT 2
539 
540 static void
541 grDispEngineLeds (tCarElt *car, int X, int Y, int align, int bg)
542 {
543  int x, y;
544  int xref;
545  GLfloat ledcolg[2][3] = {
546  {0.0, 0.2, 0.0},
547  {0.0, 1.0, 0.0}
548  };
549 
550  GLfloat ledcolr[2][3] = {
551  {0.2, 0.0, 0.0},
552  {1.0, 0.0, 0.0}
553  };
554 
555  int i;
556  int ledNb = 20;
557  int ledHeight = 10;
558  int ledWidth = 5;
559  int ledSpace = 2;
560  int ledRed = (int)((car->_enginerpmRedLine * .9 / car->_enginerpmMax) * (tdble)ledNb);
561  int ledLit = (int)((car->_enginerpm / car->_enginerpmMax) * (tdble)ledNb);
562 
563  switch (align) {
564  case ALIGN_CENTER:
565  x = X - ((ledNb * ledWidth) + (ledNb - 1) * ledSpace) / 2;
566  break;
567  case ALIGN_LEFT:
568  x = X;
569  break;
570  case ALIGN_RIGHT:
571  x = X - ((ledNb * ledWidth) + (ledNb - 1) * ledSpace);
572  break;
573  default:
574  x = X - ((ledNb * ledWidth) + (ledNb - 1) * ledSpace) / 2;
575  break;
576  }
577 
578  y = Y;
579  glBegin(GL_QUADS);
580 
581  if (bg) {
582  glColor3f(0.1, 0.1, 0.1);
583  glVertex2f(x - ledSpace, y + ledHeight + ledSpace);
584  glVertex2f(x + ledNb * (ledWidth+ ledSpace), y + ledHeight + ledSpace);
585  glVertex2f(x + ledNb * (ledWidth+ ledSpace), Winy);
586  glVertex2f(x - ledSpace, Winy);
587  }
588 
589  xref = x;
590  glColor3fv(ledcolg[0]);
591  for (i = 0; i < ledRed; i++) {
592  glVertex2f(x, y);
593  glVertex2f(x + ledWidth, y);
594  glVertex2f(x + ledWidth, y + ledHeight);
595  glVertex2f(x, y + ledHeight);
596  x += ledWidth + ledSpace;
597  }
598 
599  glColor3fv(ledcolr[0]);
600  for (i = ledRed; i < ledNb; i++) {
601  glVertex2f(x, y);
602  glVertex2f(x + ledWidth, y);
603  glVertex2f(x + ledWidth, y + ledHeight);
604  glVertex2f(x, y + ledHeight);
605  x += ledWidth + ledSpace;
606  }
607  x = xref;
608 #define DD 1
609  glColor3fv(ledcolg[1]);
610  for (i = 0; i < ledNb; i++) {
611  if (i == ledRed) {
612  glColor3fv(ledcolr[1]);
613  }
614  if (i <= ledLit) {
615  glVertex2f(x + DD, y + DD);
616  glVertex2f(x + ledWidth - DD, y + DD);
617  glVertex2f(x + ledWidth - DD, y + ledHeight - DD);
618  glVertex2f(x + DD, y + ledHeight - DD);
619  x += ledWidth + ledSpace;
620  } else {
621  break;
622  }
623  }
624  glEnd();
625 }
626 
627 void
629 {
630  int x, y;
631  const int BUFSIZE=256;
632  char buf[BUFSIZE];
633 
635 
636  x = Winx + Winw/2;
637  y = Winy;
638  snprintf(buf, BUFSIZE, " kph %s", gearStr[car->_gear+car->_gearOffset]);
640 
641  x = Winx + Winw/2;
642  snprintf(buf, BUFSIZE, "%3d", abs((int)(car->_speed_x * 3.6)));
644 }
645 
646 void
648 {
649  int x, x2, y, i, j;
650  const int BUFSIZE=256;
651  char buf[BUFSIZE];
652  int maxi = MIN(leaderNb, s->_ncars);
653  float *clr;
654  int dy;
655  int drawCurrent;
656  int drawLaps = leaderFlag - 1;
657  int current = 0;
658 
659  for (i = 0; i < s->_ncars; i++) {
660  if (car == s->cars[i]) {
661  current = i;
662  break;
663  }
664  }
665 
666  x = Winx + 5;
667  x2 = Winx + 170;
668  y = Winy + 10;
670 
671  glEnable(GL_BLEND);
672  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
673  glBegin(GL_QUADS);
674  glColor4f(0.1, 0.1, 0.1, 0.8);
675  glVertex2f(x, Winy + 5);
676  glVertex2f(Winx + 180, Winy + 5);
677  glVertex2f(Winx + 180, y + dy * (maxi + drawLaps));
678  glVertex2f(x, y + dy * (maxi + drawLaps));
679  glEnd();
680  glDisable(GL_BLEND);
681 
682  if (current + 1 > maxi) {
683  drawCurrent = 1;
684  } else {
685  drawCurrent = 0;
686  }
687 
688  for (j = maxi; j > 0; j--) {
689  if (drawCurrent) {
690  i = current + 1;
691  drawCurrent = 0;
692  } else {
693  i = j;
694  }
695 
696  if (i == current + 1) {
697  clr = grCarInfo[car->index].iconColor;
698  drawCurrent = 0;
699  } else {
700  clr = grWhite;
701  }
702 
703  snprintf(buf, BUFSIZE, "%3d: %s", i, s->cars[i-1]->_name);
705 
706  if (s->cars[i-1]->_state & RM_CAR_STATE_DNF) {
708  } else if (s->cars[i-1]->_timeBehindLeader == 0) {
709  if (i != 1) {
710  GfuiPrintString(" --:--", clr, GFUI_FONT_SMALL_C, x2, y, GFUI_ALIGN_HR_VB);
711  } else {
712  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, s->cars[i-1]->_curTime, 0);
713  }
714  } else {
715  if (i == 1) {
716  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, s->cars[i-1]->_curTime, 0);
717  } else {
718  if (s->cars[i-1]->_lapsBehindLeader == 0) {
719  grWriteTime(clr, GFUI_FONT_SMALL_C, x2, y, s->cars[i-1]->_timeBehindLeader, 1);
720  } else {
721  if (s->cars[i-1]->_lapsBehindLeader > 1) {
722  snprintf(buf, BUFSIZE, "+%3d Laps", s->cars[i-1]->_lapsBehindLeader);
723  } else {
724  snprintf(buf, BUFSIZE, "+%3d Lap", s->cars[i-1]->_lapsBehindLeader);
725  }
727  }
728  }
729  }
730  y += dy;
731  }
732 
733  if (drawLaps) {
735  snprintf(buf, BUFSIZE, "%d / %d", s->cars[0]->_laps, s->_totLaps);
737  }
738 }
739 
740 
741 void
743 {
744  int index;
745  tgrCarInstrument *curInst;
746  tdble val;
747  const int BUFSIZE=32;
748  char buf[BUFSIZE];
749 
750  index = car->index; /* current car's index */
751  curInst = &(grCarInfo[index].instrument[0]);
752 
753  glEnable(GL_BLEND);
754  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
755  glEnable(GL_TEXTURE_2D);
756  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
757  glBindTexture(GL_TEXTURE_2D, curInst->texture->getTextureHandle());
758  glCallList(curInst->CounterList);
759  glBindTexture(GL_TEXTURE_2D, 0);
760 
761  val = (*(curInst->monitored) - curInst->minValue) / curInst->maxValue;
762  if (val > 1.0) {
763  val = 1.0;
764  } else if (val < 0.0) {
765  val = 0.0;
766  }
767 
768  val = curInst->minAngle + val * curInst->maxAngle;
769 
770  RELAXATION(val, curInst->prevVal, 30);
771 
772  glPushMatrix();
773  glTranslatef(curInst->needleXCenter, curInst->needleYCenter, 0);
774  glRotatef(val, 0, 0, 1);
775  glCallList(curInst->needleList);
776  glPopMatrix();
777 
778  GfuiPrintString((char*)(gearStr[car->_gear+car->_gearOffset]), grRed, GFUI_FONT_LARGE_C,
779  (int)curInst->digitXCenter, (int)(curInst->digitYCenter), GFUI_ALIGN_HC_VB);
780 
781 
782  curInst = &(grCarInfo[index].instrument[1]);
783 
784  glEnable(GL_BLEND);
785  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) ;
786  glEnable(GL_TEXTURE_2D);
787  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
788  glBindTexture(GL_TEXTURE_2D, curInst->texture->getTextureHandle());
789  glCallList(curInst->CounterList);
790  glBindTexture(GL_TEXTURE_2D, 0);
791 
792  val = (*(curInst->monitored) - curInst->minValue) / curInst->maxValue;
793  if (val > 1.0) {
794  val = 1.0;
795  } else if (val < 0.0) {
796  val = 0.0;
797  }
798  val = curInst->minAngle + val * curInst->maxAngle;
799 
800  RELAXATION(val, curInst->prevVal, 30);
801 
802  glPushMatrix();
803  glTranslatef(curInst->needleXCenter, curInst->needleYCenter, 0);
804  glRotatef(val, 0, 0, 1);
805  glCallList(curInst->needleList);
806  glPopMatrix();
807 
808  if (curInst->digital) {
809  // Do not add "%3d" or something, because the digital font DOES NOT SUPPORT BLANKS!!!!
810  snprintf(buf, BUFSIZE, "%d", abs((int)(car->_speed_x * 3.6)));
812  (int)curInst->digitXCenter, (int)(curInst->digitYCenter), GFUI_ALIGN_HC_VB);
813  }
814 
815  if (counterFlag == 1){
816  grDispMisc(car);
817  }
818 }
819 
820 void
822 {
823  if (trackMap == NULL) {
824  trackMap = new cGrTrackMap();
825  }
826 }
827 
828 void
830 {
831  if (trackMap != NULL) {
832  delete trackMap;
833  trackMap = NULL;
834  }
835 }
836 
837 void
839 {
840  int x, y;
841  int dy;
842  const int BUFSIZE=256;
843  char buf[BUFSIZE];
844  float *clr;
845 
846 #define XM 15
847 #define YM 10
848 
849  x = XM;
851  y = Winy + Winh - YM - dy;
852  snprintf(buf, BUFSIZE,"%d/%d", car->_pos, s->_ncars);
854 
856  y -= dy;
858  if (!car->_commitBestLapTime) {
859  clr = grRed;
860  } else {
861  clr = grDefaultClr;
862  }
863  grWriteTime(clr, GFUI_FONT_LARGE_C, x + 150, y, car->_curLapTime, 0);
864 
865  y -= dy;
867  grWriteTime(grDefaultClr, GFUI_FONT_LARGE_C, x + 150, y, car->_bestLapTime, 0);
868 
869  x = Winx + Winw - XM;
870  y = Winy + Winh - YM - dy;
871  snprintf(buf, BUFSIZE, "Lap: %d/%d", car->_laps, s->_totLaps);
873 
874 
875  x = Winx + Winw / 2;
876  snprintf(buf, BUFSIZE, "%s", car->_name);
878 
879 
880  if (car->_fuel < 5.0) {
881  clr = grRed;
882  } else {
883  clr = grWhite;
884  }
885  grDrawGauge(XM, 20.0, 80.0, clr, grBlack, car->_fuel / car->_tank, "F");
886  grDrawGauge(XM + 15, 20.0, 80.0, grRed, grGreen, (tdble)(car->_dammage) / grMaxDammage, "D");
887 
888  x = Winx + Winw - XM;
890  y = YM + dy;
891  snprintf(buf, BUFSIZE, "%3d km/h", abs((int)(car->_speed_x * 3.6)));
893  y = YM;
894  snprintf(buf, BUFSIZE, "%s", gearStr[car->_gear+car->_gearOffset]);
896 
898 }
899 
900 
901 void cGrBoard::refreshBoard(tSituation *s, float Fps, int forceArcade, tCarElt *curr)
902 {
903  if (arcadeFlag || forceArcade) {
904  grDispArcade(curr, s);
905  } else {
906  if (debugFlag) grDispDebug(Fps, curr);
907  if (GFlag) grDispGGraph(curr);
908  if (boardFlag) grDispCarBoard(curr, s);
909  if (leaderFlag) grDispLeaderBoard(curr, s);
910  if (counterFlag) grDispCounterBoard2(curr);
911  }
912 
913  trackMap->display(curr, s, Winx, Winy, Winw, Winh);
914 }
915 
916 
918 {
919  const int BUFSIZE=1024;
920  char buf[BUFSIZE];
921  int index;
922  void *handle;
923  const char *param;
925  tgrCarInfo *carInfo;
926  tgrCarInstrument *curInst;
927  tdble xSz, ySz, xpos, ypos;
928  tdble needlexSz, needleySz;
929 
930  ssgSetCurrentOptions ( &options ) ;
931 
932  index = car->index; /* current car's index */
933  carInfo = &grCarInfo[index];
934  handle = car->_carHandle;
935 
936  /* Tachometer */
937  curInst = &(carInfo->instrument[0]);
938 
939  /* Load the Tachometer texture */
940  param = GfParmGetStr(handle, SECT_GROBJECTS, PRM_TACHO_TEX, "rpm8000.rgb");
941  snprintf(buf, BUFSIZE, "drivers/%s/%d;drivers/%s;cars/%s;data/textures", car->_modName, car->_driverIndex, car->_modName, car->_carName);
942  grFilePath = strdup(buf);
943  curInst->texture = (ssgSimpleState*)grSsgLoadTexState(param);
944  curInst->texture->ref();
945  free(grFilePath);
946 
947  /* Load the intrument placement */
948  xSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XSZ, (char*)NULL, 128);
949  ySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YSZ, (char*)NULL, 128);
950  xpos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XPOS, (char*)NULL, Winw / 2.0 - xSz);
951  ypos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YPOS, (char*)NULL, 0);
952  needlexSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_NDLXSZ, (char*)NULL, 50);
953  needleySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_NDLYSZ, (char*)NULL, 2);
954  curInst->needleXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XCENTER, (char*)NULL, xSz / 2.0) + xpos;
955  curInst->needleYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YCENTER, (char*)NULL, ySz / 2.0) + ypos;
956  curInst->digitXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_XDIGITCENTER, (char*)NULL, xSz / 2.0) + xpos;
957  curInst->digitYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_YDIGITCENTER, (char*)NULL, 16) + ypos;
958  curInst->minValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MINVAL, (char*)NULL, 0);
959  curInst->maxValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MAXVAL, (char*)NULL, RPM2RADS(10000)) - curInst->minValue;
960  curInst->minAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MINANG, "deg", 225);
961  curInst->maxAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_TACHO_MAXANG, "deg", -45) - curInst->minAngle;
962  curInst->monitored = &(car->_enginerpm);
963  curInst->prevVal = curInst->minAngle;
964 
965  curInst->CounterList = glGenLists(1);
966  glNewList(curInst->CounterList, GL_COMPILE);
967  glBegin(GL_TRIANGLE_STRIP);
968  {
969  glColor4f(1.0, 1.0, 1.0, 0.0);
970  glTexCoord2f(0.0, 0.0); glVertex2f(xpos, ypos);
971  glTexCoord2f(0.0, 1.0); glVertex2f(xpos, ypos + ySz);
972  glTexCoord2f(1.0, 0.0); glVertex2f(xpos + xSz, ypos);
973  glTexCoord2f(1.0, 1.0); glVertex2f(xpos + xSz, ypos + ySz);
974  }
975  glEnd();
976  glEndList();
977 
978  curInst->needleList = glGenLists(1);
979  glNewList(curInst->needleList, GL_COMPILE);
980  glBegin(GL_TRIANGLE_STRIP);
981  {
982  glColor4f(1.0, 0.0, 0.0, 1.0);
983  glVertex2f(0, -needleySz);
984  glVertex2f(0, needleySz);
985  glVertex2f(needlexSz, -needleySz / 2.0);
986  glVertex2f(needlexSz, needleySz / 2.0);
987  }
988  glEnd();
989  glEndList();
990 
991 
992  /* Speedometer */
993  curInst = &(carInfo->instrument[1]);
994 
995  /* Load the Speedometer texture */
996  param = GfParmGetStr(handle, SECT_GROBJECTS, PRM_SPEEDO_TEX, "speed360.rgb");
997  snprintf(buf, BUFSIZE, "drivers/%s/%d;drivers/%s;cars/%s;data/textures", car->_modName, car->_driverIndex, car->_modName, car->_carName);
998  grFilePath = strdup(buf);
999  curInst->texture = (ssgSimpleState*)grSsgLoadTexState(param);
1000  curInst->texture->ref();
1001  free(grFilePath);
1002 
1003  /* Load the intrument placement */
1004  xSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XSZ, (char*)NULL, 128);
1005  ySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YSZ, (char*)NULL, 128);
1006  xpos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XPOS, (char*)NULL, Winw / 2.0);
1007  ypos = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YPOS, (char*)NULL, 0);
1008  needlexSz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_NDLXSZ, (char*)NULL, 50);
1009  needleySz = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_NDLYSZ, (char*)NULL, 2);
1010  curInst->needleXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XCENTER, (char*)NULL, xSz / 2.0) + xpos;
1011  curInst->needleYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YCENTER, (char*)NULL, ySz / 2.0) + ypos;
1012  curInst->digitXCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_XDIGITCENTER, (char*)NULL, xSz / 2.0) + xpos;
1013  curInst->digitYCenter = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_YDIGITCENTER, (char*)NULL, 10) + ypos;
1014  curInst->minValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MINVAL, (char*)NULL, 0);
1015  curInst->maxValue = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MAXVAL, (char*)NULL, 100) - curInst->minValue;
1016  curInst->minAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MINANG, "deg", 225);
1017  curInst->maxAngle = GfParmGetNum(handle, SECT_GROBJECTS, PRM_SPEEDO_MAXANG, "deg", -45) - curInst->minAngle;
1018  curInst->monitored = &(car->_speed_x);
1019  curInst->prevVal = curInst->minAngle;
1020  if (strcmp(GfParmGetStr(handle, SECT_GROBJECTS, PRM_SPEEDO_DIGITAL, "yes"), "yes") == 0) {
1021  curInst->digital = 1;
1022  }
1023 
1024  curInst->CounterList = glGenLists(1);
1025  glNewList(curInst->CounterList, GL_COMPILE);
1026  glBegin(GL_TRIANGLE_STRIP);
1027  {
1028  glColor4f(1.0, 1.0, 1.0, 0.0);
1029  glTexCoord2f(0.0, 0.0); glVertex2f(xpos, ypos);
1030  glTexCoord2f(0.0, 1.0); glVertex2f(xpos, ypos + ySz);
1031  glTexCoord2f(1.0, 0.0); glVertex2f(xpos + xSz, ypos);
1032  glTexCoord2f(1.0, 1.0); glVertex2f(xpos + xSz, ypos + ySz);
1033  }
1034  glEnd();
1035  glEndList();
1036 
1037  curInst->needleList = glGenLists(1);
1038  glNewList(curInst->needleList, GL_COMPILE);
1039  glBegin(GL_TRIANGLE_STRIP);
1040  {
1041  glColor4f(1.0, 0.0, 0.0, 1.0);
1042  glVertex2f(0, -needleySz);
1043  glVertex2f(0, needleySz);
1044  glVertex2f(needlexSz, -needleySz / 2.0);
1045  glVertex2f(needlexSz, needleySz / 2.0);
1046  }
1047  glEnd();
1048  glEndList();
1049 
1050 }
1051 
1053 {
1054  int i;
1055  for (i = 0; i < grNbCars; i++) {
1056  ssgDeRefDelete(grCarInfo[i].instrument[0].texture);
1057  ssgDeRefDelete(grCarInfo[i].instrument[1].texture);
1058  glDeleteLists(grCarInfo[i].instrument[0].needleList, 1);
1059  glDeleteLists(grCarInfo[i].instrument[1].needleList, 1);
1060  glDeleteLists(grCarInfo[i].instrument[0].CounterList, 1);
1061  glDeleteLists(grCarInfo[i].instrument[1].CounterList, 1);
1062  }
1063 }
#define GFUI_FONT_BIG_C
Definition: tgfclient.h:171
#define RM_CAR_STATE_DNF
Car did not finish.
Definition: car.h:212
#define PRM_SPEEDO_XCENTER
Definition: car.h:660
double currentTime
current time in sec since the beginning of the simulation
Definition: raceman.h:88
void grDispCounterBoard2(tCarElt *car)
Definition: grboard.cpp:742
static ssgLoaderOptionsEx options
Definition: grscene.cpp:165
void grDispMisc(tCarElt *car)
Definition: grboard.cpp:258
void loadDefaults(tCarElt *curCar)
Definition: grboard.cpp:70
cars situation used to inform the GUI and the drivers
Definition: raceman.h:85
tdble brakeCmd
Brake command [0.0, 1.0].
Definition: car.h:347
tInitCar info
public
Definition: car.h:458
int grNbCars
Definition: grmain.cpp:57
static void grDispEngineLeds(tCarElt *car, int X, int Y, int align, int bg)
Definition: grboard.cpp:541
tdble minAngle
Definition: grcar.h:33
#define RM_CAR_STATE_BROKEN
Engine no more working.
Definition: car.h:218
tCarElt ** cars
list of cars
Definition: raceman.h:90
#define PRM_TACHO_MAXANG
Definition: car.h:651
tCarCtrl ctrl
private
Definition: car.h:462
#define PRM_SPEEDO_TEX
Definition: car.h:653
tdble needleXCenter
Definition: grcar.h:30
#define SECT_GROBJECTS
Definition: car.h:506
#define RM_DRV_HUMAN
Definition: car.h:122
#define GR_ATT_BOARD
Definition: graphic.h:69
Car structure (tCarElt).
Definition: car.h:455
#define NB_BOARDS
Definition: grboard.cpp:48
tdble * monitored
Definition: grcar.h:34
#define PRM_TACHO_TEX
Definition: car.h:637
Robots Tools.
#define ALIGN_RIGHT
Definition: grboard.cpp:538
GLuint needleList
Definition: grcar.h:29
char * grFilePath
Definition: grutil.cpp:42
ssgSimpleState * texture
Definition: grcar.h:27
tdble clutchCmd
Clutch command [0.0, 1.0].
Definition: car.h:348
void grDispCarBoard2(tCarElt *car, tSituation *s)
Definition: grboard.cpp:365
int counterFlag
Definition: grboard.h:36
void refreshBoard(tSituation *s, float Fps, int forceArcade, tCarElt *curr)
Definition: grboard.cpp:901
tdble digitYCenter
Definition: grcar.h:31
float iconColor[4]
Definition: grcar.h:43
char msg[4][32]
4 lines of 31 characters 0-1 from car 2-3 from race engine
Definition: car.h:353
tdble currentTemperature
Definition: car.h:262
Definition: Basic.h:58
#define PRM_TACHO_MAXVAL
Definition: car.h:649
tdble grMaxDammage
Definition: grmain.cpp:56
#define PRM_TACHO_XSZ
Definition: car.h:638
#define RPM2RADS(x)
RPM to Radian/s conversion.
Definition: tgf.h:74
int GfParmWriteFile(const char *file, void *parmHandle, const char *name)
Write parameter set into file.
Definition: params.cpp:1610
#define GFUI_FONT_SMALL_C
Definition: tgfclient.h:174
#define PRM_SPEEDO_NDLXSZ
Definition: car.h:658
#define PRM_SPEEDO_XDIGITCENTER
Definition: car.h:662
int GFlag
Definition: grboard.h:37
#define GFUI_ALIGN_HR_VB
Definition: tgfclient.h:75
tdble maxAngle
Definition: grcar.h:33
static float grBlue[4]
Definition: grboard.cpp:43
void display(tCarElt *currentCar, tSituation *situation, int Winx, int Winy, int Winw, int Winh)
Definition: grtrackmap.cpp:447
void grDispCounterBoard(tCarElt *car)
Definition: grboard.cpp:628
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
Definition: params.cpp:2311
#define GFUI_FONT_LARGE_C
Definition: tgfclient.h:172
int debugFlag
Definition: grboard.h:34
tdble minValue
Definition: grcar.h:32
The Gaming Framework API (client part).
tdble currentGraining
Definition: car.h:264
#define PRM_TACHO_XPOS
Definition: car.h:640
static float grGreen[4]
Definition: grboard.cpp:44
int grWinh
Definition: grmain.cpp:62
static float grWhite[4]
Definition: grboard.cpp:41
void grDispGGraph(tCarElt *car)
Definition: grboard.cpp:169
void grDispDebug(float fps, tCarElt *car)
Definition: grboard.cpp:138
static int Winx
Definition: grboard.cpp:52
#define GR_ATT_DEBUG
Definition: graphic.h:72
#define YM
#define DD
#define PRM_TACHO_YPOS
Definition: car.h:641
void initBoard(void)
Definition: grboard.cpp:821
tdble localPressure
Definition: car.h:314
#define PRM_SPEEDO_MAXVAL
Definition: car.h:665
tdble steer
Steer command [-1.0, 1.0].
Definition: car.h:345
void grDrawGauge(tdble X1, tdble Y1, tdble H, float *clr1, float *clr2, tdble val, const char *title)
Definition: grboard.cpp:225
int getDefaultViewMode()
Definition: grtrackmap.cpp:750
tdble currentPressure
Definition: car.h:261
void selectBoard(int brd)
Definition: grboard.cpp:101
tgrCarInstrument instrument[2]
Definition: grcar.h:62
cGrTrackMap * trackMap
Definition: grboard.h:54
float tdble
Floating point type used in TORCS.
Definition: tgf.h:48
static int Winy
Definition: grboard.cpp:54
int GfuiFontHeight(int font)
Definition: guiobject.cpp:65
#define THNSSFG
void grDispCarBoard1(tCarElt *car, tSituation *s)
Definition: grboard.cpp:275
Definition: Endpoint.h:36
#define PRM_SPEEDO_XSZ
Definition: car.h:654
#define PRM_SPEEDO_YPOS
Definition: car.h:657
tWheelState wheel[4]
Definition: car.h:290
Definition: Basic.h:58
#define PRM_SPEEDO_MINANG
Definition: car.h:666
void GfuiPrintString(const char *text, float *fgColor, int font, int x, int y, int align)
Definition: guiobject.cpp:43
Dynamic wheel information.
Definition: car.h:249
static int Winh
Definition: grboard.cpp:55
#define PRM_SPEEDO_YDIGITCENTER
Definition: car.h:663
#define PRM_SPEEDO_DIGITAL
Definition: car.h:668
static float grDefaultClr[4]
Definition: grboard.cpp:46
void grDispArcade(tCarElt *car, tSituation *s)
Definition: grboard.cpp:838
tPrivCar priv
private
Definition: car.h:461
void grShutdownBoardCar(void)
Definition: grboard.cpp:1052
#define PRM_SPEEDO_XPOS
Definition: car.h:656
void grDispLeaderBoard(tCarElt *car, tSituation *s)
Definition: grboard.cpp:647
Parameter header structure, a parameter can either carry a numeric or a string value, numeric value is constraint by min and max, string value by options in within.
Definition: params.cpp:63
int boardFlag
Definition: grboard.h:31
#define PRM_TACHO_MINVAL
Definition: car.h:648
int arcadeFlag
Definition: grboard.h:38
int index
car index
Definition: car.h:457
#define GFUI_FONT_DIGIT
Definition: tgfclient.h:175
#define THNSSBG
#define GR_SCT_DISPMODE
Definition: graphic.h:63
int GfuiFontWidth(int font, const char *text)
Definition: guiobject.cpp:70
int GfParmSetNum(void *handle, const char *path, const char *key, const char *unit, tdble val)
Set a numerical parameter in the parameter set handle.
Definition: params.cpp:2586
#define PRM_TACHO_YSZ
Definition: car.h:639
#define GFUI_ALIGN_HC_VB
Definition: tgfclient.h:72
#define ALIGN_CENTER
Definition: grboard.cpp:536
#define PRM_TACHO_YDIGITCENTER
Definition: car.h:647
#define PRM_SPEEDO_NDLYSZ
Definition: car.h:659
tdble accelCmd
Accelerator command [0.0, 1.0].
Definition: car.h:346
#define GFUI_ALIGN_HL_VB
Definition: tgfclient.h:69
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
Definition: params.cpp:2392
int leaderFlag
Definition: grboard.h:33
static Vector y[4]
Definition: Convex.cpp:56
static float grRed[4]
Definition: grboard.cpp:42
#define GR_ATT_GGRAPH
Definition: graphic.h:73
#define PRM_SPEEDO_MINVAL
Definition: car.h:664
tgrCarInfo * grCarInfo
Definition: grmain.cpp:66
tdble currentWear
Definition: car.h:263
void shutdown(void)
Definition: grboard.cpp:829
#define GR_ATT_ARCADE
Definition: graphic.h:74
#define PRM_TACHO_NDLYSZ
Definition: car.h:643
#define PRM_TACHO_XCENTER
Definition: car.h:644
tdble digitXCenter
Definition: grcar.h:31
#define GR_ATT_COUNTER
Definition: graphic.h:70
#define GFUI_FONT_MEDIUM_C
Definition: tgfclient.h:173
ssgState * grSsgLoadTexState(const char *img)
Definition: grutil.cpp:219
#define PRM_TACHO_XDIGITCENTER
Definition: car.h:646
static const char * gearStr[MAX_GEARS]
Definition: grboard.cpp:534
int getViewMode()
Definition: grtrackmap.cpp:745
GLuint CounterList
Definition: grcar.h:28
void * grHandle
Definition: grmain.cpp:59
#define GFUI_FONT_MEDIUM
Definition: tgfclient.h:169
#define ALIGN_LEFT
Definition: grboard.cpp:537
Definition: Endpoint.h:36
#define PRM_TACHO_NDLXSZ
Definition: car.h:642
tdble prevVal
Definition: grcar.h:35
~cGrBoard()
Definition: grboard.cpp:64
int grWinw
Definition: grmain.cpp:62
cGrBoard(int myid)
Definition: grboard.cpp:57
#define PRM_SPEEDO_YSZ
Definition: car.h:655
void grDispCarBoard(tCarElt *car, tSituation *s)
Definition: grboard.cpp:518
#define NB_LBOARDS
Definition: grboard.cpp:49
float msgColor[4]
RGBA of text.
Definition: car.h:355
#define PRM_TACHO_YCENTER
Definition: car.h:645
int skillLevel
Driver&#39;s skill level (0=rookie -> 3=pro)
Definition: car.h:81
static float grBlack[4]
Definition: grboard.cpp:45
This file contains the divergences from PLIB.
void grWriteTime(float *color, int font, int x, int y, tdble sec, int sgn)
Definition: grutil.cpp:317
#define GR_ATT_MAP
Definition: graphic.h:67
#define GR_ATT_LEADER
Definition: graphic.h:71
void grInitBoardCar(tCarElt *car)
Definition: grboard.cpp:917
#define GR_ATT_NBLEADER
Definition: graphic.h:75
tdble maxValue
Definition: grcar.h:32
tdble needleYCenter
Definition: grcar.h:30
int leaderNb
Definition: grboard.h:35
#define PRM_TACHO_MINANG
Definition: car.h:650
#define MAX_GEARS
Definition: car.h:276
void setViewMode(int vm)
Definition: grtrackmap.cpp:740
#define RELAXATION(target, prev, rate)
Definition: robottools.h:38
static int Winw
Definition: grboard.cpp:53
#define PRM_SPEEDO_MAXANG
Definition: car.h:667
#define XM
#define PRM_SPEEDO_YCENTER
Definition: car.h:661