diff options
| author | quarrel07 <178681861+quarrel07@users.noreply.github.com> | 2026-07-26 22:00:47 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-07-26 23:00:47 -0600 |
| commit | 5b28472d477bab101dee2a0f469fe2aee2c58a01 (patch) | |
| tree | 1a368189c00196f1b0f5547f79473c8b313d0f0c /src/enhancements | |
| parent | 24ac81951ea9b40a431b07a3c6395beab636cd97 (diff) | |
Fix garbage frame flash on cinematic camera cuts (#720)
* Fix garbage frame flash on cinematic camera cuts
Frame interpolation blended matrices across instant camera teleports in
attract/demo and post-race cameras, flashing 1-2 frames of sheared
geometry. Complete the existing camera-epoch mechanism: flag a cut in
func_80019890 when the camera moves >100 units, and have the
interpolator snap that frame to the new view instead of blending.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Retrigger CI (transient 502 downloading libogg from gitlab.xiph.org)
* Name the cinematic shot dispatcher
Review feedback on #720: func_80019890 -> camera_start_cinematic_shot.
It starts whichever shot D_80164680 has selected for a camera, dispatching
to the per-shot setup that teleports the camera to the shot's opening
position, which is why the cut detection lives there.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
* Apply fix to freecam
Added FrameInterpolation_DontInterpolateCamera calls to improve camera behavior when changing target players.
---------
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: MegaMech <MegaMech@users.noreply.github.com>
Diffstat (limited to 'src/enhancements')
| -rw-r--r-- | src/enhancements/freecam/freecam.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/enhancements/freecam/freecam.cpp b/src/enhancements/freecam/freecam.cpp index c5ee60319..07d0f6e51 100644 --- a/src/enhancements/freecam/freecam.cpp +++ b/src/enhancements/freecam/freecam.cpp @@ -236,9 +236,11 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { if (bFreecamUseController) { if (fController.buttonDepressed & R_TRIG) { fTargetPlayer = true; + FrameInterpolation_DontInterpolateCamera(); } if (fController.buttonDepressed & L_TRIG) { fTargetPlayer = false; + FrameInterpolation_DontInterpolateCamera(); } if (fController.buttonPressed & L_JPAD) { TargetPreviousPlayer = true; @@ -273,6 +275,7 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { else if (wnd->GetWindowBackend() == Ship::WindowBackend::FAST3D_DXGI_DX11) { if (FreecamKeyDown('F')) { fTargetPlayer = !fTargetPlayer; + FrameInterpolation_DontInterpolateCamera(); } if (FreecamKeyDown('N')) { TargetPreviousPlayer = true; @@ -309,6 +312,7 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { const uint8_t* keystate = SDL_GetKeyboardState(NULL); if (FreecamKeyDown(SDL_SCANCODE_F)) { fTargetPlayer = !fTargetPlayer; + FrameInterpolation_DontInterpolateCamera(); } if (FreecamKeyDown(SDL_SCANCODE_N)) { TargetPreviousPlayer = true; @@ -345,6 +349,7 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { fRankIndex--; camera->playerId = fRankIndex; gScreenOneCtx->player = &gPlayers[fRankIndex]; + FrameInterpolation_DontInterpolateCamera(); } } @@ -354,6 +359,7 @@ void freecam_keyboard_manager(Camera* camera, Vec3f forwardVector) { fRankIndex++; camera->playerId = fRankIndex; gScreenOneCtx->player = &gPlayers[fRankIndex]; + FrameInterpolation_DontInterpolateCamera(); } } |
