Skip to content

Commit bb53980

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

File tree

2 files changed

+55
-37
lines changed
  • GeneralsMD/Code/GameEngineDevice/Source/W3DDevice/GameClient
  • Generals/Code/GameEngineDevice/Source/W3DDevice/GameClient

2 files changed

+55
-37
lines changed

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

Lines changed: 26 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -940,8 +940,34 @@ void W3DView::updateView(void)
940940
// render update, but it advanced separately for every fixed time step. This ensures that
941941
// things like vehicle wheels no longer spin too fast on high frame rates or keep spinning
942942
// on game pause.
943+
// The camera shaker is also no longer tied to the render update. The shake does sharp shakes
944+
// on every fixed time step, and is not intended to have linear interpolation during the
945+
// render update.
943946
void W3DView::stepView()
944947
{
948+
//
949+
// Process camera shake
950+
//
951+
if (m_shakeIntensity > 0.01f)
952+
{
953+
m_shakeOffset.x = m_shakeIntensity * m_shakeAngleCos;
954+
m_shakeOffset.y = m_shakeIntensity * m_shakeAngleSin;
955+
956+
// fake a stiff spring/damper
957+
const Real dampingCoeff = 0.75f;
958+
m_shakeIntensity *= dampingCoeff;
959+
960+
// spring is so "stiff", it pulls 180 degrees opposite each frame
961+
m_shakeAngleCos = -m_shakeAngleCos;
962+
m_shakeAngleSin = -m_shakeAngleSin;
963+
}
964+
else
965+
{
966+
m_shakeIntensity = 0.0f;
967+
m_shakeOffset.x = 0.0f;
968+
m_shakeOffset.y = 0.0f;
969+
}
970+
945971
if (TheScriptEngine->isTimeFast()) {
946972
return; // don't draw - makes it faster :) jba.
947973
}
@@ -1164,29 +1190,11 @@ void W3DView::update(void)
11641190
}
11651191
//
11661192
// Process camera shake
1167-
/// @todo Make this framerate-independent
11681193
//
11691194
if (m_shakeIntensity > 0.01f)
11701195
{
1171-
m_shakeOffset.x = m_shakeIntensity * m_shakeAngleCos;
1172-
m_shakeOffset.y = m_shakeIntensity * m_shakeAngleSin;
1173-
1174-
// fake a stiff spring/damper
1175-
const Real dampingCoeff = 0.75f;
1176-
m_shakeIntensity *= dampingCoeff;
1177-
1178-
// spring is so "stiff", it pulls 180 degrees opposite each frame
1179-
m_shakeAngleCos = -m_shakeAngleCos;
1180-
m_shakeAngleSin = -m_shakeAngleSin;
1181-
11821196
recalcCamera = true;
11831197
}
1184-
else
1185-
{
1186-
m_shakeIntensity = 0.0f;
1187-
m_shakeOffset.x = 0.0f;
1188-
m_shakeOffset.y = 0.0f;
1189-
}
11901198

11911199
/*
11921200
* In order to have the camera follow the terrain in a non-dizzying way, we will have a

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)