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