46 if (((ndot * spinVel) < 0.0f) && (fabs(ndot) > fabs(spinVel))) {
49 if ((spinVel == 0.0f) && (ndot < 0.0f)) {
53 return spinVel + ndot;
63 if (differential->
dTqMax < 0.0f) differential->
dTqMax = 0.0f;
109 if (differential->
dTqMax < 0.0f) {
110 differential->
dTqMax = 0.0f;
140 tdble engineReaction;
144 DrTq = differential->
in.
Tq;
155 if (engineReaction != 0.0f) {
156 spinVel = engineReaction;
169 tdble DrTq, DrTq0, DrTq1;
171 tdble spinVel0, spinVel1;
173 tdble spdRatioMax, commomSpinVel;
174 tdble deltaSpd, deltaTq, bias, lockTq, biassign;
175 tdble engineReaction;
183 DrTq = differential->
in.
Tq;
188 inTq0 = differential->
inAxis[0]->
Tq;
189 inTq1 = differential->
inAxis[1]->
Tq;
191 commomSpinVel = (
tdble) (fabs(spinVel0) + fabs(spinVel1));
192 if (commomSpinVel != 0) {
193 tdble spdRatio = (
tdble) fabs(spinVel0 - spinVel1) / commomSpinVel;
195 switch (differential->
type) {
198 tdble spiderTq = inTq1 - inTq0;
199 DrTq0 = (DrTq + spiderTq)*0.5f;
200 DrTq1 = (DrTq - spiderTq)*0.5f;
204 if (DrTq > differential->
lockInputTq || DrTq < -differential->lockBrakeInputTq) {
217 spdRatioMax = differential->
dSlipMax - DrTq * differential->
dSlipMax / lockTq;
219 if (spdRatio > spdRatioMax) {
220 deltaSpd = (spdRatio - spdRatioMax) * commomSpinVel / 2.0f;
221 if (spinVel0 > spinVel1) {
222 spinVel0 -= deltaSpd;
223 spinVel1 += deltaSpd;
224 bias = -(spdRatio - spdRatioMax);
226 spinVel0 += deltaSpd;
227 spinVel1 -= deltaSpd;
228 bias = (spdRatio - spdRatioMax);
233 tdble spiderTq = inTq1 - inTq0;
234 DrTq0 = (DrTq*(1.0f + bias*biassign) + spiderTq)*0.5f;
235 DrTq1 = (DrTq*(1.0f - bias*biassign) - spiderTq)*0.5f;
239 if (spinVel0 >= spinVel1) {
240 DrTq0 = DrTq * differential->
dTqMin;
241 DrTq1 = DrTq * (1.0f - differential->
dTqMin);
243 deltaTq = differential->
dTqMin + (1.0f - (
tdble) exp(-fabs(differential->
viscosity * (spinVel0 - spinVel1)))) * differential->
dTqMax;
244 DrTq0 = DrTq * deltaTq;
245 DrTq1 = DrTq * (1.0f - deltaTq);
250 DrTq0 = DrTq1 = 0.0f;
267 meanv = (spinVel0 + spinVel1) / 2.0f;
270 engineReaction = engineReaction / meanv;
271 if (engineReaction != 0.0f) {
272 spinVel1 *= engineReaction;
273 spinVel0 *= engineReaction;
void SimDifferentialReConfig(tCar *car, int index)
static tdble applyBrakeToSpinVel(tdble spinVel, tdble brkTq, tdble inertia)
Integrate wheel/axle brake torque for one simulation step.
tCarPitSetupValue diffmaxtqbias[3]
bool SimAdjustPitCarSetupParam(tCarPitSetupValue *v)
#define SIGN(x)
Sign of the expression.
void SimDifferentialUpdate(tCar *car, tDifferential *differential, int first)
#define VAL_DIFF_LIMITED_SLIP
Section header structure.
#define PRM_MAX_SLIP_BIAS
tDifferential differential[3]
tCarPitSetupValue diffratio[3]
const char * GfParmGetStr(void *parmHandle, const char *path, const char *key, const char *deflt)
Get a string parameter from the parameter set handle.
static void updateSpool(tCar *car, tDifferential *differential, int first)
tCarPitSetupValue difflockinginputtq[3]
#define VAL_DIFF_VISCOUS_COUPLER
tdble SimEngineUpdateRpm(tCar *car, tdble axleRpm)
float tdble
Floating point type used in TORCS.
#define DIFF_VISCOUS_COUPLER
#define DIFF_LIMITED_SLIP
void SimDifferentialConfig(void *hdle, const char *section, tDifferential *differential)
tCarPitSetupValue diffmintqbias[3]
tdble GfParmGetNum(void *handle, const char *path, const char *key, const char *unit, tdble deflt)
Get a numerical parameter from the parameter set handle.
tTransmission transmission
#define PRM_VISCOSITY_FACTOR
tCarPitSetupValue diffslipbias[3]
#define PRM_LOCKINGBRAKE_TQ
tCarPitSetupValue difflockinginputbraketq[3]