- update simuV5

git-svn-id: https://svn.code.sf.net/p/speed-dreams/code/trunk@9181 30fe4595-0a0c-4342-8851-515496e4dcbd
This commit is contained in:
torcs-ng 2023-10-29 14:48:03 +00:00
parent 4f68969dbc
commit 699886d40c
6 changed files with 250 additions and 97 deletions

View File

@ -36,6 +36,9 @@
<!-- Experimental code, use only for development or testing -->
<attstr name="fixed wheel force" in="yes,no" val="no"/>
<!-- Experimental code, use only for development or testing -->
<attstr name="tire compounds" in="yes,no" val="no"/>
<!-- Experimental code, use only for development or testing -->
<!-- Cars set up for this feature enable it in their xml files. -->
<!--attstr name="enable tcl" in="yes,no" val="yes"/-->

View File

@ -754,7 +754,8 @@ void HumanDriver::pause_race(int index, tCarElt* /*car*/, tSituation* /*s*/)
const int idx = index - 1;
//reset force feedback to zero (if set)
if(HCtx[idx]->lastForceFeedbackLevel){
if(HCtx[idx]->lastForceFeedbackLevel)
{
gfctrlJoyConstantForce(HCtx[idx]->lastForceFeedbackIndex, 0, 0);
}
}
@ -774,7 +775,8 @@ void HumanDriver::resume_race(int index, tCarElt* car, tSituation *s)
// re-read the controls as they may have changed
read_prefs(index);
if (resume_keybd) {
if (resume_keybd)
{
GfOut("Clearing Keyboard map (index %d)\n", index);
keyIndex = 0;
mapKeys.clear();
@ -797,14 +799,18 @@ void HumanDriver::resume_race(int index, tCarElt* car, tSituation *s)
}//for i
//restore force feedback effect to the wheel (if was set)
if(HCtx[idx]->lastForceFeedbackLevel) {
if(cmd[CMD_LEFTSTEER].type != GFCTRL_TYPE_KEYBOARD && cmd[CMD_LEFTSTEER].type != GFCTRL_TYPE_MOUSE_AXIS){
if(HCtx[idx]->lastForceFeedbackLevel)
{
if(cmd[CMD_LEFTSTEER].type != GFCTRL_TYPE_KEYBOARD && cmd[CMD_LEFTSTEER].type != GFCTRL_TYPE_MOUSE_AXIS)
{
HCtx[idx]->lastForceFeedbackIndex = int((cmd[CMD_LEFTSTEER].val) / GFCTRL_JOY_NUMBER);
gfctrlJoyConstantForce(
HCtx[idx]->lastForceFeedbackIndex,
HCtx[idx]->lastForceFeedbackLevel,
HCtx[idx]->lastForceFeedbackDir );
} else {
}
else
{
HCtx[idx]->lastForceFeedbackLevel = 0; // forget force feedback level
}
}
@ -815,13 +821,13 @@ void HumanDriver::end_race(int index, tCarElt* /*car*/, tSituation* /*s*/)
const int idx = index - 1;
//reset force feedback to zero (if set)
if(HCtx[idx]->lastForceFeedbackLevel){
if(HCtx[idx]->lastForceFeedbackLevel)
{
gfctrlJoyConstantForce(HCtx[idx]->lastForceFeedbackIndex, 0, 0);
HCtx[idx]->lastForceFeedbackLevel = 0; // forget force feedback level
}
}
/*
* Changes from original: none
*/
@ -845,22 +851,35 @@ static void updateKeys(void)
int idx;
tControlCmd *cmd;
for (idx = 0; idx < (int)HCtx.size(); idx++) {
if (HCtx[idx]) {
for (idx = 0; idx < (int)HCtx.size(); idx++)
{
if (HCtx[idx])
{
cmd = HCtx[idx]->cmdControl;
for (i = 0; i < NbCmdControl; i++) {
if (cmd[i].type == GFCTRL_TYPE_KEYBOARD) {
for (i = 0; i < NbCmdControl; i++)
{
if (cmd[i].type == GFCTRL_TYPE_KEYBOARD)
{
nKeyInd = lookUpKeyMap(cmd[i].val);
if (lastReadKeyState[nKeyInd] == GFUI_KEY_DOWN) {
if (keyInfo[nKeyInd].state == GFUI_KEY_UP) {
if (lastReadKeyState[nKeyInd] == GFUI_KEY_DOWN)
{
if (keyInfo[nKeyInd].state == GFUI_KEY_UP)
{
keyInfo[nKeyInd].edgeDn = 1;
} else {
}
else
{
keyInfo[nKeyInd].edgeDn = 0;
}
} else {
if (keyInfo[nKeyInd].state == GFUI_KEY_DOWN) {
}
else
{
if (keyInfo[nKeyInd].state == GFUI_KEY_DOWN)
{
keyInfo[nKeyInd].edgeUp = 1;
} else {
}
else
{
keyInfo[nKeyInd].edgeUp = 0;
}
}
@ -910,7 +929,8 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
init_keybd = false;
}
if (init_mouse && !GfuiScreenIsActive(0) && HCtx[idx]->mouseControlUsed) {
if (init_mouse && !GfuiScreenIsActive(0) && HCtx[idx]->mouseControlUsed)
{
GfuiMouseShow();
GfctrlMouseCenter();
GfctrlMouseInitCenter();
@ -928,16 +948,19 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
car->_lightCmd = HCtx[idx]->lightCmd;
if (car->_laps != HCtx[idx]->lastPitStopLap) {
if (car->_laps != HCtx[idx]->lastPitStopLap)
{
car->_raceCmd = RM_CMD_PIT_ASKED;
}
// Update the controls at most once per "robots time slice" (RCM_MAX_DT_ROBOTS s)
// (i.e. keyboard/joystick/mouse values read for all players simultaneously).
if (lastKeyUpdate != s->currentTime && index == ControlsUpdaterIndex) {
if (lastKeyUpdate != s->currentTime && index == ControlsUpdaterIndex)
{
updateKeys();
if (joyPresent) {
if (joyPresent)
{
GfctrlJoyGetCurrentStates(joyInfo);
}
@ -946,12 +969,18 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
}
// Perform mapping of axis->buttons functions
for (dummy=0; dummy <= CMD_END_OF_LIST; dummy++) {
if (cmd[dummy].type == GFCTRL_TYPE_JOY_ATOB) {
if (joyInfo->ax[cmd[dummy].val] >= cmd[dummy].min && joyInfo->ax[cmd[dummy].val] <= cmd[dummy].max) {
for (dummy=0; dummy <= CMD_END_OF_LIST; dummy++)
{
if (cmd[dummy].type == GFCTRL_TYPE_JOY_ATOB)
{
if (joyInfo->ax[cmd[dummy].val] >= cmd[dummy].min && joyInfo->ax[cmd[dummy].val] <= cmd[dummy].max)
{
// Abuse deadZone to store state; 1=just pressed, 2=held
if (cmd[dummy].deadZone < 2) cmd[dummy].deadZone++;
} else cmd[dummy].deadZone = 0;
if (cmd[dummy].deadZone < 2)
cmd[dummy].deadZone++;
}
else
cmd[dummy].deadZone = 0;
}
}
@ -961,7 +990,8 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
/* default to neutral gear */
preGear = 0;
for (int i = CMD_GEAR_R; i <= CMD_GEAR_6; i++) {
for (int i = CMD_GEAR_R; i <= CMD_GEAR_6; i++)
{
if ((cmd[i].type == GFCTRL_TYPE_JOY_BUT && joyInfo->levelup[cmd[i].val])
|| (cmd[i].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->button[cmd[i].val])
#if 0 //SDW fixme
@ -1023,16 +1053,21 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
}
}
switch (cmd[CMD_LEFTSTEER].type) {
switch (cmd[CMD_LEFTSTEER].type)
{
case GFCTRL_TYPE_JOY_AXIS:
ax0 = joyInfo->ax[cmd[CMD_LEFTSTEER].val];
// limit and normalise
if (ax0 > cmd[CMD_LEFTSTEER].max) {
if (ax0 > cmd[CMD_LEFTSTEER].max)
{
ax0 = cmd[CMD_LEFTSTEER].max;
} else if (ax0 < cmd[CMD_LEFTSTEER].min) {
}
else if (ax0 < cmd[CMD_LEFTSTEER].min)
{
ax0 = cmd[CMD_LEFTSTEER].min;
}
ax0 = (ax0 - cmd[CMD_LEFTSTEER].min) / (cmd[CMD_LEFTSTEER].max - cmd[CMD_LEFTSTEER].min);
// pow used to indicate the polarity of 'more turn'
@ -1052,22 +1087,31 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
case GFCTRL_TYPE_MOUSE_AXIS:
ax0 = mouseInfo->ax[cmd[CMD_LEFTSTEER].val] - cmd[CMD_LEFTSTEER].deadZone;
if (ax0 > cmd[CMD_LEFTSTEER].max) {
if (ax0 > cmd[CMD_LEFTSTEER].max)
{
ax0 = cmd[CMD_LEFTSTEER].max;
} else if (ax0 < cmd[CMD_LEFTSTEER].min) {
}
else if (ax0 < cmd[CMD_LEFTSTEER].min)
{
ax0 = cmd[CMD_LEFTSTEER].min;
}
ax0 = ax0 * cmd[CMD_LEFTSTEER].pow;
leftSteer = pow(fabs(ax0), 1.0f / cmd[CMD_LEFTSTEER].sens) / (1.0f + cmd[CMD_LEFTSTEER].spdSens * car->_speed_xy / 1000.0);
break;
case GFCTRL_TYPE_KEYBOARD:
case GFCTRL_TYPE_JOY_BUT:
case GFCTRL_TYPE_MOUSE_BUT:
if (cmd[CMD_LEFTSTEER].type == GFCTRL_TYPE_KEYBOARD) {
if (cmd[CMD_LEFTSTEER].type == GFCTRL_TYPE_KEYBOARD)
{
ax0 = keyInfo[lookUpKeyMap(cmd[CMD_LEFTSTEER].val)].state;
} else if (cmd[CMD_LEFTSTEER].type == GFCTRL_TYPE_MOUSE_BUT) {
}
else if (cmd[CMD_LEFTSTEER].type == GFCTRL_TYPE_MOUSE_BUT)
{
ax0 = mouseInfo->button[cmd[CMD_LEFTSTEER].val];
} else {
}
else
{
ax0 = joyInfo->levelup[cmd[CMD_LEFTSTEER].val];
}
#if (BINCTRL_STEERING == JEPZ)
@ -1111,16 +1155,21 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
}
switch (cmd[CMD_RIGHTSTEER].type) {
switch (cmd[CMD_RIGHTSTEER].type)
{
case GFCTRL_TYPE_JOY_AXIS:
ax0 = joyInfo->ax[cmd[CMD_RIGHTSTEER].val];
// limit and normalise
if (ax0 > cmd[CMD_RIGHTSTEER].max) {
if (ax0 > cmd[CMD_RIGHTSTEER].max)
{
ax0 = cmd[CMD_RIGHTSTEER].max;
} else if (ax0 < cmd[CMD_RIGHTSTEER].min) {
}
else if (ax0 < cmd[CMD_RIGHTSTEER].min)
{
ax0 = cmd[CMD_RIGHTSTEER].min;
}
ax0 = (ax0 - cmd[CMD_RIGHTSTEER].min) / (cmd[CMD_RIGHTSTEER].max - cmd[CMD_RIGHTSTEER].min);
// pow used to indicate the polarity of 'more turn'
@ -1129,7 +1178,8 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
else
ax0 = 1 - ax0 - cmd[CMD_RIGHTSTEER].deadZone;
if (ax0 < 0) ax0 = 0;
if (ax0 < 0)
ax0 = 0;
if (1 - cmd[CMD_RIGHTSTEER].deadZone != 0)
ax0 = ax0 / (1 - cmd[CMD_RIGHTSTEER].deadZone);
@ -1140,22 +1190,31 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
case GFCTRL_TYPE_MOUSE_AXIS:
ax0 = mouseInfo->ax[cmd[CMD_RIGHTSTEER].val] - cmd[CMD_RIGHTSTEER].deadZone;
if (ax0 > cmd[CMD_RIGHTSTEER].max) {
if (ax0 > cmd[CMD_RIGHTSTEER].max)
{
ax0 = cmd[CMD_RIGHTSTEER].max;
} else if (ax0 < cmd[CMD_RIGHTSTEER].min) {
}
else if (ax0 < cmd[CMD_RIGHTSTEER].min)
{
ax0 = cmd[CMD_RIGHTSTEER].min;
}
ax0 = ax0 * cmd[CMD_RIGHTSTEER].pow;
rightSteer = - pow(fabs(ax0), 1.0f / cmd[CMD_RIGHTSTEER].sens) / (1.0f + cmd[CMD_RIGHTSTEER].spdSens * car->_speed_xy / 1000.0);
break;
case GFCTRL_TYPE_KEYBOARD:
case GFCTRL_TYPE_JOY_BUT:
case GFCTRL_TYPE_MOUSE_BUT:
if (cmd[CMD_RIGHTSTEER].type == GFCTRL_TYPE_KEYBOARD) {
if (cmd[CMD_RIGHTSTEER].type == GFCTRL_TYPE_KEYBOARD)
{
ax0 = keyInfo[lookUpKeyMap(cmd[CMD_RIGHTSTEER].val)].state;
} else if (cmd[CMD_RIGHTSTEER].type == GFCTRL_TYPE_MOUSE_BUT) {
}
else if (cmd[CMD_RIGHTSTEER].type == GFCTRL_TYPE_MOUSE_BUT)
{
ax0 = mouseInfo->button[cmd[CMD_RIGHTSTEER].val];
} else {
}
else
{
ax0 = joyInfo->levelup[cmd[CMD_RIGHTSTEER].val];
}
#if (BINCTRL_STEERING == JEPZ)
@ -1310,9 +1369,12 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
|| (cmd[CMD_DASHB_INC].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[CMD_DASHB_INC].val)].state)
|| (cmd[CMD_DASHB_INC].type == GFCTRL_TYPE_JOY_ATOB && cmd[CMD_DASHB_INC].deadZone != 0))
{
if (HCtx[idx]->dashboardCounter > 0) {
if (HCtx[idx]->dashboardCounter > 0)
{
HCtx[idx]->dashboardCounter--;
} else {
}
else
{
item->setup->desired_value += item->setup->stepsize;
if (item->setup->desired_value > item->setup->max) {item->setup->desired_value = item->setup->max;}
item->setup->changed = TRUE;
@ -1331,14 +1393,18 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
item->setup->changed = TRUE;
car->ctrl.setupChangeCmd = item;
}
if ((cmd[CMD_DASHB_DEC].type == GFCTRL_TYPE_JOY_BUT && joyInfo->levelup[cmd[CMD_DASHB_DEC].val])
|| (cmd[CMD_DASHB_DEC].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->button[cmd[CMD_DASHB_DEC].val])
|| (cmd[CMD_DASHB_DEC].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[CMD_DASHB_DEC].val)].state)
|| (cmd[CMD_DASHB_DEC].type == GFCTRL_TYPE_JOY_ATOB && cmd[CMD_DASHB_DEC].deadZone != 0))
{
if (HCtx[idx]->dashboardCounter > 0) {
if (HCtx[idx]->dashboardCounter > 0)
{
HCtx[idx]->dashboardCounter--;
} else {
}
else
{
item->setup->desired_value -= item->setup->stepsize;
if (item->setup->desired_value < item->setup->min) {item->setup->desired_value = item->setup->min;}
item->setup->changed = TRUE;
@ -1346,14 +1412,20 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
}
}
switch (cmd[CMD_BRAKE].type) {
switch (cmd[CMD_BRAKE].type)
{
case GFCTRL_TYPE_JOY_AXIS:
brake = joyInfo->ax[cmd[CMD_BRAKE].val];
if (brake > cmd[CMD_BRAKE].max) {
if (brake > cmd[CMD_BRAKE].max)
{
brake = cmd[CMD_BRAKE].max;
} else if (brake < cmd[CMD_BRAKE].min) {
}
else if (brake < cmd[CMD_BRAKE].min)
{
brake = cmd[CMD_BRAKE].min;
}
car->_brakeCmd = fabs(cmd[CMD_BRAKE].pow *
pow(fabs((brake - cmd[CMD_BRAKE].minVal) /
(cmd[CMD_BRAKE].max - cmd[CMD_BRAKE].min)),
@ -1361,11 +1433,15 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
case GFCTRL_TYPE_MOUSE_AXIS:
ax0 = mouseInfo->ax[cmd[CMD_BRAKE].val] - cmd[CMD_BRAKE].deadZone;
if (ax0 > cmd[CMD_BRAKE].max) {
if (ax0 > cmd[CMD_BRAKE].max)
{
ax0 = cmd[CMD_BRAKE].max;
} else if (ax0 < cmd[CMD_BRAKE].min) {
}
else if (ax0 < cmd[CMD_BRAKE].min)
{
ax0 = cmd[CMD_BRAKE].min;
}
ax0 = ax0 * cmd[CMD_BRAKE].pow;
car->_brakeCmd = pow(fabs(ax0), 1.0f / cmd[CMD_BRAKE].sens) / (1.0 + cmd[CMD_BRAKE].spdSens * car->_speed_x / 1000.0);
break;
@ -1383,14 +1459,19 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
}
switch (cmd[CMD_CLUTCH].type) {
switch (cmd[CMD_CLUTCH].type)
{
case GFCTRL_TYPE_JOY_AXIS:
clutch = joyInfo->ax[cmd[CMD_CLUTCH].val];
if (clutch > cmd[CMD_CLUTCH].max) {
if (clutch > cmd[CMD_CLUTCH].max)
{
clutch = cmd[CMD_CLUTCH].max;
} else if (clutch < cmd[CMD_CLUTCH].min) {
}
else if (clutch < cmd[CMD_CLUTCH].min)
{
clutch = cmd[CMD_CLUTCH].min;
}
car->_clutchCmd = fabs(cmd[CMD_CLUTCH].pow *
pow(fabs((clutch - cmd[CMD_CLUTCH].minVal) /
(cmd[CMD_CLUTCH].max - cmd[CMD_CLUTCH].min)),
@ -1398,11 +1479,15 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
case GFCTRL_TYPE_MOUSE_AXIS:
ax0 = mouseInfo->ax[cmd[CMD_CLUTCH].val] - cmd[CMD_CLUTCH].deadZone;
if (ax0 > cmd[CMD_CLUTCH].max) {
if (ax0 > cmd[CMD_CLUTCH].max)
{
ax0 = cmd[CMD_CLUTCH].max;
} else if (ax0 < cmd[CMD_CLUTCH].min) {
}
else if (ax0 < cmd[CMD_CLUTCH].min)
{
ax0 = cmd[CMD_CLUTCH].min;
}
ax0 = ax0 * cmd[CMD_CLUTCH].pow;
car->_clutchCmd = pow(fabs(ax0), 1.0f / cmd[CMD_CLUTCH].sens) / (1.0 + cmd[CMD_CLUTCH].spdSens * car->_speed_x / 1000.0);
break;
@ -1433,18 +1518,26 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
car->_ebrakeCmd = 1;
if (HCtx[idx]->autoClutch)
car->_clutchCmd = 1;
} else {
}
else
{
car->_ebrakeCmd = 0;
}
switch (cmd[CMD_THROTTLE].type) {
switch (cmd[CMD_THROTTLE].type)
{
case GFCTRL_TYPE_JOY_AXIS:
throttle = joyInfo->ax[cmd[CMD_THROTTLE].val];
if (throttle > cmd[CMD_THROTTLE].max) {
if (throttle > cmd[CMD_THROTTLE].max)
{
throttle = cmd[CMD_THROTTLE].max;
} else if (throttle < cmd[CMD_THROTTLE].min) {
}
else if (throttle < cmd[CMD_THROTTLE].min)
{
throttle = cmd[CMD_THROTTLE].min;
}
car->_accelCmd = fabs(cmd[CMD_THROTTLE].pow *
pow(fabs((throttle - cmd[CMD_THROTTLE].minVal) /
(cmd[CMD_THROTTLE].max - cmd[CMD_THROTTLE].min)),
@ -1452,16 +1545,23 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
break;
case GFCTRL_TYPE_MOUSE_AXIS:
ax0 = mouseInfo->ax[cmd[CMD_THROTTLE].val] - cmd[CMD_THROTTLE].deadZone;
if (ax0 > cmd[CMD_THROTTLE].max) {
if (ax0 > cmd[CMD_THROTTLE].max)
{
ax0 = cmd[CMD_THROTTLE].max;
} else if (ax0 < cmd[CMD_THROTTLE].min) {
}
else if (ax0 < cmd[CMD_THROTTLE].min)
{
ax0 = cmd[CMD_THROTTLE].min;
}
ax0 = ax0 * cmd[CMD_THROTTLE].pow;
car->_accelCmd = pow(fabs(ax0), 1.0f / cmd[CMD_THROTTLE].sens) / (1.0 + cmd[CMD_THROTTLE].spdSens * car->_speed_x / 1000.0);
if (isnan (car->_accelCmd)) {
if (isnan (car->_accelCmd))
{
car->_accelCmd = 0;
}
/* printf(" axO:%f accelCmd:%f\n", ax0, car->_accelCmd); */
break;
case GFCTRL_TYPE_JOY_BUT:
@ -1529,7 +1629,8 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
HCtx[idx]->paccel = car->_accelCmd;
if (HCtx[idx]->autoReverseEngaged) {
if (HCtx[idx]->autoReverseEngaged)
{
/* swap brake and throttle */
brake = car->_brakeCmd;
car->_brakeCmd = car->_accelCmd;
@ -1565,7 +1666,8 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
// reduce brake if wheels are slipping
tdble slip = 0;
for (i = 0; i < 4; i++) {
for (i = 0; i < 4; i++)
{
slip = MAX(slip, car->_speed_x - (car->_wheelSpinVel(i) * car->_wheelRadius(i)));
}
@ -1634,12 +1736,18 @@ static void common_drive(const int index, tCarElt* car, tSituation *s)
car->_accelCmd = MIN(car->_accelCmd, origaccel - MIN(origaccel-0.2, ((slip - 2.5)/20.0)));
}
if (speedLimiter) {
if (speedLimit != 0) {
if (speedLimiter)
{
if (speedLimit != 0)
{
tdble dv = speedLimit - car->_speed_x;
if (dv > 0.0) {
if (dv > 0.0)
{
car->_accelCmd = MIN(car->_accelCmd, fabs(dv/6.0));
} else {
}
else
{
car->_brakeCmd = MAX(car->_brakeCmd, fabs(dv/5.0));
car->_accelCmd = 0;
}//if-else dv
@ -1734,7 +1842,8 @@ static tdble getAutoClutch(const int idx, int gear, int newGear, tCarElt *car)
{
tdble ret = 0.0f;
if (newGear != 0 && newGear < car->_gearNb) {
if (newGear != 0 && newGear < car->_gearNb)
{
if (newGear != gear)
HCtx[idx]->clutchTime = HCtx[idx]->maxClutchTime;
@ -1912,7 +2021,6 @@ void HumanDriver::drive_mt(int index, tCarElt* car, tSituation *s)
car->_clutchCmd = getAutoClutch(idx, car->_gear, car->_gearCmd, car);
common_brake(idx, car, s);
}
/*
@ -1955,13 +2063,18 @@ void HumanDriver::drive_at(int index, tCarElt* car, tSituation *s)
|| (cmd[CMD_DN_SHFT].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[CMD_DN_SHFT].val)].edgeUp)
|| (cmd[CMD_DN_SHFT].type == GFCTRL_TYPE_JOY_ATOB && cmd[CMD_DN_SHFT].deadZone == 1))
{
if (car->_gear > 1) {
if (car->_gear > 1)
{
car->_gearCmd--;
HCtx[idx]->manual = true;
} else if (HCtx[idx]->seqShftAllowNeutral && car->_gear == 1) {
}
else if (HCtx[idx]->seqShftAllowNeutral && car->_gear == 1)
{
car->_gearCmd = 0;
HCtx[idx]->manual = true;
} else if (HCtx[idx]->seqShftAllowReverse && car->_gear < 2) {
}
else if (HCtx[idx]->seqShftAllowReverse && car->_gear < 2)
{
car->_gearCmd = -1;
HCtx[idx]->manual = true;
}
@ -1992,7 +2105,8 @@ void HumanDriver::drive_at(int index, tCarElt* car, tSituation *s)
/* manual shift direct ie. Reverse-Park-Drive*/
if (HCtx[idx]->relButNeutral) {
for (int i = CMD_GEAR_R; i < CMD_GEAR_2; i++) {
for (int i = CMD_GEAR_R; i < CMD_GEAR_2; i++)
{
if ((cmd[i].type == GFCTRL_TYPE_JOY_BUT && joyInfo->edgedn[cmd[i].val])
|| (cmd[i].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->edgedn[cmd[i].val])
|| (cmd[i].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[i].val)].edgeDn))
@ -2004,7 +2118,8 @@ void HumanDriver::drive_at(int index, tCarElt* car, tSituation *s)
}
/* Select the right gear if any gear command activated (edge up) */
for (int i = CMD_GEAR_R; i < CMD_GEAR_2; i++) {
for (int i = CMD_GEAR_R; i < CMD_GEAR_2; i++)
{
if ((cmd[i].type == GFCTRL_TYPE_JOY_BUT && joyInfo->edgeup[cmd[i].val])
|| (cmd[i].type == GFCTRL_TYPE_MOUSE_BUT && mouseInfo->edgeup[cmd[i].val])
|| (cmd[i].type == GFCTRL_TYPE_KEYBOARD && keyInfo[lookUpKeyMap(cmd[i].val)].edgeUp))
@ -2019,28 +2134,40 @@ void HumanDriver::drive_at(int index, tCarElt* car, tSituation *s)
}//if !autoReverse
/* auto shift */
if (!HCtx[idx]->manual && !HCtx[idx]->autoReverseEngaged) {
if (!HCtx[idx]->manual && !HCtx[idx]->autoReverseEngaged)
{
if (car->_speed_x > HCtx[idx]->shiftThld[gear]) {
car->_gearCmd++;
} else if ((car->_gearCmd > 1) && (car->_speed_x < (HCtx[idx]->shiftThld[gear-1] - 4.0))) {
}
else if ((car->_gearCmd > 1) && (car->_speed_x < (HCtx[idx]->shiftThld[gear-1] - 4.0)))
{
car->_gearCmd--;
}
if (car->_gearCmd <= 0)
car->_gearCmd++;
}//if !manual && !autoReverse
/* Automatic Reverse Gear Mode */
if (HCtx[idx]->autoReverse) {
if (!HCtx[idx]->autoReverseEngaged) { //currently not in autoReverse
if ((car->_brakeCmd > car->_accelCmd) && (car->_speed_xy < 1.0)) {
if (HCtx[idx]->autoReverse)
{
if (!HCtx[idx]->autoReverseEngaged)
{ //currently not in autoReverse
if ((car->_brakeCmd > car->_accelCmd) && (car->_speed_xy < 1.0))
{
HCtx[idx]->autoReverseEngaged = true;
car->_gearCmd = CMD_GEAR_R - CMD_GEAR_N;
}
} else { //currently in autoreverse mode
if ((car->_brakeCmd > car->_accelCmd) && (car->_speed_x > -1.0) && (car->_speed_x < 1.0)) {
}
else
{ //currently in autoreverse mode
if ((car->_brakeCmd > car->_accelCmd) && (car->_speed_x > -1.0) && (car->_speed_x < 1.0))
{
HCtx[idx]->autoReverseEngaged = false;
car->_gearCmd = CMD_GEAR_1 - CMD_GEAR_N;
} else {
}
else
{
car->_gearCmd = CMD_GEAR_R - CMD_GEAR_N;
}
}//if-else autoReverseEngaged

View File

@ -61,6 +61,7 @@ SimCarConfig(tCar *car)
car->TCL_SlipScale = 1.0f;
car->ABS_SlipScale = 0.1f;
car->ABS_BrakeScale = 1.0f;
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_AEROTOCG, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{

View File

@ -43,7 +43,7 @@ SimCarConfig(tCar *car)
car->options = new SimulationOptions;
car->options->SetFromSkill (carElt->_skillLevel);
car->options->LoadFromFile (hdle);
//car->options->LoadFromFile (hdle);
car->fuel_time = 0.0;
car->fuel_consumption = 0.0;
@ -68,66 +68,76 @@ SimCarConfig(tCar *car)
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_AEROTOCG;
GfLogInfo("SimuV5 feature AEROTOCG on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_SLOWGRIP, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_SLOWGRIP;
GfLogInfo("SimuV5 feature SLOW GRIP on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_REALGEARCHANGE, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_REALGEARCHANGE;
GfLogInfo("SimuV5 feature REAL GEAR CHANGE on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_REVLIMIT, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_REVLIMIT;
GfLogInfo("SimuV5 feature REV LIMIT on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_TIRETEMPDEG, VAL_NO);
/*enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_TIRETEMPDEG, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_TIRETEMPDEG;
}
}*/
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_TIRECOMPOUNDS, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_COMPOUNDS;
GfLogInfo("SimuV5 feature COMPOUNDS on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_FIXEDWHEELFORCE, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_FIXEDWHEELFORCE;
GfLogInfo("SimuV5 feature FIXED WHEEL FORCE on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_TCLINSIMU, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_TCLINSIMU;
GfLogInfo("SimuV5 feature TCL SIMU on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_ABSINSIMU, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_ABSINSIMU;
GfLogInfo("SimuV5 feature ABS SIMU on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_ESPINSIMU, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_ESPINSIMU;
GfLogInfo("SimuV5 feature ESP IMU on\n");
}
enabling = GfParmGetStr(hdle, SECT_FEATURES, PRM_LIMITEDGROUNDEFFECT, VAL_NO);
if (strcmp(enabling, VAL_YES) == 0)
{
car->features = car->features | FEAT_LIMITEDGROUNDEFFECT;
GfLogInfo("SimuV5 feature LIMITED GROUND EFFECT on\n");
}
/* continue with car parameters */
@ -207,6 +217,7 @@ SimCarConfig(tCar *car)
setupSpring->stepsize = 1000;
K[i] = setupSpring->desired_value;
}
setupSpring = &(car->carElt->setup.heaveSpring[0]);
setupSpring->desired_value = setupSpring->min = setupSpring-> max = 0.0f;
GfParmGetNumWithLimits(hdle, SECT_FRNTHEAVE, PRM_SPR, (char*)NULL, &(setupSpring->desired_value), &(setupSpring->min), &(setupSpring->max));
@ -442,7 +453,7 @@ SimCarConfig(tCar *car)
i = 1;
}
if (car->features & FEAT_COMPOUNDS && car->options->compounds)
if ((car->features & FEAT_COMPOUNDS) && car->options->compounds)
{
priv->dashboardRequest[0].type = DI_COMPOUND_SET;
priv->dashboardRequest[0].setup = &(setup->reqTirecompound);

View File

@ -38,7 +38,7 @@ void SimulationOptions::SetFromSkill (tSkillLevel skill)
option_list.Set(PRM_DAMAGE_AERO, false);
option_list.Set(PRM_DAMAGE_ENGINE, false);
option_list.Set(PRM_MODEL_TYRE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, true);
option_list.Set(PRM_MODEL_ENGINE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_AERO_FACTOR, 4.0f);
break;
@ -49,7 +49,7 @@ void SimulationOptions::SetFromSkill (tSkillLevel skill)
option_list.Set(PRM_DAMAGE_AERO, true);
option_list.Set(PRM_DAMAGE_ENGINE, false);
option_list.Set(PRM_MODEL_TYRE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, true);
option_list.Set(PRM_MODEL_ENGINE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_AERO_FACTOR, 4.0f);
break;
@ -61,7 +61,7 @@ void SimulationOptions::SetFromSkill (tSkillLevel skill)
option_list.Set(PRM_DAMAGE_ENGINE, false);
option_list.Set(PRM_MODEL_AEROFLOW, SIMPLE);
option_list.Set(PRM_MODEL_TYRE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, true);
option_list.Set(PRM_MODEL_ENGINE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_AERO_FACTOR, 3.0f);
break;
@ -73,7 +73,7 @@ void SimulationOptions::SetFromSkill (tSkillLevel skill)
option_list.Set(PRM_DAMAGE_ENGINE, true);
option_list.Set(PRM_MODEL_AEROFLOW, SIMPLE);
option_list.Set(PRM_MODEL_TYRE_TEMPERATURE, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, false);
option_list.Set(PRM_MODEL_TYRE_COMPOUNDS, true);
option_list.Set(PRM_MODEL_ENGINE_TEMPERATURE, true);
option_list.Set(PRM_MODEL_AERO_FACTOR, 2.0f);
break;
@ -137,6 +137,7 @@ bool SimulationOptions::StrToBool (const char* s, bool dontcare)
{
return false;
}
return dontcare;
}

View File

@ -111,19 +111,23 @@ void SimWheelConfig(tCar *car, int index)
tireratio = GfParmGetNum(hdle, WheelSect[index], PRM_TIRERATIO, (char*)NULL, 0.75f);
wheel->mu = GfParmGetNum(hdle, WheelSect[index], PRM_MU, (char*)NULL, 1.0f);
if (car->features & FEAT_COMPOUNDS && car->options->compounds)
if ((car->features & FEAT_COMPOUNDS) && car->options->compounds)
{
sprintf(path, "%s/%s/%s", WheelSect[index], SECT_COMPOUNDS, SECT_SOFT);
wheel->muC[1] = GfParmGetNum(hdle, path, PRM_MU, (char*)NULL, wheel->mu);
GfLogInfo("Mu in simuV5 soft = %.3f\n", wheel->muC[1]);
sprintf(path, "%s/%s/%s", WheelSect[index], SECT_COMPOUNDS, SECT_MEDIUM);
wheel->muC[2] = GfParmGetNum(hdle, path, PRM_MU, (char*)NULL, wheel->mu);
GfLogInfo("Mu in simuV5 medium = %.3f\n", wheel->muC[1]);
sprintf(path, "%s/%s/%s", WheelSect[index], SECT_COMPOUNDS, SECT_HARD);
wheel->muC[3] = GfParmGetNum(hdle, path, PRM_MU, (char*)NULL, wheel->mu);
GfLogInfo("Mu in simuV5 hard = %.3f\n", wheel->muC[1]);
sprintf(path, "%s/%s/%s", WheelSect[index], SECT_COMPOUNDS, SECT_WET);
wheel->muC[4] = GfParmGetNum(hdle, path, PRM_MU, (char*)NULL, wheel->mu);
GfLogInfo("Mu in simuV5 wet = %.3f\n", wheel->muC[1]);
sprintf(path, "%s/%s/%s", WheelSect[index], SECT_COMPOUNDS, SECT_EXTREM_WET);
wheel->muC[5] = GfParmGetNum(hdle, path, PRM_MU, (char*)NULL, wheel->mu);
@ -137,6 +141,13 @@ void SimWheelConfig(tCar *car, int index)
GfLogInfo("# Simu MU compound with no rain wet = %.3f - extreme wet = %.3f\n",
wheel->muC[4], wheel->muC[5]);
}
if(SimRain > 0)
{
wheel->muC[1] = 1.0;
wheel->muC[2] = 1.0;
wheel->muC[3] -= 0.2;
}
}
wheel->I = GfParmGetNum(hdle, WheelSect[index], PRM_INERTIA, (char*)NULL, 1.5f);
@ -194,7 +205,7 @@ void SimWheelConfig(tCar *car, int index)
wheel->treadDepth = 1.0;
wheel->Topt = GfParmGetNum(hdle, WheelSect[index], PRM_OPTTEMP, (char*)NULL, 350.0f);
if (car->features & FEAT_COMPOUNDS && car->options->compounds)
if ((car->features & FEAT_COMPOUNDS) && car->options->compounds)
{
sprintf(path, "%s/%s/%s", WheelSect[index], SECT_COMPOUNDS, SECT_SOFT);
wheel->TinitC[1] = GfParmGetNum(hdle, path, PRM_INITTEMP, (char*)NULL, wheel->Tinit);
@ -225,7 +236,6 @@ void SimWheelConfig(tCar *car, int index)
if (car->options->tyre_temperature)
{
wheel->Ttire = wheel->Tinit;
}
else
{