Skip to content

Commit 29295d2

Browse files
committed
bugfix(fps): Decouple camera shaker time step from render update (#1451)
1 parent dc82f98 commit 29295d2

File tree

1 file changed

+29
-19
lines changed
  • GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient

1 file changed

+29
-19
lines changed

GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient/W3DView.cpp

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,9 @@ void W3DView::buildCameraTransform( Matrix3D *transform )
409409
transform->Look_At( sourcePos, targetPos, 0 );
410410

411411
//WST 11/12/2002 New camera shaker system
412-
CameraShakerSystem.Timestep(1.0f/30.0f);
412+
// TheSuperHackers @tweak The camera shaker is now decoupled from the render update.
413+
const Real logicTimeScaleOverFpsRatio = TheGameEngine->getActualLogicTimeScaleOverFpsRatio();
414+
CameraShakerSystem.Timestep(TheW3DFrameLengthInMsec * logicTimeScaleOverFpsRatio);
413415
CameraShakerSystem.Update_Camera_Shaker(sourcePos, &m_shakerAngles);
414416
transform->Rotate_X(m_shakerAngles.X);
415417
transform->Rotate_Y(m_shakerAngles.Y);
@@ -1084,8 +1086,34 @@ void W3DView::updateView(void)
10841086
// render update, but it advanced separately for every fixed time step. This ensures that
10851087
// things like vehicle wheels no longer spin too fast on high frame rates or keep spinning
10861088
// on game pause.
1089+
// The camera shaker is also no longer tied to the render update. The shake does sharp shakes
1090+
// on every fixed time step, and is not intended to have linear interpolation during the
1091+
// render update.
10871092
void W3DView::stepView()
10881093
{
1094+
//
1095+
// Process camera shake
1096+
//
1097+
if (m_shakeIntensity > 0.01f)
1098+
{
1099+
m_shakeOffset.x = m_shakeIntensity * m_shakeAngleCos;
1100+
m_shakeOffset.y = m_shakeIntensity * m_shakeAngleSin;
1101+
1102+
// fake a stiff spring/damper
1103+
const Real dampingCoeff = 0.75f;
1104+
m_shakeIntensity *= dampingCoeff;
1105+
1106+
// spring is so "stiff", it pulls 180 degrees opposite each frame
1107+
m_shakeAngleCos = -m_shakeAngleCos;
1108+
m_shakeAngleSin = -m_shakeAngleSin;
1109+
}
1110+
else
1111+
{
1112+
m_shakeIntensity = 0.0f;
1113+
m_shakeOffset.x = 0.0f;
1114+
m_shakeOffset.y = 0.0f;
1115+
}
1116+
10891117
if (TheScriptEngine->isTimeFast()) {
10901118
return; // don't draw - makes it faster :) jba.
10911119
}
@@ -1310,29 +1338,11 @@ void W3DView::update(void)
13101338
}
13111339
//
13121340
// Process camera shake
1313-
/// @todo Make this framerate-independent
13141341
//
13151342
if (m_shakeIntensity > 0.01f)
13161343
{
1317-
m_shakeOffset.x = m_shakeIntensity * m_shakeAngleCos;
1318-
m_shakeOffset.y = m_shakeIntensity * m_shakeAngleSin;
1319-
1320-
// fake a stiff spring/damper
1321-
const Real dampingCoeff = 0.75f;
1322-
m_shakeIntensity *= dampingCoeff;
1323-
1324-
// spring is so "stiff", it pulls 180 degrees opposite each frame
1325-
m_shakeAngleCos = -m_shakeAngleCos;
1326-
m_shakeAngleSin = -m_shakeAngleSin;
1327-
13281344
recalcCamera = true;
13291345
}
1330-
else
1331-
{
1332-
m_shakeIntensity = 0.0f;
1333-
m_shakeOffset.x = 0.0f;
1334-
m_shakeOffset.y = 0.0f;
1335-
}
13361346

13371347
//Process New C3 Camera Shaker system
13381348
if (CameraShakerSystem.IsCameraShaking())

0 commit comments

Comments
 (0)