Separate fake_longtics and raw_input (#1710)

This commit is contained in:
ceski 2024-05-26 20:42:10 -07:00 committed by GitHub
parent 1c325fb79d
commit 2fb776726a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 43 additions and 24 deletions

View File

@ -24,12 +24,37 @@
#include "i_timer.h"
#include "i_video.h"
#include "p_mobj.h"
#include "r_main.h"
#include "r_state.h"
//
// Local View
//
boolean G_UseLocalView(const player_t *player)
{
return ((raw_input || (lowres_turn && fake_longtics))
&& player == &players[consoleplayer]
&& player->playerstate != PST_DEAD
&& !player->mo->reactiontime
&& !demoplayback
&& (!netgame || solonet));
}
angle_t (*G_CalcViewAngle)(const player_t *player);
static angle_t CalcViewAngle_RawInput(const player_t *player)
{
return (player->mo->angle + localview.angle - player->ticangle
+ LerpAngle(player->oldticangle, player->ticangle));
}
static angle_t CalcViewAngle_LerpFakeLongTics(const player_t *player)
{
return LerpAngle(player->mo->oldangle + localview.oldlerpangle,
player->mo->angle + localview.lerpangle);
}
void (*G_UpdateLocalView)(void);
void G_ClearLocalView(void)
@ -44,6 +69,8 @@ static void UpdateLocalView_FakeLongTics(void)
localview.angleoffset = 0;
localview.pitch = 0;
localview.rawpitch = 0.0;
localview.oldlerpangle = localview.lerpangle;
localview.lerpangle = localview.angle;
}
//
@ -151,15 +178,21 @@ void G_UpdateAngleFunctions(void)
CarryAngleTic = lowres_turn ? CarryAngleTic_LowRes : CarryAngleTic_Full;
CarryAngle = CarryAngleTic;
G_UpdateLocalView = G_ClearLocalView;
G_CalcViewAngle = CalcViewAngle_RawInput;
if (raw_input && (!netgame || solonet))
if (!netgame || solonet)
{
if (lowres_turn && fake_longtics)
{
CarryAngle = CarryAngle_FakeLongTics;
G_UpdateLocalView = UpdateLocalView_FakeLongTics;
if (uncapped && !raw_input)
{
G_CalcViewAngle = CalcViewAngle_LerpFakeLongTics;
}
}
else if (uncapped)
else if (uncapped && raw_input)
{
CarryAngle = lowres_turn ? CarryAngle_LowRes : CarryAngle_Full;
}

View File

@ -25,6 +25,8 @@ struct ticcmd_s;
// Local View
boolean G_UseLocalView(const struct player_s *player);
extern angle_t (*G_CalcViewAngle)(const struct player_s *player);
extern void (*G_UpdateLocalView)(void);
void G_ClearLocalView(void);

View File

@ -30,6 +30,7 @@
#include "doomdata.h"
#include "doomdef.h"
#include "doomstat.h"
#include "g_input.h"
#include "i_video.h"
#include "p_mobj.h"
#include "p_pspr.h"
@ -696,24 +697,6 @@ subsector_t *R_PointInSubsector(fixed_t x, fixed_t y)
return &subsectors[nodenum & ~NF_SUBSECTOR];
}
static inline boolean CheckLocalView(const player_t *player)
{
return (
// Don't use localview when interpolation is preferred.
raw_input &&
// Don't use localview if the player is spying.
player == &players[consoleplayer] &&
// Don't use localview if the player is dead.
player->playerstate != PST_DEAD &&
// Don't use localview if the player just teleported.
!player->mo->reactiontime &&
// Don't use localview if a demo is playing.
!demoplayback &&
// Don't use localview during a netgame (single-player or solo-net only).
(!netgame || solonet)
);
}
//
// R_SetupFrame
//
@ -722,7 +705,7 @@ void R_SetupFrame (player_t *player)
{
int i, cm;
fixed_t pitch;
const boolean use_localview = CheckLocalView(player);
const boolean use_localview = G_UseLocalView(player);
viewplayer = player;
// [AM] Interpolate the player camera if the feature is enabled.
@ -743,8 +726,7 @@ void R_SetupFrame (player_t *player)
if (use_localview)
{
viewangle = (player->mo->angle + localview.angle - player->ticangle +
LerpAngle(player->oldticangle, player->ticangle));
viewangle = G_CalcViewAngle(player);
}
else
{
@ -773,7 +755,7 @@ void R_SetupFrame (player_t *player)
// [crispy] pitch is actual lookdir and weapon pitch
pitch = player->pitch + player->recoilpitch;
if (use_localview && lowres_turn && fake_longtics)
if (use_localview)
{
viewangle += localview.angle;
}

View File

@ -94,6 +94,8 @@ typedef struct localview_s
double rawangle;
double rawpitch;
angle_t angle;
angle_t oldlerpangle;
angle_t lerpangle;
fixed_t pitch;
short angleoffset;
} localview_t;