1 /***************************************************************************
2
3 file : sim.h
4 created : Sun Mar 19 00:07:42 CET 2000
5 copyright : (C) 2000 by Eric Espie
6 email : torcs@free.fr
7 version : $Id: sim.h,v 1.20.2.3 2014/04/14 04:54:03 berniw Exp $
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 #ifndef _SIMFCT_H_
21 #define _SIMFCT_H_
22
23 #include <math.h>
24 #include <stdio.h>
25 #include <cstring>
26 #ifdef WIN32
27 #include <float.h>
28 #define isnan _isnan
29 #endif
30
31 #include <tgf.h>
32 #include <track.h>
33 #include <car.h>
34 #include <raceman.h>
35 #include <simu.h>
36 #include "carstruct.h"
37 #include <robottools.h>
38
39 extern void SimConfig(tCarElt *carElt, tRmInfo* ReInfo);
40 extern void SimReConfig(tCarElt *carElt);
41 extern void SimUpdate(tSituation*, double deltaTime, int telemetry);
42 extern void SimInit(int nbcars, tTrack* track, tdble fuelFactor, tdble damageFactor);
43 extern void SimShutdown(void);
44
45 extern void SimAxleConfig(tCar *car, int index);
46 extern void SimAxleUpdate(tCar *car, int index);
47
48 extern void SimCarConfig(tCar *car);
49 extern void SimCarUpdate(tCar *car, tSituation*);
50 extern void SimCarUpdate2(tCar *car, tSituation*);
51
52 extern void SimSuspCheckIn(tSuspension *susp);
53 extern void SimSuspUpdate(tSuspension *susp);
54 extern void SimSuspConfig(void *hdle, const char *section, tSuspension *susp, tdble F0, tdble X0);
55 extern void SimSuspDamage(tSuspension* susp, tdble dmg);
56
57 extern void SimWheelConfig(tCar *car, int index);
58 extern void SimWheelUpdateRide(tCar *car, int index);
59 extern void SimWheelUpdateForce(tCar *car, int index);
60 extern void SimWheelUpdateRotation(tCar *car);
61 extern void SimUpdateFreeWheels(tCar *car, int axlenb);
62
63 extern void SimSteerConfig(tCar *car);
64 extern void SimSteerUpdate(tCar *car);
65
66 extern void SimBrakeConfig(void *hdle, const char *section, tBrake *brake);
67 extern void SimBrakeUpdate(tCar *car, tWheel *wheel, tBrake *brake);
68 extern void SimBrakeSystemConfig(tCar *car);
69 extern void SimBrakeSystemUpdate(tCar *car);
70
71 extern void SimAeroConfig(tCar *car);
72 extern void SimAeroUpdate(tCar *car, tSituation *s);
73 extern void SimAeroDamage(tCar *car, sgVec3 poc, tdble F);
74 extern void SimWingConfig(tCar *car, int index);
75 extern void SimWingUpdate(tCar *car, int index, tSituation *s);
76
77 extern void SimCarUpdateWheelPos(tCar *car);
78
79 extern void SimTransmissionConfig(tCar *car);
80 extern void SimTransmissionUpdate(tCar *car);
81 extern void SimGearboxUpdate(tCar *car);
82
83 extern void SimDifferentialConfig(void *hdle, const char *section, tDifferential *differential);
84 extern void SimDifferentialUpdate(tCar *car, tDifferential *differential, int first);
85
86 extern void SimEngineConfig(tCar *car);
87 extern void SimEngineUpdateTq(tCar *car);
88 extern tdble SimEngineUpdateRpm(tCar *car, tdble axleRpm);
89 extern void SimEngineShutdown(tCar *car);
90
91 extern void SimCarCollideZ(tCar *car);
92 extern void SimCarCollideXYScene(tCar *car);
93 extern void SimCarCollideCars(tSituation*);
94 extern void SimCarCollideConfig(tCar *car);
95 extern void SimCarCollideShutdown(int nbcars);
96 extern void SimCarCollideInit(void);
97 extern void SimCarCollideAddDeformation(tCar* car, sgVec3 pos, sgVec3 force);
98 extern void NaiveRotate (t3Dd v, t3Dd u, t3Dd* v0);
99 extern void NaiveInverseRotate (t3Dd v, t3Dd u, t3Dd* v0);
100 extern void QuatToEuler (sgVec3 hpr, const sgQuat quat);
101 extern void EulerToQuat (sgQuat quat, tdble h, tdble p, tdble r);
102 extern void SimCarAddAngularVelocity (tCar* car);
103 extern tdble ConstantFriction (tdble u, tdble du);
104 extern tdble ConstantFriction (tdble u, tdble a, tdble dt);
105 extern tdble PartialFlowRectangle(tdble theta, tdble psi);
106 extern tdble PartialFlowSmooth(tdble theta, tdble psi);
107 extern tdble PartialFlowSphere(tdble theta, tdble psi);
108
109 extern tdble SimDeltaTime;
110 extern int SimTelemetry;
111 extern tCar *SimCarTable;
112 extern t3Dd vectStart[];
113 extern t3Dd vectEnd[];
114
115 extern tdble simDammageFactor[];
116 extern tdble simSkidFactor[];
117
118 /// return a number drawn uniformly from [0,1]
urandom()119 inline float urandom() {
120 //return (((float)rand()/(1.0+(float)RAND_MAX)));
121 return ((((float)rand()-1)/((float)RAND_MAX)));
122 }
123
124 /// Due to numerical precision we sometimes get 1 or greater
125 /// using urandom() or indeed, drand48().
126 /// This
safe_urandom()127 inline float safe_urandom() {
128 float X;
129 do {
130 X = urandom();
131 } while (X>=1);
132 return X;
133 }
134
t2sg3(t3Dd & p,sgVec3 & v)135 inline void t2sg3 (t3Dd& p, sgVec3& v)
136 {
137 v[SG_X] = p.x;
138 v[SG_Y] = p.y;
139 v[SG_Z] = p.z;
140 }
141
sg2t3(sgVec3 & v,t3Dd & p)142 inline void sg2t3 (sgVec3& v, t3Dd& p)
143 {
144 p.x = v[SG_X];
145 p.y = v[SG_Y];
146 p.z = v[SG_Z];
147 }
148
149 #define SIM_VECT_COLL 12
150 #define SIM_VECT_SPD 13
151 #define SIM_VECT_ACCEL 14
152 #define SIM_WHEEL_SPD 16
153 #define SIM_WHEEL_ACCEL 20
154
155 #define SIM_Z_OFFSET 2.0
156
157 #endif /* _SIMFCT_H_ */
158
159
160
161