TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
grmain.cpp
Go to the documentation of this file.
1/***************************************************************************
2
3 file : grmain.cpp
4 created : Thu Aug 17 23:23:49 CEST 2000
5 copyright : (C) 2013-2026 by Eric Espié, Bernhard Wymann
6 email : berniw@bluewin.ch
7
8 ***************************************************************************/
9
10/***************************************************************************
11 * *
12 * This program is free software; you can redistribute it and/or modify *
13 * it under the terms of the GNU General Public License as published by *
14 * the Free Software Foundation; either version 2 of the License, or *
15 * (at your option) any later version. *
16 * *
17 ***************************************************************************/
18
19#include <time.h>
20#include <stdlib.h>
21#include <stdio.h>
22#ifdef WIN32
23#include <windows.h>
24#endif
25#include <GL/glut.h>
26#include <plib/ssg.h>
27
28#include <tgfclient.h>
29#include <portability.h>
30#include <graphic.h>
31
32#include "grmain.h"
33#include "grshadow.h"
34#include "grskidmarks.h"
35#include "grsmoke.h"
36#include "grcar.h"
37#include "grscreen.h"
38#include "grcam.h"
39#include "grscene.h"
40#include "grsound.h"
41#include "grboard.h"
42#include "grutil.h"
43#include "grtrackmap.h"
44#include "grcarlight.h"
45#include <glfeatures.h>
46
48static double OldTime;
49static int nFrame;
50float grFps;
51double grCurTime;
53int segIndice = 0;
54
56int grNbCars = 0;
57
58void *grHandle = NULL;
59void *grTrackHandle = NULL;
60
62
64
66ssgContext grContext;
67class cGrScreen *grScreens[GR_NB_MAX_SCREEN] = {NULL, NULL, NULL, NULL};
68int grNbScreen = 1;
71
72#ifdef WIN32
73#include <GL/glext.h>
74PFNGLMULTITEXCOORD2FARBPROC glMultiTexCoord2fARB = NULL;
75PFNGLMULTITEXCOORD2FVARBPROC glMultiTexCoord2fvARB = NULL;
76PFNGLACTIVETEXTUREARBPROC glActiveTextureARB = NULL;
77PFNGLCLIENTACTIVETEXTUREARBPROC glClientActiveTextureARB = NULL;
78#endif
79
80
81// InitMultiTex
82// desc: sets up OpenGL for multitexturing support
83bool InitMultiTex(void)
84{
85 if (GetSingleTextureMode ()) {
87 return true;
88 } else {
89 // list of available extensions
90 char *extensionStr = (char*)glGetString(GL_EXTENSIONS);
91 if (extensionStr == NULL)
92 return false;
93
94 if (strstr(extensionStr, "GL_ARB_multitexture")) {
95 // retrieve the maximum number of texture units allowed
96 glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB, &maxTextureUnits);
97#ifdef WIN32
98 // retrieve addresses of multitexturing functions
99 glMultiTexCoord2fARB = (PFNGLMULTITEXCOORD2FARBPROC) wglGetProcAddress("glMultiTexCoord2fARB");
100 glActiveTextureARB = (PFNGLACTIVETEXTUREARBPROC) wglGetProcAddress("glActiveTextureARB");
101 glClientActiveTextureARB = (PFNGLCLIENTACTIVETEXTUREARBPROC) wglGetProcAddress("glClientActiveTextureARB");
102 glMultiTexCoord2fvARB = (PFNGLMULTITEXCOORD2FVARBPROC) wglGetProcAddress("glMultiTexCoord2fvARB");
103#endif
104 return true;
105 } else {
106 return false;
107 }
108 }
109}
110
111
112static void grAdaptScreenSize(void)
113{
114 switch (grNbScreen) {
115 case 0:
116 case 1:
117 grScreens[0]->activate(grWinx, grWiny, grWinw, grWinh);
118 grScreens[1]->desactivate();
119 grScreens[2]->desactivate();
120 grScreens[3]->desactivate();
121 break;
122 case 2:
123 grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw, grWinh / 2);
124 grScreens[1]->activate(grWinx, grWiny, grWinw, grWinh / 2);
125 grScreens[2]->desactivate();
126 grScreens[3]->desactivate();
127 break;
128 case 3:
129 grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
130 grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
131 grScreens[2]->activate(grWinx + grWinw / 4, grWiny, grWinw / 2, grWinh / 2);
132 grScreens[3]->desactivate();
133 break;
134 case 4:
135 grScreens[0]->activate(grWinx, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
136 grScreens[1]->activate(grWinx + grWinw / 2, grWiny + grWinh / 2, grWinw / 2, grWinh / 2);
137 grScreens[2]->activate(grWinx, grWiny, grWinw / 2, grWinh / 2);
138 grScreens[3]->activate(grWinx + grWinw / 2, grWiny, grWinw / 2, grWinh / 2);
139 break;
140 }
141}
142
143static void
145{
146 switch (p) {
147 case GR_SPLIT_ADD:
148 grNbScreen++;
151 }
152 break;
153 case GR_SPLIT_REM:
154 grNbScreen--;
155 if (grNbScreen < 1) {
156 grNbScreen = 1;
157 }
158 break;
159 }
161 GfParmWriteFile(NULL, grHandle, "Graph");
163}
164
165static class cGrScreen *
167{
168 tMouseInfo *mouse;
169 int i;
170 int x, y;
171
172 mouse = GfuiMouseInfo();
173 x = (int)(mouse->X * grMouseRatioX);
174 y = (int)(mouse->Y * grMouseRatioY);
175 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
176 if (grScreens[i]->isInScreen(x, y)) {
177 return grScreens[i];
178 }
179 }
180 return grScreens[0];
181}
182
183static void
184grSetZoom(int zoom)
185{
187}
188
189static void
190grSelectCamera(int camera)
191{
193}
194
195static void
200
201static void
202grSelectTrackMap(void * /* vp */)
203{
205}
206
207static void
208grPrevCar(void * /* dummy */)
209{
211}
212
213static void
214grNextCar(void * /* dummy */)
215{
217}
218
219static void
220grSwitchMirror(void * /* dummy */)
221{
223}
224
225int
226initView(int x, int y, int width, int height, int /* flag */, void *screen)
227{
228 int i;
229 const int BUFSIZE = 1024;
230 char buf[BUFSIZE];
231
232 if (maxTextureUnits==0) {
233 InitMultiTex();
234 }
235
236 grWinx = x;
237 grWiny = y;
238 grWinw = width;
239 grWinh = height;
240
241 grMouseRatioX = width / 640.0;
242 grMouseRatioY = height / 480.0;
243
245 nFrame = 0;
246 grFps = 0;
247
248 snprintf(buf, BUFSIZE, "%s%s", GetLocalDir(), GR_PARAM_FILE);
250
251 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
252 grScreens[i]->initBoard ();
253 }
254
255 GfuiAddSKeyAction(screen, GLUT_KEY_HOME, "Zoom Maximum", [] { grSetZoom(GR_ZOOM_MAX); }, tGfuiAction());
256 GfuiAddSKeyAction(screen, GLUT_KEY_END, "Zoom Minimum", [] { grSetZoom(GR_ZOOM_MIN); }, tGfuiAction());
257 GfuiAddKeyAction(screen, '*', "Zoom Default", [] { grSetZoom(GR_ZOOM_DFLT); }, tGfuiAction());
258
259 GfuiAddSKeyAction(screen, GLUT_KEY_PAGE_UP, "Select Previous Car", [] { grPrevCar(NULL); }, tGfuiAction());
260 GfuiAddSKeyAction(screen, GLUT_KEY_PAGE_DOWN, "Select Next Car", [] { grNextCar(NULL); }, tGfuiAction());
261
262 GfuiAddSKeyAction(screen, GLUT_KEY_F2, "Driver Views", [] { grSelectCamera(0); }, tGfuiAction());
263 GfuiAddSKeyAction(screen, GLUT_KEY_F3, "Car Views", [] { grSelectCamera(1); }, tGfuiAction());
264 GfuiAddSKeyAction(screen, GLUT_KEY_F4, "Side Car Views", [] { grSelectCamera(2); }, tGfuiAction());
265 GfuiAddSKeyAction(screen, GLUT_KEY_F5, "Up Car View", [] { grSelectCamera(3); }, tGfuiAction());
266 GfuiAddSKeyAction(screen, GLUT_KEY_F6, "Persp Car View", [] { grSelectCamera(4); }, tGfuiAction());
267 GfuiAddSKeyAction(screen, GLUT_KEY_F7, "All Circuit Views", [] { grSelectCamera(5); }, tGfuiAction());
268 GfuiAddSKeyAction(screen, GLUT_KEY_F8, "Track View", [] { grSelectCamera(6); }, tGfuiAction());
269 GfuiAddSKeyAction(screen, GLUT_KEY_F9, "Track View Zoomed", [] { grSelectCamera(7); }, tGfuiAction());
270 GfuiAddSKeyAction(screen, GLUT_KEY_F10, "Follow Car Zoomed", [] { grSelectCamera(8); }, tGfuiAction());
271 GfuiAddSKeyAction(screen, GLUT_KEY_F11, "TV Director View", [] { grSelectCamera(9); }, tGfuiAction());
272
273 GfuiAddKeyAction(screen, '5', "FPS Counter", [] { grSelectBoard(3); }, tGfuiAction());
274 GfuiAddKeyAction(screen, '4', "G/Cmd Graph", [] { grSelectBoard(4); }, tGfuiAction());
275 GfuiAddKeyAction(screen, '3', "Leaders Board", [] { grSelectBoard(2); }, tGfuiAction());
276 GfuiAddKeyAction(screen, '2', "Driver Counters", [] { grSelectBoard(1); }, tGfuiAction());
277 GfuiAddKeyAction(screen, '1', "Driver Board", [] { grSelectBoard(0); }, tGfuiAction());
278 GfuiAddKeyAction(screen, '9', "Mirror", [] { grSwitchMirror(NULL); }, tGfuiAction());
279 GfuiAddKeyAction(screen, '0', "Arcade Board", [] { grSelectBoard(5); }, tGfuiAction());
280 GfuiAddKeyAction(screen, '>', "Zoom In", [] { grSetZoom(GR_ZOOM_IN); }, tGfuiAction());
281 GfuiAddKeyAction(screen, '<', "Zoom Out", [] { grSetZoom(GR_ZOOM_OUT); }, tGfuiAction());
282 GfuiAddKeyAction(screen, '[', "Split Screen", [] { grSplitScreen(GR_SPLIT_ADD); }, tGfuiAction());
283 GfuiAddKeyAction(screen, ']', "UnSplit Screen", [] { grSplitScreen(GR_SPLIT_REM); }, tGfuiAction());
284 GfuiAddKeyAction(screen, 'm', "Track Maps", [] { grSelectTrackMap(NULL); }, tGfuiAction());
285
287
288 grInitScene();
289
291
293 if (strcmp(wheelDetailOption,GR_ATT_WHEELRENDERING_DETAILED ) == 0) {
295 } else if (strcmp(wheelDetailOption,GR_ATT_WHEELRENDERING_SIMPLE ) == 0) {
297 }
298
300
301 return 0;
302}
303
304
305int
307{
308 int i;
309
310 START_PROFILE("refresh");
311
312 nFrame++;
315 if ((grCurTime - OldTime) > 1.0) {
316 /* The Frames Per Second (FPS) display is refreshed every second */
318 nFrame = 0;
320 }
321
322 TRACE_GL("refresh: start");
323
324 START_PROFILE("grRefreshSound*");
326 STOP_PROFILE("grRefreshSound*");
327
328 START_PROFILE("grDrawBackground/glClear");
329 glDepthFunc(GL_LEQUAL);
330 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
331 STOP_PROFILE("grDrawBackground/glClear");
332
333 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
334 grScreens[i]->update(s, grFps);
335 }
336
338
339 STOP_PROFILE("refresh");
340 return 0;
341}
342
343int
345{
346 const int IDXSIZE = 16;
347 char idx[IDXSIZE];
348 int index;
349 int i;
350 tCarElt *elt;
351 void *hdle;
352 const int BUFSIZE = 1024;
353 char buf[1024];
354
355 TRACE_GL("initCars: start");
356
357 snprintf(buf, BUFSIZE, "%s%s", GetLocalDir(), GR_PARAM_FILE);
359
361 grInitCarlight(s->_ncars);
362 grMaxDammage = (tdble)s->_maxDammage;
363 grNbCars = s->_ncars;
364
366
367 grCarInfo = (tgrCarInfo*)calloc(s->_ncars, sizeof(tgrCarInfo));
368
369 for (i = 0; i < s->_ncars; i++) {
370 elt = s->cars[i];
371 /* Shadow init (Should be done before the cars for display order) */
372 grInitShadow(elt);
373 /* Skidmarks init */
374 grInitSkidmarks(elt);
375 }
376
377 grNbScreen = 0;
378 for (i = 0; i < s->_ncars; i++) {
379 elt = s->cars[i];
380 index = elt->index;
381 hdle = elt->_paramsHandle;
382 snprintf(idx, IDXSIZE, "Robots/index/%d", elt->_driverIndex);
383 grCarInfo[index].iconColor[0] = GfParmGetNum(hdle, idx, "red", (char*)NULL, 0);
384 grCarInfo[index].iconColor[1] = GfParmGetNum(hdle, idx, "green", (char*)NULL, 0);
385 grCarInfo[index].iconColor[2] = GfParmGetNum(hdle, idx, "blue", (char*)NULL, 0);
386 grCarInfo[index].iconColor[3] = 1.0;
387 grInitCar(elt);
388 if ((elt->_driverType == RM_DRV_HUMAN) && (grNbScreen < GR_NB_MAX_SCREEN)) {
389 grScreens[grNbScreen]->setCurrentCar(elt);
390 grNbScreen++;
391 }
392 }
393
394 if (grNbScreen == 0) {
396 }
397
398 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
399 grScreens[i]->initCams(s);
400 }
401
402 TRACE_GL("initCars: end");
403
404 grInitSmoke(s->_ncars);
405 grInitSound(s, s->_ncars);
406
408
409 return 0;
410}
411
412void
414{
415 int i;
416
417 GfOut("-- shutdownCars\n");
419 if (grNbCars) {
424 /* Delete ssg objects */
425 CarsAnchor->removeAllKids();
426 ShadowAnchor->removeAllKids();
427 for (i = 0; i < grNbCars; i++) {
428 ssgDeRefDelete(grCarInfo[i].envSelector);
429 ssgDeRefDelete(grCarInfo[i].shadowBase);
430 ssgDeRefDelete(grCarInfo[i].wheelTexture);
431 if (grCarInfo[i].driverSelectorinsg == false) {
432 delete grCarInfo[i].driverSelector;
433 }
434 }
435
436 PitsAnchor->removeAllKids();
437 ThePits = 0;
438 free(grCarInfo);
439 }
440
442
443 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
444 grScreens[i]->setCurrentCar(NULL);
445 }
446}
447
448int
450{
451 int i;
452
453 // The inittrack does as well init the context, that is highly inconsistent, IMHO.
454 // TODO: Find a solution to init the graphics first independent of objects.
455 grContext.makeCurrent();
456
459
460 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
461 grScreens[i] = new cGrScreen(i);
462 }
463
464 return 0;
465}
466
467
468void
470{
471 int i;
472
475
476 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
477 if (grScreens[i] != NULL) {
478 delete grScreens[i];
479 grScreens[i] = NULL;
480 }
481 }
482
484}
485
486/*void bendCar (int index, sgVec3 poc, sgVec3 force, int cnt)
487{
488 if (grCarInfo)
489 grPropagateDamage (grCarInfo[index].carEntity, poc, force, cnt);
490}*/
491
492
493void muteForMenu(void)
494{
496}
497
static Point p[4]
Definition Convex.cpp:54
static Vector y[4]
Definition Convex.cpp:56
#define RM_DRV_HUMAN
Definition car.h:122
struct CarElt tCarElt
Car structure (tCarElt).
cGrCamera * getCurCamera(void)
Definition grscreen.h:83
void selectTrackMap()
Definition grscreen.cpp:159
class cGrBoard * board
Definition grscreen.h:43
void switchMirror(void)
Definition grscreen.cpp:179
void setZoom(long zoom)
Definition grscreen.cpp:139
cGrScreen(int id)
Definition grscreen.cpp:41
int isInScreen(int x, int y)
Definition grscreen.cpp:90
void selectNextCar(void)
Definition grscreen.cpp:144
void selectCamera(long cam)
Definition grscreen.cpp:198
void selectPrevCar(void)
Definition grscreen.cpp:149
void selectBoard(long brd)
Definition grscreen.cpp:154
#define GR_ATT_WHEELRENDERING_DETAILED
Definition graphic.h:58
#define GR_ATT_WHEELRENDERING
Definition graphic.h:57
#define GR_ATT_WHEELRENDERING_SIMPLE
Definition graphic.h:59
#define GR_SCT_GRAPHIC
Definition graphic.h:82
#define GR_ATT_LODFACTOR
Definition graphic.h:91
#define GR_SCT_DISPMODE
Definition graphic.h:63
#define GR_ATT_NB_SCREENS
Definition graphic.h:93
#define GR_PARAM_FILE
Definition graphic.h:40
void grShutdownBoardCar(void)
Definition grboard.cpp:1049
#define GR_ZOOM_MIN
Definition grcam.h:285
#define GR_ZOOM_DFLT
Definition grcam.h:286
#define GR_ZOOM_OUT
Definition grcam.h:283
#define GR_ZOOM_IN
Definition grcam.h:282
#define GR_ZOOM_MAX
Definition grcam.h:284
void grInitShadow(tCarElt *car)
Definition grcar.cpp:416
void grInitCommonState(void)
Definition grcar.cpp:64
void grInitCar(tCarElt *car)
Definition grcar.cpp:513
tgrCarInfo * grCarInfo
Definition grmain.cpp:65
void grInitCarlight(int index)
void grShudownCarlight(void)
static void grPrevCar(void *)
Definition grmain.cpp:208
static void grSplitScreen(int p)
Definition grmain.cpp:144
static void grSelectTrackMap(void *)
Definition grmain.cpp:202
static void grSelectBoard(int board)
Definition grmain.cpp:196
tdble grLodFactorValue
Definition grmain.cpp:69
double grDeltaTime
Definition grmain.cpp:52
static double OldTime
Definition grmain.cpp:48
ssgContext grContext
Definition grmain.cpp:66
static float grMouseRatioY
Definition grmain.cpp:63
void * grHandle
Definition grmain.cpp:58
int grWinw
Definition grmain.cpp:61
int initCars(tSituation *s)
Definition grmain.cpp:344
void shutdownCars(void)
Definition grmain.cpp:413
static class cGrScreen * grGetcurrentScreen(void)
Definition grmain.cpp:166
int grWinh
Definition grmain.cpp:61
int grNbScreen
Definition grmain.cpp:68
static void grSwitchMirror(void *)
Definition grmain.cpp:220
static void grAdaptScreenSize(void)
Definition grmain.cpp:112
EWheelDetail grUseDetailedWheels
Definition grmain.cpp:70
int initView(int x, int y, int width, int height, int, void *screen)
Definition grmain.cpp:226
int refresh(tSituation *s)
Definition grmain.cpp:306
int segIndice
Definition grmain.cpp:53
class cGrScreen * grScreens[GR_NB_MAX_SCREEN]
Definition grmain.cpp:67
double grCurTime
Definition grmain.cpp:51
int grWiny
Definition grmain.cpp:61
int grNbCars
Definition grmain.cpp:56
int maxTextureUnits
Definition grmain.cpp:47
static void grNextCar(void *)
Definition grmain.cpp:214
int initTrack(tTrack *track)
Definition grmain.cpp:449
void muteForMenu(void)
Definition grmain.cpp:493
void * grTrackHandle
Definition grmain.cpp:59
tdble grMaxDammage
Definition grmain.cpp:55
static void grSelectCamera(int camera)
Definition grmain.cpp:190
bool InitMultiTex(void)
Definition grmain.cpp:83
static int nFrame
Definition grmain.cpp:49
static float grMouseRatioX
Definition grmain.cpp:63
static void grSetZoom(int zoom)
Definition grmain.cpp:184
int grWinx
Definition grmain.cpp:61
void shutdownTrack(void)
Definition grmain.cpp:469
float grFps
Definition grmain.cpp:50
EWheelDetail
Definition grmain.h:77
@ DETAILED
Definition grmain.h:77
@ SIMPLE
Definition grmain.h:77
#define GR_NB_MAX_SCREEN
Definition grmain.h:72
#define GR_SPLIT_REM
Definition grmain.h:70
#define GR_SPLIT_ADD
Definition grmain.h:69
float tdble
Floating point type used in TORCS.
Definition tgf.h:47
void GfuiAddKeyAction(void *scr, unsigned char key, const char *descr, const tGfuiAction &onKeyPressed, const tGfuiAction &onKeyReleased)
Add a Keyboard callback to a screen.
Definition gui.cpp:809
void GfuiAddSKeyAction(void *scr, int key, const char *descr, const tGfuiAction &onKeyPressed, const tGfuiAction &onKeyReleased)
Add a Special Keyboard shortcut to the screen.
Definition gui.cpp:895
tMouseInfo * GfuiMouseInfo(void)
Get the GUI's current mouse state.
Definition gui.cpp:419
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:2453
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:2534
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:2737
void GfParmReleaseHandle(void *parmHandle)
Release given parameter set handle parmHandle.
Definition params.cpp:1963
int GfParmWriteFile(const char *file, void *parmHandle, const char *name)
Write parameter set into file.
Definition params.cpp:1732
void * GfParmReadFile(const char *file, int mode)
Read parameter set from file and return handle to parameter set.
Definition params.cpp:1173
int grInitScene(void)
Definition grscene.cpp:95
void grShutdownScene(void)
Definition grscene.cpp:276
void grCustomizePits(void)
Definition grscene.cpp:642
int grLoadScene(tTrack *track)
Definition grscene.cpp:170
ssgBranch * CarsAnchor
Definition grscene.cpp:74
ssgBranch * PitsAnchor
Definition grscene.cpp:76
ssgBranch * ShadowAnchor
Definition grscene.cpp:75
ssgBranch * ThePits
Definition grscene.cpp:81
void grShutdownSkidmarks(void)
remove the skidmarks information for a car
void grInitSkidmarks(tCarElt *car)
initialize the skidmak structure for a car
void grInitSmoke(int index)
Definition grsmoke.cpp:68
void grShutdownSmoke()
remove the smoke information for a car
Definition grsmoke.cpp:429
void grUpdateSmoke(double t)
update if necessary the smoke for a car
Definition grsmoke.cpp:148
float grRefreshSound(tSituation *s, cGrCamera *camera)
Definition grsound.cpp:204
void grInitSound(tSituation *s, int ncars)
Definition grsound.cpp:45
void grMuteForMenu(void)
Definition grsound.cpp:250
void grShutdownSound(int ncars)
Definition grsound.cpp:172
void grShutdownState(void)
Definition grutil.cpp:182
#define TRACE_GL(msg)
Definition grutil.h:28
double GfTimeClock(void)
Get the time in seconds.
Definition os.cpp:50
struct Situation tSituation
cars situation used to inform the GUI and the drivers
int index
car index
Definition car.h:459
tCarElt ** cars
list of cars
Definition raceman.h:89
double currentTime
current time in sec since the beginning of the simulation
Definition raceman.h:87
Track structure.
Definition track.h:533
int GetSingleTextureMode(void)
Definition tgf.cpp:272
char * GetLocalDir(void)
Definition tgf.cpp:230
#define GfOut
Definition tgf.h:372
#define GFPARM_RMODE_CREAT
Allow an empty in-memory set on file-open failure; does not write a file.
Definition tgf.h:266
#define GFPARM_RMODE_STD
Return a new handle sharing cached data for this filename, if available.
Definition tgf.h:264
#define STOP_PROFILE(a)
Definition tgf.h:597
#define START_PROFILE(a)
Definition tgf.h:596
struct MouseInfo tMouseInfo
std::function< void()> tGfuiAction
Definition tgfclient.h:107
int track(tModInfo *modInfo)
Definition trackitf.cpp:85