more CBike and fixes

This commit is contained in:
aap 2020-06-04 17:38:41 +02:00
parent 07c6752cf7
commit 3e36428568
9 changed files with 1153 additions and 50 deletions

View File

@ -30,7 +30,7 @@ enum eEntityStatus : uint8
STATUS_PLANE,
STATUS_PLAYER_REMOTE,
STATUS_PLAYER_DISABLED,
STATUS_12, // TODO: what is this? used in CPhysical::ApplyAirResistance
STATUS_GHOST
};
class CEntity : public CPlaceable

View File

@ -458,6 +458,7 @@ CPhysical::ApplyFrictionTurnForce(float jx, float jy, float jz, float px, float
m_vecTurnFriction += turnimpulse*(1.0f/m_fTurnMass);
}
bool debugSprings;
bool
CPhysical::ApplySpringCollision(float springConst, CVector &springDir, CVector &point, float springRatio, float bias)
{
@ -467,6 +468,10 @@ CPhysical::ApplySpringCollision(float springConst, CVector &springDir, CVector &
float impulse = -GRAVITY*m_fMass*step * springConst * compression * bias*2.0f;
ApplyMoveForce(springDir*impulse);
ApplyTurnForce(springDir*impulse, point);
if(debugSprings){
printf("spring : %.3f %.3f %.3f\n", springDir.x*impulse, springDir.y*impulse, springDir.z*impulse);
printf("speed: %.3f %.3f %.3f\n", m_vecMoveSpeed.x, m_vecMoveSpeed.y, m_vecMoveSpeed.z);
}
}
return true;
}
@ -484,6 +489,11 @@ CPhysical::ApplySpringCollisionAlt(float springConst, CVector &springDir, CVecto
impulse *= 0.75f;
ApplyMoveForce(forceDir*impulse);
ApplyTurnForce(forceDir*impulse, point);
if(debugSprings){
printf("spring alt: %.3f %.3f %.3f %.3f\n", forceDir.x*impulse, forceDir.y*impulse, forceDir.z*impulse, springRatio);
printf("speed: %.3f %.3f %.3f\n", m_vecMoveSpeed.x, m_vecMoveSpeed.y, m_vecMoveSpeed.z);
printf("pos: %.3f %.3f %.3f\n", GetPosition().x, GetPosition().y, GetPosition().z);
}
}
return true;
}
@ -531,7 +541,7 @@ void
CPhysical::ApplyAirResistance(void)
{
if(m_fAirResistance > 0.1f){
if(GetStatus() != STATUS_12){
if(GetStatus() != STATUS_GHOST){
float f = Pow(m_fAirResistance, CTimer::GetTimeStep());
m_vecMoveSpeed *= f;
m_vecTurnSpeed *= f;

View File

@ -60,6 +60,7 @@ public:
}
void Slerp(const CQuaternion &q1, const CQuaternion &q2, float theta, float invSin, float t);
void Set(RwV3d *axis, float angle);
void Get(RwMatrix *matrix);
};

View File

@ -170,6 +170,17 @@ CQuaternion::Slerp(const CQuaternion &q1, const CQuaternion &q2, float theta, fl
}
}
void
CQuaternion::Set(RwV3d *axis, float angle)
{
float halfCos = Cos(angle*0.5f);
float halfSin = Sin(angle*0.5f);
x = axis->x*halfSin;
y = axis->y*halfSin;
z = axis->z*halfSin;
w = halfCos;
}
void
CQuaternion::Get(RwMatrix *matrix)
{

View File

@ -255,6 +255,7 @@ void
CAutomobile::ProcessControl(void)
{
int i;
float wheelRot;
CColModel *colModel;
if(bUsingSpecialColModel)
@ -422,7 +423,7 @@ CAutomobile::ProcessControl(void)
float slowdown;
CVector parallelSpeed = m_vecMoveSpeed - DotProduct(m_vecMoveSpeed, GetUp())*m_vecMoveSpeed;
float fSpeed = parallelSpeed.MagnitudeSqr();
if(fSpeed > 0.09f){
if(fSpeed > SQR(0.3f)){
fSpeed = Sqrt(fSpeed);
parallelSpeed *= 0.3f / fSpeed;
slowdown = SAND_SLOWDOWN * Max(1.0f - 2.0f*fSpeed, 0.2f);
@ -461,11 +462,9 @@ CAutomobile::ProcessControl(void)
pHandling->Transmission.CalculateGearForSimpleCar(AutoPilot.m_fMaxTrafficSpeed/50.0f, m_nCurrentGear);
{
float wheelRot = ProcessWheelRotation(WHEEL_STATE_NORMAL, GetForward(), m_vecMoveSpeed, 0.35f);
wheelRot = ProcessWheelRotation(WHEEL_STATE_NORMAL, GetForward(), m_vecMoveSpeed, 0.35f);
for(i = 0; i < 4; i++)
m_aWheelRotation[i] += wheelRot;
}
PlayHornIfNecessary();
ReduceHornCounter();
@ -500,7 +499,7 @@ CAutomobile::ProcessControl(void)
break;
case STATUS_ABANDONED:
if(m_vecMoveSpeed.MagnitudeSqr() < 0.01f)
if(m_vecMoveSpeed.MagnitudeSqr() < SQR(0.1f))
m_fBrakePedal = 0.2f;
else
m_fBrakePedal = 0.0f;
@ -529,7 +528,7 @@ CAutomobile::ProcessControl(void)
break;
case STATUS_PLAYER_DISABLED:
if(m_vecMoveSpeed.MagnitudeSqr() < 0.01f ||
if(m_vecMoveSpeed.MagnitudeSqr() < SQR(0.1f) ||
(pDriver && pDriver->IsPlayer() &&
(pDriver->GetPedState() == PED_ARRESTED ||
pDriver->GetPedState() == PED_DRAG_FROM_CAR ||
@ -770,7 +769,7 @@ CAutomobile::ProcessControl(void)
for(i = 0; i < 4; i++){
if(m_aSuspensionSpringRatio[i] < 1.0f){
float bias = pHandling->fSuspensionBias;
if(i == 1 || i == 3) // rear
if(i == CARWHEEL_REAR_LEFT || i == CARWHEEL_REAR_RIGHT)
bias = 1.0f - bias;
ApplySpringCollisionAlt(pHandling->fSuspensionForceLevel,
@ -823,7 +822,6 @@ CAutomobile::ProcessControl(void)
}
}
bool gripCheat = true;
fwdSpeed = DotProduct(m_vecMoveSpeed, GetForward());
if(!strongGrip1 && !CVehicle::bCheat3)
@ -1062,6 +1060,7 @@ CAutomobile::ProcessControl(void)
}else if(m_doingBurnout && !mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier)){
rearBrake = 0.0f;
rearTraction = 0.0f;
// BUG: missing timestep
ApplyTurnForce(contactPoints[CARWHEEL_REAR_LEFT], -0.001f*m_fTurnMass*m_fSteerAngle*GetRight());
}else if(m_fTireTemperature > 1.0f){
rearTraction *= m_fTireTemperature;
@ -1155,7 +1154,7 @@ CAutomobile::ProcessControl(void)
}
if(m_doingBurnout && !mod_HandlingManager.HasFrontWheelDrive(pHandling->nIdentifier) &&
(m_aWheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING || m_aWheelState[CARWHEEL_REAR_RIGHT])){
(m_aWheelState[CARWHEEL_REAR_LEFT] == WHEEL_STATE_SPINNING || m_aWheelState[CARWHEEL_REAR_RIGHT] == WHEEL_STATE_SPINNING)){
m_fTireTemperature += 0.001f*CTimer::GetTimeStep();
if(m_fTireTemperature > 3.0f)
m_fTireTemperature = 3.0f;
@ -1375,14 +1374,14 @@ CAutomobile::ProcessControl(void)
// Flying
bool foo = false;
bool playRotorSound = false;
if(GetStatus() != STATUS_PLAYER && GetStatus() != STATUS_PLAYER_REMOTE && GetStatus() != STATUS_PHYSICS){
if(IsRealHeli()){
bEngineOn = false;
m_aWheelSpeed[1] = Max(m_aWheelSpeed[1]-0.0005f, 0.0f);
if(GetModelIndex() != MI_RCRAIDER && GetModelIndex() != MI_RCGOBLIN)
if(m_aWheelSpeed[1] < 0.154f && m_aWheelSpeed[1] > 0.0044f)
foo = true;
playRotorSound = true;
}
}else if((GetModelIndex() == MI_DODO || CVehicle::bAllDodosCheat) &&
m_vecMoveSpeed.Magnitude() > 0.0f && CTimer::GetTimeStep() > 0.0f){
@ -1476,10 +1475,25 @@ CAutomobile::ProcessControl(void)
if(GetModelIndex() != MI_RCRAIDER && GetModelIndex() != MI_RCGOBLIN)
if(m_aWheelSpeed[1] < 0.154f && m_aWheelSpeed[1] > 0.0044f)
foo = true;
playRotorSound = true;
}
//TODO(MIAMI): propeller stuff
// Play rotor sound
if(playRotorSound && m_aCarNodes[CAR_BONNET]){
CVector camDist = TheCamera.GetPosition() - GetPosition();
float distSq = camDist.MagnitudeSqr();
if(distSq < SQR(20.0f) && Abs(m_fPropellerRotation - m_aWheelRotation[1]) > DEGTORAD(30.0f)){
CMatrix mat;
mat.Attach(RwFrameGetMatrix(m_aCarNodes[CAR_BONNET]));
CVector blade = mat.GetRight();
blade = GetMatrix() * blade;
camDist /= Max(Sqrt(distSq), 0.01f);
if(Abs(DotProduct(camDist, blade)) > 0.95f){
DMAudio.PlayOneShot(m_audioEntityId, SOUND_31, 0.0f);
m_fPropellerRotation = m_aWheelRotation[1];
}
}
}
}
@ -1559,8 +1573,10 @@ CAutomobile::ProcessControl(void)
for(i = 0; i < 4; i++){
float suspChange = m_aSuspensionSpringRatioPrev[i] - m_aSuspensionSpringRatio[i];
if(suspChange > 0.3f && !drivingInSand && speedsq > 0.04f){
//TODO(MIAMI): depends on wheel status
DMAudio.PlayOneShot(m_audioEntityId, SOUND_CAR_JUMP, suspChange);
if(Damage.GetWheelStatus(i) == WHEEL_STATUS_BURST)
DMAudio.PlayOneShot(m_audioEntityId, SOUND_CAR_JUMP_2, suspChange);
else
DMAudio.PlayOneShot(m_audioEntityId, SOUND_CAR_JUMP, suspChange);
if(suspChange > suspShake)
suspShake = suspChange;
}
@ -4192,12 +4208,12 @@ CAutomobile::VehicleDamage(float impulse, uint16 damagedPiece)
pDriver &&
m_pDamageEntity && m_pDamageEntity->IsVehicle() &&
(this != FindPlayerVehicle() || ((CVehicle*)m_pDamageEntity)->VehicleCreatedBy == MISSION_VEHICLE) &&
// TODO(MIAMI): enum
((CVehicle*)m_pDamageEntity)->pDriver){
// TODO(MIAMI)
// if(GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR)
// pDriver->Say(145);
// else
// pDriver->Say(144);
if(GetVehicleAppearance() == VEHICLE_APPEARANCE_CAR)
pDriver->Say(145);
else
pDriver->Say(144);
}
int oldHealth = m_fHealth;
@ -4828,7 +4844,6 @@ CAutomobile::BurstTyre(uint8 wheel, bool applyForces)
case CAR_PIECE_WHEEL_LR: wheel = VEHWHEEL_REAR_LEFT; break;
case CAR_PIECE_WHEEL_RF: wheel = VEHWHEEL_FRONT_RIGHT; break;
case CAR_PIECE_WHEEL_RR: wheel = VEHWHEEL_REAR_RIGHT; break;
default: assert(0 && "invalid wheel");
}
int status = Damage.GetWheelStatus(wheel);

File diff suppressed because it is too large Load Diff

View File

@ -21,10 +21,10 @@ enum {
};
enum {
BIKESUSP_FRONT_1,
BIKESUSP_FRONT_2,
BIKESUSP_REAR_1,
BIKESUSP_REAR_2,
BIKESUSP_F1,
BIKESUSP_F2,
BIKESUSP_R1,
BIKESUSP_R2,
};
class CBike : public CVehicle
@ -33,8 +33,8 @@ public:
RwFrame *m_aBikeNodes[BIKE_NUM_NODES];
bool bLeanMatrixClean;
CMatrix m_leanMatrix;
CVector wheelieNormal;
CVector wheelieRight;
CVector m_vecAvgSurfaceNormal;
CVector m_vecAvgSurfaceRight;
tBikeHandlingData *pBikeHandling;
AssocGroupId m_bikeAnimType;
uint8 m_wheelStatus[2];
@ -58,7 +58,7 @@ public:
float m_fFrontForkY;
float m_fFrontForkZ;
float m_fFrontForkSlope;
float m_fBikeSteerAngle;
float m_fWheelAngle;
float m_fLeanLRAngle;
float m_fLeanLRAngle2;
float m_fLeanInput;
@ -68,9 +68,9 @@ public:
uint8 unused[3]; // looks like padding..but for what?
uint8 m_bike_flag01 : 1;
uint8 m_bike_flag02 : 1;
uint8 m_bike_flag04 : 1;
uint8 bWaterTight : 1;
uint8 m_bike_flag08 : 1;
uint8 m_bike_flag10 : 1;
uint8 bIsStanding : 1;
uint8 m_bike_flag20 : 1;
uint8 m_bike_flag40 : 1;
uint8 m_bike_flag80 : 1;
@ -117,6 +117,9 @@ public:
float GetHeightAboveRoad(void);
void PlayCarHorn(void);
void VehicleDamage(void);
void ProcessBuoyancy(void);
void DoDriveByShootings(void);
void PlayHornIfNecessary(void);
void ResetSuspension(void);
void SetupSuspensionLines(void);

View File

@ -926,7 +926,7 @@ CVehicle::ProcessBikeWheel(CVector &wheelFwd, CVector &wheelRight, CVector &whee
if(bAlreadySkidding)
adhesion *= pHandling->fTractionLoss;
if(special == BIKE_WHEEL_2 || special == BIKE_WHEEL_3)
if(special == BIKE_WHEELSPEC_2 || special == BIKE_WHEELSPEC_3)
contactSpeedRight = 0.0f;
else
contactSpeedRight = DotProduct(wheelContactSpeed, wheelRight);

View File

@ -128,11 +128,13 @@ enum eVehicleAppearance
VEHICLE_APPEARANCE_PLANE,
};
// TODO
// TODO: what is this even?
enum eBikeWheelSpecial
{
BIKE_WHEEL_2 = 2,
BIKE_WHEEL_3,
BIKE_WHEELSPEC_0, // both wheels on ground
BIKE_WHEELSPEC_1, // rear wheel on ground
BIKE_WHEELSPEC_2, // only front wheel on ground
BIKE_WHEELSPEC_3, // can't happen
};
enum