diff --git a/Core/GameEngineDevice/Include/W3DDevice/GameClient/W3DView.h b/Core/GameEngineDevice/Include/W3DDevice/GameClient/W3DView.h index 87178aed370..fd0c3ca0ee8 100644 --- a/Core/GameEngineDevice/Include/W3DDevice/GameClient/W3DView.h +++ b/Core/GameEngineDevice/Include/W3DDevice/GameClient/W3DView.h @@ -76,7 +76,7 @@ typedef struct typedef struct { Int numFrames; ///< Number of frames to rotate. - Int curFrame; ///< Current frame. + Real curFrame; ///< Progress in frames, advanced by elapsed logic time. Int startTimeMultiplier; Int endTimeMultiplier; Int numHoldFrames; ///< Number of frames to hold the camera before finishing the movement @@ -101,7 +101,7 @@ typedef struct typedef struct { Int numFrames; ///< Number of frames to pitch. - Int curFrame; ///< Current frame. + Real curFrame; ///< Progress in frames, advanced by elapsed logic time. Real angle; Real startPitch; Real endPitch; @@ -115,7 +115,7 @@ typedef struct typedef struct { Int numFrames; ///< Number of frames to zoom. - Int curFrame; ///< Current frame. + Real curFrame; ///< Progress in frames, advanced by elapsed logic time. Real startZoom; Real endZoom; Int startTimeMultiplier; @@ -325,9 +325,9 @@ class W3DView : public View, public SubsystemInterface void moveAlongWaypointPath(Real milliseconds); ///< Move camera along path. void getPickRay(const ICoord2D *screen, Vector3 *rayStart, Vector3 *rayEnd); ///getLogicTimeStepMilliseconds(FramePacer::IgnoreFrozenTime)); didUpdate = true; } if (hasScriptedState(Scripted_Pitch)) { - pitchCameraOneFrame(); + pitchCameraOneFrame(TheFramePacer->getLogicTimeStepMilliseconds(FramePacer::IgnoreFrozenTime)); didUpdate = true; } if (hasScriptedState(Scripted_Rotate)) { m_previousLookAtPosition = getPosition(); - rotateCameraOneFrame(); + rotateCameraOneFrame(TheFramePacer->getLogicTimeStepMilliseconds(FramePacer::IgnoreFrozenTime)); didUpdate = true; } else if (hasScriptedState(Scripted_MoveOnWaypointPath)) @@ -3268,9 +3268,12 @@ static Real makeQuadraticS(Real t) // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void W3DView::rotateCameraOneFrame() +void W3DView::rotateCameraOneFrame(Real milliseconds) { - m_rcInfo.curFrame++; + // TheSuperHackers @bugfix bobtista 14/08/2026 Advance the scripted camera by the elapsed logic + // time rather than by one render frame, so the movement takes the authored duration at any + // render frame rate. This mirrors moveAlongWaypointPath, which was decoupled the same way. + m_rcInfo.curFrame += milliseconds / TheW3DFrameLengthInMsec; if (TheGlobalData->m_disableCameraMovement) { if (m_rcInfo.curFrame >= m_rcInfo.numFrames + m_rcInfo.numHoldFrames) { removeScriptedState(Scripted_Rotate); @@ -3339,9 +3342,9 @@ void W3DView::rotateCameraOneFrame() // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void W3DView::zoomCameraOneFrame() +void W3DView::zoomCameraOneFrame(Real milliseconds) { - m_zcInfo.curFrame++; + m_zcInfo.curFrame += milliseconds / TheW3DFrameLengthInMsec; if (TheGlobalData->m_disableCameraMovement) { if (m_zcInfo.curFrame >= m_zcInfo.numFrames) { removeScriptedState(Scripted_Zoom); @@ -3365,9 +3368,9 @@ void W3DView::zoomCameraOneFrame() // ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------ -void W3DView::pitchCameraOneFrame() +void W3DView::pitchCameraOneFrame(Real milliseconds) { - m_pcInfo.curFrame++; + m_pcInfo.curFrame += milliseconds / TheW3DFrameLengthInMsec; if (TheGlobalData->m_disableCameraMovement) { if (m_pcInfo.curFrame >= m_pcInfo.numFrames) { removeScriptedState(Scripted_Pitch);