Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files
make vehicle freecam work better at high fps
Fixes FOV, Angle limit, and rotation speed at high FPS to more closely match behavior at 30fps locked.
  • Loading branch information
ZLau92 committed Aug 7, 2021
1 parent bb300a9 commit 2b7f8ebfcc9a9e4facce59211dc22805c1c26ae3
Showing with 12 additions and 12 deletions.
  1. +12 −12 src/core/Cam.cpp
@@ -4892,12 +4892,12 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
if (isCar || isBike) {
// 0.4f: CAR_FOV_START_SPEED
if (DotProduct(car->GetForward(), car->m_vecMoveSpeed) > 0.4f)
FOV += (DotProduct(car->GetForward(), car->m_vecMoveSpeed) - 0.4f) * CTimer::GetTimeStep();
FOV += (DotProduct(car->GetForward(), car->m_vecMoveSpeed) - 0.4f) * (CTimer::GetTimeStep() / CTimer::GetTimeStepFix());
}

if (FOV > DefaultFOV)
// 0.98f: CAR_FOV_FADE_MULT
FOV = Pow(0.98f, CTimer::GetTimeStep()) * (FOV - DefaultFOV) + DefaultFOV;
FOV = Pow(0.98f, CTimer::GetTimeStep() / CTimer::GetTimeStepFix()) * (FOV - DefaultFOV) + DefaultFOV;

FOV = Clamp(FOV, DefaultFOV, DefaultFOV + 30.0f);
}
@@ -4965,8 +4965,8 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
else if (velocityRightHeading > camRightHeading + PI)
velocityRightHeading = velocityRightHeading - TWOPI;

float betaChangeMult1 = CTimer::GetTimeStep() * CARCAM_SET[camSetArrPos][10];
float betaChangeLimit = CTimer::GetTimeStep() * CARCAM_SET[camSetArrPos][11];
float betaChangeMult1 = (CTimer::GetTimeStep() / CTimer::GetTimeStepFix()) * CARCAM_SET[camSetArrPos][10];
float betaChangeLimit = (CTimer::GetTimeStep() / CTimer::GetTimeStepFix()) * CARCAM_SET[camSetArrPos][11];

float betaChangeMult2 = (car->m_vecMoveSpeed - DotProduct(car->m_vecMoveSpeed, Front) * Front).Magnitude();

@@ -5028,8 +5028,8 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
} else {
targetAlpha = maxAlphaAllowed;
}
float maxAlphaBlendAmount = CTimer::GetTimeStep() * CARCAM_SET[camSetArrPos][6];
float targetAlphaBlendAmount = (1.0f - Pow(CARCAM_SET[camSetArrPos][5], CTimer::GetTimeStep())) * (targetAlpha - Alpha);
float maxAlphaBlendAmount = (CTimer::GetTimeStep() / CTimer::GetTimeStepFix()) * CARCAM_SET[camSetArrPos][6];
float targetAlphaBlendAmount = (1.0f - Pow(CARCAM_SET[camSetArrPos][5], CTimer::GetTimeStep() / CTimer::GetTimeStepFix())) * (targetAlpha - Alpha);
if (targetAlphaBlendAmount <= maxAlphaBlendAmount) {
if (targetAlphaBlendAmount < -maxAlphaBlendAmount)
targetAlphaBlendAmount = -maxAlphaBlendAmount;
@@ -5038,7 +5038,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
}

// Using GetCarGun(LR/UD) will give us same unprocessed RightStick value as SA
float stickX = -(pad->GetCarGunLeftRight());
float stickX = -pad->GetCarGunLeftRight();
float stickY = -pad->GetCarGunUpDown();

// In SA this is for not let num2/num8 move camera when Keyboard & Mouse controls are used.
@@ -5125,7 +5125,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
float betaSpeedFromStickX = xMovement * CARCAM_SET[camSetArrPos][12];

float newAngleSpeedMaxBlendAmount = CARCAM_SET[camSetArrPos][9];
float angleChangeStep = Pow(CARCAM_SET[camSetArrPos][8], CTimer::GetTimeStep());
float angleChangeStep = Pow(CARCAM_SET[camSetArrPos][8], CTimer::GetTimeStepFix());
float targetBetaWithStickBlendAmount = betaSpeedFromStickX + (targetBeta - Beta) / Max(CTimer::GetTimeStep(), 1.0f);

if (targetBetaWithStickBlendAmount < -newAngleSpeedMaxBlendAmount)
@@ -5135,7 +5135,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,

float angleChangeStepLeft = 1.0f - angleChangeStep;
BetaSpeed = targetBetaWithStickBlendAmount * angleChangeStepLeft + angleChangeStep * BetaSpeed;
if (Abs(BetaSpeed) < 0.0001f)
if (Abs(BetaSpeed) < 0.0001f * CTimer::GetTimeStepFix())
BetaSpeed = 0.0f;

float betaChangePerFrame;
@@ -5176,7 +5176,7 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
AlphaSpeed = maxAlphaSpeed;
}

if (Abs(AlphaSpeed) < 0.0001f)
if (Abs(AlphaSpeed) < 0.0001f * CTimer::GetTimeStepFix())
AlphaSpeed = 0.0f;

float alphaWithSpeedAccounted;
@@ -5200,12 +5200,12 @@ CCam::Process_FollowCar_SA(const CVector& CameraTarget, float TargetOrientation,
}

// Prevent unsignificant angle changes
if (Abs(lastAlpha - Alpha) < 0.0001f)
if (Abs(lastAlpha - Alpha) < 0.0001f * CTimer::GetTimeStepFix())
Alpha = lastAlpha;

lastAlpha = Alpha;

if (Abs(lastBeta - Beta) < 0.0001f)
if (Abs(lastBeta - Beta) < 0.0001f * CTimer::GetTimeStepFix())
Beta = lastBeta;

lastBeta = Beta;

0 comments on commit 2b7f8eb

Please sign in to comment.