TORCS  1.3.9
The Open Racing Car Simulator
grscene.cpp
Go to the documentation of this file.
1 /***************************************************************************
2 
3  file : grscene.cpp
4  created : Mon Aug 21 20:13:56 CEST 2000
5  copyright : (C) 2000 by Eric Espie
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 <math.h>
22 #include <stdlib.h>
23 #include <sys/types.h>
24 #include <stdio.h>
25 #include <ctype.h>
26 #ifdef WIN32
27 #include <windows.h>
28 #include <GL/gl.h>
29 #include <GL/glext.h>
30 #endif
31 #include <GL/glut.h>
32 #include <plib/ssg.h>
33 #include <plib/ssgAux.h>
34 #include <tgfclient.h>
35 #include <track.h>
36 #include <car.h>
37 #include <graphic.h>
38 #include <robottools.h>
39 #include <portability.h>
40 
41 #include "grmain.h"
42 #include "grshadow.h"
43 #include "grskidmarks.h"
44 #include "grsmoke.h"
45 #include "grcar.h"
46 #include "grcam.h"
47 #include "grscene.h"
48 #include "grutil.h"
49 #include "grssgext.h"
50 #include "grtexture.h"
51 
52 
53 int grWrldX;
54 int grWrldY;
55 int grWrldZ;
58 
59 ssgStateSelector *grEnvSelector;
63 #define NB_BG_FACES 36
64 #define BG_DIST 1.0
65 
66 ssgRoot *TheScene = 0;
67 static ssgRoot *TheBackground = 0;
68 
69 /* TheScene kid order */
70 ssgBranch *SunAnchor = 0;
71 ssgBranch *LandAnchor = 0;
72 ssgBranch *CarsAnchor = 0;
73 ssgBranch *ShadowAnchor = 0;
74 ssgBranch *PitsAnchor = 0;
75 ssgBranch *SmokeAnchor = 0;
76 ssgBranch *SkidAnchor = 0;
77 ssgBranch *CarlightAnchor = 0;
78 
79 ssgBranch *ThePits = 0;
80 ssgTransform *sun_grscene = NULL ;
81 
82 static void initBackground(void);
83 
84 extern ssgEntity *grssgLoadAC3D ( const char *fname, const ssgLoaderOptions* options );
85 
86 int preScene(ssgEntity *e)
87 {
88  return TRUE;
89 }
90 
91 
92 int
94 {
95  void *hndl = grTrackHandle;
96  ssgLight *light = ssgGetLight(0);
97 
98  GLfloat mat_specular[] = {0.3, 0.3, 0.3, 1.0};
99  GLfloat mat_shininess[] = {50.0};
100  GLfloat light_position[] = {0, 0, 200, 0.0};
101  GLfloat lmodel_ambient[] = {0.2, 0.2, 0.2, 1.0};
102  GLfloat lmodel_diffuse[] = {0.8, 0.8, 0.8, 1.0};
103  GLfloat fog_clr[] = {1.0, 1.0, 1.0, 0.5};
104 
105  mat_specular[0] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_SPEC_R, NULL, mat_specular[0]);
106  mat_specular[1] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_SPEC_G, NULL, mat_specular[1]);
107  mat_specular[2] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_SPEC_B, NULL, mat_specular[2]);
108 
109  lmodel_ambient[0] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_AMBIENT_R, NULL, lmodel_ambient[0]);
110  lmodel_ambient[1] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_AMBIENT_G, NULL, lmodel_ambient[1]);
111  lmodel_ambient[2] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_AMBIENT_B, NULL, lmodel_ambient[2]);
112 
113  lmodel_diffuse[0] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_DIFFUSE_R, NULL, lmodel_diffuse[0]);
114  lmodel_diffuse[1] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_DIFFUSE_G, NULL, lmodel_diffuse[1]);
115  lmodel_diffuse[2] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_DIFFUSE_B, NULL, lmodel_diffuse[2]);
116 
117  mat_shininess[0] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_SHIN, NULL, mat_shininess[0]);
118 
119  light_position[0] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_LIPOS_X, NULL, light_position[0]);
120  light_position[1] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_LIPOS_Y, NULL, light_position[1]);
121  light_position[2] = GfParmGetNum(hndl, TRK_SECT_GRAPH, TRK_ATT_LIPOS_Z, NULL, light_position[2]);
122 
123  glShadeModel(GL_SMOOTH);
124 
125  light->setPosition(light_position[0],light_position[1],light_position[2]);
126  light->setColour(GL_AMBIENT,lmodel_ambient);
127  light->setColour(GL_DIFFUSE,lmodel_diffuse);
128  light->setColour(GL_SPECULAR,mat_specular);
129  light->setSpotAttenuation(0.0, 0.0, 0.0);
130 
131  sgCopyVec3 (fog_clr, grTrack->graphic.bgColor);
132  sgScaleVec3 (fog_clr, 0.8);
133  glFogi(GL_FOG_MODE, GL_LINEAR);
134  glFogfv(GL_FOG_COLOR, fog_clr);
135  glFogf(GL_FOG_DENSITY, 0.05);
136  glHint(GL_FOG_HINT, GL_DONT_CARE);
137 
138  glEnable(GL_LIGHTING);
139  glEnable(GL_LIGHT0);
140  glEnable(GL_DEPTH_TEST);
141 
142  if (!sun_grscene) {
143  ssgaLensFlare *sun_obj = NULL ;
144  sun_obj = new ssgaLensFlare () ;
145  sun_grscene = new ssgTransform ;
146  sun_grscene->setTransform( light_position );
147  sun_grscene-> addKid(sun_obj);
148  SunAnchor-> addKid(sun_grscene);
149  }
150 
151  /* GUIONS GL_TRUE */
152  glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,GL_FALSE);
153 
154 #ifdef GL_SEPARATE_SPECULAR_COLOR
155  glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,GL_SEPARATE_SPECULAR_COLOR);
156 #else
157 #ifdef GL_SEPARATE_SPECULAR_COLOR_EXT
158  glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL_EXT,GL_SEPARATE_SPECULAR_COLOR_EXT);
159 #endif
160 #endif
161 
162  return 0;
163 }
164 
166 
167 int
169 {
170  void *hndl = grTrackHandle;
171  const char *acname;
172  ssgEntity *desc;
173  const int BUFSIZE = 256;
174  char buf[BUFSIZE];
175 
176  if (maxTextureUnits==0) {
177  InitMultiTex();
178  }
179 
180  ssgSetCurrentOptions(&options);
181  ssgAddTextureFormat(".png", grLoadPngTexture);
183 
184  grTrack = track;
185  TheScene = new ssgRoot;
186 
187  /* Landscape */
188  LandAnchor = new ssgBranch;
189  TheScene->addKid(LandAnchor);
190 
191  /* Pit stops walls */
192  PitsAnchor = new ssgBranch;
193  TheScene->addKid(PitsAnchor);
194 
195  /* Skid Marks */
196  SkidAnchor = new ssgBranch;
197  TheScene->addKid(SkidAnchor);
198 
199  /* Car shadows */
200  ShadowAnchor = new ssgBranch;
201  TheScene->addKid(ShadowAnchor);
202 
203  /* Car lights */
204  CarlightAnchor = new ssgBranch;
205  TheScene->addKid(CarlightAnchor);
206 
207  /* Cars */
208  CarsAnchor = new ssgBranch;
209  TheScene->addKid(CarsAnchor);
210 
211  /* Smoke */
212  SmokeAnchor = new ssgBranch;
213  TheScene->addKid(SmokeAnchor);
214 
215  /* Lens Flares */
216  SunAnchor = new ssgBranch;
217  TheScene->addKid(SunAnchor);
218 
219 
220  initBackground();
221 
222  grWrldX = (int)(track->max.x - track->min.x + 1);
223  grWrldY = (int)(track->max.y - track->min.y + 1);
224  grWrldZ = (int)(track->max.z - track->min.z + 1);
226 
227  acname = GfParmGetStr(hndl, TRK_SECT_GRAPH, TRK_ATT_3DDESC, "track.ac");
228  if (strlen(acname) == 0) {
229  return -1;
230  }
231 
232  snprintf(buf, BUFSIZE, "tracks/%s/%s;data/textures;data/img;.", grTrack->category, grTrack->internalname);
233  ssgTexturePath(buf);
234  snprintf(buf, BUFSIZE, "tracks/%s/%s", grTrack->category, grTrack->internalname);
235  ssgModelPath(buf);
236 
237  desc = grssgLoadAC3D(acname, NULL);
238  LandAnchor->addKid(desc);
239 
240  return 0;
241 }
242 
243 
244 void grDrawScene(void)
245 {
246  TRACE_GL("refresh: ssgCullAndDraw start");
247  ssgCullAndDraw(TheScene);
248  TRACE_GL("refresh: ssgCullAndDraw");
249 }
250 
251 
252 void grShutdownScene(void)
253 {
254  if (TheScene) {
255  delete TheScene;
256  TheScene = 0;
257  }
258 
259  if (TheBackground) {
260  delete TheBackground;
261  TheBackground = 0;
262  }
263 
264  if (grEnvState != NULL) {
265  ssgDeRefDelete(grEnvState);
266  grEnvState = NULL;
267  }
268  if (grEnvShadowState != NULL) {
269  ssgDeRefDelete(grEnvShadowState);
270  grEnvShadowState = NULL;
271  }
272  if (grEnvShadowStateOnCars != NULL) {
273  ssgDeRefDelete(grEnvShadowStateOnCars);
274  grEnvShadowStateOnCars = NULL;
275  }
276  if(grEnvSelector != NULL) {
277  delete grEnvSelector;
278  grEnvSelector = NULL;
279  }
280 
281  options.endLoad();
282 }
283 
284 
285 static void
287 {
288  int i;
289  float x, y, z1, z2;
290  double alpha;
291  float texLen;
292  tTrackGraphicInfo *graphic;
293  ssgSimpleState *envst;
294  sgVec3 vtx;
295  sgVec4 clr;
296  sgVec3 nrm;
297  sgVec2 tex;
298  const int BUFSIZE = 1024;
299  char buf[BUFSIZE];
300  ssgVtxTable *bg;
301  ssgVertexArray *bg_vtx;
302  ssgTexCoordArray *bg_tex;
303  ssgColourArray *bg_clr;
304  ssgNormalArray *bg_nrm;
305  ssgSimpleState *bg_st;
306 
307  snprintf(buf, BUFSIZE, "tracks/%s/%s;data/img;data/textures;.", grTrack->category, grTrack->internalname);
308  grFilePath = buf;
309  grGammaValue = 1.8;
310  grMipMap = 0;
311 
312  graphic = &grTrack->graphic;
313  glClearColor(graphic->bgColor[0], graphic->bgColor[1], graphic->bgColor[2], 1.0);
314 
315  TheBackground = new ssgRoot();
316  clr[0] = clr[1] = clr[2] = 1.0;
317  clr[3] = 1.0;
318  nrm[0] = nrm[2] = 0.0;
319  nrm[1] = 1.0;
320 
321  z1 = -0.5;
322  z2 = 1.0;
323  switch (graphic->bgtype) {
324  case 0:
325  bg_vtx = new ssgVertexArray(NB_BG_FACES + 1);
326  bg_tex = new ssgTexCoordArray(NB_BG_FACES + 1);
327  bg_clr = new ssgColourArray(1);
328  bg_nrm = new ssgNormalArray(1);
329 
330  bg_clr->add(clr);
331  bg_nrm->add(nrm);
332 
333  for (i = 0; i < NB_BG_FACES + 1; i++) {
334  alpha = (float)i * 2 * PI / (float)NB_BG_FACES;
335  texLen = (float)i / (float)NB_BG_FACES;
336 
337  x = BG_DIST * cos(alpha);
338  y = BG_DIST * sin(alpha);
339 
340  vtx[0] = x;
341  vtx[1] = y;
342  vtx[2] = z1;
343  bg_vtx->add(vtx);
344  tex[0] = texLen*4.0;
345  tex[1] = 0;
346  bg_tex->add(tex);
347 
348  vtx[0] = x;
349  vtx[1] = y;
350  vtx[2] = z2;
351  bg_vtx->add(vtx);
352  tex[0] = texLen*4.0;
353  tex[1] = 1.0;
354  bg_tex->add(tex);
355  }
356  bg = new ssgVtxTable(GL_TRIANGLE_STRIP, bg_vtx, bg_nrm, bg_tex, bg_clr);
357  bg_st = (ssgSimpleState*)grSsgLoadTexState(graphic->background);
358  bg_st->disable(GL_LIGHTING);
359  bg->setState(bg_st);
360  bg->setCullFace(0);
361  TheBackground->addKid(bg);
362  break;
363 
364  case 2:
365  bg_vtx = new ssgVertexArray(NB_BG_FACES + 1);
366  bg_tex = new ssgTexCoordArray(NB_BG_FACES + 1);
367  bg_clr = new ssgColourArray(1);
368  bg_nrm = new ssgNormalArray(1);
369 
370  bg_clr->add(clr);
371  bg_nrm->add(nrm);
372 
373  for (i = 0; i < NB_BG_FACES / 4 + 1; i++) {
374  alpha = (float)i * 2 * PI / (float)NB_BG_FACES;
375  texLen = (float)i / (float)NB_BG_FACES;
376 
377  x = BG_DIST * cos(alpha);
378  y = BG_DIST * sin(alpha);
379 
380  vtx[0] = x;
381  vtx[1] = y;
382  vtx[2] = z1;
383  bg_vtx->add(vtx);
384  tex[0] = texLen*4.0;
385  tex[1] = 0;
386  bg_tex->add(tex);
387 
388  vtx[0] = x;
389  vtx[1] = y;
390  vtx[2] = z2;
391  bg_vtx->add(vtx);
392  tex[0] = texLen*4.0;
393  tex[1] = 0.5;
394  bg_tex->add(tex);
395  }
396  bg = new ssgVtxTable(GL_TRIANGLE_STRIP, bg_vtx, bg_nrm, bg_tex, bg_clr);
397  bg_st = (ssgSimpleState*)grSsgLoadTexState(graphic->background);
398  bg_st->disable(GL_LIGHTING);
399  bg->setState(bg_st);
400  bg->setCullFace(0);
401  TheBackground->addKid(bg);
402 
403  bg_vtx = new ssgVertexArray(NB_BG_FACES + 1);
404  bg_tex = new ssgTexCoordArray(NB_BG_FACES + 1);
405  bg_clr = new ssgColourArray(1);
406  bg_nrm = new ssgNormalArray(1);
407 
408  bg_clr->add(clr);
409  bg_nrm->add(nrm);
410 
411  for (i = NB_BG_FACES/4; i < NB_BG_FACES / 2 + 1; i++) {
412  alpha = (float)i * 2 * PI / (float)NB_BG_FACES;
413  texLen = (float)i / (float)NB_BG_FACES;
414 
415  x = BG_DIST * cos(alpha);
416  y = BG_DIST * sin(alpha);
417 
418  vtx[0] = x;
419  vtx[1] = y;
420  vtx[2] = z1;
421  bg_vtx->add(vtx);
422  tex[0] = texLen*4.0;
423  tex[1] = 0.5;
424  bg_tex->add(tex);
425 
426  vtx[0] = x;
427  vtx[1] = y;
428  vtx[2] = z2;
429  bg_vtx->add(vtx);
430  tex[0] = texLen*4.0;
431  tex[1] = 1.0;
432  bg_tex->add(tex);
433  }
434  bg = new ssgVtxTable(GL_TRIANGLE_STRIP, bg_vtx, bg_nrm, bg_tex, bg_clr);
435  bg_st = (ssgSimpleState*)grSsgLoadTexState(graphic->background);
436  bg_st->disable(GL_LIGHTING);
437  bg->setState(bg_st);
438  bg->setCullFace(0);
439  TheBackground->addKid(bg);
440 
441  bg_vtx = new ssgVertexArray(NB_BG_FACES + 1);
442  bg_tex = new ssgTexCoordArray(NB_BG_FACES + 1);
443  bg_clr = new ssgColourArray(1);
444  bg_nrm = new ssgNormalArray(1);
445 
446  bg_clr->add(clr);
447  bg_nrm->add(nrm);
448 
449  for (i = NB_BG_FACES / 2; i < 3 * NB_BG_FACES / 4 + 1; i++) {
450  alpha = (float)i * 2 * PI / (float)NB_BG_FACES;
451  texLen = (float)i / (float)NB_BG_FACES;
452 
453  x = BG_DIST * cos(alpha);
454  y = BG_DIST * sin(alpha);
455 
456  vtx[0] = x;
457  vtx[1] = y;
458  vtx[2] = z1;
459  bg_vtx->add(vtx);
460  tex[0] = texLen*4.0;
461  tex[1] = 0.0;
462  bg_tex->add(tex);
463 
464  vtx[0] = x;
465  vtx[1] = y;
466  vtx[2] = z2;
467  bg_vtx->add(vtx);
468  tex[0] = texLen*4.0;
469  tex[1] = 0.5;
470  bg_tex->add(tex);
471  }
472  bg = new ssgVtxTable(GL_TRIANGLE_STRIP, bg_vtx, bg_nrm, bg_tex, bg_clr);
473  bg_st = (ssgSimpleState*)grSsgLoadTexState(graphic->background);
474  bg_st->disable(GL_LIGHTING);
475  bg->setState(bg_st);
476  bg->setCullFace(0);
477  TheBackground->addKid(bg);
478 
479  bg_vtx = new ssgVertexArray(NB_BG_FACES + 1);
480  bg_tex = new ssgTexCoordArray(NB_BG_FACES + 1);
481  bg_clr = new ssgColourArray(1);
482  bg_nrm = new ssgNormalArray(1);
483 
484  bg_clr->add(clr);
485  bg_nrm->add(nrm);
486 
487  for (i = 3 * NB_BG_FACES / 4; i < NB_BG_FACES + 1; i++) {
488  alpha = (float)i * 2 * PI / (float)NB_BG_FACES;
489  texLen = (float)i / (float)NB_BG_FACES;
490 
491  x = BG_DIST * cos(alpha);
492  y = BG_DIST * sin(alpha);
493 
494  vtx[0] = x;
495  vtx[1] = y;
496  vtx[2] = z1;
497  bg_vtx->add(vtx);
498  tex[0] = texLen*4.0;
499  tex[1] = 0.5;
500  bg_tex->add(tex);
501 
502  vtx[0] = x;
503  vtx[1] = y;
504  vtx[2] = z2;
505  bg_vtx->add(vtx);
506  tex[0] = texLen*4.0;
507  tex[1] = 1.0;
508  bg_tex->add(tex);
509  }
510  bg = new ssgVtxTable(GL_TRIANGLE_STRIP, bg_vtx, bg_nrm, bg_tex, bg_clr);
511  bg_st = (ssgSimpleState*)grSsgLoadTexState(graphic->background);
512  bg_st->disable(GL_LIGHTING);
513  bg->setState(bg_st);
514  bg->setCullFace(0);
515  TheBackground->addKid(bg);
516 
517  break;
518 
519 
520  case 4:
521  z1 = -1.0;
522  z2 = 1.0;
523 
524  bg_vtx = new ssgVertexArray(NB_BG_FACES + 1);
525  bg_tex = new ssgTexCoordArray(NB_BG_FACES + 1);
526  bg_clr = new ssgColourArray(1);
527  bg_nrm = new ssgNormalArray(1);
528 
529  bg_clr->add(clr);
530  bg_nrm->add(nrm);
531 
532  for (i = 0; i < NB_BG_FACES + 1; i++) {
533  alpha = (double)i * 2 * PI / (double)NB_BG_FACES;
534  texLen = 1.0 - (float)i / (float)NB_BG_FACES;
535 
536  x = BG_DIST * cos(alpha);
537  y = BG_DIST * sin(alpha);
538 
539  vtx[0] = x;
540  vtx[1] = y;
541  vtx[2] = z1;
542  bg_vtx->add(vtx);
543  tex[0] = texLen;
544  tex[1] = 0;
545  bg_tex->add(tex);
546 
547  vtx[0] = x;
548  vtx[1] = y;
549  vtx[2] = z2;
550  bg_vtx->add(vtx);
551  tex[0] = texLen;
552  tex[1] = 1.0;
553  bg_tex->add(tex);
554  }
555  bg = new ssgVtxTable(GL_TRIANGLE_STRIP, bg_vtx, bg_nrm, bg_tex, bg_clr);
556  bg_st = (ssgSimpleState*)grSsgLoadTexState(graphic->background);
557  bg_st->disable(GL_LIGHTING);
558  bg->setState(bg_st);
559  bg->setCullFace(0);
560  TheBackground->addKid(bg);
561  break;
562 
563  default:
564  break;
565  }
566 
567  /* Environment Mapping Settings */
568  grEnvSelector = new ssgStateSelector(graphic->envnb);
569  for (i = 0; i < graphic->envnb; i++) {
570  GfOut("Loading Environment Mapping Image %s\n", graphic->env[i]);
571  envst = (ssgSimpleState*)grSsgLoadTexState(graphic->env[i]);
572  envst->enable(GL_BLEND);
573  grEnvSelector->setStep(i, envst);
574  }
575  grEnvSelector->selectStep(0); /* mandatory !!! */
579 
580  if (grEnvState != NULL) {
581  grEnvState->ref();
582  }
583 
584  if (grEnvShadowState == NULL) {
585  ulSetError ( UL_WARNING, "grscene:initBackground Failed to open envshadow.png for reading") ;
586  ulSetError ( UL_WARNING, " mandatory for top env mapping ") ;
587  ulSetError ( UL_WARNING, " should be in the .xml !! ") ;
588  ulSetError ( UL_WARNING, " copy the envshadow.png from g-track-2 to the track you selected ") ;
589  ulSetError ( UL_WARNING, " c'est pas classe comme sortie, mais ca evite un crash ") ;
590  GfScrShutdown();
591  exit(-1);
592  } else {
593  grEnvShadowState->ref();
594  }
595 
596  if (grEnvShadowStateOnCars == NULL) {
597  ulSetError ( UL_WARNING, "grscene:initBackground Failed to open shadow2.rgb for reading") ;
598  ulSetError ( UL_WARNING, " no shadow mapping on cars for this track ") ;
599  } else {
600  grEnvShadowStateOnCars->ref();
601  }
602 }
603 
604 
605 void grDrawBackground(class cGrCamera *cam, class cGrBackgroundCam *bgCam)
606 {
607  TRACE_GL("grDrawBackground: ssgCullAndDraw start");
608 
609  bgCam->update(cam);
610  bgCam->action();
611 
612  ssgCullAndDraw(TheBackground);
613 
614  TRACE_GL("grDrawBackground: ssgCullAndDraw");
615 }
616 
617 void
619 {
620  tTrackPitInfo *pits;
621  int i;
622  tdble x, y;
623  tdble x2, y2, z2;
624 
625  ThePits = new ssgBranch();
626  PitsAnchor->addKid(ThePits);
627 
628  pits = &(grTrack->pits);
629  /* draw the pit identification */
630 
631  switch (pits->type) {
633  for (i = 0; i < pits->nMaxPits; i++) {
634  const int BUFSIZE=256;
635  char buf[BUFSIZE];
636  t3Dd normalvector;
637  sgVec3 vtx;
638  sgVec4 clr = {0,0,0,1};
639  sgVec3 nrm;
640  sgVec2 tex;
641  ssgState *st;
642  ssgVertexArray *pit_vtx = new ssgVertexArray(4);
643  ssgTexCoordArray *pit_tex = new ssgTexCoordArray(4);
644  ssgColourArray *pit_clr = new ssgColourArray(1);
645  ssgNormalArray *pit_nrm = new ssgNormalArray(1);
646 
647  pit_clr->add(clr);
648 
649  if (pits->driversPits[i].car[0]) {
650  // If we have more than one car in the pit use the team pit logo of driver 0.
651  if (pits->driversPits[i].freeCarIndex == 1) {
652  // One car assigned to the pit.
653  snprintf(buf, BUFSIZE, "drivers/%s/%d;drivers/%s;data/textures;data/img;.",
654  pits->driversPits[i].car[0]->_modName, pits->driversPits[i].car[0]->_driverIndex,
655  pits->driversPits[i].car[0]->_modName);
656  } else {
657  // Multiple cars assigned to the pit.
658  snprintf(buf, BUFSIZE, "drivers/%s;data/textures;data/img;.", pits->driversPits[i].car[0]->_modName);
659  }
660  } else {
661  snprintf(buf, BUFSIZE, "data/textures;data/img;.");
662  }
663 
664 
665  st = grSsgLoadTexStateEx("logo.rgb", buf, FALSE, FALSE);
666  ((ssgSimpleState*)st)->setShininess(50);
667 
668  RtTrackLocal2Global(&(pits->driversPits[i].pos), &x, &y, pits->driversPits[i].pos.type);
669  RtTrackSideNormalG(pits->driversPits[i].pos.seg, x, y, pits->side, &normalvector);
670  x2 = x - pits->width/2.0 * normalvector.x + pits->len/2.0 * normalvector.y;
671  y2 = y - pits->width/2.0 * normalvector.y - pits->len/2.0 * normalvector.x;
672  z2 = RtTrackHeightG(pits->driversPits[i].pos.seg, x2, y2);
673 
674  nrm[0] = normalvector.x;
675  nrm[1] = normalvector.y;
676  nrm[2] = 0;
677  pit_nrm->add(nrm);
678 
679  tex[0] = -0.7;
680  tex[1] = 0.33;
681  vtx[0] = x2;
682  vtx[1] = y2;
683  vtx[2] = z2;
684  pit_tex->add(tex);
685  pit_vtx->add(vtx);
686 
687  tex[0] = -0.7;
688  tex[1] = 1.1;
689  vtx[0] = x2;
690  vtx[1] = y2;
691  vtx[2] = z2 + 4.8;
692  pit_tex->add(tex);
693  pit_vtx->add(vtx);
694 
695  x2 = x - pits->width/2.0 * normalvector.x - pits->len/2.0 * normalvector.y;
696  y2 = y - pits->width/2.0 * normalvector.y + pits->len/2.0 * normalvector.x;
697  z2 = RtTrackHeightG(pits->driversPits[i].pos.seg, x2, y2);
698 
699  tex[0] = 1.3;
700  tex[1] = 0.33;
701  vtx[0] = x2;
702  vtx[1] = y2;
703  vtx[2] = z2;
704  pit_tex->add(tex);
705  pit_vtx->add(vtx);
706 
707  tex[0] = 1.3;
708  tex[1] = 1.1;
709  vtx[0] = x2;
710  vtx[1] = y2;
711  vtx[2] = z2 + 4.8;
712  pit_tex->add(tex);
713  pit_vtx->add(vtx);
714 
715  ssgVtxTable *pit = new ssgVtxTable(GL_TRIANGLE_STRIP, pit_vtx, pit_nrm, pit_tex, pit_clr);
716  pit->setState(st);
717  pit->setCullFace(0);
718  ThePits->addKid(pit);
719  }
720  break;
722  break;
723  case TR_PIT_NONE:
724  break;
725  }
726 }
int nMaxPits
number max of pits
Definition: track.h:462
tTrack * grTrack
Definition: grscene.cpp:57
#define TRK_ATT_DIFFUSE_R
Definition: track.h:70
void grShutdownScene(void)
Definition: grscene.cpp:252
#define TRK_ATT_DIFFUSE_B
Definition: track.h:72
bool grLoadPngTexture(const char *fname, ssgTextureInfo *info)
Definition: grutil.cpp:91
tTrackOwnPit * driversPits
List of pits by driver.
Definition: track.h:475
static ssgLoaderOptionsEx options
Definition: grscene.cpp:165
void grDrawBackground(class cGrCamera *cam, class cGrBackgroundCam *bgCam)
Definition: grscene.cpp:605
ssgRoot * TheScene
Definition: grscene.cpp:66
grMultiTexState * grEnvShadowState
Definition: grscene.cpp:61
int freeCarIndex
Definition: track.h:448
tdble RtTrackHeightG(tTrackSeg *seg, tdble X, tdble Y)
Returns the absolute height in meters of the road at the Global position (segment, X, Y)
Definition: rttrack.cpp:443
#define TRACE_GL(msg)
Definition: grutil.h:28
ssgBranch * SunAnchor
Definition: grscene.cpp:70
ssgState * grSsgEnvTexState(const char *img)
Definition: grutil.cpp:251
#define TRK_ATT_DIFFUSE_G
Definition: track.h:71
int side
Pits side:
Definition: track.h:464
void RtTrackLocal2Global(tTrkLocPos *p, tdble *X, tdble *Y, int flag)
Calculate global coordinates from a local position relative to the given track segment (segment...
Definition: rttrack.cpp:80
#define TR_PIT_ON_TRACK_SIDE
The pits are on the track side.
Definition: track.h:460
void grDrawScene(void)
Definition: grscene.cpp:244
Robots Tools.
Track structure.
Definition: track.h:502
#define TRK_ATT_SPEC_R
Definition: track.h:64
char * grFilePath
Definition: grutil.cpp:42
#define TRK_ATT_AMBIENT_G
Definition: track.h:68
ssgBranch * ThePits
Definition: grscene.cpp:79
const double PI
PI.
Definition: tgf.h:69
#define TR_PIT_ON_SEPARATE_PATH
Definition: track.h:461
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
ssgBranch * CarlightAnchor
Definition: grscene.cpp:77
The Gaming Framework API (client part).
bool InitMultiTex(void)
Definition: grmain.cpp:84
int grInitScene(void)
Definition: grscene.cpp:93
int type
Type of description:
Definition: track.h:421
char * internalname
Internal name of the track.
Definition: track.h:508
#define TRK_ATT_SPEC_B
Definition: track.h:66
tTrkLocPos pos
Center of the pit position.
Definition: track.h:442
void grCustomizePits(void)
Definition: grscene.cpp:618
tTrackGraphicInfo graphic
Definition: track.h:520
struct CarElt * car[TR_PIT_MAXCARPERPIT]
Car links for pit.
Definition: track.h:449
#define TRK_ATT_LIPOS_Y
Definition: track.h:75
void RtTrackSideNormalG(tTrackSeg *seg, tdble X, tdble Y, int side, t3Dd *norm)
Give the normal vector of the border of the track including the sides.
Definition: rttrack.cpp:470
grMultiTexState * grEnvState
Definition: grscene.cpp:60
float bgColor[3]
Definition: track.h:493
ssgBranch * SmokeAnchor
Definition: grscene.cpp:75
void update(tCarElt *car, tSituation *s)
Definition: grcam.h:226
static ssgRoot * TheBackground
Definition: grscene.cpp:67
float tdble
Floating point type used in TORCS.
Definition: tgf.h:48
Definition: Endpoint.h:36
#define GfOut
Definition: tgf.h:373
int grWrldY
Definition: grscene.cpp:54
ssgBranch * CarsAnchor
Definition: grscene.cpp:72
#define BG_DIST
Definition: grscene.cpp:64
ssgBranch * LandAnchor
Definition: grscene.cpp:71
int grWrldX
Definition: grscene.cpp:53
#define TRK_ATT_SPEC_G
Definition: track.h:65
Graphic Module Interface Definition.
#define TRK_ATT_AMBIENT_R
Definition: track.h:67
#define TRK_ATT_3DDESC
Definition: track.h:55
tdble y
y coordinate
Definition: tgf.h:117
int grWrldMaxSize
Definition: grscene.cpp:56
This is the car structure.
#define TR_PIT_NONE
No pits for that tracks.
Definition: track.h:459
void grRegisterCustomSGILoader(void)
Definition: grtexture.cpp:108
void * grTrackHandle
Definition: grmain.cpp:60
#define NB_BG_FACES
Definition: grscene.cpp:63
ssgBranch * ShadowAnchor
Definition: grscene.cpp:73
tTrackSeg * seg
Track segment.
Definition: track.h:420
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
tdble width
Width of each pit stop.
Definition: track.h:469
void action(void)
Definition: grcam.h:79
int track(tModInfo *modInfo)
Definition: trackitf.cpp:85
static Vector y[4]
Definition: Convex.cpp:56
static void initBackground(void)
Definition: grscene.cpp:286
const char * background
Definition: track.h:490
Pits Info Structure.
Definition: track.h:453
int grLoadScene(tTrack *track)
Definition: grscene.cpp:168
#define TRK_ATT_LIPOS_Z
Definition: track.h:76
tdble len
Lenght of each pit stop.
Definition: track.h:468
ssgEntity * grssgLoadAC3D(const char *fname, const ssgLoaderOptions *options)
Definition: grloadac.cpp:1149
ssgStateSelector * grEnvSelector
Definition: grscene.cpp:59
ssgState * grSsgLoadTexState(const char *img)
Definition: grutil.cpp:219
grMultiTexState * grEnvShadowStateOnCars
Definition: grscene.cpp:62
ssgState * grSsgLoadTexStateEx(const char *img, char *filepath, int wrap, int mipmap)
Definition: grutil.cpp:284
float grGammaValue
Definition: grutil.cpp:39
#define TRK_ATT_LIPOS_X
Definition: track.h:74
const char ** env
Definition: track.h:495
int maxTextureUnits
Definition: grmain.cpp:48
#define TRK_ATT_SHIN
Definition: track.h:73
int preScene(ssgEntity *e)
Definition: grscene.cpp:86
#define TRK_SECT_GRAPH
Definition: track.h:53
3D point.
Definition: tgf.h:115
#define TRK_ATT_AMBIENT_B
Definition: track.h:69
ssgBranch * SkidAnchor
Definition: grscene.cpp:76
void GfScrShutdown(void)
Shutdown the screen.
Definition: screen.cpp:442
ssgBranch * PitsAnchor
Definition: grscene.cpp:74
const char * category
Category of the track.
Definition: track.h:509
Track Structure and Track Loader Module Definition.
This file contains the divergences from PLIB.
tTrackPitInfo pits
Pits information.
Definition: track.h:514
tdble x
x coordinate
Definition: tgf.h:116
int grMipMap
Definition: grutil.cpp:40
int grWrldZ
Definition: grscene.cpp:55
ssgTransform * sun_grscene
Definition: grscene.cpp:80
int type
Type of Pit:
Definition: track.h:455