mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-25 21:41:03 +00:00
Added interpolation to view position
This commit is contained in:
parent
e8d8dde283
commit
6b7065899d
4 changed files with 26 additions and 9 deletions
|
@ -125,6 +125,7 @@ typedef enum
|
||||||
CF_INTERPVIEWANGLES = 1 << 15, // [MR] flag for interpolating view angles without interpolating the entire frame
|
CF_INTERPVIEWANGLES = 1 << 15, // [MR] flag for interpolating view angles without interpolating the entire frame
|
||||||
CF_NOFOVINTERP = 1 << 16, // [B] Disable FOV interpolation when instantly zooming
|
CF_NOFOVINTERP = 1 << 16, // [B] Disable FOV interpolation when instantly zooming
|
||||||
CF_SCALEDNOLERP = 1 << 17, // [MR] flag for applying angles changes in the ticrate without interpolating the frame
|
CF_SCALEDNOLERP = 1 << 17, // [MR] flag for applying angles changes in the ticrate without interpolating the frame
|
||||||
|
CF_NOVIEWPOSINTERP = 1 << 18, // Disable view position interpolation.
|
||||||
CF_EXTREMELYDEAD = 1 << 22, // [RH] Reliably let the status bar know about extreme deaths.
|
CF_EXTREMELYDEAD = 1 << 22, // [RH] Reliably let the status bar know about extreme deaths.
|
||||||
CF_BUDDHA2 = 1 << 24, // [MC] Absolute buddha. No voodoo can kill it either.
|
CF_BUDDHA2 = 1 << 24, // [MC] Absolute buddha. No voodoo can kill it either.
|
||||||
CF_GODMODE2 = 1 << 25, // [MC] Absolute godmode. No voodoo can kill it either.
|
CF_GODMODE2 = 1 << 25, // [MC] Absolute godmode. No voodoo can kill it either.
|
||||||
|
|
|
@ -1278,6 +1278,7 @@ void P_PlayerThink (player_t *player)
|
||||||
player->cheats &= ~CF_INTERPVIEWANGLES;
|
player->cheats &= ~CF_INTERPVIEWANGLES;
|
||||||
player->cheats &= ~CF_SCALEDNOLERP;
|
player->cheats &= ~CF_SCALEDNOLERP;
|
||||||
player->cheats &= ~CF_NOFOVINTERP;
|
player->cheats &= ~CF_NOFOVINTERP;
|
||||||
|
player->cheats &= ~CF_NOVIEWPOSINTERP;
|
||||||
player->mo->FloatVar("prevBob") = player->bob;
|
player->mo->FloatVar("prevBob") = player->bob;
|
||||||
|
|
||||||
IFVIRTUALPTRNAME(player->mo, NAME_PlayerPawn, PlayerThink)
|
IFVIRTUALPTRNAME(player->mo, NAME_PlayerPawn, PlayerThink)
|
||||||
|
|
|
@ -78,7 +78,7 @@ struct InterpolationViewer
|
||||||
{
|
{
|
||||||
struct instance
|
struct instance
|
||||||
{
|
{
|
||||||
DVector3 Pos;
|
DVector3 Pos, ViewPos;
|
||||||
DRotator Angles;
|
DRotator Angles;
|
||||||
DRotator ViewAngles;
|
DRotator ViewAngles;
|
||||||
};
|
};
|
||||||
|
@ -605,6 +605,22 @@ void R_InterpolateView(FRenderViewpoint& viewPoint, const player_t* const player
|
||||||
|
|
||||||
// Now that the base position and angles are set, add offsets.
|
// Now that the base position and angles are set, add offsets.
|
||||||
|
|
||||||
|
const DViewPosition* const vPos = iView->ViewActor->ViewPos;
|
||||||
|
if (vPos != nullptr && !(vPos->Flags & VPSF_ABSOLUTEPOS)
|
||||||
|
&& (player == nullptr || gamestate == GS_TITLELEVEL || (!(player->cheats & CF_CHASECAM) && (!r_deathcamera || !(iView->ViewActor->flags6 & MF6_KILLED)))))
|
||||||
|
{
|
||||||
|
DVector3 vOfs = {};
|
||||||
|
if (player == nullptr || !(player->cheats & CF_NOVIEWPOSINTERP))
|
||||||
|
vOfs = iView->Old.ViewPos * inverseTicFrac + iView->New.ViewPos * ticFrac;
|
||||||
|
else
|
||||||
|
vOfs = iView->New.ViewPos;
|
||||||
|
|
||||||
|
if (vPos->Flags & VPSF_ABSOLUTEOFFSET)
|
||||||
|
iView->ViewOffset += vOfs;
|
||||||
|
else
|
||||||
|
iView->RelativeViewOffset += vOfs;
|
||||||
|
}
|
||||||
|
|
||||||
DVector3 posOfs = iView->ViewOffset;
|
DVector3 posOfs = iView->ViewOffset;
|
||||||
if (!iView->RelativeViewOffset.isZero())
|
if (!iView->RelativeViewOffset.isZero())
|
||||||
posOfs += DQuaternion::FromAngles(viewPoint.Angles.Yaw, viewPoint.Angles.Pitch, viewPoint.Angles.Roll) * iView->RelativeViewOffset;
|
posOfs += DQuaternion::FromAngles(viewPoint.Angles.Yaw, viewPoint.Angles.Pitch, viewPoint.Angles.Roll) * iView->RelativeViewOffset;
|
||||||
|
@ -916,8 +932,8 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA
|
||||||
viewPoint.showviewer = false;
|
viewPoint.showviewer = false;
|
||||||
viewPoint.bForceNoViewer = matchPlayer;
|
viewPoint.bForceNoViewer = matchPlayer;
|
||||||
|
|
||||||
if (gamestate != GS_TITLELEVEL &&
|
if (player != nullptr && gamestate != GS_TITLELEVEL
|
||||||
((player != nullptr && (player->cheats & CF_CHASECAM)) || (r_deathcamera && (viewPoint.camera->flags6 & MF6_KILLED))))
|
&& ((player->cheats & CF_CHASECAM) || (r_deathcamera && (viewPoint.camera->flags6 & MF6_KILLED))))
|
||||||
{
|
{
|
||||||
// The cam Actor should probably be visible in third person.
|
// The cam Actor should probably be visible in third person.
|
||||||
viewPoint.showviewer = true;
|
viewPoint.showviewer = true;
|
||||||
|
@ -925,7 +941,8 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA
|
||||||
iView->ViewOffset.Z = clamp<double>(chase_height, -1000.0, 1000.0);
|
iView->ViewOffset.Z = clamp<double>(chase_height, -1000.0, 1000.0);
|
||||||
iView->RelativeViewOffset.X = -clamp<double>(chase_dist, 0.0, 30000.0);
|
iView->RelativeViewOffset.X = -clamp<double>(chase_dist, 0.0, 30000.0);
|
||||||
}
|
}
|
||||||
else if (viewOffset != nullptr)
|
|
||||||
|
if (viewOffset != nullptr)
|
||||||
{
|
{
|
||||||
// No chase/death cam, so use the view offset.
|
// No chase/death cam, so use the view offset.
|
||||||
if (!viewPoint.bForceNoViewer)
|
if (!viewPoint.bForceNoViewer)
|
||||||
|
@ -933,16 +950,13 @@ void R_SetupFrame(FRenderViewpoint& viewPoint, const FViewWindow& viewWindow, AA
|
||||||
|
|
||||||
if (viewOffset->Flags & VPSF_ABSOLUTEPOS)
|
if (viewOffset->Flags & VPSF_ABSOLUTEPOS)
|
||||||
{
|
{
|
||||||
|
iView->New.ViewPos.Zero();
|
||||||
if (!matchPlayer)
|
if (!matchPlayer)
|
||||||
camPos = viewOffset->Offset;
|
camPos = viewOffset->Offset;
|
||||||
}
|
}
|
||||||
else if (viewOffset->Flags & VPSF_ABSOLUTEOFFSET)
|
|
||||||
{
|
|
||||||
iView->ViewOffset += viewOffset->Offset;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
iView->RelativeViewOffset = viewOffset->Offset;
|
iView->New.ViewPos = viewOffset->Offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1161,6 +1161,7 @@ enum EPlayerCheats
|
||||||
CF_INTERPVIEWANGLES = 1 << 15, // [MR] flag for interpolating view angles without interpolating the entire frame
|
CF_INTERPVIEWANGLES = 1 << 15, // [MR] flag for interpolating view angles without interpolating the entire frame
|
||||||
CF_NOFOVINTERP = 1 << 16, // [B] Disable FOV interpolation when instantly zooming
|
CF_NOFOVINTERP = 1 << 16, // [B] Disable FOV interpolation when instantly zooming
|
||||||
CF_SCALEDNOLERP = 1 << 17, // [MR] flag for applying angles changes in the ticrate without interpolating the frame
|
CF_SCALEDNOLERP = 1 << 17, // [MR] flag for applying angles changes in the ticrate without interpolating the frame
|
||||||
|
CF_NOVIEWPOSINTERP = 1 << 18, // Disable view position interpolation.
|
||||||
|
|
||||||
CF_EXTREMELYDEAD = 1 << 22, // [RH] Reliably let the status bar know about extreme deaths.
|
CF_EXTREMELYDEAD = 1 << 22, // [RH] Reliably let the status bar know about extreme deaths.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue