TORCS  1.3.10
The Open Racing Car Simulator
Loading...
Searching...
No Matches
simu.cpp
Go to the documentation of this file.
1/***************************************************************************
2
3 file : simu.cpp
4 created : Sun Mar 19 00:07:53 CET 2000
5 copyright : (C) 2000-2017 by Eric Espie, Bernhard Wymann
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#include <stdlib.h>
21#include <stdio.h>
22#include <memory.h>
23#include <math.h>
24#ifdef WIN32
25#include <windows.h>
26#include <float.h>
27#define isnan _isnan
28#endif
29
30#include <tgf.h>
31#include <robottools.h>
32#include "sim.h"
33
37static int SimNbCars = 0;
38
42
43/*
44 * Check the input control from robots
45 */
46static void
48{
49 tTransmission *trans = &(car->transmission);
50 tClutch *clutch = &(trans->clutch);
51
52 /* sanity check */
53#if defined WIN32 || defined sun
54 if (isnan(car->ctrl->accelCmd)) car->ctrl->accelCmd = 0;
55 if (isnan(car->ctrl->brakeCmd)) car->ctrl->brakeCmd = 0;
56 if (isnan(car->ctrl->clutchCmd)) car->ctrl->clutchCmd = 0;
57 if (isnan(car->ctrl->steer)) car->ctrl->steer = 0;
58#else
59 if (isnan(car->ctrl->accelCmd) || isinf(car->ctrl->accelCmd)) car->ctrl->accelCmd = 0;
60 if (isnan(car->ctrl->brakeCmd) || isinf(car->ctrl->brakeCmd)) car->ctrl->brakeCmd = 0;
61 if (isnan(car->ctrl->clutchCmd) || isinf(car->ctrl->clutchCmd)) car->ctrl->clutchCmd = 0;
62 if (isnan(car->ctrl->steer) || isinf(car->ctrl->steer)) car->ctrl->steer = 0;
63#endif
64
65 /* When the car is broken try to send it on the track side */
66 if (car->carElt->_state & RM_CAR_STATE_BROKEN) {
67 car->ctrl->accelCmd = 0.0f;
68 car->ctrl->brakeCmd = 0.1f;
69 car->ctrl->gear = 0;
70 if (car->trkPos.toRight > car->trkPos.seg->width / 2.0) {
71 car->ctrl->steer = 0.1f;
72 } else {
73 car->ctrl->steer = -0.1f;
74 }
75 } else if (car->carElt->_state & RM_CAR_STATE_ELIMINATED) {
76 car->ctrl->accelCmd = 0.0f;
77 car->ctrl->brakeCmd = 0.1f;
78 car->ctrl->gear = 0;
79 if (car->trkPos.toRight > car->trkPos.seg->width / 2.0) {
80 car->ctrl->steer = 0.1f;
81 } else {
82 car->ctrl->steer = -0.1f;
83 }
84 } else if (car->carElt->_state & RM_CAR_STATE_FINISH) {
85 /* when the finish line is passed, continue at "slow" pace */
86 car->ctrl->accelCmd = MIN(car->ctrl->accelCmd, 0.20);
87 if (car->DynGC.vel.x > 30.0) {
88 car->ctrl->brakeCmd = MAX(car->ctrl->brakeCmd, 0.05);
89 }
90 }
91
92 /* check boundaries */
93 if (car->ctrl->accelCmd > 1.0) {
94 car->ctrl->accelCmd = 1.0;
95 } else if (car->ctrl->accelCmd < 0.0) {
96 car->ctrl->accelCmd = 0.0;
97 }
98 if (car->ctrl->brakeCmd > 1.0) {
99 car->ctrl->brakeCmd = 1.0;
100 } else if (car->ctrl->brakeCmd < 0.0) {
101 car->ctrl->brakeCmd = 0.0;
102 }
103 if (car->ctrl->clutchCmd > 1.0) {
104 car->ctrl->clutchCmd = 1.0;
105 } else if (car->ctrl->clutchCmd < 0.0) {
106 car->ctrl->clutchCmd = 0.0;
107 }
108 if (car->ctrl->steer > 1.0) {
109 car->ctrl->steer = 1.0;
110 } else if (car->ctrl->steer < -1.0) {
111 car->ctrl->steer = -1.0;
112 }
113
114 clutch->transferValue = 1.0 - car->ctrl->clutchCmd;
115}
116
117/* Initial configuration */
118void
119SimConfig(tCarElt *carElt, RmInfo *info)
120{
121 tCar *car = &(SimCarTable[carElt->index]);
122
123 memset(car, 0, sizeof(tCar));
124
125 car->carElt = carElt;
126 car->DynGCg = car->DynGC = carElt->_DynGC;
127 car->worldPosX = car->DynGCg.pos.x;
128 car->worldPosY = car->DynGCg.pos.y;
129 car->publishedPosX = car->DynGCg.pos.x;
130 car->publishedPosY = car->DynGCg.pos.y;
131 carElt->_pos_X_D = carElt->_pos_X;
132 carElt->_pos_Y_D = carElt->_pos_Y;
133 car->trkPos = carElt->_trkPos;
134 car->ctrl = &carElt->ctrl;
135 car->params = carElt->_carHandle;
136
137 SimCarConfig(car);
138
139 SimCarCollideConfig(car, info->track);
140 sgMakeCoordMat4(carElt->pub.posMat, carElt->_pos_X, carElt->_pos_Y, carElt->_pos_Z - carElt->_statGC_z,
141 RAD2DEG(carElt->_yaw), RAD2DEG(carElt->_roll), RAD2DEG(carElt->_pitch));
142}
143
144/* After pit stop */
145void SimReConfig(tCarElt *carElt)
146{
147 tCar *car = &(SimCarTable[carElt->index]);
148 if (carElt->pitcmd.fuel > 0) {
149 car->fuel += carElt->pitcmd.fuel;
150 if (car->fuel > car->tank) car->fuel = car->tank;
151 }
152
153 if (carElt->pitcmd.repair > 0) {
154 car->dammage -= carElt->pitcmd.repair;
155 if (car->dammage < 0) car->dammage = 0;
156 }
157
158 int i;
159 SimSteerReConfig(car);
161
162 for (i = 0; i < 2; i++) {
163 SimWingReConfig(car, i);
164 SimAxleReConfig(car, i);
165 }
166
167 for (i = 0; i < 4; i++) {
168 SimWheelReConfig(car, i);
169 if (carElt->pitcmd.tireChange == tCarPitCmd::ALL) {
170 SimWheelResetWear(car, i);
171 }
172 }
173
175}
176
177
178static void
180{
181 int i;
182 tCarElt *carElt;
183 tTrkLocPos trkPos;
184 int trkFlag;
185 tdble travelTime;
186 tdble dang;
187
188 static tdble PULL_Z_OFFSET = 3.0;
189 static tdble PULL_SPD = 0.5;
190
191 carElt = car->carElt;
192
193 if (carElt->_state & RM_CAR_STATE_PULLUP) {
194 carElt->_pos_Z += car->restPos.vel.z * SimDeltaTime;
195 carElt->_yaw += car->restPos.vel.az * SimDeltaTime;
196 carElt->_roll += car->restPos.vel.ax * SimDeltaTime;
197 carElt->_pitch += car->restPos.vel.ay * SimDeltaTime;
198 sgMakeCoordMat4(carElt->pub.posMat, carElt->_pos_X, carElt->_pos_Y, carElt->_pos_Z - carElt->_statGC_z,
199 RAD2DEG(carElt->_yaw), RAD2DEG(carElt->_roll), RAD2DEG(carElt->_pitch));
200
201 if (carElt->_pos_Z > (car->restPos.pos.z + PULL_Z_OFFSET)) {
202 carElt->_state &= ~RM_CAR_STATE_PULLUP;
203 carElt->_state |= RM_CAR_STATE_PULLSIDE;
204 // Moved pullside velocity computation down due to floating point error accumulation.
205 }
206 return;
207 }
208
209
210 if (carElt->_state & RM_CAR_STATE_PULLSIDE) {
211 // Recompute velocity to converge on the parking point without overshooting.
212 travelTime = DIST(car->restPos.pos.x, car->restPos.pos.y, carElt->_pos_X_D, carElt->_pos_Y_D) / PULL_SPD;
213 car->restPos.vel.x = (car->restPos.pos.x - carElt->_pos_X_D) / travelTime;
214 car->restPos.vel.y = (car->restPos.pos.y - carElt->_pos_Y_D) / travelTime;
215
216 carElt->_pos_X_D += (double)car->restPos.vel.x * SimDeltaTime;
217 carElt->_pos_Y_D += (double)car->restPos.vel.y * SimDeltaTime;
218 carElt->_pos_X = (tdble)carElt->_pos_X_D;
219 carElt->_pos_Y = (tdble)carElt->_pos_Y_D;
220 sgMakeCoordMat4(carElt->pub.posMat, carElt->_pos_X, carElt->_pos_Y, carElt->_pos_Z - carElt->_statGC_z,
221 RAD2DEG(carElt->_yaw), RAD2DEG(carElt->_roll), RAD2DEG(carElt->_pitch));
222
223 if ((fabs(car->restPos.pos.x - carElt->_pos_X_D) < 0.5) && (fabs(car->restPos.pos.y - carElt->_pos_Y_D) < 0.5)) {
224 carElt->_state &= ~RM_CAR_STATE_PULLSIDE;
225 carElt->_state |= RM_CAR_STATE_PULLDN;
226 }
227 return;
228 }
229
230
231 if (carElt->_state & RM_CAR_STATE_PULLDN) {
232 carElt->_pos_Z -= car->restPos.vel.z * SimDeltaTime;
233 sgMakeCoordMat4(carElt->pub.posMat, carElt->_pos_X, carElt->_pos_Y, carElt->_pos_Z - carElt->_statGC_z,
234 RAD2DEG(carElt->_yaw), RAD2DEG(carElt->_roll), RAD2DEG(carElt->_pitch));
235
236 if (carElt->_pos_Z < car->restPos.pos.z) {
237 carElt->_state &= ~RM_CAR_STATE_PULLDN;
238 carElt->_state |= RM_CAR_STATE_OUT;
239 }
240 return;
241 }
242
243
244 if (carElt->_state & (RM_CAR_STATE_NO_SIMU & ~RM_CAR_STATE_PIT)) {
245 return;
246 }
247
248 if (carElt->_state & RM_CAR_STATE_PIT) {
249 if ((s->_maxDammage) && (car->dammage > s->_maxDammage)) {
250 // Broken during pit stop.
251 carElt->_state &= ~RM_CAR_STATE_PIT;
252 carElt->_pit->pitCarIndex = TR_PIT_STATE_FREE;
253 } else {
254 return;
255 }
256 }
257
258 if ((s->_maxDammage) && (car->dammage > s->_maxDammage)) {
259 carElt->_state |= RM_CAR_STATE_BROKEN;
260 } else {
261 carElt->_state |= RM_CAR_STATE_OUTOFGAS;
262 }
263
264 carElt->_gear = car->transmission.gearbox.gear = 0;
265 carElt->_enginerpm = car->engine.rads = 0;
266
267 if (!(carElt->_state & RM_CAR_STATE_DNF)) {
268 if (fabs(carElt->_speed_x) > 1.0) {
269 return;
270 }
271 }
272
273 carElt->_state |= RM_CAR_STATE_PULLUP;
274 // RM_CAR_STATE_NO_SIMU evaluates to > 0 from here, so we remove the car from the
275 // collision detection.
276 SimCollideRemoveCar(car, s->_ncars);
277
278 carElt->priv.simcollision = carElt->priv.collision = car->collision = 0;
279 for(i = 0; i < 4; i++) {
280 carElt->_skid[i] = 0;
281 carElt->_wheelSpinVel(i) = 0;
282 carElt->_brakeTemp(i) = 0;
283 }
284
285 carElt->pub.DynGC = car->DynGC;
286 carElt->_speed_x = 0;
287
288 // Compute the target zone for the wrecked car.
289 trkPos = car->trkPos;
290 if (trkPos.toRight > trkPos.seg->width / 2.0) {
291 while (trkPos.seg->lside != 0) {
292 trkPos.seg = trkPos.seg->lside;
293 }
294 trkPos.toLeft = -3.0;
295 trkFlag = TR_TOLEFT;
296 } else {
297 while (trkPos.seg->rside != 0) {
298 trkPos.seg = trkPos.seg->rside;
299 }
300 trkPos.toRight = -3.0;
301 trkFlag = TR_TORIGHT;
302 }
303
304 trkPos.type = TR_LPOS_SEGMENT;
305 RtTrackLocal2Global(&trkPos, &(car->restPos.pos.x), &(car->restPos.pos.y), trkFlag);
306 car->restPos.pos.z = RtTrackHeightL(&trkPos) + carElt->_statGC_z;
307 car->restPos.pos.az = RtTrackSideTgAngleL(&trkPos);
308 car->restPos.pos.ax = 0;
309 car->restPos.pos.ay = 0;
310
311 car->restPos.vel.z = PULL_SPD;
312 travelTime = (car->restPos.pos.z + PULL_Z_OFFSET - carElt->_pos_Z) / car->restPos.vel.z;
313 dang = car->restPos.pos.az - carElt->_yaw;
314 NORM_PI_PI(dang);
315 car->restPos.vel.az = dang / travelTime;
316 dang = car->restPos.pos.ax - carElt->_roll;
317 NORM_PI_PI(dang);
318 car->restPos.vel.ax = dang / travelTime;
319 dang = car->restPos.pos.ay - carElt->_pitch;
320 NORM_PI_PI(dang);
321 car->restPos.vel.ay = dang / travelTime;
322}
323
324
325
326void
327SimUpdate(tSituation *s, double deltaTime, int telemetry)
328{
329 int i;
330 int ncar;
331 tCarElt *carElt;
332 tCar *car;
333
334 SimDeltaTime = deltaTime;
336 for (ncar = 0; ncar < s->_ncars; ncar++) {
337 SimCarTable[ncar].collision = 0;
338 SimCarTable[ncar].blocked = 0;
339 }
340
341 for (ncar = 0; ncar < s->_ncars; ncar++) {
342 car = &(SimCarTable[ncar]);
343 carElt = car->carElt;
344
345 if (carElt->_state & RM_CAR_STATE_NO_SIMU) {
346 RemoveCar(car, s);
347 continue;
348 } else if (((s->_maxDammage) && (car->dammage > s->_maxDammage)) ||
349 (car->fuel == 0) ||
350 (car->carElt->_state & RM_CAR_STATE_ELIMINATED)) {
351 RemoveCar(car, s);
352 if (carElt->_state & RM_CAR_STATE_NO_SIMU) {
353 continue;
354 }
355 }
356
357 if (s->_raceState & RM_RACE_PRESTART) {
358 car->ctrl->gear = 0;
359 }
360
361 SimAtmosphereUpdate(car, s);
362 CHECK(car);
363 ctrlCheck(car);
364 CHECK(car);
365 SimSteerUpdate(car);
366 CHECK(car);
367 SimGearboxUpdate(car);
368 CHECK(car);
370 CHECK(car);
371
372 if (!(s->_raceState & RM_RACE_PRESTART)) {
373
375 CHECK(car);
377 CHECK(car);
378 SimAeroUpdate(car, s);
379 CHECK(car);
380 for (i = 0; i < 2; i++){
381 SimWingUpdate(car, i, s);
382 }
383 CHECK(car);
384 for (i = 0; i < 4; i++){
385 SimWheelUpdateRide(car, i);
386 }
387 CHECK(car);
388 for (i = 0; i < 2; i++){
389 SimAxleUpdate(car, i);
390 }
391 CHECK(car);
392 for (i = 0; i < 4; i++){
393 SimWheelUpdateForce(car, i);
394 SimWheelUpdateTire(car, i);
395
396 // Reset tire damage in pre simulation state (when the model is thrown in the world)
397 if (s->_raceState == 0) {
398 SimWheelResetWear(car, i);
399 }
400 }
401 CHECK(car);
403 CHECK(car);
405 CHECK(car);
406 SimCarUpdate(car, s);
407 CHECK(car);
408 } else {
409 SimEngineUpdateRpm(car, 0.0);
410 }
411 }
412
414
415 /* printf ("%f - ", s->currentTime); */
416
417 for (ncar = 0; ncar < s->_ncars; ncar++) {
418 car = &(SimCarTable[ncar]);
419 CHECK(car);
420 carElt = car->carElt;
421
422 if (carElt->_state & RM_CAR_STATE_NO_SIMU) {
423 continue;
424 }
425
426 CHECK(car);
427 SimCarUpdate2(car, s); /* telemetry */
428
429 /* copy back the data to carElt */
430 car->worldPosX += (double)car->DynGCg.pos.x - car->publishedPosX;
431 car->worldPosY += (double)car->DynGCg.pos.y - car->publishedPosY;
432 car->publishedPosX = car->DynGCg.pos.x;
433 car->publishedPosY = car->DynGCg.pos.y;
434 carElt->pub.DynGC = car->DynGC;
435 carElt->pub.DynGCg = car->DynGCg;
436 carElt->_pos_X_D = car->worldPosX + (double)carElt->_pos_X - car->DynGCg.pos.x;
437 carElt->_pos_Y_D = car->worldPosY + (double)carElt->_pos_Y - car->DynGCg.pos.y;
438 carElt->pub.speed = car->speed;
439 sgMakeCoordMat4(carElt->pub.posMat, carElt->_pos_X, carElt->_pos_Y, carElt->_pos_Z - carElt->_statGC_z,
440 RAD2DEG(carElt->_yaw), RAD2DEG(carElt->_roll), RAD2DEG(carElt->_pitch));
441 carElt->_trkPos = car->trkPos;
442
443 for (i = 0; i < 4; i++) {
444 tWheelState* const wheelState = &(carElt->priv.wheel[i]);
445 const tWheel* const wheel = &(car->wheel[i]);
446
447 wheelState->relPos = wheel->relPos;
448 wheelState->seg = wheel->trkPos.seg;
449 wheelState->brakeTemp = wheel->brake.temp;
450 wheelState->currentGraining = wheel->currentGraining;
451 wheelState->currentPressure = wheel->currentPressure;
452 wheelState->currentTemperature = wheel->currentTemperature;
453 wheelState->currentWear = wheel->currentWear;
454
455 carElt->pub.corner[i] = car->corner[i].pos;
456 }
457
458 carElt->_gear = car->transmission.gearbox.gear;
459 carElt->_enginerpm = car->engine.rads;
460 carElt->_fuel = car->fuel;
461 carElt->priv.collision |= car->collision;
462 carElt->priv.simcollision = car->collision;
463 carElt->_dammage = car->dammage;
464 carElt->priv.localPressure = car->localPressure;
467 }
468}
469
470
471void
472SimInit(int nbcars, tTrack* track, tdble fuelFactor, tdble damageFactor, tdble tireFactor)
473{
474 rulesFuelFactor = fuelFactor;
475 rulesDamageFactor = damageFactor;
476 rulesTireFactor = tireFactor;
477 SimNbCars = nbcars;
478 SimCarTable = (tCar*)calloc(nbcars, sizeof(tCar));
480}
481
482void
484{
485 tCar *car;
486 int ncar;
487
489 if (SimCarTable) {
490 for (ncar = 0; ncar < SimNbCars; ncar++) {
491 car = &(SimCarTable[ncar]);
493 }
494 free(SimCarTable);
495 SimCarTable = 0;
496 }
497}
498
499
501{
502 // If min == max there is nothing to adjust
503 if (fabs(v->max - v->min) >= 0.0001f) {
504 // Ensure that value is in intended borders
505 if (v->value > v->max) {
506 v->value = v->max;
507 } else if (v->value < v->min) {
508 v->value = v->min;
509 }
510 return true;
511 }
512
513 v->value = v->max;
514 return false;
515}
void SimWingUpdate(tCar *car, int index, tSituation *s)
Definition aero.cpp:147
void SimAeroUpdate(tCar *car, tSituation *s)
Definition aero.cpp:37
void SimWingReConfig(tCar *car, int index)
Definition aero.cpp:131
void SimAtmosphereUpdate(tCar *car, tSituation *s)
void SimAxleUpdate(tCar *car, int index)
Definition axle.cpp:66
void SimAxleReConfig(tCar *car, int index)
Definition axle.cpp:49
void SimBrakeSystemUpdate(tCar *car)
Definition brake.cpp:73
void SimBrakeSystemReConfig(tCar *car)
Definition brake.cpp:59
void SimCarUpdateWheelPos(tCar *car)
Definition car.cpp:275
void SimCarConfig(tCar *car)
Definition car.cpp:29
void SimCarUpdate2(tCar *car, tSituation *)
Definition car.cpp:435
void SimCarUpdate(tCar *car, tSituation *)
Definition car.cpp:417
#define RM_CAR_STATE_OUTOFGAS
Out of Gas.
Definition car.h:219
#define RM_CAR_STATE_PIT
Car currently stopped in pits.
Definition car.h:211
#define RM_CAR_STATE_NO_SIMU
Do not simulate the car.
Definition car.h:217
#define RM_CAR_STATE_PULLSIDE
Car pulled out in the air.
Definition car.h:214
#define RM_CAR_STATE_DNF
Car did not finish.
Definition car.h:212
struct CarElt tCarElt
Car structure (tCarElt).
#define RM_CAR_STATE_PULLUP
Car pulled out in the air.
Definition car.h:213
#define RM_CAR_STATE_FINISH
Car having passed the finish line.
Definition car.h:210
#define RM_CAR_STATE_OUT
Car out of race.
Definition car.h:216
#define RM_CAR_STATE_BROKEN
Engine no more working.
Definition car.h:218
#define RM_CAR_STATE_PULLDN
Car pulled out in the air.
Definition car.h:215
#define RM_CAR_STATE_ELIMINATED
Eliminated due to rules infringement.
Definition car.h:220
#define CHECK(_car_)
Definition carstruct.h:149
void SimCarCollideConfig(tCar *car, tTrack *track)
Definition collide.cpp:700
void SimCarCollideInit(tTrack *track)
Definition collide.cpp:720
void SimCarCollideShutdown(int nbcars)
Definition collide.cpp:522
void SimCarCollideCars(tSituation *s)
Definition collide.cpp:748
void SimCollideRemoveCar(tCar *car, int nbcars)
Definition collide.cpp:496
void SimEngineShutdown(tCar *car)
Definition engine.cpp:212
void SimEngineUpdateTq(tCar *car)
Definition engine.cpp:112
tdble SimEngineUpdateRpm(tCar *car, tdble axleRpm)
Definition engine.cpp:162
float tdble
Floating point type used in TORCS.
Definition tgf.h:47
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
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
#define RM_RACE_PRESTART
Definition raceman.h:67
struct Situation tSituation
cars situation used to inform the GUI and the drivers
void SimGearboxUpdate(tCar *car)
tCar * SimCarTable
Definition simu.cpp:34
void SimSteerUpdate(tCar *car)
Definition steer.cpp:41
int SimTelemetry
Definition simu.cpp:36
tdble rulesDamageFactor
Definition simu.cpp:40
void SimWheelUpdateRide(tCar *car, int index)
Definition wheel.cpp:166
void SimWheelResetWear(tCar *car, int index)
Definition wheel.cpp:504
tdble rulesTireFactor
Definition simu.cpp:41
void SimWheelUpdateForce(tCar *car, int index)
Definition wheel.cpp:211
void SimWheelReConfig(tCar *car, int index)
Definition wheel.cpp:137
void SimWheelUpdateRotation(tCar *car)
Definition wheel.cpp:373
void SimTransmissionReConfig(tCar *car)
void SimTransmissionUpdate(tCar *car)
tdble rulesFuelFactor
Definition simu.cpp:39
void SimWheelUpdateTire(tCar *car, int index)
Definition wheel.cpp:421
tdble SimDeltaTime
Definition simu.cpp:35
void SimSteerReConfig(tCar *car)
Definition steer.cpp:31
static int SimNbCars
Definition simu.cpp:37
static void RemoveCar(tCar *car, tSituation *s)
Definition simu.cpp:179
void SimReConfig(tCarElt *carElt)
Definition simu.cpp:145
void SimConfig(tCarElt *carElt, RmInfo *info)
Definition simu.cpp:119
void SimShutdown(void)
Definition simu.cpp:483
void SimUpdate(tSituation *s, double deltaTime, int telemetry)
Definition simu.cpp:327
void SimInit(int nbcars, tTrack *track, tdble fuelFactor, tdble damageFactor, tdble tireFactor)
Definition simu.cpp:472
static void ctrlCheck(tCar *car)
Definition simu.cpp:47
bool SimAdjustPitCarSetupParam(tCarPitSetupValue *v)
Definition simu.cpp:500
tPrivCar priv
private
Definition car.h:463
tPublicCar pub
public
Definition car.h:461
tCarPitCmd pitcmd
private
Definition car.h:465
tCarCtrl ctrl
private
Definition car.h:464
int index
car index
Definition car.h:459
Race Manager General Info.
Definition raceman.h:220
tTrack * track
Current track.
Definition raceman.h:223
tdble temp
Definition brake.h:29
int repCmdMaxClicks
Definition brake.h:39
int gear
[-1,6] for gear selection
Definition car.h:351
tdble steer
Steer command [-1.0, 1.0].
Definition car.h:347
int brakeRepartitionCmd
Brake balance "clicks", positive is to the front.
Definition car.h:361
tdble clutchCmd
Clutch command [0.0, 1.0].
Definition car.h:350
tdble accelCmd
Accelerator command [0.0, 1.0].
Definition car.h:348
tdble brakeCmd
Brake command [0.0, 1.0].
Definition car.h:349
tdble fuel
Definition carstruct.h:63
tWheel wheel[4]
Definition carstruct.h:46
tDynPt DynGCg
Definition carstruct.h:65
tBrakeSyst brkSyst
Definition carstruct.h:48
tdble publishedPosX
Definition carstruct.h:68
void * params
Definition carstruct.h:39
tTransmission transmission
Definition carstruct.h:51
tCarElt * carElt
Definition carstruct.h:40
double worldPosX
Definition carstruct.h:66
tdble speed
Definition carstruct.h:92
tDynPt DynGC
Definition carstruct.h:64
tdble publishedPosY
Definition carstruct.h:69
tEngine engine
Definition carstruct.h:52
int collision
Definition carstruct.h:79
tTrkLocPos trkPos
Definition carstruct.h:72
tDynPt corner[4]
Definition carstruct.h:78
tCarCtrl * ctrl
Definition carstruct.h:38
tdble tank
Definition carstruct.h:58
tdble localPressure
Definition carstruct.h:95
double worldPosY
Definition carstruct.h:67
tDynPt restPos
Definition carstruct.h:89
int dammage
Definition carstruct.h:87
@ ALL
Definition car.h:445
TireChange tireChange
Definition car.h:447
int repair
Definition car.h:439
tdble fuel
Definition car.h:438
tdble value
Definition car.h:377
tdble transferValue
tPosd vel
velocity
Definition tgf.h:144
tPosd pos
position
Definition tgf.h:143
tdble rads
Definition engine.h:46
tdble y
y coordinate
Definition tgf.h:131
tdble x
x coordinate
Definition tgf.h:130
tdble z
z coordinate
Definition tgf.h:132
tdble ay
angle along y axis
Definition tgf.h:134
tdble ax
angle along x axis
Definition tgf.h:133
tdble az
angle along z axis
Definition tgf.h:135
int brakeRepartitionCmd
Definition car.h:318
tWheelState wheel[4]
Definition car.h:292
int collision
Collision value for graphics and sound, clearing is managed by consumers.
Definition car.h:308
int repCmdMaxClicks
Definition car.h:317
int simcollision
For rules etc.
Definition car.h:309
tdble localPressure
Definition car.h:316
tDynPt DynGCg
GC data (world axis)
Definition car.h:193
tPosd corner[4]
Definition car.h:222
tDynPt DynGC
GC data (car axis)
Definition car.h:192
sgMat4 posMat
position matrix
Definition car.h:195
tdble speed
Definition car.h:194
Track structure.
Definition track.h:533
tGearbox gearbox
Location on the track in local coordinates.
Definition track.h:434
tdble toLeft
Distance (- to left, + to right) relative to left side of segment.
Definition track.h:449
tdble toRight
Distance (+ to left, - to right) relative to the right side of segment.
Definition track.h:447
tTrackSeg * seg
Track segment.
Definition track.h:435
int type
Type of description:
Definition track.h:436
Definition wheel.h:26
tdble currentPressure
Definition wheel.h:99
double currentWear
Definition wheel.h:101
tBrake brake
Definition wheel.h:30
tdble currentGraining
Definition wheel.h:102
tdble currentTemperature
Definition wheel.h:100
tPosd relPos
Definition wheel.h:53
tTrkLocPos trkPos
Definition wheel.h:51
Dynamic wheel information.
Definition car.h:251
tdble brakeTemp
brake temperature from 0 (cool) to 1.0 (hot)
Definition car.h:254
tdble currentGraining
Definition car.h:266
tdble currentTemperature
Definition car.h:264
tdble currentPressure
Definition car.h:263
tdble currentWear
Definition car.h:265
tTrackSeg * seg
Track segment where the wheel is.
Definition car.h:256
tPosd relPos
position relative to GC
Definition car.h:252
struct trackSeg * rside
Definition track.h:421
tdble width
Width of the segment (if constant width)
Definition track.h:333
struct trackSeg * lside
Definition track.h:421
int telemetry(tModInfo *modInfo)
#define NORM_PI_PI(x)
Angle normalization between -PI and PI.
Definition tgf.h:87
#define MIN(x, y)
Definition tgf.h:56
#define MAX(x, y)
Definition tgf.h:52
#define DIST(x1, y1, x2, y2)
Distance between two points.
Definition tgf.h:96
#define RAD2DEG(x)
Radian to degree conversion.
Definition tgf.h:74
#define TR_PIT_STATE_FREE
Definition track.h:459
#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
#define TR_TORIGHT
Definition track.h:428
#define TR_TOLEFT
Definition track.h:430
int track(tModInfo *modInfo)
Definition trackitf.cpp:85