- Re-write PlayerAngles scaled adjustment methods.

This commit is contained in:
Mitchell Richters 2022-11-28 16:34:29 +11:00 committed by Christoph Oelckers
parent aa868232c8
commit 630c10856e
11 changed files with 84 additions and 127 deletions

View file

@ -338,20 +338,16 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, PlayerAngles& w, P
("rotscrnang", w.ZzROTSCRNANG) ("rotscrnang", w.ZzROTSCRNANG)
("spin", w.YawSpin) ("spin", w.YawSpin)
("actor", w.pActor) ("actor", w.pActor)
("inputdisabled", w.legacyDisabledYaw) ("anglelocks", w.AngleLocks)
("horizoff", w.ZzHORIZOFF) ("horizoff", w.ZzHORIZOFF)
("inputdisabled", w.legacyDisabledPitch)
.EndObject(); .EndObject();
if (arc.isReading()) if (arc.isReading())
{ {
w.ZzOLDLOOKANG = w.ZzLOOKANG; w.ZzOLDLOOKANG = w.ZzLOOKANG;
w.ZzOLDROTSCRNANG = w.ZzROTSCRNANG; w.ZzOLDROTSCRNANG = w.ZzROTSCRNANG;
w.legacyDisabledYaw = w.legacyDisabledYaw;
w.resetAdjustmentYaw();
w.ZzOHORIZOFF = w.ZzHORIZOFF; w.ZzOHORIZOFF = w.ZzHORIZOFF;
w.legacyDisabledPitch = w.legacyDisabledPitch; w.resetAdjustments();
w.resetAdjustmentPitch();
} }
} }
return arc; return arc;

View file

@ -24,67 +24,53 @@ struct PlayerAngles
void doViewPitch(const DVector2& pos, DAngle const ang, bool const aimmode, bool const canslopetilt, sectortype* const cursectnum, double const scaleAdjust = 1, bool const climbing = false); void doViewPitch(const DVector2& pos, DAngle const ang, bool const aimmode, bool const canslopetilt, sectortype* const cursectnum, double const scaleAdjust = 1, bool const climbing = false);
// General methods. // General methods.
void resetAdjustments() { Adjustments = {}; }
void setActor(DCoreActor* const actor) { pActor = actor; } void setActor(DCoreActor* const actor) { pActor = actor; }
// Pitch methods. // Pitch methods.
void lockPitch() { legacyDisabledPitch = true; } void lockPitch() { AngleLocks.Set(PITCH); }
void unlockPitch() { legacyDisabledPitch = false; } void unlockPitch() { AngleLocks.Clear(PITCH); }
bool targetedPitch() { return legacyTargetPitch.Sgn(); } bool lockedPitch() { return Targets.Pitch.Sgn() || AngleLocks[PITCH]; }
bool lockedPitch() { return targetedPitch() || legacyDisabledPitch; } void addPitch(const DAngle value) { addAngle(PITCH, value); }
void addPitch(DAngle const value) void setPitch(const DAngle value, const bool backup = false) { setAngle(PITCH, ClampViewPitch(value), backup); }
{
if (!SyncInput())
{
legacyAdjustmentPitch += value;
}
else
{
ZzHORIZON() += value;
}
}
void setPitch(DAngle value, bool const backup = false)
{
// Clamp incoming variable because sometimes the caller can exceed bounds.
value = ClampViewPitch(value);
if (!SyncInput() && !backup)
{
legacyTargetPitch = value.Sgn() ? value : minAngle;
}
else
{
ZzHORIZON() = value;
if (backup) ZzOLDHORIZON() = ZzHORIZON();
}
}
// Yaw methods. // Yaw methods.
void lockYaw() { legacyDisabledYaw = true; } void lockYaw() { AngleLocks.Set(YAW); }
void unlockYaw() { legacyDisabledYaw = false; } void unlockYaw() { AngleLocks.Clear(YAW); }
bool targetedYaw() { return legacyTargetYaw.Sgn(); } bool lockedYaw() { return Targets.Yaw.Sgn() || AngleLocks[YAW]; }
bool lockedYaw() { return targetedYaw() || legacyDisabledYaw; } void addYaw(const DAngle value) { addAngle(YAW, value); }
void addYaw(const DAngle value) void setYaw(const DAngle value, const bool backup = false) { setAngle(YAW, value, backup); }
{
if (!SyncInput())
{
legacyAdjustmentYaw += value.Normalized180();
}
else
{
ZzANGLE() += value;
}
}
void setYaw(const DAngle value, bool const backup = false) // Roll methods.
void lockRoll() { AngleLocks.Set(ROLL); }
void unlockRoll() { AngleLocks.Clear(ROLL); }
bool lockedRoll() { return Targets.Roll.Sgn() || AngleLocks[ROLL]; }
void addRoll(const DAngle value) { addAngle(ROLL, value); }
void setRoll(const DAngle value, const bool backup = false) { setAngle(ROLL, value, backup); }
// Applicator of pending angle changes.
void applyScaledAdjustments(const double scaleAdjust)
{ {
if (!SyncInput() && !backup) for (unsigned i = 0; i < MAXANGLES; i++)
{ {
legacyTargetYaw = value.Sgn() ? value : minAngle; if (Targets[i].Sgn())
} {
else const auto delta = deltaangle(pActor->spr.Angles[i], Targets[i]);
{
ZzANGLE() = value; if (abs(delta.Degrees()) > BAngToDegree)
if (backup) ZzOLDANGLE() = ZzANGLE(); {
pActor->spr.Angles[i] += delta * scaleAdjust;
}
else
{
pActor->spr.Angles[i] = Targets[i];
Targets[i] = nullAngle;
}
}
else if (Adjustments[i].Sgn())
{
pActor->spr.Angles[i] += Adjustments[i] * scaleAdjust;
}
} }
} }
@ -108,27 +94,6 @@ struct PlayerAngles
// Legacy, to be removed. // Legacy, to be removed.
DAngle ZzHORIZOFF, ZzOHORIZOFF; DAngle ZzHORIZOFF, ZzOHORIZOFF;
void processLegacyHelperPitch(double const scaleAdjust)
{
if (targetedPitch())
{
auto delta = deltaangle(ZzHORIZON(), legacyTargetPitch);
if (abs(delta).Degrees() > 0.45)
{
ZzHORIZON() += delta * scaleAdjust;
}
else
{
ZzHORIZON() = legacyTargetPitch;
legacyTargetPitch = nullAngle;
}
}
else if (legacyAdjustmentPitch.Sgn())
{
ZzHORIZON() += legacyAdjustmentPitch * scaleAdjust;
}
}
void backupPitch() void backupPitch()
{ {
ZzOLDHORIZON() = ZzHORIZON(); ZzOLDHORIZON() = ZzHORIZON();
@ -142,30 +107,8 @@ struct PlayerAngles
DAngle horizOLDSUM() { return ZzOLDHORIZON() + ZzOHORIZOFF; } DAngle horizOLDSUM() { return ZzOLDHORIZON() + ZzOHORIZOFF; }
DAngle horizSUM() { return ZzHORIZON() + ZzHORIZOFF; } DAngle horizSUM() { return ZzHORIZON() + ZzHORIZOFF; }
DAngle horizLERPSUM(double const interpfrac) { return interpolatedvalue(horizOLDSUM(), horizSUM(), interpfrac); } DAngle horizLERPSUM(double const interpfrac) { return interpolatedvalue(horizOLDSUM(), horizSUM(), interpfrac); }
void resetAdjustmentPitch() { legacyAdjustmentPitch = nullAngle; }
DAngle ZzLOOKANG, ZzOLDLOOKANG, ZzROTSCRNANG, ZzOLDROTSCRNANG, YawSpin; DAngle ZzLOOKANG, ZzOLDLOOKANG, ZzROTSCRNANG, ZzOLDROTSCRNANG, YawSpin;
void processLegacyHelperYaw(double const scaleAdjust)
{
if (targetedYaw())
{
auto delta = deltaangle(ZzANGLE(), legacyTargetYaw);
if (abs(delta) > DAngleBuildToDeg)
{
ZzANGLE() += delta * scaleAdjust;
}
else
{
ZzANGLE() = legacyTargetYaw;
legacyTargetYaw = nullAngle;
}
}
else if (legacyAdjustmentYaw.Sgn())
{
ZzANGLE() += legacyAdjustmentYaw * scaleAdjust;
}
}
void backupYaw() void backupYaw()
{ {
ZzOLDANGLE() = ZzANGLE(); ZzOLDANGLE() = ZzANGLE();
@ -186,19 +129,46 @@ struct PlayerAngles
DAngle angLERPROTSCRN(double const interpfrac) { return interpolatedvalue(ZzOLDROTSCRNANG, ZzROTSCRNANG, interpfrac); } DAngle angLERPROTSCRN(double const interpfrac) { return interpolatedvalue(ZzOLDROTSCRNANG, ZzROTSCRNANG, interpfrac); }
DAngle angRENDERLOOKANG(double const interpfrac) { return !SyncInput() ? ZzLOOKANG : angLERPLOOKANG(interpfrac); } DAngle angRENDERLOOKANG(double const interpfrac) { return !SyncInput() ? ZzLOOKANG : angLERPLOOKANG(interpfrac); }
DAngle angRENDERROTSCRN(double const interpfrac) { return !SyncInput() ? ZzROTSCRNANG : angLERPROTSCRN(interpfrac); } DAngle angRENDERROTSCRN(double const interpfrac) { return !SyncInput() ? ZzROTSCRNANG : angLERPROTSCRN(interpfrac); }
void resetAdjustmentYaw() { legacyAdjustmentYaw = nullAngle; }
private: private:
// DRotator indices.
enum : unsigned
{
PITCH,
YAW,
ROLL,
MAXANGLES,
};
// Private data which should never be accessed publically. // Private data which should never be accessed publically.
DRotator Targets, Adjustments;
FixedBitArray<MAXANGLES> AngleLocks;
DCoreActor* pActor; DCoreActor* pActor;
void addAngle(const unsigned angIndex, const DAngle value)
{
if (!SyncInput())
{
Adjustments[angIndex] += value.Normalized180();
}
else
{
pActor->spr.Angles[angIndex] += value;
}
}
// Legacy, to be removed. void setAngle(const unsigned angIndex, const DAngle value, const bool backup)
DAngle legacyTargetPitch, legacyAdjustmentPitch; {
bool legacyDisabledPitch; if (!SyncInput() && !backup)
{
DAngle legacyTargetYaw, legacyAdjustmentYaw; Targets[angIndex] = value.Sgn() ? value : minAngle;
bool legacyDisabledYaw; }
else
{
pActor->spr.Angles[angIndex] = value;
if (backup) pActor->PrevAngles[angIndex] = pActor->spr.Angles[angIndex];
}
}
}; };
class FSerializer; class FSerializer;

View file

@ -66,8 +66,7 @@ void GameInterface::GetInput(ControlInfo* const hidInput, double const scaleAdju
doslopetilting(pPlayer, scaleAdjust); doslopetilting(pPlayer, scaleAdjust);
} }
pPlayer->Angles.processLegacyHelperYaw(scaleAdjust); pPlayer->Angles.applyScaledAdjustments(scaleAdjust);
pPlayer->Angles.processLegacyHelperPitch(scaleAdjust);
} }
if (packet) if (packet)

View file

@ -1522,8 +1522,7 @@ void ProcessInput(PLAYER* pPlayer)
Item_JumpBoots = 3 Item_JumpBoots = 3
}; };
pPlayer->Angles.resetAdjustmentPitch(); pPlayer->Angles.resetAdjustments();
pPlayer->Angles.resetAdjustmentYaw();
DBloodActor* actor = pPlayer->actor; DBloodActor* actor = pPlayer->actor;
POSTURE* pPosture = &pPlayer->pPosture[pPlayer->lifeMode][pPlayer->posture]; POSTURE* pPosture = &pPlayer->pPosture[pPlayer->lifeMode][pPlayer->posture];

View file

@ -841,8 +841,7 @@ void GameInterface::GetInput(ControlInfo* const hidInput, double const scaleAdju
p->Angles.applyPitch(input.horz, &p->sync.actions, scaleAdjust); p->Angles.applyPitch(input.horz, &p->sync.actions, scaleAdjust);
} }
p->Angles.processLegacyHelperYaw(scaleAdjust); p->Angles.applyScaledAdjustments(scaleAdjust);
p->Angles.processLegacyHelperPitch(scaleAdjust);
} }
if (packet) if (packet)

View file

@ -2725,8 +2725,7 @@ void processinput_d(int snum)
p = &ps[snum]; p = &ps[snum];
auto pact = p->GetActor(); auto pact = p->GetActor();
p->Angles.resetAdjustmentPitch(); p->Angles.resetAdjustments();
p->Angles.resetAdjustmentYaw();
ESyncBits& actions = p->sync.actions; ESyncBits& actions = p->sync.actions;

View file

@ -3272,8 +3272,7 @@ void processinput_r(int snum)
auto p = &ps[snum]; auto p = &ps[snum];
auto pact = p->GetActor(); auto pact = p->GetActor();
p->Angles.resetAdjustmentPitch(); p->Angles.resetAdjustments();
p->Angles.resetAdjustmentYaw();
ESyncBits& actions = p->sync.actions; ESyncBits& actions = p->sync.actions;

View file

@ -95,8 +95,7 @@ void GameInterface::GetInput(ControlInfo* const hidInput, double const scaleAdju
} }
} }
pPlayer->Angles.processLegacyHelperYaw(scaleAdjust); pPlayer->Angles.applyScaledAdjustments(scaleAdjust);
pPlayer->Angles.processLegacyHelperPitch(scaleAdjust);
UpdatePlayerSpriteAngle(pPlayer); UpdatePlayerSpriteAngle(pPlayer);
} }

View file

@ -906,8 +906,7 @@ void AIPlayer::Tick(RunListEvent* ev)
PlayerList[nPlayer].Angles.backupYaw(); PlayerList[nPlayer].Angles.backupYaw();
PlayerList[nPlayer].Angles.backupPitch(); PlayerList[nPlayer].Angles.backupPitch();
PlayerList[nPlayer].Angles.resetAdjustmentYaw(); PlayerList[nPlayer].Angles.resetAdjustments();
PlayerList[nPlayer].Angles.resetAdjustmentPitch();
pPlayerActor->vel.XY() = sPlayerInput[nPlayer].vel; pPlayerActor->vel.XY() = sPlayerInput[nPlayer].vel;

View file

@ -200,8 +200,7 @@ void GameInterface::GetInput(ControlInfo* const hidInput, double const scaleAdju
DoPlayerTurnTurret(pp, input.avel); DoPlayerTurnTurret(pp, input.avel);
} }
pp->Angles.processLegacyHelperYaw(scaleAdjust); pp->Angles.applyScaledAdjustments(scaleAdjust);
pp->Angles.processLegacyHelperPitch(scaleAdjust);
} }
if (packet) if (packet)

View file

@ -6973,8 +6973,7 @@ void domovethings(void)
// Reset flags used while tying input to framerate // Reset flags used while tying input to framerate
pp->Flags2 &= ~(PF2_INPUT_CAN_AIM|PF2_INPUT_CAN_TURN_GENERAL|PF2_INPUT_CAN_TURN_VEHICLE|PF2_INPUT_CAN_TURN_TURRET); pp->Flags2 &= ~(PF2_INPUT_CAN_AIM|PF2_INPUT_CAN_TURN_GENERAL|PF2_INPUT_CAN_TURN_VEHICLE|PF2_INPUT_CAN_TURN_TURRET);
pp->Angles.resetAdjustmentPitch(); pp->Angles.resetAdjustments();
pp->Angles.resetAdjustmentYaw();
// disable synchronised input if set by game. // disable synchronised input if set by game.
resetForcedSyncInput(); resetForcedSyncInput();