TORCS  1.3.9
The Open Racing Car Simulator
miscscreens.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  file : miscscreens.cpp
4  created : Sun Dec 8 13:01:47 CET 2002
5  copyright : (C) 2000-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 
26 #include <stdio.h>
27 #include <tgfclient.h>
28 #include <robot.h>
29 
30 #include <racescreens.h>
31 #include <portability.h>
32 
33 static void *twoStateHdle = 0;
34 static void *triStateHdle = 0;
35 static void *fourStateHdle = 0;
36 static void *nStateHandle = 0;
37 
38 
51  const char *title,
52  const char *label1, const char *tip1, void *screen1,
53  const char *label2, const char *tip2, void *screen2)
54 {
55  if (twoStateHdle) {
57  }
58 
60  GfuiScreenAddBgImg(twoStateHdle, "data/img/splash-quit.png");
61  GfuiMenuButtonCreate(twoStateHdle, label1, tip1, screen1, GfuiScreenActivate);
62  GfuiMenuButtonCreate(twoStateHdle, label2, tip2, screen2, GfuiScreenActivate);
63  GfuiAddKey(twoStateHdle, 27, tip2, screen2, GfuiScreenActivate, NULL);
65 
66  return twoStateHdle;
67 }
68 
69 
85  const char *title,
86  const char *label1, const char *tip1, void *screen1,
87  const char *label2, const char *tip2, void *screen2,
88  const char *label3, const char *tip3, void *screen3)
89 {
90  if (triStateHdle) {
92  }
93 
95  GfuiScreenAddBgImg(triStateHdle, "data/img/splash-quit.png");
96  GfuiMenuButtonCreate(triStateHdle, label1, tip1, screen1, GfuiScreenActivate);
97  GfuiMenuButtonCreate(triStateHdle, label2, tip2, screen2, GfuiScreenActivate);
98  GfuiMenuButtonCreate(triStateHdle, label3, tip3, screen3, GfuiScreenActivate);
99  GfuiAddKey(triStateHdle, 27, tip3, screen3, GfuiScreenActivate, NULL);
101 
102  return triStateHdle;
103 }
104 
105 
124  const char *title,
125  const char *label1, const char *tip1, void *screen1,
126  const char *label2, const char *tip2, void *screen2,
127  const char *label3, const char *tip3, void *screen3,
128  const char *label4, const char *tip4, void *screen4)
129 {
130  if (fourStateHdle) {
132  }
133 
135  GfuiScreenAddBgImg(fourStateHdle, "data/img/splash-quit.png");
136  GfuiMenuButtonCreate(fourStateHdle, label1, tip1, screen1, GfuiScreenActivate);
137  GfuiMenuButtonCreate(fourStateHdle, label2, tip2, screen2, GfuiScreenActivate);
138  GfuiMenuButtonCreate(fourStateHdle, label3, tip3, screen3, GfuiScreenActivate);
139  GfuiMenuButtonCreate(fourStateHdle, label4, tip4, screen4, GfuiScreenActivate);
140  GfuiAddKey(fourStateHdle, 27, tip4, screen4, GfuiScreenActivate, NULL);
142 
143  return fourStateHdle;
144 }
145 
146 
157  const char *title,
158  const char** label,
159  const char** tip,
160  void** screen,
161  const int n
162 )
163 {
164  if (nStateHandle) {
166  }
167 
169  GfuiScreenAddBgImg(nStateHandle, "data/img/splash-quit.png");
170 
171  int i;
172  for (i = 0; i < n; i++) {
173  GfuiMenuButtonCreate(nStateHandle, label[i], tip[i], screen[i], GfuiScreenActivate);
174  }
175 
176  GfuiAddKey(nStateHandle, 27, tip[n-1], screen[n-1], GfuiScreenActivate, NULL);
178 
179  return nStateHandle;
180 }
181 
182 
183 /*********************************************************
184  * Start screen
185  */
186 
187 #define MAX_LINES 20
188 
189 typedef struct
190 {
191  void *startScr;
192  void *abortScr;
194  int start;
196 
198 static void *rmScrHdle = 0;
199 
200 static void rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start);
201 
202 static void
203 rmChgStartScreen(void *vpsrc)
204 {
205  void *prevScr = rmScrHdle;
206  tStartRaceCall *psrc = (tStartRaceCall*)vpsrc;
207 
208  rmDisplayStartRace(psrc->info, psrc->startScr, psrc->abortScr, psrc->start);
209  GfuiScreenRelease(prevScr);
210 }
211 
212 static void
213 rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
214 {
215  const int BUFSIZE = 1024;
216  char path[BUFSIZE];
217  int nCars;
218  int i;
219  int y;
220  int x, dx;
221  int rows, curRow;
222  int robotIdx;
223  void *robhdle;
224  void *carHdle;
225  void *params = info->params;
226  const char *race = info->_reRaceName;
227 
229  GfuiTitleCreate(rmScrHdle, race, strlen(race));
230 
231  const char* img = GfParmGetStr(params, RM_SECT_HEADER, RM_ATTR_STARTIMG, 0);
232  if (img) {
234  }
235 
236  if (!strcmp(GfParmGetStr(params, race, RM_ATTR_DISP_START_GRID, RM_VAL_YES), RM_VAL_YES)) {
237  GfuiLabelCreate(rmScrHdle, "Starting Grid", GFUI_FONT_MEDIUM_C, 320, 420, GFUI_ALIGN_HC_VB, 0);
238  snprintf(path, BUFSIZE, "%s/%s", race, RM_SECT_STARTINGGRID);
239  rows = (int)GfParmGetNum(params, path, RM_ATTR_ROWS, (char*)NULL, 2);
240 
241  dx = 0;
242  x = 40;
243  y = 400;
244  curRow = 0;
245  nCars = GfParmGetEltNb(params, RM_SECT_DRIVERS_RACING);
246 
247  for (i = start; i < MIN(start + MAX_LINES, nCars); i++) {
248  /* Find starting driver's name */
249  snprintf(path, BUFSIZE, "%s/%d", RM_SECT_DRIVERS_RACING, i + 1);
250  const char* name = GfParmGetStr(info->params, path, RM_ATTR_MODULE, "");
251  robotIdx = (int)GfParmGetNum(info->params, path, RM_ATTR_IDX, NULL, 0);
252 
253  snprintf(path, BUFSIZE, "%sdrivers/%s/%s.xml", GetLocalDir(), name, name);
254  robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
255  if (!robhdle) {
256  snprintf(path, BUFSIZE, "drivers/%s/%s.xml", name, name);
257  robhdle = GfParmReadFile(path, GFPARM_RMODE_STD);
258  }
259 
260  if (robhdle) {
261  snprintf(path, BUFSIZE, "%s/%s/%d", ROB_SECT_ROBOTS, ROB_LIST_INDEX, robotIdx);
262  name = GfParmGetStr(robhdle, path, ROB_ATTR_NAME, "<none>");
263  const char* carName = GfParmGetStr(robhdle, path, ROB_ATTR_CAR, "");
264 
265  snprintf(path, BUFSIZE, "cars/%s/%s.xml", carName, carName);
266  carHdle = GfParmReadFile(path, GFPARM_RMODE_STD);
267  carName = GfParmGetName(carHdle);
268 
269  snprintf(path, BUFSIZE, "%d - %s - (%s)", i + 1, name, carName);
271  x + curRow * dx, y, GFUI_ALIGN_HL_VB, 0);
272 
273  GfParmReleaseHandle(carHdle);
274  GfParmReleaseHandle(robhdle);
275  }
276  curRow = (curRow + 1) % rows;
277  y -= 15;
278  }
279 
280 
281  if (start > 0) {
282  prevStartRace.startScr = startScr;
283  prevStartRace.abortScr = abortScr;
284  prevStartRace.info = info;
285  prevStartRace.start = start - MAX_LINES;
286  GfuiGrButtonCreate(rmScrHdle, "data/img/arrow-up.png", "data/img/arrow-up.png",
287  "data/img/arrow-up.png", "data/img/arrow-up-pushed.png",
288  80, 40, GFUI_ALIGN_HL_VB, 1,
290  NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
291  GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_UP, "Previous drivers", (void*)&prevStartRace, rmChgStartScreen, NULL);
292  }
293 
294  if (i < nCars) {
295  nextStartRace.startScr = startScr;
296  nextStartRace.abortScr = abortScr;
297  nextStartRace.info = info;
298  nextStartRace.start = start + MAX_LINES;
299  GfuiGrButtonCreate(rmScrHdle, "data/img/arrow-down.png", "data/img/arrow-down.png",
300  "data/img/arrow-down.png", "data/img/arrow-down-pushed.png",
301  540, 40, GFUI_ALIGN_HL_VB, 1,
303  NULL, (tfuiCallback)NULL, (tfuiCallback)NULL);
304  GfuiAddSKey(rmScrHdle, GLUT_KEY_PAGE_DOWN, "Next Drivers", (void*)&nextStartRace, rmChgStartScreen, NULL);
305  }
306  }
307 
309  "Start",
311  210,
312  40,
313  150,
315  0,
316  startScr,
318  NULL,
319  (tfuiCallback)NULL,
320  (tfuiCallback)NULL);
321  GfuiAddKey(rmScrHdle, (unsigned char)13, "Start", startScr, GfuiScreenReplace, NULL);
322 
324  "Abandon",
326  430,
327  40,
328  150,
330  0,
331  abortScr,
333  NULL,
334  (tfuiCallback)NULL,
335  (tfuiCallback)NULL);
336  GfuiAddKey(rmScrHdle, (unsigned char)27, "Abandon", abortScr, GfuiScreenReplace, NULL);
337 
338  GfuiAddSKey(rmScrHdle, GLUT_KEY_F12, "Take a Screen Shot", NULL, GfuiScreenShot, NULL);
339 
341 }
342 
343 
344 void
345 RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
346 {
347  rmDisplayStartRace(info, startScr, abortScr, 0);
348 }
static void rmChgStartScreen(void *vpsrc)
Race Manager General Info.
Definition: raceman.h:218
static tStartRaceCall prevStartRace
void GfuiScreenReplace(void *screen)
Activate a screen and make it current plus release the current screen.
Definition: gui.cpp:506
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
Definition: params.cpp:1157
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
int GfuiMenuButtonCreate(void *scr, const char *text, const char *tip, void *userdata, tfuiCallback onpush)
Add a button to a menu screen.
Definition: guimenu.cpp:110
#define GFPARM_RMODE_STD
if handle already openned return it
Definition: tgf.h:265
void * RmFourStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2, const char *label3, const char *tip3, void *screen3, const char *label4, const char *tip4, void *screen4)
Screen with 4 menu options (buttons)
char * GetLocalDir(void)
Definition: tgf.cpp:231
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
Definition: params.cpp:1834
static void * fourStateHdle
Definition: miscscreens.cpp:35
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
Robot Module Interface Definition.
#define RM_ATTR_DISP_START_GRID
Definition: raceman.h:250
void GfuiScreenRelease(void *scr)
Release the given screen.
Definition: gui.cpp:618
int GfuiLabelCreate(void *scr, const char *text, int font, int x, int y, int align, int maxlen)
Add a label to a screen.
Definition: guilabel.cpp:142
void * GfuiMenuScreenCreate(const char *title)
Create a new menu screen.
Definition: guimenu.cpp:76
#define RM_SECT_STARTINGGRID
Definition: raceman.h:237
static void * triStateHdle
Definition: miscscreens.cpp:34
static void rmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr, int start)
void GfuiScreenAddBgImg(void *scr, const char *filename)
Add an image background to a screen.
Definition: gui.cpp:961
static void * twoStateHdle
Definition: miscscreens.cpp:33
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
The Gaming Framework API (client part).
void * RmTriStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2, const char *label3, const char *tip3, void *screen3)
Screen with 3 menu options (buttons)
Definition: miscscreens.cpp:84
#define GFUI_FONT_LARGE
Definition: tgfclient.h:168
#define ROB_LIST_INDEX
Definition: robot.h:124
tRmInfo * info
static void * nStateHandle
Definition: miscscreens.cpp:36
#define RM_ATTR_IDX
Definition: raceman.h:266
#define ROB_ATTR_NAME
Definition: robot.h:126
#define RM_ATTR_MODULE
Definition: raceman.h:265
#define RM_ATTR_STARTIMG
Definition: raceman.h:263
#define RM_ATTR_ROWS
Definition: raceman.h:274
void(* tfuiCallback)(void *)
Definition: tgfclient.h:105
void GfuiScreenActivate(void *screen)
Activate a screen and make it current.
Definition: gui.cpp:467
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
#define GFUI_ALIGN_HC_VB
Definition: tgfclient.h:72
#define ROB_SECT_ROBOTS
Definition: robot.h:122
#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
void GfuiScreenShot(void *)
Save a screen shot in png format.
Definition: gui.cpp:913
static void * rmScrHdle
#define MAX_LINES
static Vector y[4]
Definition: Convex.cpp:56
void * RmTwoStateScreen(const char *title, const char *label1, const char *tip1, void *screen1, const char *label2, const char *tip2, void *screen2)
Screen with 2 menu options (buttons)
Definition: miscscreens.cpp:50
int GfuiTitleCreate(void *scr, const char *text, int maxlen)
Add a Title to the screen.
Definition: guilabel.cpp:170
#define ROB_ATTR_CAR
Definition: robot.h:130
int GfuiGrButtonCreate(void *scr, const char *disabled, const char *enabled, const char *focused, const char *pushed, int x, int y, int align, int mouse, void *userDataOnPush, tfuiCallback onPush, void *userDataOnFocus, tfuiCallback onFocus, tfuiCallback onFocusLost)
Add a graphical button to a screen.
Definition: guibutton.cpp:62
void * GfuiScreenCreate(void)
Create a new screen.
Definition: gui.cpp:543
#define GFUI_FONT_MEDIUM_C
Definition: tgfclient.h:173
int GfParmGetEltNb(void *handle, const char *path)
Count the number of subsections in a section in the parameter set handle.
Definition: params.cpp:2106
void * RmNStateScreen(const char *title, const char **label, const char **tip, void **screen, const int n)
Screen with N menu options (buttons)
Definition: Endpoint.h:36
static tStartRaceCall nextStartRace
void RmDisplayStartRace(tRmInfo *info, void *startScr, void *abortScr)
char * GfParmGetName(void *handle)
Get the name property of the parameter set handle.
Definition: params.cpp:2057
#define RM_SECT_DRIVERS_RACING
Definition: raceman.h:244
void * params
Raceman parameters.
Definition: raceman.h:223
#define RM_SECT_HEADER
Definition: raceman.h:235
#define RM_VAL_YES
Definition: raceman.h:314