mirror of
https://github.com/DrBeef/Raze.git
synced 2025-02-21 19:21:44 +00:00
- floatified UpdateAimVector
the biggest mess of all.
This commit is contained in:
parent
a843c0bdb6
commit
b2bf137d72
2 changed files with 60 additions and 71 deletions
|
@ -113,7 +113,7 @@ struct PLAYER
|
||||||
double zWeapon;
|
double zWeapon;
|
||||||
double ozWeapon;
|
double ozWeapon;
|
||||||
double zWeaponVel;
|
double zWeaponVel;
|
||||||
int slope;
|
int slope; // Q18.14, like dudeslope
|
||||||
bool isUnderwater;
|
bool isUnderwater;
|
||||||
bool hasKey[8];
|
bool hasKey[8];
|
||||||
int8_t hasFlag;
|
int8_t hasFlag;
|
||||||
|
|
|
@ -423,20 +423,16 @@ void UpdateAimVector(PLAYER* pPlayer)
|
||||||
{
|
{
|
||||||
assert(pPlayer != NULL);
|
assert(pPlayer != NULL);
|
||||||
auto plActor = pPlayer->actor;
|
auto plActor = pPlayer->actor;
|
||||||
int x = plActor->int_pos().X;
|
DVector3 pos(plActor->spr.pos.XY(), pPlayer->zWeapon);
|
||||||
int y = plActor->int_pos().Y;
|
DVector3 Aim(plActor->spr.angle.ToVector(), pPlayer->slope / 16384.);
|
||||||
int z = pPlayer->zWeapon * zworldtoint;
|
|
||||||
Aim aim;
|
|
||||||
aim.dx = bcos(plActor->int_ang());
|
|
||||||
aim.dy = bsin(plActor->int_ang());
|
|
||||||
aim.dz = pPlayer->slope;
|
|
||||||
WEAPONTRACK* pWeaponTrack = &gWeaponTrack[pPlayer->curWeapon];
|
WEAPONTRACK* pWeaponTrack = &gWeaponTrack[pPlayer->curWeapon];
|
||||||
DBloodActor* targetactor = nullptr;
|
DBloodActor* targetactor = nullptr;
|
||||||
pPlayer->aimTargetsCount = 0;
|
pPlayer->aimTargetsCount = 0;
|
||||||
int autoaim = Autoaim(pPlayer->nPlayer);
|
int autoaim = Autoaim(pPlayer->nPlayer);
|
||||||
if (autoaim == 1 || (autoaim == 2 && !pWeaponTrack->bIsProjectile) || pPlayer->curWeapon == kWeapVoodooDoll || pPlayer->curWeapon == kWeapLifeLeech)
|
if (autoaim == 1 || (autoaim == 2 && !pWeaponTrack->bIsProjectile) || pPlayer->curWeapon == kWeapVoodooDoll || pPlayer->curWeapon == kWeapLifeLeech)
|
||||||
{
|
{
|
||||||
int nClosest = 0x7fffffff;
|
double nClosest = 0x7fffffff;
|
||||||
BloodStatIterator it(kStatDude);
|
BloodStatIterator it(kStatDude);
|
||||||
while (auto actor = it.Next())
|
while (auto actor = it.Next())
|
||||||
{
|
{
|
||||||
|
@ -448,48 +444,45 @@ void UpdateAimVector(PLAYER* pPlayer)
|
||||||
continue;
|
continue;
|
||||||
if (!(actor->spr.flags & 8))
|
if (!(actor->spr.flags & 8))
|
||||||
continue;
|
continue;
|
||||||
int x2 = actor->int_pos().X;
|
|
||||||
int y2 = actor->int_pos().Y;
|
auto pos2 = actor->spr.pos;
|
||||||
int z2 = actor->int_pos().Z;
|
double nDist = (pos2.XY() - pos.XY()).Length();
|
||||||
int nDist = approxDist(x2 - x, y2 - y);
|
if (nDist == 0 || nDist > 3200)
|
||||||
if (nDist == 0 || nDist > 51200)
|
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (pWeaponTrack->seeker)
|
if (pWeaponTrack->seeker)
|
||||||
{
|
{
|
||||||
int t = DivScale(nDist, pWeaponTrack->seeker, 12);
|
double t = nDist * 4096 / pWeaponTrack->seeker;
|
||||||
x2 += (actor->int_vel().X * t) >> 12;
|
pos2 += actor->vel * t;
|
||||||
y2 += (actor->int_vel().Y * t) >> 12;
|
|
||||||
z2 += (actor->int_vel().Z * t) >> 8;
|
|
||||||
}
|
}
|
||||||
int lx = x + MulScale(Cos(plActor->int_ang()), nDist, 30);
|
DVector3 lpos = pos + DVector3(plActor->spr.angle.ToVector(), pPlayer->slope / 16384.) * nDist;
|
||||||
int ly = y + MulScale(Sin(plActor->int_ang()), nDist, 30);
|
|
||||||
int lz = z + MulScale(pPlayer->slope, nDist, 10);
|
double zRange = nDist * (9460 / 16384.);
|
||||||
int zRange = MulScale(9460, nDist, 10);
|
double top, bottom;
|
||||||
int top, bottom;
|
|
||||||
GetActorExtents(actor, &top, &bottom);
|
GetActorExtents(actor, &top, &bottom);
|
||||||
if (lz - zRange > bottom || lz + zRange < top)
|
if (lpos.Z - zRange > bottom || lpos.Z + zRange < top)
|
||||||
continue;
|
continue;
|
||||||
int angle = getangle(x2 - x, y2 - y);
|
|
||||||
if (abs(((angle - plActor->int_ang() + 1024) & 2047) - 1024) > pWeaponTrack->angleRange)
|
DAngle angle = VecToAngle(pos2 - pos);
|
||||||
|
DAngle deltaangle = absangle(angle, plActor->spr.angle);
|
||||||
|
if (deltaangle > DAngle::fromBuild(pWeaponTrack->angleRange))
|
||||||
continue;
|
continue;
|
||||||
if (pPlayer->aimTargetsCount < 16 && cansee(x, y, z, plActor->sector(), x2, y2, z2, actor->sector()))
|
if (pPlayer->aimTargetsCount < 16 && cansee(pos, plActor->sector(), pos2, actor->sector()))
|
||||||
pPlayer->aimTargets[pPlayer->aimTargetsCount++] = actor;
|
pPlayer->aimTargets[pPlayer->aimTargetsCount++] = actor;
|
||||||
// Inlined?
|
|
||||||
int dz = (lz - z2) >> 8;
|
double nDist2 = (lpos - pos2).Length();
|
||||||
int dy = (ly - y2) >> 4;
|
|
||||||
int dx = (lx - x2) >> 4;
|
|
||||||
int nDist2 = ksqrt(dx * dx + dy * dy + dz * dz);
|
|
||||||
if (nDist2 >= nClosest)
|
if (nDist2 >= nClosest)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type);
|
DUDEINFO* pDudeInfo = getDudeInfo(actor->spr.type);
|
||||||
int center = (actor->spr.yrepeat * pDudeInfo->aimHeight) << 2;
|
if (cansee(pos, plActor->sector(), pos2, actor->sector()))
|
||||||
int dzCenter = (z2 - center) - z;
|
|
||||||
if (cansee(x, y, z, plActor->sector(), x2, y2, z2, actor->sector()))
|
|
||||||
{
|
{
|
||||||
|
double center = (actor->spr.yrepeat * pDudeInfo->aimHeight) * REPEAT_SCALE;
|
||||||
|
double dzCenter = (pos2.Z - center) - pos.Z;
|
||||||
|
|
||||||
nClosest = nDist2;
|
nClosest = nDist2;
|
||||||
aim.dx = bcos(angle);
|
Aim.XY() = angle.ToVector();
|
||||||
aim.dy = bsin(angle);
|
Aim.Z = dzCenter / nDist;
|
||||||
aim.dz = DivScale(dzCenter, nDist, 10);
|
|
||||||
targetactor = actor;
|
targetactor = actor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -502,53 +495,49 @@ void UpdateAimVector(PLAYER* pPlayer)
|
||||||
continue;
|
continue;
|
||||||
if (!(actor->spr.flags & 8))
|
if (!(actor->spr.flags & 8))
|
||||||
continue;
|
continue;
|
||||||
int x2 = actor->int_pos().X;
|
auto pos2 = actor->spr.pos;
|
||||||
int y2 = actor->int_pos().Y;
|
auto dv = pos2 - pos;
|
||||||
int z2 = actor->int_pos().Z;
|
|
||||||
int dx = x2 - x;
|
double nDist = dv.Length();
|
||||||
int dy = y2 - y;
|
if (nDist == 0 || nDist > 3200)
|
||||||
int dz = z2 - z;
|
|
||||||
int nDist = approxDist(dx, dy);
|
|
||||||
if (nDist == 0 || nDist > 51200)
|
|
||||||
continue;
|
continue;
|
||||||
int lx = x + MulScale(Cos(plActor->int_ang()), nDist, 30);
|
|
||||||
int ly = y + MulScale(Sin(plActor->int_ang()), nDist, 30);
|
DVector3 lpos = pos + DVector3(plActor->spr.angle.ToVector(), pPlayer->slope / 16384.) * nDist;
|
||||||
int lz = z + MulScale(pPlayer->slope, nDist, 10);
|
double zRange = nDist * (9460 / 16384.);
|
||||||
int zRange = MulScale(9460, nDist, 10);
|
|
||||||
int top, bottom;
|
double top, bottom;
|
||||||
GetActorExtents(actor, &top, &bottom);
|
GetActorExtents(actor, &top, &bottom);
|
||||||
if (lz - zRange > bottom || lz + zRange < top)
|
if (lpos.Z - zRange > bottom || lpos.Z + zRange < top)
|
||||||
continue;
|
continue;
|
||||||
int angle = getangle(dx, dy);
|
|
||||||
if (abs(((angle - plActor->int_ang() + 1024) & 2047) - 1024) > pWeaponTrack->thingAngle)
|
DAngle angle = VecToAngle(dv);
|
||||||
|
DAngle deltaangle = absangle(angle, plActor->spr.angle);
|
||||||
|
if (deltaangle > DAngle::fromBuild(pWeaponTrack->thingAngle))
|
||||||
continue;
|
continue;
|
||||||
if (pPlayer->aimTargetsCount < 16 && cansee(x, y, z, plActor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector()))
|
|
||||||
|
if (pPlayer->aimTargetsCount < 16 && cansee(pos, plActor->sector(), pos2, actor->sector()))
|
||||||
pPlayer->aimTargets[pPlayer->aimTargetsCount++] = actor;
|
pPlayer->aimTargets[pPlayer->aimTargetsCount++] = actor;
|
||||||
// Inlined?
|
|
||||||
int dz2 = (lz - z2) >> 8;
|
double nDist2 = (lpos - pos2).Length();
|
||||||
int dy2 = (ly - y2) >> 4;
|
|
||||||
int dx2 = (lx - x2) >> 4;
|
|
||||||
int nDist2 = ksqrt(dx2 * dx2 + dy2 * dy2 + dz2 * dz2);
|
|
||||||
if (nDist2 >= nClosest)
|
if (nDist2 >= nClosest)
|
||||||
continue;
|
continue;
|
||||||
if (cansee(x, y, z, plActor->sector(), actor->int_pos().X, actor->int_pos().Y, actor->int_pos().Z, actor->sector()))
|
if (cansee(pos, plActor->sector(), pos2, actor->sector()))
|
||||||
{
|
{
|
||||||
nClosest = nDist2;
|
nClosest = nDist2;
|
||||||
aim.dx = bcos(angle);
|
Aim.XY() = angle.ToVector();
|
||||||
aim.dy = bsin(angle);
|
Aim.Z = dv.Z / nDist;
|
||||||
aim.dz = DivScale(dz, nDist, 10);
|
|
||||||
targetactor = actor;
|
targetactor = actor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Aim aim2;
|
DVector3 Aim2(Aim);
|
||||||
aim2 = aim;
|
Aim2.XY() = Aim2.XY().Rotated(-plActor->spr.angle);
|
||||||
RotateVector((int*)&aim2.dx, (int*)&aim2.dy, -plActor->int_ang());
|
Aim2.Z -= pPlayer->slope / 16384.;
|
||||||
aim2.dz -= pPlayer->slope;
|
|
||||||
pPlayer->relAim.dx = interpolatedvalue(pPlayer->relAim.dx, aim2.dx, FixedToFloat(pWeaponTrack->aimSpeedHorz));
|
pPlayer->relAim.dx = interpolatedvalue(pPlayer->relAim.dx, int(Aim2.X * 16384), FixedToFloat(pWeaponTrack->aimSpeedHorz));
|
||||||
pPlayer->relAim.dy = interpolatedvalue(pPlayer->relAim.dy, aim2.dy, FixedToFloat(pWeaponTrack->aimSpeedHorz));
|
pPlayer->relAim.dy = interpolatedvalue(pPlayer->relAim.dy, int(Aim2.Y * 16384), FixedToFloat(pWeaponTrack->aimSpeedHorz));
|
||||||
pPlayer->relAim.dz = interpolatedvalue(pPlayer->relAim.dz, aim2.dz, FixedToFloat(pWeaponTrack->aimSpeedVert));
|
pPlayer->relAim.dz = interpolatedvalue(pPlayer->relAim.dz, int(Aim2.Z * 16384), FixedToFloat(pWeaponTrack->aimSpeedVert));
|
||||||
pPlayer->aim = pPlayer->relAim;
|
pPlayer->aim = pPlayer->relAim;
|
||||||
RotateVector((int*)&pPlayer->aim.dx, (int*)&pPlayer->aim.dy, plActor->int_ang());
|
RotateVector((int*)&pPlayer->aim.dx, (int*)&pPlayer->aim.dy, plActor->int_ang());
|
||||||
pPlayer->aim.dz += pPlayer->slope;
|
pPlayer->aim.dz += pPlayer->slope;
|
||||||
|
|
Loading…
Reference in a new issue