TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
grcam.cpp
Go to the documentation of this file.
1/***************************************************************************
2
3 file : grcam.cpp
4 created : Mon Aug 21 20:55:32 CEST 2000
5 copyright : (C) 2000-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 <stdio.h>
20#include <stdlib.h>
21#include <math.h>
22#include <memory.h>
23#ifdef WIN32
24#include <windows.h>
25#endif
26#include <GL/gl.h>
27#include <GL/glu.h>
28#include <plib/ssg.h>
29
30#include <robottools.h>
31#include <portability.h>
32#include <graphic.h>
33#include "grcam.h"
34#include "grscreen.h"
35#include "grscene.h"
36#include "grshadow.h"
37#include "grskidmarks.h"
38#include "grsmoke.h"
39#include "grcar.h"
40#include "grmain.h"
41#include "grutil.h"
42#include <tgfclient.h>
43
44float
46{
47 float dx = (renderCoordinatesLocal ? (float)(car->_pos_X_D - grRenderOrigin[0]) : car->_pos_X) - eye[0];
48 float dy = (renderCoordinatesLocal ? (float)(car->_pos_Y_D - grRenderOrigin[1]) : car->_pos_Y) - eye[1];
49
50 return dx * dx + dy * dy;
51}
52
53
54void
60
61
62void
73
74
75static void
76grGetPreciseCarPosition(const tCarElt* car, double* x, double* y)
77{
78 *x = car->_pos_X_D + (double)car->_pos_X - car->_posMat[3][0];
79 *y = car->_pos_Y_D + (double)car->_pos_Y - car->_posMat[3][1];
80}
81
82
83static void
84grTransformCarPointToRender(const tCarElt* car, tdble x, tdble y, tdble z, sgVec3 point)
85{
86 const float baseX = (float)(car->_pos_X_D - grRenderOrigin[0]);
87 const float baseY = (float)(car->_pos_Y_D - grRenderOrigin[1]);
88 point[0] = baseX + x * car->_posMat[0][0] + y * car->_posMat[1][0] + z * car->_posMat[2][0];
89 point[1] = baseY + x * car->_posMat[0][1] + y * car->_posMat[1][1] + z * car->_posMat[2][1];
90 point[2] = car->_posMat[3][2] + x * car->_posMat[0][2] + y * car->_posMat[1][2] + z * car->_posMat[2][2];
91}
92
93
94static tdble
95grTrackHeightD(tTrackSeg* segment, double x, double y)
96{
99 return RtTrackHeightL(&position);
100}
101
102
103static void
104grMakeLookAtMat4(sgMat4 dst, const sgVec3 eye, const sgVec3 center, const sgVec3 up)
105{
106 // Caveats:
107 // 1) In order to compute the line of sight, the eye point must not be equal
108 // to the center point.
109 // 2) The up vector must not be parallel to the line of sight from the eye
110 // to the center point.
111
112 /* Compute the direction vectors */
113 sgVec3 x, y, z;
114
115 /* Y vector = center - eye */
116 sgSubVec3(y, center, eye);
117
118 /* Z vector = up */
119 sgCopyVec3(z, up);
120
121 /* X vector = Y cross Z */
122 sgVectorProductVec3(x, y, z);
123
124 /* Recompute Z = X cross Y */
125 sgVectorProductVec3(z, x, y);
126
127 /* Normalize everything */
128 sgNormaliseVec3(x);
129 sgNormaliseVec3(y);
130 sgNormaliseVec3(z);
131
132 /* Build the matrix */
133#define M(row,col) dst[row][col]
134 M(0, 0) = x[0]; M(0, 1) = x[1]; M(0, 2) = x[2]; M(0, 3) = 0.0;
135 M(1, 0) = y[0]; M(1, 1) = y[1]; M(1, 2) = y[2]; M(1, 3) = 0.0;
136 M(2, 0) = z[0]; M(2, 1) = z[1]; M(2, 2) = z[2]; M(2, 3) = 0.0;
137 M(3, 0) = eye[0]; M(3, 1) = eye[1]; M(3, 2) = eye[2]; M(3, 3) = 1.0;
138#undef M
139}
140
141
142cGrPerspCamera::cGrPerspCamera(class cGrScreen* myscreen, int id, int drawCurr, int drawDrv, int drawBG, int mirrorAllowed,
143 float myfovy, float myfovymin, float myfovymax,
144 float myfnear, float myffar, float myfogstart, float myfogend)
145 : cGrCamera(myscreen, id, drawCurr, drawDrv, drawBG, mirrorAllowed)
146{
147 fovy = myfovy;
148 fovymin = myfovymin;
149 fovymax = myfovymax;
150 fnear = myfnear;
151 ffar = myffar;
152 fovydflt = myfovy;
153 fogstart = myfogstart;
154 fogend = myfogend;
155
156}
157
159{
160 // PLib takes the field of view as angles in degrees. However, the
161 // aspect ratio really aplies to lengths in the projection
162 // plane. So we have to transform the fovy angle to a length in
163 // the projection plane, apply the aspect ratio and transform the
164 // result back to an angle. Care needs to be taken to because the
165 // tan and atan functions operate on angles in radians. Also,
166 // we're only interested in half the viewing angle.
167 float fovx = atan(screen->getViewRatio() * tan(fovy * M_PI / 360.0)) * 360.0 / M_PI;
168 grContext.setFOV(fovx, fovy);
169 grContext.setNearFar(fnear, ffar);
170}
171
173{
174 sgMat4 mat;
175 sgVec3 renderEye, renderCenter;
176 sgCopyVec3(renderEye, eye);
177 sgCopyVec3(renderCenter, center);
179 sgSubVec3(renderEye, renderEye, grRenderOrigin);
180 sgSubVec3(renderCenter, renderCenter, grRenderOrigin);
181 }
182 grMakeLookAtMat4(mat, renderEye, renderCenter, up);
183
184 grContext.setCamera(mat);
185}
186
188{
189 const int BUFSIZE = 1024;
190 char path[BUFSIZE];
191
192 snprintf(path, BUFSIZE, "%s/%d", GR_SCT_DISPMODE, screen->getId());
193 fovy = (float)GfParmGetNum(grHandle, path, attr, (char*)NULL, fovydflt);
194 limitFov();
195}
196
197
198/* Give the height in pixels of 1 m high object on the screen at this point */
199float cGrPerspCamera::getLODFactor(float x, float y, float z) {
201 x -= grRenderOrigin[0];
202 y -= grRenderOrigin[1];
203 }
204 tdble dx, dy, dz, dd;
205 float ang;
206 int scrh, dummy;
207 float res;
208
209 dx = x - eye[0];
210 dy = y - eye[1];
211 dz = z - eye[2];
212
213 dd = sqrt(dx * dx + dy * dy + dz * dz);
214
215 ang = DEG2RAD(fovy / 2.0);
216 GfScrGetSize(&dummy, &scrh, &dummy, &dummy);
217
218 res = (float)scrh / 2.0 / dd / tan(ang);
219 if (res < 0) {
220 res = 0;
221 }
222 return res;
223}
224
226{
227 const int BUFSIZE = 256;
228 char buf[BUFSIZE];
229 const int PATHSIZE = 1024;
230 char path[PATHSIZE];
231
232
233 switch (cmd) {
234 case GR_ZOOM_IN:
235 if (fovy > 2) {
236 fovy--;
237 }
238 else {
239 fovy /= 2.0;
240 }
241 if (fovy < fovymin) {
242 fovy = fovymin;
243 }
244 break;
245
246 case GR_ZOOM_OUT:
247 fovy++;
248 if (fovy > fovymax) {
249 fovy = fovymax;
250 }
251 break;
252
253 case GR_ZOOM_MAX:
254 fovy = fovymax;
255 break;
256
257 case GR_ZOOM_MIN:
258 fovy = fovymin;
259 break;
260
261 case GR_ZOOM_DFLT:
262 fovy = fovydflt;
263 break;
264 }
265
266 limitFov();
267
268 snprintf(buf, BUFSIZE, "%s-%d-%d", GR_ATT_FOVY, screen->getCurCamHead(), getId());
269 snprintf(path, PATHSIZE, "%s/%d", GR_SCT_DISPMODE, screen->getId());
270 GfParmSetNum(grHandle, path, buf, (char*)NULL, (tdble)fovy);
271 GfParmWriteFile(NULL, grHandle, "Graph");
272}
273
275{
276 glMatrixMode(GL_PROJECTION);
277 glLoadIdentity();
278 gluOrtho2D(left, right, bottom, top);
279}
280
282{
283 glMatrixMode(GL_MODELVIEW);
284 glLoadIdentity();
285}
286
288{
289 static float BACKGROUND_FOVY_CUTOFF = 60.0f;
290 memcpy(&eye, curCam->getPosv(), sizeof(eye));
291 memcpy(&center, curCam->getCenterv(), sizeof(center));
292 sgSubVec3(center, center, eye);
293 sgSetVec3(eye, 0, 0, 0);
294 speed[0] = 0.0;
295 speed[1] = 0.0;
296 speed[2] = 0.0;
297 fovy = curCam->getFovY();
298 if (fovy < BACKGROUND_FOVY_CUTOFF) {
299 fovy = BACKGROUND_FOVY_CUTOFF;
300 }
301 memcpy(&up, curCam->getUpv(), sizeof(up));
302}
303
304
305
307{
308public:
309 cGrCarCamInside(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
310 float myfovy, float myfovymin, float myfovymax,
311 float myfnear, float myffar = 1500.0,
312 float myfogstart = 800.0, float myfogend = 1500.0)
313 : cGrPerspCamera(myscreen, id, drawCurr, 0, drawBG, 1,
314 myfovy, myfovymin, myfovymax,
315 myfnear, myffar, myfogstart, myfogend) {
316 up[0] = 0;
317 up[1] = 0;
318 up[2] = 1;
319 }
320
321 void update(tCarElt* car, tSituation* s) {
323 grTransformCarPointToRender(car, car->_drvPos_x, car->_drvPos_y, car->_drvPos_z, eye);
324 grTransformCarPointToRender(car, car->_drvPos_x + 30.0f, car->_drvPos_y, car->_drvPos_z, center);
325
326 speed[0] = car->pub.DynGCg.vel.x;
327 speed[1] = car->pub.DynGCg.vel.y;
328 speed[2] = car->pub.DynGCg.vel.z;
329 }
330};
331
332
333/* MIRROR */
335{
336 glDeleteTextures(1, &tex);
337 delete viewCam;
338}
339
340
342 fovy = 90.0 / screen->getViewRatio();
343}
344
345
347{
349 grTransformCarPointToRender(car, car->_bonnetPos_x, car->_bonnetPos_y, car->_bonnetPos_z, eye);
350 grTransformCarPointToRender(car, car->_bonnetPos_x - 30.0f, car->_bonnetPos_y, car->_bonnetPos_z, center);
351
352 up[0] = car->_posMat[2][0];
353 up[1] = car->_posMat[2][1];
354 up[2] = car->_posMat[2][2];
355}
356
357
358void cGrCarCamMirror::setViewport(int x, int y, int w, int h)
359{
360 vpx = x;
361 vpy = y;
362 vpw = w;
363 vph = h;
364
365 if (viewCam) {
366 delete viewCam;
367 }
368 viewCam = new cGrOrthoCamera(screen, x, x + w, y, y + h);
369 limitFov();
370}
371
372
373void cGrCarCamMirror::setPos(int x, int y, int w, int h)
374{
375 mx = x;
376 my = y;
377 mw = w;
378 mh = h;
379
380 // round up texture size to next power of two
381 tw = GfNearestPow2(w);
382 th = GfNearestPow2(h);
383 if (tw < w) {
384 tw *= 2;
385 }
386 if (th < h) {
387 th *= 2;
388 }
389
390 // Create texture object.
391 glBindTexture(GL_TEXTURE_2D, tex);
392 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
393 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
394 glReadBuffer(GL_BACK);
395
396 glCopyTexImage2D(GL_TEXTURE_2D,
397 0, // map level,
398 GL_RGB, // internal format,
399 0, 0, tw, th,
400 0); // border
401
402 tsu = (float)mw / tw;
403 teu = 0.0;
404 tsv = 0.0;
405 tev = (float)mh / th;
406}
407
408
410{
411 glViewport(vpx, vpy, vpw, vph);
412
413 // Enable scissor test to conserve graphics memory bandwidth.
414 glEnable(GL_SCISSOR_TEST);
415 glScissor(vpx + (vpw - mw) / 2, vpy + (vph - mh) / 2, mw, mh);
416}
417
419{
420 glDisable(GL_SCISSOR_TEST);
421
422 glBindTexture(GL_TEXTURE_2D, tex);
423 glReadBuffer(GL_BACK);
424
425 // NVidia recommends to NOT use glCopyTexImage2D for performance reasons.
426 glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0,
427 vpx + (vpw - mw) / 2,
428 vpy + (vph - mh) / 2, mw, mh);
429}
430
431
433{
434 viewCam->action();
435
436 glBindTexture(GL_TEXTURE_2D, tex);
437 glBegin(GL_TRIANGLE_STRIP);
438 {
439 glColor4f(1.0, 1.0, 1.0, 1.0);
440 glTexCoord2f(tsu, tsv); glVertex2f(mx, my);
441 glTexCoord2f(tsu, tev); glVertex2f(mx, my + mh);
442 glTexCoord2f(teu, tsv); glVertex2f(mx + mw, my);
443 glTexCoord2f(teu, tev); glVertex2f(mx + mw, my + mh);
444 }
445 glEnd();
446}
447
448
449
450
452{
453public:
454 cGrCarCamInsideFixedCar(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
455 float myfovy, float myfovymin, float myfovymax,
456 float myfnear, float myffar = 1500.0,
457 float myfogstart = 1400.0, float myfogend = 1500.0)
458 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 1,
459 myfovy, myfovymin, myfovymax,
460 myfnear, myffar, myfogstart, myfogend) {
462 }
463
464 void update(tCarElt* car, tSituation* s) {
466 grTransformCarPointToRender(car, car->_bonnetPos_x, car->_bonnetPos_y, car->_bonnetPos_z, eye);
467 center[0] = eye[0] + 30.0f * car->_posMat[0][0];
468 center[1] = eye[1] + 30.0f * car->_posMat[0][1];
469 center[2] = eye[2] + 30.0f * car->_posMat[0][2];
470
471 up[0] = car->_posMat[2][0];
472 up[1] = car->_posMat[2][1];
473 up[2] = car->_posMat[2][2];
474
475 speed[0] = car->pub.DynGCg.vel.x;
476 speed[1] = car->pub.DynGCg.vel.y;
477 speed[2] = car->pub.DynGCg.vel.z;
478 }
479};
480
481
482/*
483 * Dynamic chase camera placed behind the current car.
484 * The yaw and camera position are integrated with simulation dt so the camera
485 * keeps the same feel at different rendering frame rates.
486 */
488{
489 tdble smoothedYaw; /* Camera yaw after time-based filtering. */
490 double lastUpdateTime; /* Last simulation time used for dt. */
491 int currentCarIndex; /* Car index for which camera state is valid. */
492
493protected:
494 float cameraDistance; /* Distance behind the car in meters. */
495 float cameraHeight; /* Height above the car reference point. */
496
497public:
498 cGrCarCamBehind(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
499 float fovy, float fovymin, float fovymax,
500 float mydist, float myHeight, float fnear, float ffar = 1500.0,
501 float myfogstart = 1400.0, float myfogend = 1500.0)
502 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
503 fovymax, fnear, ffar, myfogstart, myfogend) {
504 cameraDistance = mydist;
505 cameraHeight = myHeight;
506 smoothedYaw = 0.0;
507 lastUpdateTime = 0.0;
508 currentCarIndex = -1;
509 up[0] = 0;
510 up[1] = 0;
511 up[2] = 1;
512 }
513
514 void update(tCarElt* car, tSituation* s) {
515 const tdble yawResponseTime = 0.4f; /* Seconds; larger values allow more yaw lag. */
516 const tdble centerHeightResponseTime = 0.10f; /* Seconds; smooths pitch bobbing. */
517 const tdble positionSpring = 45.0f; /* Spring gain pulling the camera eye to target. */
518 const tdble velocityDamping = 10.0f; /* Damping toward the car velocity. */
519 const tdble maxFrameTime = 0.1f; /* Cap dt after stalls to avoid integration jumps. */
520 const tdble groundClearance = 0.5f; /* Minimum camera clearance above sampled ground. */
521 const tdble lookAhead = 9.0f; /* Look target distance ahead of the car. */
522 const tdble lookHeight = 1.3f; /* Look target height above car Z; lowers car in frame. */
523 const tdble downhillLookFactor = 0.85f; /* Amount of downhill road drop applied to look target. */
524 const tdble downhillEyeLiftFactor = 0.35f; /* Amount of downhill road drop added to camera height. */
525 const tdble downhillSampleAhead = 45.0f; /* Road sample distance used to detect drops after crests. */
526 const tdble maxDownhillLookDrop = 8.0f; /* Limit pitch-down on abrupt terrain drops. */
527 const tdble maxDownhillEyeLift = 2.5f; /* Limit eye lift on steep downhills. */
528 tdble carYaw;
529 tdble trackYaw;
530 tdble cosYaw;
531 tdble sinYaw;
532 tdble dt;
533 tdble yawFactor;
534 tdble centerHeightFactor;
535 tdble groundHeight;
536 tdble minHeight;
537 tdble carGroundHeight;
538 tdble lookGroundDelta;
539 tdble downhillDrop;
540 tdble downhillEyeLift;
541 double carX;
542 double carY;
543 double targetEyeX;
544 double targetEyeY;
545 double downhillSampleX;
546 double downhillSampleY;
547 sgVec3 targetCenter;
548 sgVec3 targetEye;
549 sgVec3 targetSpeed;
550 bool resetCamera = false;
551
553 grGetPreciseCarPosition(car, &carX, &carY);
554 carYaw = car->_yaw;
555 dt = 0.0f;
556 if (currentCarIndex != car->index) {
557 currentCarIndex = car->index;
558 resetCamera = true;
559 }
560 else {
561 dt = (tdble)(s->currentTime - lastUpdateTime);
562 if ((dt < 0.0f) || (fabs(dt) > 1.0f)) {
563 resetCamera = true;
564 dt = 0.0f;
565 }
566 else if (dt > maxFrameTime) {
567 dt = maxFrameTime;
568 }
569 }
571
572 if (resetCamera) {
573 smoothedYaw = carYaw;
574 }
575 else {
576 if (fabs(smoothedYaw - carYaw) > fabs(smoothedYaw - carYaw + 2 * PI)) {
577 smoothedYaw += 2 * PI;
578 }
579 else if (fabs(smoothedYaw - carYaw) > fabs(smoothedYaw - carYaw - 2 * PI)) {
580 smoothedYaw -= 2 * PI;
581 }
582 yawFactor = (tdble)(1.0 - exp(-dt / yawResponseTime));
583 smoothedYaw = smoothedYaw + yawFactor * (carYaw - smoothedYaw);
584 carYaw = smoothedYaw;
585 }
586 cosYaw = cos(carYaw);
587 sinYaw = sin(carYaw);
588 targetEyeX = carX - cameraDistance * cosYaw;
589 targetEyeY = carY - cameraDistance * sinYaw;
590 targetEye[0] = (float)(targetEyeX - grRenderOrigin[0]);
591 targetEye[1] = (float)(targetEyeY - grRenderOrigin[1]);
592 targetEye[2] = car->_pos_Z + cameraHeight;
593 groundHeight = grTrackHeightD(car->_trkPos.seg, targetEyeX, targetEyeY) + groundClearance;
594 if (targetEye[2] < groundHeight) {
595 targetEye[2] = groundHeight;
596 }
597 targetSpeed[0] = car->pub.DynGCg.vel.x;
598 targetSpeed[1] = car->pub.DynGCg.vel.y;
599 targetSpeed[2] = car->pub.DynGCg.vel.z;
600
601 targetCenter[0] = (float)(carX + lookAhead * cosYaw - grRenderOrigin[0]);
602 targetCenter[1] = (float)(carY + lookAhead * sinYaw - grRenderOrigin[1]);
603 targetCenter[2] = car->_pos_Z + lookHeight;
604 trackYaw = RtTrackSideTgAngleL(&(car->_trkPos));
605 downhillSampleX = carX + downhillSampleAhead * cos(trackYaw);
606 downhillSampleY = carY + downhillSampleAhead * sin(trackYaw);
607 carGroundHeight = grTrackHeightD(car->_trkPos.seg, carX, carY);
608 lookGroundDelta = grTrackHeightD(car->_trkPos.seg, downhillSampleX, downhillSampleY) - carGroundHeight;
609 if (lookGroundDelta < -maxDownhillLookDrop) {
610 lookGroundDelta = -maxDownhillLookDrop;
611 }
612 if (lookGroundDelta < 0.0f) {
613 downhillDrop = -lookGroundDelta;
614 downhillEyeLift = downhillEyeLiftFactor * downhillDrop;
615 if (downhillEyeLift > maxDownhillEyeLift) {
616 downhillEyeLift = maxDownhillEyeLift;
617 }
618 targetCenter[2] -= downhillLookFactor * downhillDrop;
619 targetEye[2] += downhillEyeLift;
620 }
621
622 center[0] = targetCenter[0];
623 center[1] = targetCenter[1];
624 if (resetCamera) {
625 center[2] = targetCenter[2];
626 }
627 else {
628 centerHeightFactor = (tdble)(1.0 - exp(-dt / centerHeightResponseTime));
629 center[2] = center[2] + centerHeightFactor * (targetCenter[2] - center[2]);
630 }
631
632 if (resetCamera) {
633 eye[0] = targetEye[0];
634 eye[1] = targetEye[1];
635 eye[2] = targetEye[2];
636 speed[0] = targetSpeed[0];
637 speed[1] = targetSpeed[1];
638 speed[2] = targetSpeed[2];
639 }
640 else if (dt > 0.0f) {
641 speed[0] += (positionSpring * (targetEye[0] - eye[0]) + velocityDamping * (targetSpeed[0] - speed[0])) * dt;
642 speed[1] += (positionSpring * (targetEye[1] - eye[1]) + velocityDamping * (targetSpeed[1] - speed[1])) * dt;
643 speed[2] += (positionSpring * (targetEye[2] - eye[2]) + velocityDamping * (targetSpeed[2] - speed[2])) * dt;
644
645 eye[0] += speed[0] * dt;
646 eye[1] += speed[1] * dt;
647 eye[2] += speed[2] * dt;
648
649 minHeight = grTrackHeightD(car->_trkPos.seg,
650 (double)eye[0] + grRenderOrigin[0], (double)eye[1] + grRenderOrigin[1]) + groundClearance;
651 if (eye[2] < minHeight) {
652 eye[2] = minHeight;
653 if (speed[2] < 0.0f) {
654 speed[2] = 0.0f;
655 }
656 }
657 }
658
659 }
660
662 {
663 currentCarIndex = -1;
664 }
665};
666
667
669{
671
672protected:
673 float dist;
674
675public:
676 cGrCarCamBehind2(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
677 float fovy, float fovymin, float fovymax,
678 float mydist, float fnear, float ffar = 1500.0,
679 float myfogstart = 1400.0, float myfogend = 1500.0)
680 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
681 fovymax, fnear, ffar, myfogstart, myfogend) {
682 dist = mydist;
683 PreA = 0.0;
684 up[0] = 0;
685 up[1] = 0;
686 up[2] = 1;
687 }
688
689 void update(tCarElt* car, tSituation* s) {
690 tdble A;
691 tdble CosA;
692 tdble SinA;
693 double carX;
694 double carY;
695 double x;
696 double y;
697
699 grGetPreciseCarPosition(car, &carX, &carY);
700 A = RtTrackSideTgAngleL(&(car->_trkPos));
701 if (fabs(PreA - A) > fabs(PreA - A + 2 * PI)) {
702 PreA += 2 * PI;
703 }
704 else if (fabs(PreA - A) > fabs(PreA - A - 2 * PI)) {
705 PreA -= 2 * PI;
706 }
707 RELAXATION(A, PreA, 5.0);
708 CosA = cos(A);
709 SinA = sin(A);
710 x = carX - dist * CosA;
711 y = carY - dist * SinA;
712
713 eye[0] = (float)(x - grRenderOrigin[0]);
714 eye[1] = (float)(y - grRenderOrigin[1]);
715 eye[2] = grTrackHeightD(car->_trkPos.seg, x, y) + 5.0f;
716 center[0] = (float)(carX - grRenderOrigin[0]);
717 center[1] = (float)(carY - grRenderOrigin[1]);
718 center[2] = car->_pos_Z;
719
720
721 speed[0] = car->pub.DynGCg.vel.x;
722 speed[1] = car->pub.DynGCg.vel.y;
723 speed[2] = car->pub.DynGCg.vel.z;
724
725 }
726};
727
728
730{
731protected:
732 float dist;
733
734public:
735 cGrCarCamFront(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
736 float fovy, float fovymin, float fovymax,
737 float mydist, float fnear, float ffar = 1500.0,
738 float myfogstart = 1400.0, float myfogend = 1500.0)
739 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
740 fovymax, fnear, ffar, myfogstart, myfogend) {
741 dist = mydist;
742 up[0] = 0;
743 up[1] = 0;
744 up[2] = 1;
745 }
746
747 void update(tCarElt* car, tSituation* s) {
748 tdble CosA = cos(car->_yaw);
749 tdble SinA = sin(car->_yaw);
750 double carX;
751 double carY;
752
754 grGetPreciseCarPosition(car, &carX, &carY);
755 double x = carX + dist * CosA;
756 double y = carY + dist * SinA;
757
758 eye[0] = (float)(x - grRenderOrigin[0]);
759 eye[1] = (float)(y - grRenderOrigin[1]);
760 eye[2] = grTrackHeightD(car->_trkPos.seg, x, y) + 0.5f;
761 center[0] = (float)(carX - grRenderOrigin[0]);
762 center[1] = (float)(carY - grRenderOrigin[1]);
763 center[2] = car->_pos_Z;
764
765 speed[0] = car->pub.DynGCg.vel.x;
766 speed[1] = car->pub.DynGCg.vel.y;
767 speed[2] = car->pub.DynGCg.vel.z;
768
769 }
770};
771
772
774{
775protected:
776 float distx;
777 float disty;
778 float distz;
779
780public:
781 cGrCarCamSide(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
782 float fovy, float fovymin, float fovymax,
783 float mydistx, float mydisty, float mydistz,
784 float fnear, float ffar = 1500.0,
785 float myfogstart = 1400.0, float myfogend = 1500.0)
786 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
787 fovymax, fnear, ffar, myfogstart, myfogend) {
788 distx = mydistx;
789 disty = mydisty;
790 distz = mydistz;
791
792 up[0] = 0;
793 up[1] = 0;
794 up[2] = 1;
795 }
796
797 void update(tCarElt* car, tSituation* s) {
798 tdble x = car->_pos_X + distx;
799 tdble y = car->_pos_Y + disty;
800 tdble z = car->_pos_Z + distz;
801
802 eye[0] = x;
803 eye[1] = y;
804 eye[2] = z;
805 center[0] = car->_pos_X;
806 center[1] = car->_pos_Y;
807 center[2] = car->_pos_Z;
808
809 speed[0] = car->pub.DynGCg.vel.x;
810 speed[1] = car->pub.DynGCg.vel.y;
811 speed[2] = car->pub.DynGCg.vel.z;
812
813 }
814};
815
817{
818protected:
819 float distz;
820
821public:
822 cGrCarCamUp(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
823 float fovy, float fovymin, float fovymax,
824 float mydistz, int axis,
825 float fnear, float ffar = 1500.0,
826 float myfogstart = 1600.0, float myfogend = 1700.0)
827 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
828 fovymax, fnear, ffar, myfogstart, myfogend) {
829 distz = mydistz;
830 up[2] = 0;
831 switch (axis) {
832 case 0:
833 up[0] = 0;
834 up[1] = 1;
835 break;
836 case 1:
837 up[0] = 0;
838 up[1] = -1;
839 break;
840 case 2:
841 up[0] = 1;
842 up[1] = 0;
843 break;
844 case 3:
845 up[0] = -1;
846 up[1] = 0;
847 break;
848 default:
849 up[0] = 0;
850 up[1] = 1;
851 break;
852 }
853 }
854
855 void update(tCarElt* car, tSituation* s) {
856 tdble x = car->_pos_X;
857 tdble y = car->_pos_Y;
858 tdble z = car->_pos_Z + distz;
859
860 eye[0] = x;
861 eye[1] = y;
862 eye[2] = z;
863 center[0] = x;
864 center[1] = y;
865 center[2] = car->_pos_Z;
866
867
868 speed[0] = car->pub.DynGCg.vel.x;
869 speed[1] = car->pub.DynGCg.vel.y;
870 speed[2] = car->pub.DynGCg.vel.z;
871
872 }
873};
874
876{
877protected:
878 float distz;
879 float locfar;
880 float locfovy;
881
882public:
883 cGrCarCamCenter(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
884 float fovy, float fovymin, float fovymax,
885 float mydistz,
886 float fnear, float ffar = 1500.0,
887 float myfogstart = 1400.0, float myfogend = 1500.0)
888 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
889 fovymax, fnear, ffar, myfogstart, myfogend) {
890 distz = mydistz;
891 locfar = ffar;
892 locfovy = fovy;
893
894 eye[0] = grWrldX * 0.5;
895 eye[1] = grWrldY * 0.6;
896 eye[2] = distz;
897
898 up[0] = 0;
899 up[1] = 0;
900 up[2] = 1;
901 }
902
903 void loadDefaults(char* attr) {
904 const int PATHSIZE = 1024;
905 char path[PATHSIZE];
906
907 snprintf(path, PATHSIZE, "%s/%d", GR_SCT_DISPMODE, screen->getId());
908 locfovy = (float)GfParmGetNum(grHandle, path, attr, (char*)NULL, fovydflt);
909 }
910
911 void setZoom(int cmd) {
912 fovy = locfovy;
914 locfovy = fovy;
915 }
916
917 void update(tCarElt* car, tSituation* s) {
918 tdble dx, dy, dz, dd;
919
920 center[0] = car->_pos_X;
921 center[1] = car->_pos_Y;
922 center[2] = car->_pos_Z;
923
924 dx = center[0] - eye[0];
925 dy = center[1] - eye[1];
926 dz = center[2] - eye[2];
927
928 dd = sqrt(dx * dx + dy * dy + dz * dz);
929
930 fnear = dz - 5;
931 if (fnear < 1) {
932 fnear = 1;
933 }
934 ffar = dd + locfar;
935
936 fovy = RAD2DEG(atan2(locfovy, dd));
937
938 speed[0] = 0;
939 speed[1] = 0;
940 speed[2] = 0;
941
942 }
943};
944
946{
947protected:
948
949public:
950 cGrCarCamLookAt(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
951 float fovy, float fovymin, float fovymax,
952 int axis,
953 float eyex, float eyey, float eyez,
954 float centerx, float centery, float centerz,
955 float fnear, float ffar = 1500.0,
956 float myfogstart = 1600.0, float myfogend = 1700.0)
957 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
958 fovymax, fnear, ffar, myfogstart, myfogend) {
959
960 eye[0] = eyex;
961 eye[1] = eyey;
962 eye[2] = eyez;
963
964 center[0] = centerx;
965 center[1] = centery;
966 center[2] = centerz;
967
968 switch (axis) {
969 case 0:
970 up[0] = 0;
971 up[1] = 1;
972 up[2] = 0;
973 break;
974 case 1:
975 up[0] = 0;
976 up[1] = -1;
977 up[2] = 0;
978 break;
979 case 2:
980 up[0] = 1;
981 up[1] = 0;
982 up[2] = 0;
983 break;
984 case 3:
985 up[0] = -1;
986 up[1] = 0;
987 up[2] = 0;
988 break;
989 case 4:
990 up[0] = 0;
991 up[1] = 0;
992 up[2] = 1;
993 break;
994 case 5:
995 up[0] = 0;
996 up[1] = 0;
997 up[2] = -1;
998 break;
999 default:
1000 up[0] = 0;
1001 up[1] = 0;
1002 up[2] = 1;
1003 break;
1004 }
1005 }
1006
1007 void update(tCarElt* car, tSituation* s) {
1008 }
1009};
1010
1011
1013{
1014protected:
1015
1016public:
1017 cGrCarCamRoadNoZoom(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
1018 float fovy, float fovymin, float fovymax,
1019 float fnear, float ffar = 1500.0,
1020 float myfogstart = 1400.0, float myfogend = 1500.0)
1021 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
1022 fovymax, fnear, ffar, myfogstart, myfogend) {
1023 up[0] = 0;
1024 up[1] = 0;
1025 up[2] = 1;
1026 }
1027
1028 void update(tCarElt* car, tSituation* s) {
1029 tRoadCam* curCam;
1030
1031
1032 curCam = car->_trkPos.seg->cam;
1033
1034 if (curCam == NULL) {
1035 eye[0] = grWrldX * 0.5;
1036 eye[1] = grWrldY * 0.6;
1037 eye[2] = 120;
1038 center[2] = car->_pos_Z;
1039 }
1040 else {
1041 eye[0] = curCam->pos.x;
1042 eye[1] = curCam->pos.y;
1043 eye[2] = curCam->pos.z;
1044 center[2] = curCam->pos.z;
1045 }
1046
1047 center[0] = car->_pos_X;
1048 center[1] = car->_pos_Y;
1049 /* center[2] = car->_pos_Z; */
1050
1051 speed[0] = 0.0;
1052 speed[1] = 0.0;
1053 speed[2] = 0.0;
1054 }
1055};
1056
1058{
1059protected:
1061 float timer;
1062 float zOffset;
1063 float gain;
1064 float damp;
1065 float offset[3];
1067public:
1068 cGrCarCamRoadFly(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
1069 float fovy, float fovymin, float fovymax,
1070 float fnear, float ffar = 1500.0,
1071 float myfogstart = 1400.0, float myfogend = 1500.0)
1072 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
1073 fovymax, fnear, ffar, myfogstart, myfogend) {
1074 up[0] = 0;
1075 up[1] = 0;
1076 up[2] = 1;
1077 timer = 0.0;
1078 offset[0] = 0.0;
1079 offset[1] = 0.0;
1080 offset[2] = 60.0;
1081 current = -1;
1082 currenttime = 0.0;
1083 speed[0] = 0.0;
1084 speed[1] = 0.0;
1085 speed[2] = 0.0;
1086 }
1087
1088 void update(tCarElt* car, tSituation* s) {
1089 //tRoadCam *curCam;
1090 float height;
1091 float dt;
1092
1093 //curCam = car->_trkPos.seg->cam;
1094
1095 if (currenttime == 0.0) {
1097 }
1098
1099 if (currenttime == s->currentTime) {
1100 return;
1101 }
1102
1103 bool reset_camera = false;
1104 dt = s->currentTime - currenttime;
1106 if (fabs(dt) > 1.0f) {
1107 dt = 0.1f; // avoid overflow
1108 reset_camera = true;
1109 }
1110
1111 //timer--;
1112 if (timer < 0.0) {
1113 reset_camera = true;
1114 }
1115 else {
1116 timer -= dt;
1117 }
1118
1119 if (current != car->index) {
1120 /* the target car changed */
1121 zOffset = 50.0;
1122 current = car->index;
1123 reset_camera = true;
1124 }
1125 else {
1126 zOffset = 0.0;
1127 }
1128
1129 if ((timer <= 0.0) || (zOffset > 0.0)) {
1130 timer = 10.0 + (int)(5.0 * rand() / (RAND_MAX + 1.0));
1131 offset[0] = -0.5 + (rand() / (RAND_MAX + 1.0));
1132 offset[1] = -0.5 + (rand() / (RAND_MAX + 1.0));
1133 offset[2] = 10.0f + (50.0 * rand() / (RAND_MAX + 1.0)) + zOffset;
1134 offset[0] = offset[0] * (offset[2] + 1.0);
1135 offset[1] = offset[1] * (offset[2] + 1.0);
1136 // follow the car more closely when low
1137 gain = 200.0 / (10.0f + offset[2]);
1138 damp = 5.0f;
1139 }
1140
1141
1142 if (reset_camera) {
1143 eye[0] = car->_pos_X + 50.0 + (50.0 * rand() / (RAND_MAX + 1.0));
1144 eye[1] = car->_pos_Y + 50.0 + (50.0 * rand() / (RAND_MAX + 1.0));
1145 eye[2] = car->_pos_Z + 50.0 + (50.0 * rand() / (RAND_MAX + 1.0));
1146 speed[0] = speed[1] = speed[2] = 0.0f;
1147 }
1148
1149 speed[0] += (gain * (offset[0] + car->_pos_X - eye[0]) - speed[0] * damp) * dt;
1150 speed[1] += (gain * (offset[1] + car->_pos_Y - eye[1]) - speed[1] * damp) * dt;
1151 speed[2] += (gain * (offset[2] + car->_pos_Z - eye[2]) - speed[2] * damp) * dt;
1152
1153 eye[0] = eye[0] + speed[0] * dt;
1154 eye[1] = eye[1] + speed[1] * dt;
1155 eye[2] = eye[2] + speed[2] * dt;
1156
1157 center[0] = (car->_pos_X);
1158 center[1] = (car->_pos_Y);
1159 center[2] = (car->_pos_Z);
1160
1161 // avoid going under the scene
1162 height = grGetHOT(eye[0], eye[1]) + 1.0;
1163 if (eye[2] < height) {
1164 timer = 10.0 + (int)(10.0 * rand() / (RAND_MAX + 1.0));
1165 offset[2] = height - car->_pos_Z + 1.0;
1166 eye[2] = height;
1167 }
1168
1169 }
1170
1171
1172
1174 {
1175 timer = 0;
1176 current = -1;
1177 }
1178
1179};
1180
1182{
1183protected:
1184 float locfar;
1185 float locfovy;
1186
1187public:
1188 cGrCarCamRoadZoom(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
1189 float fovy, float fovymin, float fovymax,
1190 float fnear, float ffar = 1500.0,
1191 float myfogstart = 1400.0, float myfogend = 1500.0)
1192 : cGrPerspCamera(myscreen, id, drawCurr, 1, drawBG, 0, fovy, fovymin,
1193 fovymax, fnear, ffar, myfogstart, myfogend) {
1194 locfar = ffar;
1195 locfovy = fovy;
1196
1197 up[0] = 0;
1198 up[1] = 0;
1199 up[2] = 1;
1200 }
1201
1202 void loadDefaults(char* attr) {
1203
1204 const int PATHSIZE = 1024;
1205 char path[PATHSIZE];
1206
1207 snprintf(path, PATHSIZE, "%s/%d", GR_SCT_DISPMODE, screen->getId());
1208 locfovy = (float)GfParmGetNum(grHandle, path,
1209 attr, (char*)NULL, fovydflt);
1210 }
1211
1212 void setZoom(int cmd) {
1213 fovy = locfovy;
1215 locfovy = fovy;
1216 }
1217
1218 void update(tCarElt* car, tSituation* s) {
1219 tdble dx, dy, dz, dd;
1220 tRoadCam* curCam;
1221
1222 curCam = car->_trkPos.seg->cam;
1223
1224 if (curCam == NULL) {
1225 eye[0] = grWrldX * 0.5;
1226 eye[1] = grWrldY * 0.6;
1227 eye[2] = 120;
1228 }
1229 else {
1230 eye[0] = curCam->pos.x;
1231 eye[1] = curCam->pos.y;
1232 eye[2] = curCam->pos.z;
1233 }
1234
1235 center[0] = car->_pos_X;
1236 center[1] = car->_pos_Y;
1237 center[2] = car->_pos_Z;
1238
1239 dx = center[0] - eye[0];
1240 dy = center[1] - eye[1];
1241 dz = center[2] - eye[2];
1242
1243 dd = sqrt(dx * dx + dy * dy + dz * dz);
1244
1245 fnear = dz - 5;
1246 if (fnear < 1) {
1247 fnear = 1;
1248 }
1249 ffar = dd + locfar;
1250 fovy = RAD2DEG(atan2(locfovy, dd));
1251 limitFov();
1252
1253 speed[0] = 0.0;
1254 speed[1] = 0.0;
1255 speed[2] = 0.0;
1256 }
1257};
1258
1259static tdble
1261{
1262 tTrackSeg* seg;
1263 tdble lg;
1264
1265 seg = car->_trkPos.seg;
1266 lg = seg->lgfromstart;
1267
1268 switch (seg->type) {
1269 case TR_STR:
1270 lg += car->_trkPos.toStart;
1271 break;
1272 default:
1273 lg += car->_trkPos.toStart * seg->radius;
1274 break;
1275 }
1276 return lg;
1277}
1278
1279typedef struct
1280{
1281 double prio;
1284} tSchedView;
1285
1287{
1295
1296public:
1297 cGrCarCamRoadZoomTVD(class cGrScreen* myscreen, int id, int drawCurr, int drawBG,
1298 float fovy, float fovymin, float fovymax,
1299 float fnear, float ffar = 1500.0,
1300 float myfogstart = 1400.0, float myfogend = 1500.0)
1301 : cGrCarCamRoadZoom(myscreen, id, drawCurr, drawBG, fovy, fovymin,
1302 fovymax, fnear, ffar, myfogstart, myfogend) {
1303 schedView = (tSchedView*)calloc(grNbCars, sizeof(tSchedView));
1304 if (!schedView) {
1305 GfTrace("malloc error");
1306 GfScrShutdown();
1307 exit(1);
1308 }
1309
1310 lastEventTime = 0;
1311 lastViewTime = 0;
1312
1313 current = -1;
1314
1318 }
1319
1321
1322 void update(tCarElt* car, tSituation* s) {
1323 int i, j;
1324 int curCar;
1325 double curPrio;
1326 double deltaEventTime = s->currentTime - lastEventTime;
1327 double deltaViewTime = s->currentTime - lastViewTime;
1328 int event = 0;
1329
1330 if (current == -1) {
1331 current = 0;
1332 for (i = 0; i < grNbCars; i++) {
1333 if (car == s->cars[i]) {
1334 current = i;
1335 break;
1336 }
1337 }
1338 }
1339
1340
1341 /* Track events */
1342 if (deltaEventTime > camEventInterval) {
1343
1344 memset(schedView, 0, grNbCars * sizeof(tSchedView));
1345 for (i = 0; i < grNbCars; i++) {
1346 schedView[i].viewable = 1;
1347 }
1348
1349 for (i = 0; i < GR_NB_MAX_SCREEN; i++) {
1350 if ((screen != grScreens[i]) && grScreens[i]->isActive()) {
1351 car = grScreens[i]->getCurrentCar();
1352 schedView[car->index].viewable = 0;
1353 schedView[car->index].prio -= 10000;
1354 }
1355 }
1356
1357 for (i = 0; i < grNbCars; i++) {
1358 tdble dist, fs;
1359
1360 car = s->cars[i];
1361 schedView[car->index].prio += grNbCars - i;
1362 fs = GetDistToStart(car);
1363 if ((car->_state & RM_CAR_STATE_NO_SIMU) != 0) {
1364 schedView[car->index].viewable = 0;
1365 }
1366 else {
1367 if ((fs > (grTrack->length - 200.0)) && (car->_remainingLaps == 0)) {
1368 schedView[car->index].prio += 5 * grNbCars;
1369 event = 1;
1370 }
1371 }
1372
1373 if ((car->_state & RM_CAR_STATE_NO_SIMU) == 0) {
1374 dist = fabs(car->_trkPos.toMiddle) - grTrack->width / 2.0;
1375 /* out of track */
1376 if (dist > 0) {
1377 schedView[car->index].prio += grNbCars;
1378 if (car->ctrl.raceCmd & RM_CMD_PIT_ASKED) {
1379 schedView[car->index].prio += grNbCars;
1380 event = 1;
1381 }
1382 }
1383
1384 for (j = i + 1; j < grNbCars; j++) {
1385 tCarElt* car2 = s->cars[j];
1386 tdble fs2 = GetDistToStart(car2);
1387 tdble d = fabs(fs2 - fs);
1388
1389 if ((car2->_state & RM_CAR_STATE_NO_SIMU) == 0) {
1390 if (d < proximityThld) {
1391 d = proximityThld - d;
1392 schedView[car->index].prio += d * grNbCars / proximityThld;
1393 schedView[car2->index].prio += d * (grNbCars - 1) / proximityThld;
1394 if (i == 0) {
1395 event = 1;
1396 }
1397 }
1398 }
1399 }
1400
1401 if (car->priv.collision) {
1402 schedView[car->index].prio += grNbCars;
1403 event = 1;
1404 }
1405 }
1406 else {
1407 if (i == current) {
1408 event = 1; /* update view */
1409 }
1410 }
1411 }
1412
1413
1414 /* change current car */
1415 if ((event && (deltaEventTime > camEventInterval)) || (deltaViewTime > camChangeInterval)) {
1416 int last_current = current;
1417
1418 curCar = 0;
1419 curPrio = -1000000.0;
1420 for (i = 0; i < grNbCars; i++) {
1421
1422 if ((schedView[i].prio > curPrio) && (schedView[i].viewable)) {
1423 curPrio = schedView[i].prio;
1424 curCar = i;
1425 }
1426 }
1427 for (i = 0; i < grNbCars; i++) {
1428 if (s->cars[i]->index == curCar) {
1429 current = i;
1430 break;
1431 }
1432 }
1433 if (last_current != current) {
1436
1437 for (i = 0; i < grNbCars; i++) {
1438 s->cars[i]->priv.collision = 0;
1439 }
1440 }
1441 }
1442 }
1443
1444 screen->setCurrentCar(s->cars[current]);
1445
1447 }
1448};
1449
1450
1451void
1452grCamCreateSceneCameraList(class cGrScreen* myscreen, tGrCamHead* cams, tdble fovFactor)
1453{
1454 int id;
1455 int c;
1456 class cGrCamera* cam;
1457
1458 /* Scene Cameras */
1459 c = 0;
1460
1461 /* F2 */
1462 GF_TAILQ_INIT(&cams[c]);
1463 id = 0;
1464
1465 /* cam F2 = chase */
1466 cam = new cGrCarCamBehind(myscreen,
1467 id,
1468 1, /* drawCurr */
1469 1, /* drawBG */
1470 44.0, /* fovy */
1471 5.0, /* fovymin */
1472 95.0, /* fovymax */
1473 10.0, /* dist */
1474 2.3, /* height */
1475 1.0, /* near */
1476 600.0 * fovFactor, /* far */
1477 300.0 * fovFactor, /* fog */
1478 600.0 * fovFactor /* fog */
1479 );
1480 cam->add(&cams[c]);
1481 id++;
1482
1483 /* cam F2 = chase near */
1484 cam = new cGrCarCamBehind(myscreen,
1485 id,
1486 1, /* drawCurr */
1487 1, /* drawBG */
1488 44.0, /* fovy */
1489 5.0, /* fovymin */
1490 95.0, /* fovymax */
1491 8.0, /* dist */
1492 2.0, /* height */
1493 1.0, /* near */
1494 600.0 * fovFactor, /* far */
1495 300.0 * fovFactor, /* fog */
1496 600.0 * fovFactor /* fog */
1497 );
1498 cam->add(&cams[c]);
1499 id++;
1500
1501 /* cam F2 = car inside with car (bonnet view) fixed to the car */
1502 cam = new cGrCarCamInsideFixedCar(myscreen,
1503 id,
1504 1, /* drawCurr */
1505 1, /* drawBG */
1506 67.5, /* fovy */
1507 50.0, /* fovymin */
1508 95.0, /* fovymax */
1509 0.3, /* near */
1510 600.0 * fovFactor, /* far */
1511 300.0 * fovFactor, /* fog */
1512 600.0 * fovFactor /* fog */
1513 );
1514 cam->add(&cams[c]);
1515 id++;
1516
1517 /* cam F2 = car inside with car (bonnet view) */
1518 cam = new cGrCarCamInside(myscreen,
1519 id,
1520 1, /* drawCurr */
1521 1, /* drawBG */
1522 67.5, /* fovy */
1523 50.0, /* fovymin */
1524 95.0, /* fovymax */
1525 0.1, /* near */
1526 600.0 * fovFactor, /* far */
1527 300.0 * fovFactor, /* fog */
1528 600.0 * fovFactor /* fog */
1529 );
1530 cam->add(&cams[c]);
1531 id++;
1532
1533 /* cam F2 = car inside car (no car - road view) */
1534 cam = new cGrCarCamInsideFixedCar(myscreen,
1535 id,
1536 0, /* drawCurr */
1537 1, /* drawBG */
1538 67.5, /* fovy */
1539 50.0, /* fovymin */
1540 95.0, /* fovymax */
1541 0.3, /* near */
1542 600.0 * fovFactor, /* far */
1543 300.0 * fovFactor, /* fog */
1544 600.0 * fovFactor /* fog */
1545 );
1546 cam->add(&cams[c]);
1547
1548 /* F3 */
1549 c++;
1550 GF_TAILQ_INIT(&cams[c]);
1551 id = 0;
1552
1553 /* cam F3 = behind far */
1554 cam = new cGrCarCamBehind(myscreen,
1555 id,
1556 1, /* drawCurr */
1557 1, /* drawBG */
1558 40.0, /* fovy */
1559 5.0, /* fovymin */
1560 95.0, /* fovymax */
1561 18.0, /* dist */
1562 2.0, /* height */
1563 1.0, /* near */
1564 600.0 * fovFactor, /* far */
1565 300.0 * fovFactor, /* fog */
1566 600.0 * fovFactor /* fog */
1567 );
1568 cam->add(&cams[c]);
1569 id++;
1570
1571 /* cam F3 = car behind*/
1572 cam = new cGrCarCamBehind2(myscreen,
1573 id,
1574 1, /* drawCurr */
1575 1, /* drawBG */
1576 40.0, /* fovy */
1577 5.0, /* fovymin */
1578 95.0, /* fovymax */
1579 30.0, /* dist */
1580 1.0, /* near */
1581 1000.0 * fovFactor, /* far */
1582 500.0 * fovFactor, /* fog */
1583 1000.0 * fovFactor /* fog */
1584 );
1585 cam->add(&cams[c]);
1586 id++;
1587
1588 /* cam F3 = chase*/
1589 cam = new cGrCarCamBehind(myscreen,
1590 id,
1591 1, /* drawCurr */
1592 1, /* drawBG */
1593 40.0, /* fovy */
1594 5.0, /* fovymin */
1595 95.0, /* fovymax */
1596 13.0, /* dist */
1597 2.0, /* height */
1598 .50, /* near */
1599 600.0 * fovFactor, /* far */
1600 300.0 * fovFactor, /* fog */
1601 600.0 * fovFactor /* fog */
1602 );
1603 cam->add(&cams[c]);
1604 id++;
1605
1606 /* cam F3 = car reverse*/
1607 cam = new cGrCarCamFront(myscreen,
1608 id,
1609 1, /* drawCurr */
1610 1, /* drawBG */
1611 40.0, /* fovy */
1612 5.0, /* fovymin */
1613 95.0, /* fovymax */
1614 8.0, /* dist */
1615 0.5, /* near */
1616 1000.0 * fovFactor, /* far */
1617 500.0 * fovFactor, /* fog */
1618 1000.0 * fovFactor /* fog */
1619 );
1620 cam->add(&cams[c]);
1621
1622 /* F4 */
1623 c++;
1624 GF_TAILQ_INIT(&cams[c]);
1625 id = 0;
1626
1627 /* cam F4 = car side 1*/
1628 cam = new cGrCarCamSide(myscreen,
1629 id,
1630 1, /* drawCurr */
1631 1, /* drawBG */
1632 30.0, /* fovy */
1633 5.0, /* fovymin */
1634 60.0, /* fovymax */
1635 0.0, /* distx */
1636 -20.0, /* disty */
1637 3.0, /* distz */
1638 1.0, /* near */
1639 1000.0 * fovFactor, /* far */
1640 500.0 * fovFactor, /* fog */
1641 1000.0 * fovFactor /* fog */
1642 );
1643 cam->add(&cams[c]);
1644 id++;
1645
1646 /* cam F4 = car side 2*/
1647 cam = new cGrCarCamSide(myscreen,
1648 id,
1649 1, /* drawCurr */
1650 1, /* drawBG */
1651 30.0, /* fovy */
1652 5.0, /* fovymin */
1653 60.0, /* fovymax */
1654 0.0, /* distx */
1655 20.0, /* disty */
1656 3.0, /* distz */
1657 1.0, /* near */
1658 1000.0 * fovFactor, /* far */
1659 500.0 * fovFactor, /* fog */
1660 1000.0 * fovFactor /* fog */
1661 );
1662 cam->add(&cams[c]);
1663 id++;
1664
1665 /* cam F4 = car side 3*/
1666 cam = new cGrCarCamSide(myscreen,
1667 id,
1668 1, /* drawCurr */
1669 1, /* drawBG */
1670 30.0, /* fovy */
1671 5.0, /* fovymin */
1672 60.0, /* fovymax */
1673 -20.0, /* distx */
1674 0.0, /* disty */
1675 3.0, /* distz */
1676 1.0, /* near */
1677 1000.0 * fovFactor, /* far */
1678 500.0 * fovFactor, /* fog */
1679 1000.0 * fovFactor /* fog */
1680 );
1681 cam->add(&cams[c]);
1682 id++;
1683
1684 /* cam F4 = car side 4*/
1685 cam = new cGrCarCamSide(myscreen,
1686 id,
1687 1, /* drawCurr */
1688 1, /* drawBG */
1689 30.0, /* fovy */
1690 5.0, /* fovymin */
1691 60.0, /* fovymax */
1692 20.0, /* distx */
1693 0.0, /* disty */
1694 3.0, /* distz */
1695 1.0, /* near */
1696 1000.0 * fovFactor, /* far */
1697 500.0 * fovFactor, /* fog */
1698 1000.0 * fovFactor /* fog */
1699 );
1700 cam->add(&cams[c]);
1701 id++;
1702
1703 /* cam F4 = car side 5*/
1704 cam = new cGrCarCamSide(myscreen,
1705 id,
1706 1, /* drawCurr */
1707 1, /* drawBG */
1708 30.0, /* fovy */
1709 5.0, /* fovymin */
1710 60.0, /* fovymax */
1711 0.0, /* distx */
1712 -40.0, /* disty */
1713 6.0, /* distz */
1714 1.0, /* near */
1715 1000.0 * fovFactor, /* far */
1716 500.0 * fovFactor, /* fog */
1717 1000.0 * fovFactor /* fog */
1718 );
1719 cam->add(&cams[c]);
1720 id++;
1721
1722 /* cam F4 = car side 6*/
1723 cam = new cGrCarCamSide(myscreen,
1724 id,
1725 1, /* drawCurr */
1726 1, /* drawBG */
1727 30.0, /* fovy */
1728 5.0, /* fovymin */
1729 60.0, /* fovymax */
1730 0.0, /* distx */
1731 40.0, /* disty */
1732 6.0, /* distz */
1733 1.0, /* near */
1734 1000.0 * fovFactor, /* far */
1735 500.0 * fovFactor, /* fog */
1736 1000.0 * fovFactor /* fog */
1737 );
1738 cam->add(&cams[c]);
1739 id++;
1740
1741 /* cam F4 = car side 7*/
1742 cam = new cGrCarCamSide(myscreen,
1743 id,
1744 1, /* drawCurr */
1745 1, /* drawBG */
1746 30.0, /* fovy */
1747 5.0, /* fovymin */
1748 60.0, /* fovymax */
1749 -40.0, /* distx */
1750 0.0, /* disty */
1751 6.0, /* distz */
1752 1.0, /* near */
1753 1000.0 * fovFactor, /* far */
1754 500.0 * fovFactor, /* fog */
1755 1000.0 * fovFactor /* fog */
1756 );
1757 cam->add(&cams[c]);
1758 id++;
1759
1760 /* cam F4 = car side 8*/
1761 cam = new cGrCarCamSide(myscreen,
1762 id,
1763 1, /* drawCurr */
1764 1, /* drawBG */
1765 30.0, /* fovy */
1766 5.0, /* fovymin */
1767 60.0, /* fovymax */
1768 40.0, /* distx */
1769 0.0, /* disty */
1770 6.0, /* distz */
1771 1.0, /* near */
1772 1000.0 * fovFactor, /* far */
1773 500.0 * fovFactor, /* fog */
1774 1000.0 * fovFactor /* fog */
1775 );
1776 cam->add(&cams[c]);
1777
1778 /* F5 */
1779 c++;
1780 GF_TAILQ_INIT(&cams[c]);
1781 id = 0;
1782
1783 /* cam F5 = car up 1*/
1784 cam = new cGrCarCamUp(myscreen,
1785 id,
1786 1, /* drawCurr */
1787 1, /* drawBG */
1788 //12.0, /* fovy */
1789 67.5, /* fovy */
1790 1.0, /* fovymin */
1791 90.0, /* fovymax */
1792 //300.0, /* distz */
1793 200.0, /* distz */
1794 0, /* axis */
1795 //200.0, /* near */
1796 100.0, /* near */
1797 1000.0 * fovFactor,/* far */
1798 500.0 * fovFactor, /* fog */
1799 1000.0 * fovFactor /* fog */
1800 );
1801 cam->add(&cams[c]);
1802 id++;
1803
1804 /* cam F5 = car up 2*/
1805 cam = new cGrCarCamUp(myscreen,
1806 id,
1807 1, /* drawCurr */
1808 1, /* drawBG */
1809 //12.0, /* fovy */
1810 67.5, /* fovy */
1811 1.0, /* fovymin */
1812 90.0, /* fovymax */
1813 //300.0, /* distz */
1814 250.0, /* distz */
1815 1, /* axis */
1816 200.0, /* near */
1817 1000.0 * fovFactor,/* far */
1818 500.0 * fovFactor, /* fog */
1819 1000.0 * fovFactor /* fog */
1820 );
1821 cam->add(&cams[c]);
1822 id++;
1823
1824 /* cam F5 = car up 3*/
1825 cam = new cGrCarCamUp(myscreen,
1826 id,
1827 1, /* drawCurr */
1828 1, /* drawBG */
1829 //12.0, /* fovy */
1830 67.5, /* fovy */
1831 1.0, /* fovymin */
1832 90.0, /* fovymax */
1833 //300.0, /* distz */
1834 350.0, /* distz */
1835 2, /* axis */
1836 200.0, /* near */
1837 1000.0 * fovFactor,/* far */
1838 500.0 * fovFactor, /* fog */
1839 1000.0 * fovFactor /* fog */
1840 );
1841 cam->add(&cams[c]);
1842 id++;
1843
1844 /* cam F5 = car up 4*/
1845 cam = new cGrCarCamUp(myscreen,
1846 id,
1847 1, /* drawCurr */
1848 1, /* drawBG */
1849 //12.0, /* fovy */
1850 67.5, /* fovy */
1851 1.0, /* fovymin */
1852 90.0, /* fovymax */
1853 //300.0, /* distz */
1854 400.0, /* distz */
1855 3, /* axis */
1856 200.0, /* near */
1857 1000.0 * fovFactor,/* far */
1858 500.0 * fovFactor, /* fog */
1859 1000.0 * fovFactor /* fog */
1860 );
1861 cam->add(&cams[c]);
1862
1863 /* F6 */
1864 c++;
1865 GF_TAILQ_INIT(&cams[c]);
1866 id = 0;
1867
1868 /* cam F6 = car from circuit centre */
1869 cam = new cGrCarCamCenter(myscreen,
1870 id,
1871 1, /* drawCurr */
1872 1, /* drawBG */
1873 21.0, /* fovy */
1874 2.0, /* fovymin */
1875 60.0, /* fovymax */
1876 120.0, /* distz */
1877 100.0, /* near */
1878 1500.0,/* far */
1879 10500.0,/* fog */
1880 20500.0 /* fog */
1881 );
1882 cam->add(&cams[c]);
1883
1884 /* F7 */
1885 c++;
1886 GF_TAILQ_INIT(&cams[c]);
1887 id = 0;
1888
1889 /* cam F7 = panoramic */
1890 cam = new cGrCarCamLookAt(myscreen,
1891 id,
1892 1, /* drawCurr */
1893 0, /* drawBG */
1894 74.0, /* fovy */
1895 1.0, /* fovymin */
1896 110.0, /* fovymax */
1897 0, /* up axis */
1898 grWrldX / 2, /* eyex */
1899 grWrldY / 2, /* eyey */
1900 MAX(grWrldX / 2, grWrldY * 4 / 3 / 2) + grWrldZ, /* eyez */
1901 grWrldX / 2, /* centerx */
1902 grWrldY / 2, /* centery */
1903 0, /* centerz */
1904 10.0, /* near */
1905 grWrldMaxSize * 2.0, /* far */
1906 grWrldMaxSize * 10.0, /* fog */
1907 grWrldMaxSize * 20.0 /* fog */
1908 );
1909 cam->add(&cams[c]);
1910 id++;
1911
1912 /* cam F7 = panoramic */
1913 cam = new cGrCarCamLookAt(myscreen,
1914 id,
1915 1, /* drawCurr */
1916 0, /* drawBG */
1917 74.0f, /* fovy */
1918 1.0f, /* fovymin */
1919 110.0f, /* fovymax */
1920 4, /* up axis */
1921 -grWrldX / 2.0f, /* eyex */
1922 -grWrldY / 2.0f, /* eyey */
1923 0.25f * sqrt((double)(grWrldX * grWrldX + grWrldY * grWrldY)), /* eyez */
1924 grWrldX / 2.0f, /* centerx */
1925 grWrldY / 2.0f, /* centery */
1926 0.0f, /* centerz */
1927 10.0f, /* near */
1928 2.0f * grWrldMaxSize, /* far */
1929 10.0f * grWrldMaxSize, /* fog */
1930 20.0f * grWrldMaxSize /* fog */
1931 );
1932 cam->add(&cams[c]);
1933 id++;
1934
1935 /* cam F7 = panoramic */
1936 cam = new cGrCarCamLookAt(myscreen,
1937 id,
1938 1, /* drawCurr */
1939 0, /* drawBG */
1940 74.0f, /* fovy */
1941 1.0f, /* fovymin */
1942 110.0f, /* fovymax */
1943 4, /* up axis */
1944 -grWrldX / 2.0f, /* eyex */
1945 grWrldY * 3.0f / 2.0f, /* eyey */
1946 0.25f * sqrt((double)(grWrldX * grWrldX + grWrldY * grWrldY)), /* eyez */
1947 grWrldX / 2.0f, /* centerx */
1948 grWrldY / 2.0f, /* centery */
1949 0.0f, /* centerz */
1950 10.0f, /* near */
1951 2.0f * grWrldMaxSize, /* far */
1952 10.0f * grWrldMaxSize, /* fog */
1953 20.0f * grWrldMaxSize /* fog */
1954 );
1955 cam->add(&cams[c]);
1956 id++;
1957
1958 /* cam F7 = panoramic */
1959 cam = new cGrCarCamLookAt(myscreen,
1960 id,
1961 1, /* drawCurr */
1962 0, /* drawBG */
1963 74.0f, /* fovy */
1964 1.0f, /* fovymin */
1965 110.0f, /* fovymax */
1966 4, /* up axis */
1967 grWrldX * 3.0f / 2.0f, /* eyex */
1968 grWrldY * 3.0f / 2.0f, /* eyey */
1969 0.25f * sqrt((double)(grWrldX * grWrldX + grWrldY * grWrldY)), /* eyez */
1970 grWrldX / 2.0f, /* centerx */
1971 grWrldY / 2.0f, /* centery */
1972 0.0f, /* centerz */
1973 10.0f, /* near */
1974 2.0f * grWrldMaxSize, /* far */
1975 10.0f * grWrldMaxSize, /* fog */
1976 20.0f * grWrldMaxSize /* fog */
1977 );
1978 cam->add(&cams[c]);
1979 id++;
1980
1981 /* cam F7 = panoramic */
1982 cam = new cGrCarCamLookAt(myscreen,
1983 id,
1984 1, /* drawCurr */
1985 0, /* drawBG */
1986 74.0f, /* fovy */
1987 1.0f, /* fovymin */
1988 110.0f, /* fovymax */
1989 4, /* up axis */
1990 grWrldX * 3.0f / 2.0f, /* eyex */
1991 -grWrldY / 2.0f, /* eyey */
1992 0.25f * sqrt((double)(grWrldX * grWrldX + grWrldY * grWrldY)), /* eyez */
1993 grWrldX / 2.0f, /* centerx */
1994 grWrldY / 2.0f, /* centery */
1995 0.0f, /* centerz */
1996 10.0f, /* near */
1997 2.0f * grWrldMaxSize, /* far */
1998 10.0f * grWrldMaxSize, /* fog */
1999 20.0f * grWrldMaxSize /* fog */
2000 );
2001 cam->add(&cams[c]);
2002 id++;
2003
2004 /* F8 */
2005 c++;
2006 GF_TAILQ_INIT(&cams[c]);
2007 id = 0;
2008
2009 /* cam F8 = road cam fixed fov */
2010
2011 cam = new cGrCarCamRoadNoZoom(myscreen,
2012 id,
2013 1, /* drawCurr */
2014 1, /* drawBG */
2015 30.0, /* fovy */
2016 5.0, /* fovymin */
2017 60.0, /* fovymax */
2018 1.0, /* near */
2019 1000.0 * fovFactor,/* far */
2020 500.0 * fovFactor, /* fog */
2021 1000.0 * fovFactor /* fog */
2022 );
2023 cam->add(&cams[c]);
2024
2025 /* F9 */
2026 c++;
2027 GF_TAILQ_INIT(&cams[c]);
2028 id = 0;
2029
2030 /* cam F9 = road cam zoomed */
2031 cam = new cGrCarCamRoadZoom(myscreen,
2032 id,
2033 1, /* drawCurr */
2034 1, /* drawBG */
2035 9.0, /* fovy */
2036 1.0, /* fovymin */
2037 90.0, /* fovymax */
2038 1.0, /* near */
2039 1000.0 * fovFactor, /* far */
2040 500.0 * fovFactor, /* fog */
2041 1000.0 * fovFactor /* fog */
2042 );
2043 cam->add(&cams[c]);
2044
2045 /* F10 */
2046 c++;
2047 GF_TAILQ_INIT(&cams[c]);
2048 id = 0;
2049
2050 cam = new cGrCarCamRoadFly(myscreen,
2051 id,
2052 1, /* drawCurr */
2053 1, /* drawBG */
2054 //17.0, /* fovy */
2055 67.5, /* fovy */
2056 1.0, /* fovymin */
2057 90.0, /* fovymax */
2058 1.0, /* near */
2059 1000.0 * fovFactor, /* far */
2060 500.0 * fovFactor, /* fog */
2061 1000.0 * fovFactor /* fog */
2062 );
2063 cam->add(&cams[c]);
2064
2065 /* F11 */
2066 c++;
2067 GF_TAILQ_INIT(&cams[c]);
2068 id = 0;
2069 cam = new cGrCarCamRoadZoomTVD(myscreen,
2070 id,
2071 1, /* drawCurr */
2072 1, /* drawBG */
2073 9.0, /* fovy */
2074 1.0, /* fovymin */
2075 90.0, /* fovymax */
2076 1.0, /* near */
2077 1000.0 * fovFactor, /* far */
2078 500.0 * fovFactor, /* fog */
2079 1000.0 * fovFactor /* fog */
2080 );
2081 cam->add(&cams[c]);
2082
2083}
static Vector y[4]
Definition Convex.cpp:56
static const double PI
#define RM_CMD_PIT_ASKED
Race command: Pit asked.
Definition car.h:354
#define RM_CAR_STATE_NO_SIMU
Do not simulate the car.
Definition car.h:217
struct CarElt tCarElt
Car structure (tCarElt).
void update(tCarElt *car, tSituation *s)
Definition grcam.h:241
sgVec3 speed
Definition grcam.h:47
sgVec3 * getUpv(void)
Definition grcam.h:136
sgVec3 center
Definition grcam.h:49
cGrCamera(class cGrScreen *myscreen, int myid=0, int mydrawCurrent=0, int mydrawdrv=0, int mydrawBackground=0, int mymirrorAllowed=0)
Definition grcam.h:58
int id
Definition grcam.h:40
virtual float getFovY(void)
Definition grcam.h:140
int getId(void)
Definition grcam.h:91
void rebaseLocalRenderCoordinates(void)
Definition grcam.cpp:63
int renderCoordinatesLocal
Definition grcam.h:51
sgVec3 up
Definition grcam.h:50
sgVec3 * getCenterv(void)
Definition grcam.h:125
void add(tGrCamHead *head)
Definition grcam.h:145
float getDist2(tCarElt *car)
Definition grcam.cpp:45
sgVec3 eye
Definition grcam.h:48
sgVec3 * getPosv(void)
Definition grcam.h:104
int mirrorAllowed
Definition grcam.h:44
sgVec3 renderOrigin
Definition grcam.h:52
void setLocalRenderCoordinates(void)
Definition grcam.cpp:55
class cGrScreen * screen
Definition grcam.h:53
cGrCarCamBehind2(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float mydist, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:676
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:689
double lastUpdateTime
Definition grcam.cpp:490
int currentCarIndex
Definition grcam.cpp:491
cGrCarCamBehind(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float mydist, float myHeight, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:498
void onSelect(tCarElt *car, tSituation *s)
Definition grcam.cpp:661
tdble smoothedYaw
Definition grcam.cpp:489
float cameraHeight
Definition grcam.cpp:495
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:514
float cameraDistance
Definition grcam.cpp:494
cGrCarCamCenter(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float mydistz, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:883
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:917
void loadDefaults(char *attr)
Definition grcam.cpp:903
void setZoom(int cmd)
Definition grcam.cpp:911
cGrCarCamFront(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float mydist, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:735
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:747
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:464
cGrCarCamInsideFixedCar(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float myfovy, float myfovymin, float myfovymax, float myfnear, float myffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:454
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:321
cGrCarCamInside(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float myfovy, float myfovymin, float myfovymax, float myfnear, float myffar=1500.0, float myfogstart=800.0, float myfogend=1500.0)
Definition grcam.cpp:309
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:1007
cGrCarCamLookAt(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, int axis, float eyex, float eyey, float eyez, float centerx, float centery, float centerz, float fnear, float ffar=1500.0, float myfogstart=1600.0, float myfogend=1700.0)
Definition grcam.cpp:950
virtual ~cGrCarCamMirror()
Definition grcam.cpp:334
GLuint tex
Definition grcam.h:254
void activateViewport(void)
Definition grcam.cpp:409
void setViewport(int x, int y, int w, int h)
Definition grcam.cpp:358
cGrOrthoCamera * viewCam
Definition grcam.h:255
void setPos(int x, int y, int w, int h)
Definition grcam.cpp:373
void store(void)
Definition grcam.cpp:418
void limitFov(void)
Definition grcam.cpp:341
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:346
void display(void)
Definition grcam.cpp:432
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:1088
void onSelect(tCarElt *car, tSituation *s)
Definition grcam.cpp:1173
double currenttime
Definition grcam.cpp:1066
float offset[3]
Definition grcam.cpp:1065
cGrCarCamRoadFly(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:1068
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:1028
cGrCarCamRoadNoZoom(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:1017
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:1218
void setZoom(int cmd)
Definition grcam.cpp:1212
cGrCarCamRoadZoom(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:1188
void loadDefaults(char *attr)
Definition grcam.cpp:1202
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:1322
tSchedView * schedView
Definition grcam.cpp:1288
cGrCarCamRoadZoomTVD(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:1297
float distx
Definition grcam.cpp:776
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:797
float distz
Definition grcam.cpp:778
float disty
Definition grcam.cpp:777
cGrCarCamSide(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float mydistx, float mydisty, float mydistz, float fnear, float ffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:781
float distz
Definition grcam.cpp:819
void update(tCarElt *car, tSituation *s)
Definition grcam.cpp:855
cGrCarCamUp(class cGrScreen *myscreen, int id, int drawCurr, int drawBG, float fovy, float fovymin, float fovymax, float mydistz, int axis, float fnear, float ffar=1500.0, float myfogstart=1600.0, float myfogend=1700.0)
Definition grcam.cpp:822
float right
Definition grcam.h:208
void setProjection(void)
Definition grcam.cpp:274
void setModelView(void)
Definition grcam.cpp:281
float top
Definition grcam.h:210
float bottom
Definition grcam.h:209
float left
Definition grcam.h:207
void setProjection(void)
Definition grcam.cpp:158
float ffar
Definition grcam.h:171
float fogstart
Definition grcam.h:172
void setModelView(void)
Definition grcam.cpp:172
void limitFov(void)
Definition grcam.h:193
float fovy
Definition grcam.h:166
void loadDefaults(char *attr)
Definition grcam.cpp:187
float getLODFactor(float x, float y, float z)
Definition grcam.cpp:199
void setZoom(int cmd)
Definition grcam.cpp:225
float fogend
Definition grcam.h:173
float fovymax
Definition grcam.h:168
float fnear
Definition grcam.h:170
float fovymin
Definition grcam.h:167
float fovydflt
Definition grcam.h:169
cGrPerspCamera(class cGrScreen *myscreen, int id, int drawCurr, int drawDrv, int drawBG, int mirrorAllowed, float myfovy, float myfovymin, float myfovymax, float myfnear, float myffar=1500.0, float myfogstart=1400.0, float myfogend=1500.0)
Definition grcam.cpp:142
#define GR_ATT_PROXTHLD
Definition graphic.h:80
#define GR_ATT_CHGCAMINT
Definition graphic.h:78
#define GR_ATT_EVTINT
Definition graphic.h:79
#define GR_SCT_DISPMODE
Definition graphic.h:63
#define GR_SCT_TVDIR
Definition graphic.h:77
#define GR_ATT_FOVY
Definition graphic.h:68
static tdble grTrackHeightD(tTrackSeg *segment, double x, double y)
Definition grcam.cpp:95
void grCamCreateSceneCameraList(class cGrScreen *myscreen, tGrCamHead *cams, tdble fovFactor)
Definition grcam.cpp:1452
static void grTransformCarPointToRender(const tCarElt *car, tdble x, tdble y, tdble z, sgVec3 point)
Definition grcam.cpp:84
static tdble GetDistToStart(tCarElt *car)
Definition grcam.cpp:1260
static void grMakeLookAtMat4(sgMat4 dst, const sgVec3 eye, const sgVec3 center, const sgVec3 up)
Definition grcam.cpp:104
static void grGetPreciseCarPosition(const tCarElt *car, double *x, double *y)
Definition grcam.cpp:76
#define M(row, col)
#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
ssgContext grContext
Definition grmain.cpp:66
void * grHandle
Definition grmain.cpp:58
class cGrScreen * grScreens[GR_NB_MAX_SCREEN]
Definition grmain.cpp:67
int grNbCars
Definition grmain.cpp:56
#define GR_NB_MAX_SCREEN
Definition grmain.h:72
float tdble
Floating point type used in TORCS.
Definition tgf.h:47
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
int GfParmWriteFile(const char *file, void *parmHandle, const char *name)
Write parameter set into file.
Definition params.cpp:1732
#define RELAXATION(target, prev, rate)
Smooth a target using the previous filtered result.
Definition robottools.h:57
void GfScrShutdown(void)
Shutdown the screen.
Definition screen.cpp:501
void GfScrGetSize(int *scrw, int *scrh, int *vieww, int *viewh)
Get the screen and viewport sizes.
Definition screen.cpp:529
#define GF_TAILQ_INIT(head)
Head initialization (Mandatory)
Definition tgf.h:484
struct trackSeg tTrackSeg
Track segment (tTrackSeg) The segments can be straights (type TR_STR): (the track goes from the right...
void RtTrackGlobal2LocalD(tTrackSeg *segment, double X, double Y, tTrkLocPos *p, int type)
Convert global coordinates to a local track position using double intermediates.
Definition rttrack.cpp:276
tdble RtTrackHeightL(tTrkLocPos *p)
Returns the absolute height in meters of the road at the Local position p.
Definition rttrack.cpp:365
tdble RtTrackSideTgAngleL(tTrkLocPos *p)
Used to get the tangent angle for a track position The angle is given in radian.
Definition rttrack.cpp:539
tTrack * grTrack
Definition grscene.cpp:58
int grWrldZ
Definition grscene.cpp:55
int grWrldY
Definition grscene.cpp:54
int grWrldX
Definition grscene.cpp:53
sgVec3 grRenderOrigin
Definition grscene.cpp:57
int grWrldMaxSize
Definition grscene.cpp:56
float grGetHOT(float x, float y)
Definition grutil.cpp:354
static int scrh
struct Situation tSituation
cars situation used to inform the GUI and the drivers
static tRmFileSelect fs
tPrivCar priv
private
Definition car.h:463
tPublicCar pub
public
Definition car.h:461
tCarCtrl ctrl
private
Definition car.h:464
int index
car index
Definition car.h:459
t3Dd pos
Definition track.h:246
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
tdble y
y coordinate
Definition tgf.h:116
tdble z
z coordinate
Definition tgf.h:117
tdble x
x coordinate
Definition tgf.h:115
int raceCmd
command issued by the driver
Definition car.h:352
tPosd vel
velocity
Definition tgf.h:144
tdble y
y coordinate
Definition tgf.h:131
tdble x
x coordinate
Definition tgf.h:130
tdble z
z coordinate
Definition tgf.h:132
int collision
Collision value for graphics and sound, clearing is managed by consumers.
Definition car.h:308
tDynPt DynGCg
GC data (world axis)
Definition car.h:193
double prio
Definition grcam.cpp:1281
int viewable
Definition grcam.cpp:1282
Location on the track in local coordinates.
Definition track.h:434
int type
Geometrical type:
Definition track.h:297
tdble radius
Radius in meters of the middle of the track (>0)
Definition track.h:337
tdble lgfromstart
Length of beginning of segment from starting line.
Definition track.h:336
int GfNearestPow2(int x)
Definition tgf.cpp:284
#define DEG2RAD(x)
Degree to radian conversion.
Definition tgf.h:75
#define GfTrace
Definition tgf.h:335
#define MAX(x, y)
Definition tgf.h:52
#define RAD2DEG(x)
Radian to degree conversion.
Definition tgf.h:74
#define TR_LPOS_SEGMENT
Relative to the segment which the point is located, including border and sides, mostly used for conta...
Definition track.h:443
struct RoadCam tRoadCam
road camera
#define TR_STR
Straight.
Definition track.h:304