- MoveMissile + GetZRangeXYZ

This commit is contained in:
Christoph Oelckers 2021-11-24 00:21:08 +01:00
parent 9a85ff9bad
commit 94671c5b05
4 changed files with 31 additions and 24 deletions

View file

@ -370,6 +370,13 @@ class F2DDrawer;
void getzrange(const vec3_t *pos, int16_t sectnum, int32_t *ceilz, int32_t *ceilhit, int32_t *florz, void getzrange(const vec3_t *pos, int16_t sectnum, int32_t *ceilz, int32_t *ceilhit, int32_t *florz,
int32_t *florhit, int32_t walldist, uint32_t cliptype) ATTRIBUTE((nonnull(1,3,4,5,6))); int32_t *florhit, int32_t walldist, uint32_t cliptype) ATTRIBUTE((nonnull(1,3,4,5,6)));
inline void getzrange(const vec3_t* pos, sectortype* sect, int32_t* ceilz, int32_t* ceilhit, int32_t* florz,
int32_t* florhit, int32_t walldist, uint32_t cliptype)
{
getzrange(pos, sector.IndexOf(sect), ceilz, ceilhit, florz, florhit, walldist, cliptype);
}
inline void getzrange(int x, int y, int z, int16_t sectnum, int32_t* ceilz, int32_t* ceilhit, int32_t* florz, inline void getzrange(int x, int y, int z, int16_t sectnum, int32_t* ceilz, int32_t* ceilhit, int32_t* florz,
int32_t* florhit, int32_t walldist, uint32_t cliptype) int32_t* florhit, int32_t walldist, uint32_t cliptype)
{ {

View file

@ -5340,18 +5340,18 @@ int MoveMissile(DBloodActor* actor)
while (1) while (1)
{ {
vec3_t pos = pSprite->pos; vec3_t pos = pSprite->pos;
int nSector2 = pSprite->sectnum; auto pSector2 = pSprite->sector();
const auto bakSpriteCstat = pSprite->cstat; const auto bakSpriteCstat = pSprite->cstat;
if (pOwner && !isFlameSprite && !cl_bloodvanillaexplosions && !VanillaMode()) if (pOwner && !isFlameSprite && !cl_bloodvanillaexplosions && !VanillaMode())
{ {
enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy
pSprite->cstat &= ~257; // remove self collisions for accurate clipmove pSprite->cstat &= ~257; // remove self collisions for accurate clipmove
} }
Collision clipmoveresult = ClipMove(&pos, &nSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0, 1); Collision clipmoveresult = ClipMove(&pos, &pSector2, vx, vy, pSprite->clipdist << 2, (pos.z - top) / 4, (bottom - pos.z) / 4, CLIPMASK0, 1);
enginecompatibility_mode = bakCompat; // restore enginecompatibility_mode = bakCompat; // restore
pSprite->cstat = bakSpriteCstat; pSprite->cstat = bakSpriteCstat;
int nSector = nSector2; auto pSector = pSector2;
if (nSector2 < 0) if (pSector2 == nullptr)
{ {
cliptype = -1; cliptype = -1;
break; break;
@ -5368,7 +5368,7 @@ int MoveMissile(DBloodActor* actor)
else else
{ {
int32_t fz, cz; int32_t fz, cz;
getzsofslope(clipmoveresult.wall()->nextsector, pos.x, pos.y, &cz, &fz); getzsofslopeptr(clipmoveresult.wall()->nextSector(), pos.x, pos.y, &cz, &fz);
if (pos.z <= cz || pos.z >= fz) cliptype = 0; if (pos.z <= cz || pos.z >= fz) cliptype = 0;
else cliptype = 4; else cliptype = 4;
} }
@ -5400,12 +5400,12 @@ int MoveMissile(DBloodActor* actor)
pos.y -= MulScale(Sin(nAngle), 16, 30); pos.y -= MulScale(Sin(nAngle), 16, 30);
int nVel = approxDist(actor->xvel, actor->yvel); int nVel = approxDist(actor->xvel, actor->yvel);
vz -= scale(0x100, actor->zvel, nVel); vz -= scale(0x100, actor->zvel, nVel);
updatesector(pos.x, pos.y, &nSector); updatesector(pos.x, pos.y, &pSector);
nSector2 = nSector; pSector2 = pSector;
} }
int ceilZ, floorZ; int ceilZ, floorZ;
Collision ceilColl, floorColl; Collision ceilColl, floorColl;
GetZRangeAtXYZ(pos.x, pos.y, pos.z, nSector2, &ceilZ, &ceilColl, &floorZ, &floorColl, pSprite->clipdist << 2, CLIPMASK0); GetZRangeAtXYZ(pos.x, pos.y, pos.z, pSector2, &ceilZ, &ceilColl, &floorZ, &floorColl, pSprite->clipdist << 2, CLIPMASK0);
GetActorExtents(actor, &top, &bottom); GetActorExtents(actor, &top, &bottom);
top += vz; top += vz;
bottom += vz; bottom += vz;
@ -5423,11 +5423,11 @@ int MoveMissile(DBloodActor* actor)
} }
pSprite->pos = pos; pSprite->pos = pos;
pSprite->z += vz; pSprite->z += vz;
updatesector(pos.x, pos.y, &nSector); updatesector(pos.x, pos.y, &pSector);
if (nSector >= 0 && nSector != pSprite->sectnum) if (pSector != nullptr && pSector != pSprite->sector())
{ {
assert(validSectorIndex(nSector)); assert(pSector);
ChangeActorSect(actor, nSector); ChangeActorSect(actor, pSector);
} }
CheckLink(actor); CheckLink(actor);
gHitInfo.hitSect = pSprite->sector(); gHitInfo.hitSect = pSprite->sector();

View file

@ -624,40 +624,40 @@ void GetZRange(DBloodActor *actor, int *ceilZ, Collision *ceilColl, int *floorZ,
pSprite->cstat = bakCstat; pSprite->cstat = bakCstat;
} }
void GetZRangeAtXYZ(int x, int y, int z, int nSector, int *ceilZ, Collision* ceilColl, int* floorZ, Collision* floorColl, int nDist, unsigned int nMask, unsigned int nClipParallax) void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collision* ceilColl, int* floorZ, Collision* floorColl, int nDist, unsigned int nMask, unsigned int nClipParallax)
{ {
int ceilHit, floorHit; int ceilHit, floorHit;
int32_t nTemp1, nTemp2; int32_t nTemp1, nTemp2;
vec3_t lpos = { x, y, z }; vec3_t lpos = { x, y, z };
getzrange(&lpos, nSector, (int32_t*)ceilZ, &ceilHit, (int32_t*)floorZ, &floorHit, nDist, nMask); getzrange(&lpos, pSector, (int32_t*)ceilZ, &ceilHit, (int32_t*)floorZ, &floorHit, nDist, nMask);
ceilColl->setFromEngine(ceilHit); ceilColl->setFromEngine(ceilHit);
floorColl->setFromEngine(floorHit); floorColl->setFromEngine(floorHit);
if (floorColl->type == kHitSector) if (floorColl->type == kHitSector)
{ {
int nSector = floorColl->index; auto pSector = floorColl->sector();
if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (sector[nSector].floorstat & 1)) if ((nClipParallax & PARALLAXCLIP_FLOOR) == 0 && (pSector->floorstat & 1))
*floorZ = 0x7fffffff; *floorZ = 0x7fffffff;
if (sector[nSector].hasX()) if (pSector->hasX())
{ {
XSECTOR* pXSector = &sector[nSector].xs(); XSECTOR* pXSector = &pSector->xs();
*floorZ += pXSector->Depth << 10; *floorZ += pXSector->Depth << 10;
} }
auto actor = getUpperLink(nSector); auto actor = pSector->upperLink;
if (actor) if (actor)
{ {
auto link = actor->GetOwner(); auto link = actor->GetOwner();
vec3_t newpos = lpos + link->s().pos - actor->s().pos; vec3_t newpos = lpos + link->s().pos - actor->s().pos;
getzrange(&newpos, link->s().sectnum, &nTemp1, &nTemp2, (int32_t*)floorZ, &floorHit, nDist, nMask); getzrange(&newpos, link->s().sector(), &nTemp1, &nTemp2, (int32_t*)floorZ, &floorHit, nDist, nMask);
floorColl->setFromEngine(floorHit); floorColl->setFromEngine(floorHit);
*floorZ -= link->s().z - actor->s().z; *floorZ -= link->s().z - actor->s().z;
} }
} }
if (ceilColl->type == kHitSector) if (ceilColl->type == kHitSector)
{ {
int nSector = ceilColl->index; auto pSector = ceilColl->sector();
if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (sector[nSector].ceilingstat & 1)) if ((nClipParallax & PARALLAXCLIP_CEILING) == 0 && (pSector->ceilingstat & 1))
*ceilZ = 0x80000000; *ceilZ = 0x80000000;
auto actor = getLowerLink(nSector); auto actor = pSector->lowerLink;
if (actor) if (actor)
{ {
auto link = actor->GetOwner(); auto link = actor->GetOwner();

View file

@ -77,7 +77,7 @@ bool IntersectRay(int wx, int wy, int wdx, int wdy, int x1, int y1, int z1, int
int HitScan(DBloodActor *pSprite, int z, int dx, int dy, int dz, unsigned int nMask, int a8); int HitScan(DBloodActor *pSprite, int z, int dx, int dy, int dz, unsigned int nMask, int a8);
int VectorScan(DBloodActor *pSprite, int nOffset, int nZOffset, int dx, int dy, int dz, int nRange, int ac); int VectorScan(DBloodActor *pSprite, int nOffset, int nZOffset, int dx, int dy, int dz, int nRange, int ac);
void GetZRange(DBloodActor *pSprite, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0); void GetZRange(DBloodActor *pSprite, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0);
void GetZRangeAtXYZ(int x, int y, int z, int nSector, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0); void GetZRangeAtXYZ(int x, int y, int z, sectortype* pSector, int *ceilZ, Collision *ceilHit, int *floorZ, Collision *floorHit, int nDist, unsigned int nMask, unsigned int nClipParallax = 0);
int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3); int GetDistToLine(int x1, int y1, int x2, int y2, int x3, int y3);
[[deprecated]] unsigned int ClipMove(vec3_t* pos, int *nSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount = 3); [[deprecated]] unsigned int ClipMove(vec3_t* pos, int *nSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount = 3);
unsigned int ClipMove(vec3_t* pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount = 3); unsigned int ClipMove(vec3_t* pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, int tracecount = 3);