TORCS  1.3.9
The Open Racing Car Simulator
grscreen.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  file : grscreen.cpp
4  created : Thu May 15 22:11:03 CEST 2003
5  copyright : (C) 2003 by Eric Espi�
6  email : eric.espie@torcs.org
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 
26 #include <plib/ssg.h>
27 
28 #include <tgfclient.h>
29 #include <portability.h>
30 #include "grutil.h"
31 #include "grmain.h"
32 #include "grscene.h"
33 #include "grshadow.h"
34 #include "grskidmarks.h"
35 #include "grcar.h"
36 #include "grboard.h"
37 #include "grcarlight.h"
38 
39 #include "grscreen.h"
40 
42 {
43  id = myid;
44  curCar = NULL;
45  curCam = NULL;
46  mirrorCam = NULL;
47  dispCam = NULL;
48  boardCam = NULL;
49  bgCam = NULL;
50  board = NULL;
51  curCamHead = 0;
52  drawCurrent = 0;
53  active = 0;
54  selectNextFlag = 0;
55  selectPrevFlag = 0;
56  mirrorFlag = 1;
57  memset(cams, 0, sizeof(cams));
58  viewRatio = 1.33;
59  cars = 0;
60 }
61 
63 {
64  unsigned int i;
65  class cGrCamera *cam;
66 
67  for (i = 0; i < sizeof(cams)/sizeof(cams[0]); i++) {
68  while ((cam = GF_TAILQ_FIRST(&cams[i])) != 0) {
69  cam->remove(&cams[i]);
70  delete cam;
71  }
72  }
73 
74  delete boardCam;
75  delete mirrorCam;
76  delete bgCam;
77 
78  if (board != NULL) {
79  board->shutdown ();
80  }
81 
82  FREEZ(cars);
83 
84  if (board != NULL) {
85  delete board;
86  board = NULL;
87  }
88 }
89 
90 int cGrScreen::isInScreen(int x, int y)
91 {
92  if (!active) {
93  return 0;
94  }
95 
96  if ((x >= scrx) &&
97  (y >= scry) &&
98  (x < (scrx + scrw)) &&
99  (y < (scry + scrh)))
100  {
101  return 1;
102  }
103 
104  return 0;
105 }
106 
108 {
109  curCar = newCurCar;
110 }
111 
112 /* Set Screen size & position */
113 void cGrScreen::activate(int x, int y, int w, int h)
114 {
115  viewRatio = (float)w / (float)h;
116 
117  scrx = x;
118  scry = y;
119  scrw = w;
120  scrh = h;
121 
122  if (mirrorCam) {
124  mirrorCam->setPos (scrx + scrw / 4, scry + 5 * scrh / 6 - scrh / 10, scrw / 2, scrh / 6);
125  }
126  if (curCam) {
127  curCam->limitFov ();
129  }
130  active = 1;
131 }
132 
134 {
135  active = 0;
136 }
137 
138 /* Set camera zoom value */
139 void cGrScreen::setZoom(long zoom)
140 {
141  curCam->setZoom(zoom);
142 }
143 
145 {
146  selectNextFlag = 1;
147 }
148 
150 {
151  selectPrevFlag = 1;
152 }
153 
155 {
156  board->selectBoard(brd);
157 }
158 
160 {
161  const int BUFSIZE=1024;
162  char path[BUFSIZE];
163  char path2[BUFSIZE];
164  int viewmode;
165 
167  viewmode = board->getTrackMap()->getViewMode();
168 
169  snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
170  GfParmSetNum(grHandle, path, GR_ATT_MAP, NULL, (tdble)viewmode);
171  /* save also as user's preference if human */
172  if (curCar->_driverType == RM_DRV_HUMAN) {
173  snprintf(path2, BUFSIZE, "%s/%s", GR_SCT_DISPMODE, curCar->_name);
174  GfParmSetNum(grHandle, path2, GR_ATT_MAP, NULL, (tdble)viewmode);
175  }
176  GfParmWriteFile(NULL, grHandle, "Graph");
177 }
178 
180 {
181  const int BUFSIZE=1024;
182  char path[BUFSIZE];
183  char path2[BUFSIZE];
184 
185  mirrorFlag = 1 - mirrorFlag;
186  snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
188  /* save also as user's preference if human */
189  if (curCar->_driverType == RM_DRV_HUMAN) {
190  snprintf(path2, BUFSIZE, "%s/%s", GR_SCT_DISPMODE, curCar->_name);
192  }
193  GfParmWriteFile(NULL, grHandle, "Graph");
194 }
195 
196 
197 /* Select the camera by number */
199 {
200  const int BUFSIZE=1024;
201  char buf[BUFSIZE];
202  char path[BUFSIZE];
203  char path2[BUFSIZE];
204 
205 
206  if (cam == curCamHead) {
207  /* Same camera list, choose the next one */
208  curCam = curCam->next();
209  if (curCam == (cGrPerspCamera*)GF_TAILQ_END(&cams[cam])) {
211  }
212  } else {
213  /* Change of camera list, take the first one */
214  curCamHead = cam;
216  }
217 
218  if (curCam == NULL) {
219  /* back to default camera */
220  curCamHead = 0;
222  }
223 
224  snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
225  GfParmSetStr(grHandle, path, GR_ATT_CUR_DRV, curCar->_name);
226  GfParmSetNum(grHandle, path, GR_ATT_CAM, (char*)NULL, (tdble)curCam->getId());
227  GfParmSetNum(grHandle, path, GR_ATT_CAM_HEAD, (char*)NULL, (tdble)curCamHead);
228 
229  /* save also as user's preference if human */
230  if (curCar->_driverType == RM_DRV_HUMAN) {
231  snprintf(path2, BUFSIZE, "%s/%s", GR_SCT_DISPMODE, curCar->_name);
232  GfParmSetNum(grHandle, path2, GR_ATT_CAM, (char*)NULL, (tdble)curCam->getId());
233  GfParmSetNum(grHandle, path2, GR_ATT_CAM_HEAD, (char*)NULL, (tdble)curCamHead);
234  }
235 
236  snprintf(buf, BUFSIZE, "%s-%d-%d", GR_ATT_FOVY, curCamHead, curCam->getId());
237  curCam->loadDefaults(buf);
239  curCam->limitFov ();
240  GfParmWriteFile(NULL, grHandle, "Graph");
241 }
242 
243 static class cGrPerspCamera *ThedispCam; /* the display camera */
244 
245 static int
246 comparCars(const void *car1, const void *car2)
247 {
248  float d1 = ThedispCam->getDist2(*(tCarElt**)car1);
249  float d2 = ThedispCam->getDist2(*(tCarElt**)car2);
250 
251  if (d1 > d2) {
252  return -1;
253  } else {
254  return 1;
255  }
256 }
257 
259 {
260  int i;
261 
262  glDisable(GL_COLOR_MATERIAL);
263 
264  START_PROFILE("dispCam->update*");
265  dispCam->update(curCar, s);
266  STOP_PROFILE("dispCam->update*");
267 
268  if (dispCam->getDrawBackground()) {
269  glDisable(GL_LIGHTING);
270  glDisable(GL_DEPTH_TEST);
272  glClear(GL_DEPTH_BUFFER_BIT);
273  }
274  glEnable(GL_DEPTH_TEST);
275 
276  START_PROFILE("dispCam->action*");
277  dispCam->action();
278  STOP_PROFILE("dispCam->action*");
279 
280  START_PROFILE("grDrawCar*");
281  glFogf(GL_FOG_START, dispCam->getFogStart());
282  glFogf(GL_FOG_END, dispCam->getFogEnd());
283  glEnable(GL_FOG);
284 
285  /*sort the cars by distance for transparent windows */
287  qsort(cars, s->_ncars, sizeof(tCarElt*), comparCars);
288 
289  for (i = 0; i < s->_ncars; i++) {
291  }
292  STOP_PROFILE("grDrawCar*");
293 
294  START_PROFILE("grDrawScene*");
295  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
296  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
297  grDrawScene();
298  STOP_PROFILE("grDrawScene*");
299 }
300 
301 
302 /* Update screen display */
303 void cGrScreen::update(tSituation *s, float Fps)
304 {
305  int i;
306  //ssgLight *light;
307  int carChanged;
308  const int BUFSIZE=1024;
309  char buf[BUFSIZE];
310 
311  if (!active) {
312  return;
313  }
314 
315  carChanged = 0;
316  if (selectNextFlag) {
317  for (i = 0; i < (s->_ncars - 1); i++) {
318  if (curCar == s->cars[i]) {
319  curCar = s->cars[i + 1];
320  curCar->priv.collision = 0;
321  carChanged = 1;
322  break;
323  }
324  }
325  selectNextFlag = 0;
326  }
327 
328  if (selectPrevFlag) {
329  for (i = 1; i < s->_ncars; i++) {
330  if (curCar == s->cars[i]) {
331  curCar = s->cars[i - 1];
332  curCar->priv.collision = 0;
333  carChanged = 1;
334  break;
335  }
336  }
337  selectPrevFlag = 0;
338  }
339  if (carChanged) {
340  snprintf(buf, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
342  loadParams (s);
343  GfParmWriteFile(NULL, grHandle, "Graph");
344  curCam->onSelect(curCar, s);
345  }
346 
347  //light = ssgGetLight (0);
348 
349  /* MIRROR */
350  if (mirrorFlag && curCam->isMirrorAllowed ()) {
352  dispCam = mirrorCam;
353  glClear (GL_DEPTH_BUFFER_BIT);
354  camDraw (s);
355  mirrorCam->store ();
356  }
357 
358  glViewport(scrx, scry, scrw, scrh);
359  dispCam = curCam;
360  camDraw(s);
361 
362  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
363  glDisable(GL_CULL_FACE);
364  glDisable(GL_DEPTH_TEST);
365  glDisable(GL_LIGHTING);
366  glDisable(GL_COLOR_MATERIAL);
367  glDisable(GL_ALPHA_TEST);
368  glDisable(GL_FOG);
369  glEnable(GL_TEXTURE_2D);
370 
371  /* MIRROR */
372  if (mirrorFlag && curCam->isMirrorAllowed ()) {
373  mirrorCam->display ();
374  glViewport (scrx, scry, scrw, scrh);
375  }
376 
377  START_PROFILE("boardCam*");
378  boardCam->action();
379  STOP_PROFILE("boardCam*");
380 
381  START_PROFILE("grDisp**");
382  glDisable(GL_TEXTURE_2D);
383 
384  TRACE_GL("cGrScreen::update glDisable(GL_DEPTH_TEST)");
385  board->refreshBoard(s, Fps, 0, curCar);
386  TRACE_GL("cGrScreen::update display boards");
387 
388  STOP_PROFILE("grDisp**");
389 }
390 
392 {
393  int camNum;
394  int i;
395  class cGrCamera *cam;
396  const char *carName;
397  const int BUFSIZE=1024;
398  char buf[BUFSIZE];
399  char path[BUFSIZE];
400  char path2[BUFSIZE];
401 
402  snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, id);
403 
404  if (!curCar) {
405  carName = GfParmGetStr(grHandle, path, GR_ATT_CUR_DRV, "");
406  for (i = 0; i < s->_ncars; i++) {
407  if (!strcmp(s->cars[i]->_name, carName)) {
408  break;
409  }
410  }
411  if (i < s->_ncars) {
412  curCar = s->cars[i];
413  } else if (id < s->_ncars) {
414  curCar = s->cars[id];
415  } else {
416  curCar = s->cars[0];
417  }
418  }
419  snprintf(path2, BUFSIZE, "%s/%s", GR_SCT_DISPMODE, curCar->_name);
420 
421  curCamHead = (int)GfParmGetNum(grHandle, path, GR_ATT_CAM_HEAD, NULL, 9);
422  camNum = (int)GfParmGetNum(grHandle, path, GR_ATT_CAM, NULL, 0);
425  camNum = (int)GfParmGetNum(grHandle, path2, GR_ATT_CAM, NULL, (tdble)camNum);
427 
428  cam = GF_TAILQ_FIRST(&cams[curCamHead]);
429  curCam = NULL;
430  while (cam) {
431  if (cam->getId() == camNum) {
432  curCam = (cGrPerspCamera*)cam;
433  break;
434  }
435  cam = cam->next();
436  }
437 
438  if (curCam == NULL) {
439  // back to default camera
440  curCamHead = 0;
442  GfParmSetNum(grHandle, path, GR_ATT_CAM, NULL, (tdble)curCam->getId());
444  }
445 
446  snprintf(buf, BUFSIZE, "%s-%d-%d", GR_ATT_FOVY, curCamHead, curCam->getId());
447  curCam->loadDefaults(buf);
450 }
451 
452 
453 /* Create cameras */
455 {
456  tdble fovFactor;
457  int i;
458 
459  fovFactor = GfParmGetNum(grHandle, GR_SCT_GRAPHIC, GR_ATT_FOVFACT, (char*)NULL, 1.0);
460  fovFactor *= GfParmGetNum(grTrackHandle, TRK_SECT_GRAPH, TRK_ATT_FOVFACT, (char*)NULL, 1.0);
461 
462  if (boardCam == NULL) {
463  boardCam = new cGrOrthoCamera(this,0, grWinw*600/grWinh, 0, 600);
464  }
465 
466  if (bgCam == NULL) {
467  bgCam = new cGrBackgroundCam(this);
468  }
469 
470  if (mirrorCam == NULL) {
472  this,
473  -1,
474  0, // drawCurr
475  1, // drawBG
476  90.0, // fovy
477  0.0, // fovymin
478  360.0, // fovymax
479  0.3, // near
480  300.0 * fovFactor, // far
481  200.0 * fovFactor, // fog1
482  300.0 * fovFactor // fog
483  );
484  }
485 
486  // Scene Cameras
487  unsigned int j;
488  class cGrCamera *cam;
489  for (j = 0; j < sizeof(cams)/sizeof(cams[0]); j++) {
490  while ((cam = GF_TAILQ_FIRST(&cams[j])) != 0) {
491  cam->remove(&cams[j]);
492  delete cam;
493  }
494  }
495  memset(cams, 0, sizeof(cams));
496 
497  grCamCreateSceneCameraList(this, cams, fovFactor);
498 
499  cars = (tCarElt**)calloc(s->_ncars, sizeof (tCarElt*));
500  for (i = 0; i < s->_ncars; i++) {
501  cars[i] = s->cars[i];
502  }
503 
504  loadParams(s);
505 }
506 
508 {
509  if (board == NULL) {
510  board = new cGrBoard (id);
511  }
512  board->initBoard ();
513 }
tCarElt * curCar
Definition: grscreen.h:31
int getDrawCurrent(void)
Definition: grcam.h:86
int GfParmSetStr(void *handle, const char *path, const char *key, const char *val)
Set a string parameter in the parameter set handle.
Definition: params.cpp:2477
int curCamHead
Definition: grscreen.h:34
int getDrawBackground(void)
Definition: grcam.h:88
int getId(void)
Definition: grcam.h:85
double currentTime
current time in sec since the beginning of the simulation
Definition: raceman.h:88
void grDrawBackground(class cGrCamera *cam, class cGrBackgroundCam *bgCam)
Definition: grscene.cpp:605
class cGrPerspCamera * curCam
Definition: grscreen.h:37
void loadDefaults(tCarElt *curCar)
Definition: grboard.cpp:70
void grCamCreateSceneCameraList(class cGrScreen *myscreen, tGrCamHead *cams, tdble fovFactor)
Definition: grcam.cpp:1292
cars situation used to inform the GUI and the drivers
Definition: raceman.h:85
void desactivate(void)
Definition: grscreen.cpp:133
cGrTrackMap * getTrackMap()
Definition: grboard.h:65
#define TRACE_GL(msg)
Definition: grutil.h:28
tCarElt ** cars
list of cars
Definition: raceman.h:90
#define TRK_ATT_FOVFACT
Definition: track.h:77
#define FREEZ(x)
Definition: tgf.h:60
#define GR_ATT_FOVFACT
Definition: graphic.h:90
void selectCamera(long cam)
Definition: grscreen.cpp:198
#define RM_DRV_HUMAN
Definition: car.h:122
Car structure (tCarElt).
Definition: car.h:455
void grDrawScene(void)
Definition: grscene.cpp:244
int scrw
Definition: grscreen.h:47
class cGrPerspCamera * dispCam
Definition: grscreen.h:39
void activateViewport(void)
Definition: grcam.cpp:381
void initBoard(void)
Definition: grscreen.cpp:507
void refreshBoard(tSituation *s, float Fps, int forceArcade, tCarElt *curr)
Definition: grboard.cpp:901
int mirrorFlag
Definition: grscreen.h:54
tGrCamHead cams[10]
Definition: grscreen.h:35
float viewRatio
Definition: grscreen.h:48
class cGrOrthoCamera * boardCam
Definition: grscreen.h:40
int GfParmWriteFile(const char *file, void *parmHandle, const char *name)
Write parameter set into file.
Definition: params.cpp:1610
void update(tSituation *s, float Fps)
Definition: grscreen.cpp:303
static int comparCars(const void *car1, const void *car2)
Definition: grscreen.cpp:246
int selectPrevFlag
Definition: grscreen.h:53
#define STOP_PROFILE(a)
Definition: tgf.h:598
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 START_PROFILE(a)
Definition: tgf.h:597
The Gaming Framework API (client part).
int grWinh
Definition: grmain.cpp:62
void initCams(tSituation *s)
Definition: grscreen.cpp:454
void loadParams(tSituation *s)
Definition: grscreen.cpp:391
int drawCurrent
Definition: grscreen.h:45
void remove(tGrCamHead *head)
Definition: grcam.h:136
void initBoard(void)
Definition: grboard.cpp:821
class cGrCarCamMirror * mirrorCam
Definition: grscreen.h:38
int id
Definition: grscreen.h:29
int scrx
Definition: grscreen.h:47
cGrPerspCamera * next(void)
Definition: grcam.h:175
void selectBoard(int brd)
Definition: grboard.cpp:101
float tdble
Floating point type used in TORCS.
Definition: tgf.h:48
class cGrBackgroundCam * bgCam
Definition: grscreen.h:41
void selectNextCar(void)
Definition: grscreen.cpp:144
#define GR_ZOOM_DFLT
Definition: grcam.h:271
void setViewport(int x, int y, int w, int h)
Definition: grcam.cpp:330
int isMirrorAllowed(void)
Definition: grcam.h:89
void setCurrentCar(tCarElt *newCurCar)
Definition: grscreen.cpp:107
void selectTrackMap()
Definition: grscreen.cpp:159
void store(void)
Definition: grcam.cpp:390
float getFogStart(void)
Definition: grcam.h:172
int active
Definition: grscreen.h:50
void setZoom(int cmd)
Definition: grcam.cpp:166
#define GR_SCT_GRAPHIC
Definition: graphic.h:82
#define GR_ATT_CAM_HEAD
Definition: graphic.h:65
tPrivCar priv
private
Definition: car.h:461
tCarElt ** cars
Definition: grscreen.h:32
#define GR_ATT_CUR_DRV
Definition: graphic.h:94
#define GR_SCT_DISPMODE
Definition: graphic.h:63
int scrh
Definition: grscreen.h:47
void * grTrackHandle
Definition: grmain.cpp:60
void selectTrackMap()
Definition: grtrackmap.cpp:437
void onSelect(tCarElt *car, tSituation *s)
Definition: grcam.h:180
#define GF_TAILQ_FIRST(head)
First element of a TAILQ.
Definition: tgf.h:464
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
cGrScreen(int id)
Definition: grscreen.cpp:41
void selectBoard(long brd)
Definition: grscreen.cpp:154
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
static class cGrPerspCamera * ThedispCam
Definition: grscreen.cpp:243
void activate(int x, int y, int w, int h)
Definition: grscreen.cpp:113
void action(void)
Definition: grcam.h:79
int collision
Collision value for graphics and sound, clearing is managed by consumers.
Definition: car.h:306
static Vector y[4]
Definition: Convex.cpp:56
void limitFov(void)
Definition: grcam.h:179
int getDrawDriver(void)
Definition: grcam.h:87
void selectPrevCar(void)
Definition: grscreen.cpp:149
void camDraw(tSituation *s)
Definition: grscreen.cpp:258
void shutdown(void)
Definition: grboard.cpp:829
#define GF_TAILQ_END(head)
End of a TAILQ.
Definition: tgf.h:470
#define GR_ATT_MIRROR
Definition: graphic.h:66
~cGrScreen()
Definition: grscreen.cpp:62
void setPos(int x, int y, int w, int h)
Definition: grcam.cpp:345
float getFogEnd(void)
Definition: grcam.h:173
#define _ncars
Definition: raceman.h:78
int getViewMode()
Definition: grtrackmap.cpp:745
void * grHandle
Definition: grmain.cpp:59
void grDrawCar(tCarElt *car, tCarElt *curCar, int dispCarFlag, int dispDrvFlag, double curTime, class cGrPerspCamera *curCam)
Definition: grcar.cpp:761
#define TRK_SECT_GRAPH
Definition: track.h:53
void switchMirror(void)
Definition: grscreen.cpp:179
void display(void)
Definition: grcam.cpp:404
void loadDefaults(char *attr)
Definition: grcam.cpp:132
int selectNextFlag
Definition: grscreen.h:52
int grWinw
Definition: grmain.cpp:62
virtual void update(tCarElt *car, tSituation *s)=0
float getDist2(tCarElt *car)
Definition: grcam.cpp:46
#define GR_ATT_CAM
Definition: graphic.h:64
#define GR_ATT_MAP
Definition: graphic.h:67
class cGrBoard * board
Definition: grscreen.h:43
#define GR_ATT_FOVY
Definition: graphic.h:68
cGrCamera * next(void)
Definition: grcam.h:143
int scry
Definition: grscreen.h:47
int isInScreen(int x, int y)
Definition: grscreen.cpp:90
void setZoom(long zoom)
Definition: grscreen.cpp:139