TORCS  1.3.9
The Open Racing Car Simulator
racegl.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  file : racegl.cpp
4  created : Sat Nov 16 18:22:00 CET 2002
5  copyright : (C) 2002-2013 by Eric Espie, Bernhard Wymann
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 
25 #include <stdlib.h>
26 #include <stdio.h>
27 
28 #include <tgfclient.h>
29 #include <raceman.h>
30 #include <robot.h>
31 
32 #include "racemain.h"
33 #include "raceinit.h"
34 #include "racestate.h"
35 #include "raceengine.h"
36 
37 #include "racegl.h"
38 
39 static void *reScreenHandle = 0;
40 static void *reHookHandle = 0;
41 static int rePauseId;
42 static int reMsgId;
43 static int reBigMsgId;
44 
45 static float bgcolor[4] = {0.0, 0.0, 0.0, 0.0};
46 static float white[4] = {1.0, 1.0, 1.0, 1.0};
47 static float red[4] = {1.0, 0.0, 0.0, 1.0};
48 
49 static void
50 reDisplay(void)
51 {
52  ReStateManage();
53 }
54 
55 static void
56 reScreenActivate(void * /* dummy */)
57 {
58  glutDisplayFunc(reDisplay);
59 
60  if ((ReInfo->s->_raceState & RM_RACE_PAUSED) == 0) {
61  ReStart(); /* resynchro */
62  }
63  glutPostRedisplay();
64 }
65 
66 static void
67 ReBoardInfo(void * /* vboard */)
68 {
69  if (ReInfo->s->_raceState & RM_RACE_PAUSED) {
70  ReInfo->s->_raceState &= ~RM_RACE_PAUSED;
71  ReStart();
73  } else {
74  ReInfo->s->_raceState |= RM_RACE_PAUSED;
75  ReStop();
77  }
78 }
79 
80 static void
81 reSkipPreStart(void * /* dummy */)
82 {
83  if (ReInfo->s->currentTime < -1.0) {
84  ReInfo->s->currentTime = -1.0;
85  ReInfo->_reLastTime = -1.0;
86  }
87 }
88 
89 static void
90 reMovieCapture(void * /* dummy */)
91 {
92  tRmMovieCapture *capture = &(ReInfo->movieCapture);
93 
94  if (!capture->enabled || (ReInfo->_displayMode == RM_DISP_MODE_NONE)) {
95  GfOut("Video Capture Mode Not Enabled\n");
96  return;
97  }
98 
99  capture->state = 1 - capture->state;
100  if (capture->state) {
101  GfOut("Video Capture Mode On\n");
102  capture->currentFrame = 0;
103  capture->currentCapture++;
104  capture->lastFrame = GfTimeClock() - capture->deltaFrame;
105  ReInfo->_displayMode = RM_DISP_MODE_CAPTURE;
106  } else {
107  GfOut("Video Capture Mode Off\n");
108  ReInfo->_displayMode = RM_DISP_MODE_NORMAL;
109  ReStart();
110  }
111 
112 }
113 
114 
115 
116 static void
118 {
119  GfuiAddSKey(reScreenHandle, GLUT_KEY_F1, "Help", reScreenHandle, GfuiHelpScreen, NULL);
120  GfuiAddSKey(reScreenHandle, GLUT_KEY_F12, "Screen Shot", NULL, GfuiScreenShot, NULL);
121 
122 
123  GfuiAddKey(reScreenHandle, '-', "Slow Time", (void*)0, ReTimeMod, NULL);
124  GfuiAddKey(reScreenHandle, '+', "Accelerate Time", (void*)1, ReTimeMod, NULL);
125  GfuiAddKey(reScreenHandle, '.', "Real Time", (void*)2, ReTimeMod, NULL);
126  GfuiAddKey(reScreenHandle, 'p', "Pause Race", (void*)0, ReBoardInfo, NULL);
127  GfuiAddKey(reScreenHandle, 27, "Stop Current Race", (void*)RE_STATE_RACE_STOP, ReStateApply, NULL);
128  /* GfuiAddKey(reScreenHandle, 'q', "Exit of TORCS", (void*)RE_STATE_EXIT, ReStateApply, NULL); */
129  GfuiAddKey(reScreenHandle, ' ', "Skip Pre Start", (void*)0, reSkipPreStart, NULL);
130 #ifdef DEBUG
131  //GfuiAddKey(reScreenHandle, '0', "One step simulation", (void*)1, reOneStep, NULL);
132 #endif
133  GfuiAddKey(reScreenHandle, 'c', "Movie Capture", (void*)0, reMovieCapture, NULL);
134 
135 }
136 
137 
138 void
139 ReSetRaceMsg(const char *msg)
140 {
141  static char *curMsg = 0;
142 
143  if (curMsg) free(curMsg);
144 
145  if (msg) {
146  curMsg = strdup(msg);
148  } else {
149  curMsg = 0;
151  }
152 }
153 
154 void
155 ReSetRaceBigMsg(const char *msg)
156 {
157  static char *curMsg = 0;
158 
159  if (curMsg) free(curMsg);
160 
161  if (msg) {
162  curMsg = strdup(msg);
164  } else {
165  curMsg = 0;
167  }
168 }
169 
170 void *
172 {
173 
175 
177 
178  reAddKeys();
179 
181  "",
182  red,
184  320,
185  400,
187  42);
188 
190  "P A U S E",
191  red,
193  320,
194  420,
196  0);
197 
199  "",
200  red,
202  320,
203  360,
205  32);
206 
208 
209  return reScreenHandle;
210 }
211 
212 
213 void
215 {
216  if (reScreenHandle) {
218  reScreenHandle = 0;
219  }
220 }
221 
222 
223 static void
224 reHookActivate(void * /* dummy */)
225 {
226  ReStateManage();
227 }
228 
229 void *
231 {
232  if (reHookHandle) {
233  return reHookHandle;
234  }
235 
237 
238  return reHookHandle;
239 }
240 
241 
242 void
244 {
245  if (reHookHandle) {
247  reHookHandle = 0;
248  }
249 }
250 
251 /**************************************************************************/
252 
253 /*
254  * Result only screen
255  */
256 #define LINES 21
257 
258 static float *reColor[] = {white, red};
259 
260 static void *reResScreenHdle = 0;
261 static int reResTitleId;
262 static int reResMsgId[LINES];
263 static int reResMsgClr[LINES];
264 static char *reResMsg[LINES];
265 static int reCurLine;
266 
267 static void
269 {
270  GfuiAddSKey(reResScreenHdle, GLUT_KEY_F1, "Help", reScreenHandle, GfuiHelpScreen, NULL);
271  GfuiAddSKey(reResScreenHdle, GLUT_KEY_F12, "Screen Shot", NULL, GfuiScreenShot, NULL);
272 
273  GfuiAddKey(reResScreenHdle, 27, "Stop Current Race", (void*)RE_STATE_RACE_STOP, ReStateApply, NULL);
274  /* GfuiAddKey(reResScreenHdle, 'q', "Exit of TORCS", (void*)RE_STATE_EXIT, ReStateApply, NULL); */
275 }
276 
277 static void
278 reResScreenActivate(void * /* dummy */)
279 {
280  glutDisplayFunc(reDisplay);
281  GfuiDisplay();
282  glutPostRedisplay();
283 }
284 
285 
286 static void
288 {
289  GfuiDisplay();
290  glutPostRedisplay();
291 }
292 
293 
294 static void
295 reResCont(void * /* dummy */)
296 {
297  ReStateManage();
298 }
299 
300 static void
301 reResScreenShutdown(void * /* dummy */)
302 {
303  int i;
304 
305  for (i = 1; i < LINES; i++) {
306  FREEZ(reResMsg[i]);
307  }
308 }
309 
310 void *
312 {
313  int i;
314  int y, dy;
315  static const char *title[3] = {"Practice", "Qualifications", "Race"};
316 
317  if (reResScreenHdle) {
319  }
320 
322 
323  GfuiTitleCreate(reResScreenHdle, title[ReInfo->s->_raceType], strlen(title[ReInfo->s->_raceType]));
324 
325  const char* img = GfParmGetStr(ReInfo->params, RM_SECT_HEADER, RM_ATTR_RUNIMG, 0);
326  if (img) {
328  }
329 
330  reAddResKeys();
331 
333  "",
334  red,
336  320, 420,
337  GFUI_ALIGN_HC_VB, 50);
338 
339  y = 400;
340  dy = 378 / LINES;
341  for (i = 0; i < LINES; i++) {
342  FREEZ(reResMsg[i]);
343  reResMsgClr[i] = 0;
345  "",
346  white,
348  20, y,
349  GFUI_ALIGN_HL_VB, 120);
350  y -= dy;
351  }
352 
353  reCurLine = 0;
354  return reResScreenHdle;
355 }
356 
357 void
359 {
360  if (reResScreenHdle) {
362  }
363 }
364 
365 void
367 {
368  int i;
369 
370  if (reCurLine == LINES) {
371  free(reResMsg[0]);
372  for (i = 1; i < LINES; i++) {
373  reResMsg[i - 1] = reResMsg[i];
375  }
376  reCurLine--;
377  }
378  reResMsg[reCurLine] = strdup(text);
380  reCurLine++;
381 }
382 
383 void
384 ReResScreenSetText(const char *text, int line, int clr)
385 {
386  if (line < LINES) {
387  FREEZ(reResMsg[line]);
388  reResMsg[line] = strdup(text);
389  if ((clr >= 0) && (clr < 2)) {
390  reResMsgClr[line] = clr;
391  } else {
392  reResMsgClr[line] = 0;
393  }
396  }
397 }
398 
399 int
401 {
402  return LINES;
403 }
404 
405 void
407 {
408  int i;
409 
410  for (i = 0; i < LINES; i++) {
411  ReResScreenSetText("", i, 0);
412  }
413 }
414 
415 
416 void
418 {
419  if (line < LINES) {
420  FREEZ(reResMsg[line]);
422  }
423 }
424 
425 void
427 {
428 
430  "Continue",
432  320, 15, GFUI_BTNSZ,
434  0, 0, reResCont,
435  NULL, (tfuiCallback)NULL,
436  (tfuiCallback)NULL);
437  GfuiAddKey(reResScreenHdle, 13, "Continue", 0, reResCont, NULL);
438  GfuiAddKey(reResScreenHdle, 27, "Continue", 0, reResCont, NULL);
439 
440  glutDisplayFunc(reContDisplay);
441  glutPostRedisplay();
442 }
443 
static void reAddKeys(void)
Definition: racegl.cpp:117
#define GFUI_FONT_BIG_C
Definition: tgfclient.h:171
void ReResScreenSetText(const char *text, int line, int clr)
Definition: racegl.cpp:384
static float bgcolor[4]
Definition: racegl.cpp:45
void ReSetRaceMsg(const char *msg)
Definition: racegl.cpp:139
double currentTime
current time in sec since the beginning of the simulation
Definition: raceman.h:88
void ReStateManage(void)
Definition: racestate.cpp:56
static void ReBoardInfo(void *)
Definition: racegl.cpp:67
#define RM_RACE_PAUSED
Definition: raceman.h:69
static void reSkipPreStart(void *)
Definition: racegl.cpp:81
static void reDisplay(void)
Definition: racegl.cpp:50
int GfuiButtonCreate(void *scr, const char *text, int font, int x, int y, int width, int align, int mouse, void *userDataOnPush, tfuiCallback onPush, void *userDataOnFocus, tfuiCallback onFocus, tfuiCallback onFocusLost)
Add a button to a screen.
Definition: guibutton.cpp:248
static void reHookActivate(void *)
Definition: racegl.cpp:224
void ReResShowCont(void)
Definition: racegl.cpp:426
#define GFUI_BTNSZ
Definition: tgfclient.h:192
#define FREEZ(x)
Definition: tgf.h:60
double lastFrame
Definition: raceman.h:208
static float * reColor[]
Definition: racegl.cpp:258
static char * reResMsg[LINES]
Definition: racegl.cpp:264
double deltaFrame
Definition: raceman.h:207
static int rePauseId
Definition: racegl.cpp:41
void GfuiAddKey(void *scr, unsigned char key, const char *descr, void *userData, tfuiCallback onKeyPressed, tfuiCallback onKeyReleased)
Add a Keyboard callback to a screen.
Definition: gui.cpp:742
static int reResMsgClr[LINES]
Definition: racegl.cpp:263
Robot Module Interface Definition.
static int reResTitleId
Definition: racegl.cpp:261
static int reBigMsgId
Definition: racegl.cpp:43
void GfuiDisplay(void)
Display function for the GUI to be called during redisplay of glut.
Definition: gui.cpp:136
void GfuiScreenRelease(void *scr)
Release the given screen.
Definition: gui.cpp:618
void ReResEraseScreen(void)
Definition: racegl.cpp:406
static float white[4]
Definition: racegl.cpp:46
static void * reHookHandle
Definition: racegl.cpp:40
void * ReResScreenInit(void)
Definition: racegl.cpp:311
static void reResScreenActivate(void *)
Definition: racegl.cpp:278
void GfuiScreenAddBgImg(void *scr, const char *filename)
Add an image background to a screen.
Definition: gui.cpp:961
tSituation * s
Situation during race.
Definition: raceman.h:221
int currentCapture
Definition: raceman.h:210
void * ReScreenInit(void)
Definition: racegl.cpp:171
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
static void reResCont(void *)
Definition: racegl.cpp:295
The Gaming Framework API (client part).
void ReHookShutdown(void)
Definition: racegl.cpp:243
void * GfuiScreenCreateEx(float *bgColor, void *userDataOnActivate, tfuiCallback onActivate, void *userDataOnDeactivate, tfuiCallback onDeactivate, int mouseAllowed)
Create a screen.
Definition: gui.cpp:578
tRmInfo * ReInfo
Definition: raceengine.cpp:45
static float red[4]
Definition: racegl.cpp:47
void GfuiLabelSetText(void *scr, int id, const char *text)
Change the text of a label.
Definition: guilabel.cpp:212
void ReSetRaceBigMsg(const char *msg)
Definition: racegl.cpp:155
#define RE_STATE_RACE_STOP
Definition: raceman.h:106
int currentFrame
Definition: raceman.h:211
void ReStart(void)
Definition: raceengine.cpp:671
#define GfOut
Definition: tgf.h:373
#define RM_DISP_MODE_NONE
Definition: raceman.h:148
#define RM_DISP_MODE_CAPTURE
Definition: raceman.h:147
static void reContDisplay(void)
Definition: racegl.cpp:287
static void reResScreenShutdown(void *)
Definition: racegl.cpp:301
void GfuiLabelSetColor(void *scr, int id, float *color)
Change the color of a label.
Definition: guilabel.cpp:239
static void * reScreenHandle
Definition: racegl.cpp:39
int ReResGetLines(void)
Definition: racegl.cpp:400
void ReTimeMod(void *vcmd)
Definition: raceengine.cpp:782
tRmMovieCapture movieCapture
Definition: raceman.h:228
void * GfuiHookCreate(void *userDataOnActivate, tfuiCallback onActivate)
Create a callback hook.
Definition: gui.cpp:679
void(* tfuiCallback)(void *)
Definition: tgfclient.h:105
This is the race information structures.
void ReResScreenSetTitle(char *title)
Definition: racegl.cpp:358
void GfuiAddSKey(void *scr, int key, const char *descr, void *userData, tfuiCallback onKeyPressed, tfuiCallback onKeyReleased)
Add a Special Keyboard shortcut to the screen.
Definition: gui.cpp:816
void ReResScreenAddText(char *text)
Definition: racegl.cpp:366
static void * reResScreenHdle
Definition: racegl.cpp:260
#define GFUI_ALIGN_HC_VB
Definition: tgfclient.h:72
#define RM_ATTR_RUNIMG
Definition: raceman.h:262
#define GFUI_ALIGN_HL_VB
Definition: tgfclient.h:69
double GfTimeClock(void)
Get the time in seconds.
Definition: os.cpp:50
void GfuiHelpScreen(void *prevScreen)
Generate a help screen.
Definition: guihelp.cpp:48
void GfuiScreenShot(void *)
Save a screen shot in png format.
Definition: gui.cpp:913
static Vector y[4]
Definition: Convex.cpp:56
void ReStop(void)
Definition: raceengine.cpp:678
static void reScreenActivate(void *)
Definition: racegl.cpp:56
int GfuiLabelCreateEx(void *scr, const char *text, float *fgColor, int font, int x, int y, int align, int maxlen)
Create a new label (extended version).
Definition: guilabel.cpp:63
int GfuiTitleCreate(void *scr, const char *text, int maxlen)
Add a Title to the screen.
Definition: guilabel.cpp:170
static int reMsgId
Definition: racegl.cpp:42
#define GFUI_FONT_MEDIUM_C
Definition: tgfclient.h:173
void ReScreenShutdown(void)
Definition: racegl.cpp:214
#define LINES
Definition: racegl.cpp:256
#define RM_DISP_MODE_NORMAL
Definition: raceman.h:146
int GfuiVisibilitySet(void *scr, int id, int visible)
Set/unset the visibility attribute of an object.
Definition: guiobject.cpp:404
static int reResMsgId[LINES]
Definition: racegl.cpp:262
void ReResScreenRemoveText(int line)
Definition: racegl.cpp:417
static void reAddResKeys(void)
Definition: racegl.cpp:268
void GfuiHookRelease(void *hook)
Release the given hook.
Definition: gui.cpp:696
void ReStateApply(void *vstate)
Definition: racestate.cpp:177
void * params
Raceman parameters.
Definition: raceman.h:223
#define RM_SECT_HEADER
Definition: raceman.h:235
static int reCurLine
Definition: racegl.cpp:265
void * ReHookInit(void)
Definition: racegl.cpp:230
static void reMovieCapture(void *)
Definition: racegl.cpp:90