Major Cooke: View Angles (Part 1)

Added ViewAngle, ViewPitch and ViewRoll. See https://forum.zdoom.org/viewtopic.php?f=59&t=65639&p=1117937#p1117937 for details!

- These are purely cosmetic offsets to the player's current angle/pitch/roll, not affecting the player's true aim and movement direction.
- Includes three absolute flags: ViewAbs<Angle/Pitch/Roll> which makes the implied orientation absolute.
This commit is contained in:
Major Cooke 2019-10-19 09:52:36 -05:00
parent 7b943fdf67
commit d2ecc535c1
5 changed files with 59 additions and 3 deletions

View file

@ -88,6 +88,9 @@ void PlayIdle(AActor *player);
enum
{
PPF_NOTHRUSTWHENINVUL = 1, // Attacks do not thrust the player if they are invulnerable.
PPF_VIEWABSANGLE = 1 << 5,
PPF_VIEWABSPITCH = 1 << 6,
PPF_VIEWABSROLL = 1 << 7,
};
//
@ -303,6 +306,9 @@ public:
float DesiredFOV = 0; // desired field of vision
float FOV = 0; // current field of vision
double viewangle = 0; // Angle offset (separate from actual angle)
double viewpitch = 0; // ^ for pitch
double viewroll = 0; // ...you get the point
double viewz = 0; // focal origin above r.z
double viewheight = 0; // base height above floor for viewz
double deltaviewheight = 0; // squat speed.
@ -415,6 +421,10 @@ public:
return mo->FloatVar(NAME_ViewHeight);
}
int GetFlags() const
{
return mo->IntVar(NAME_PlayerFlags);
}
void Uncrouch()
{

View file

@ -1617,6 +1617,9 @@ void player_t::Serialize(FSerializer &arc)
arc("desiredfov", DesiredFOV)
("fov", FOV)
("viewangle", viewangle)
("viewpitch", viewpitch)
("viewroll", viewroll)
("viewz", viewz)
("viewheight", viewheight)
("deltaviewheight", deltaviewheight)
@ -1723,6 +1726,9 @@ DEFINE_FIELD_X(PlayerInfo, player_t, original_oldbuttons)
DEFINE_FIELD_X(PlayerInfo, player_t, cls)
DEFINE_FIELD_X(PlayerInfo, player_t, DesiredFOV)
DEFINE_FIELD_X(PlayerInfo, player_t, FOV)
DEFINE_FIELD_X(PlayerInfo, player_t, viewangle)
DEFINE_FIELD_X(PlayerInfo, player_t, viewpitch)
DEFINE_FIELD_X(PlayerInfo, player_t, viewroll)
DEFINE_FIELD_X(PlayerInfo, player_t, viewz)
DEFINE_FIELD_X(PlayerInfo, player_t, viewheight)
DEFINE_FIELD_X(PlayerInfo, player_t, deltaviewheight)

View file

@ -804,7 +804,17 @@ void R_SetupFrame (FRenderViewpoint &viewpoint, FViewWindow &viewwindow, AActor
viewpoint.sector = viewpoint.camera->Sector;
viewpoint.showviewer = false;
}
iview->New.Angles = viewpoint.camera->Angles;
if (viewpoint.camera->player != nullptr)
{
auto plr = viewpoint.camera->player;
int flags = plr->GetFlags();
viewpoint.Angles.Yaw = ((flags & PPF_VIEWABSANGLE) ? 0. : viewpoint.camera->Angles.Yaw) + plr->viewangle;
viewpoint.Angles.Pitch = ((flags & PPF_VIEWABSPITCH) ? 0. : viewpoint.camera->Angles.Pitch) + plr->viewpitch;
viewpoint.Angles.Roll = ((flags & PPF_VIEWABSROLL) ? 0. : viewpoint.camera->Angles.Roll) + plr->viewroll;
}
iview->New.Angles = viewpoint.Angles;
if (viewpoint.camera->player != 0)
{
player = viewpoint.camera->player;

View file

@ -1057,6 +1057,9 @@ xx(AttackZOffset)
xx(SpawnMask)
xx(ScoreIcon)
xx(ViewHeight)
xx(ViewForward)
xx(ViewSide)
xx(ViewAngle)
xx(FallingScreamMinSpeed)
xx(FallingScreamMaxSpeed)
xx(GruntSpeed)

View file

@ -30,6 +30,7 @@ class PlayerPawn : Actor
Name Portrait;
Name Slot[10];
double HexenArmor[5];
double ViewAngle, ViewPitch, ViewRoll;
// [GRB] Player class properties
double JumpZ;
@ -79,6 +80,9 @@ class PlayerPawn : Actor
flagdef NoThrustWhenInvul: PlayerFlags, 0;
flagdef CanSuperMorph: PlayerFlags, 1;
flagdef CrouchableMorph: PlayerFlags, 2;
flagdef ViewAbsAngle: PlayerFlags, 5;
flagdef ViewAbsPitch: PlayerFlags, 6;
flagdef ViewAbsRoll: PlayerFlags, 7;
Default
{
@ -503,6 +507,24 @@ class PlayerPawn : Actor
}
}
}
//-----------------------------------------------------------------------
// CalcView
//
// Performs the camera offsetting for the view angles (yaw/pitch/roll)
//-----------------------------------------------------------------------
virtual void CalcView()
{
let player = self.player;
// Do not update the view if someone else is holding the camera.
if (player == NULL || player.mo != self || player.camera != self)
return;
player.viewangle = viewangle;
player.viewpitch = viewpitch;
player.viewroll = viewroll;
}
/*
==================
@ -684,7 +706,8 @@ class PlayerPawn : Actor
Pitch = 0.;
}
}
player.mo.CalcHeight ();
player.mo.CalcHeight();
player.mo.CalcView();
if (player.attacker && player.attacker != self)
{ // Watch killer
@ -1616,7 +1639,8 @@ class PlayerPawn : Actor
CheckPitch();
HandleMovement();
CalcHeight ();
CalcHeight();
CalcView();
if (!(player.cheats & CF_PREDICTING))
{
@ -2607,6 +2631,9 @@ struct PlayerInfo native play // self is what internally is known as player_t
native float DesiredFOV;
native float FOV;
native double viewz;
native double viewangle;
native double viewpitch;
native double viewroll;
native double viewheight;
native double deltaviewheight;
native double bob;