mirror of
https://github.com/ZDoom/qzdoom.git
synced 2025-02-13 07:31:04 +00:00
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:
parent
7b943fdf67
commit
d2ecc535c1
5 changed files with 59 additions and 3 deletions
|
@ -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()
|
||||
{
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -1057,6 +1057,9 @@ xx(AttackZOffset)
|
|||
xx(SpawnMask)
|
||||
xx(ScoreIcon)
|
||||
xx(ViewHeight)
|
||||
xx(ViewForward)
|
||||
xx(ViewSide)
|
||||
xx(ViewAngle)
|
||||
xx(FallingScreamMinSpeed)
|
||||
xx(FallingScreamMaxSpeed)
|
||||
xx(GruntSpeed)
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue