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