@@ -409,7 +409,9 @@ void W3DView::buildCameraTransform( Matrix3D *transform )
409
409
transform->Look_At ( sourcePos, targetPos, 0 );
410
410
411
411
// WST 11/12/2002 New camera shaker system
412
- CameraShakerSystem.Timestep (1 .0f /30 .0f );
412
+ // TheSuperHackers @tweak Decouples camera shaker from draw (aka render update)
413
+ const Real logicTimeScaleOverFpsRatio = TheGameEngine->getActualLogicTimeScaleOverFpsRatio ();
414
+ CameraShakerSystem.Timestep (TheW3DFrameLengthInMsec * logicTimeScaleOverFpsRatio);
413
415
CameraShakerSystem.Update_Camera_Shaker (sourcePos, &m_shakerAngles);
414
416
transform->Rotate_X (m_shakerAngles.X );
415
417
transform->Rotate_Y (m_shakerAngles.Y );
@@ -1084,8 +1086,34 @@ void W3DView::updateView(void)
1084
1086
// render update, but it advanced separately for every fixed time step. This ensures that
1085
1087
// things like vehicle wheels no longer spin too fast on high frame rates or keep spinning
1086
1088
// 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.
1087
1092
void W3DView::stepView ()
1088
1093
{
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
+
1089
1117
if (TheScriptEngine->isTimeFast ()) {
1090
1118
return ; // don't draw - makes it faster :) jba.
1091
1119
}
@@ -1310,29 +1338,11 @@ void W3DView::update(void)
1310
1338
}
1311
1339
//
1312
1340
// Process camera shake
1313
- // / @todo Make this framerate-independent
1314
1341
//
1315
1342
if (m_shakeIntensity > 0 .01f )
1316
1343
{
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
-
1328
1344
recalcCamera = true ;
1329
1345
}
1330
- else
1331
- {
1332
- m_shakeIntensity = 0 .0f ;
1333
- m_shakeOffset.x = 0 .0f ;
1334
- m_shakeOffset.y = 0 .0f ;
1335
- }
1336
1346
1337
1347
// Process New C3 Camera Shaker system
1338
1348
if (CameraShakerSystem.IsCameraShaking ())
0 commit comments