mirror of
https://github.com/DrBeef/Raze.git
synced 2025-01-31 21:20:39 +00:00
- Re-write PlayerAngles
scaled adjustment methods.
This commit is contained in:
parent
aa868232c8
commit
630c10856e
11 changed files with 84 additions and 127 deletions
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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];
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in a new issue