diff --git a/source/core/maptypes.h b/source/core/maptypes.h index b0be0da19..02ffcb2c6 100644 --- a/source/core/maptypes.h +++ b/source/core/maptypes.h @@ -429,6 +429,7 @@ struct walltype walltype* point2Wall() const; vec2_t delta() const { return point2Wall()->wall_int_pos() - wall_int_pos(); } vec2_t center() const { return(point2Wall()->wall_int_pos() + wall_int_pos()) / 2; } + DVector2 fcenter() const { return(point2Wall()->pos + pos) / 2; } int deltax() const { return point2Wall()->wall_int_pos().X - wall_int_pos().X; } int deltay() const { return point2Wall()->wall_int_pos().Y - wall_int_pos().Y; } bool twoSided() const { return nextsector >= 0; } diff --git a/source/games/blood/src/actor.cpp b/source/games/blood/src/actor.cpp index b71cd53f5..0f1a065ab 100644 --- a/source/games/blood/src/actor.cpp +++ b/source/games/blood/src/actor.cpp @@ -4541,9 +4541,7 @@ static Collision MoveThing(DBloodActor* actor) actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL; if ((actor->GetOwner()) && !cl_bloodvanillaexplosions && !VanillaMode()) enginecompatibility_mode = ENGINECOMPATIBILITY_NONE; // improved clipmove accuracy - auto pos = actor->int_pos(); - ClipMove(pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, actor->spr.clipdist << 2, (actor->int_pos().Z - top) / 4, (bottom - actor->int_pos().Z) / 4, CLIPMASK0, lhit); - actor->set_int_pos(pos); + ClipMove(actor->spr.pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, actor->spr.clipdist << 2, (actor->int_pos().Z - top) / 4, (bottom - actor->int_pos().Z) / 4, CLIPMASK0, lhit); actor->hit.hit = lhit; enginecompatibility_mode = bakCompat; // restore actor->spr.cstat = bakCstat; @@ -4763,9 +4761,7 @@ void MoveDude(DBloodActor* actor) { auto bakCstat = actor->spr.cstat; actor->spr.cstat &= ~CSTAT_SPRITE_BLOCK_ALL; - auto pos = actor->int_pos(); - ClipMove(pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, wd, tz, bz, CLIPMASK0, actor->hit.hit); - actor->set_int_pos(pos); + ClipMove(actor->spr.pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, wd, tz, bz, CLIPMASK0, actor->hit.hit); if (pSector == nullptr) { pSector = actor->sector(); diff --git a/source/games/blood/src/animatesprite.cpp b/source/games/blood/src/animatesprite.cpp index 8266a2594..f1d439ea2 100644 --- a/source/games/blood/src/animatesprite.cpp +++ b/source/games/blood/src/animatesprite.cpp @@ -444,7 +444,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF break; sectortype* pSector = pTSprite->sectp; - pNSprite->set_int_pos({ pTSprite->int_pos().X, pTSprite->int_pos().Y, pSector->int_ceilingz() }); + pNSprite->pos = { pTSprite->pos.X, pTSprite->pos.Y, pSector->ceilingz }; pNSprite->picnum = 624; pNSprite->shade = ((pTSprite->int_pos().Z - pSector->int_ceilingz()) >> 8) - 64; @@ -462,7 +462,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF break; sectortype* pSector = pTSprite->sectp; - pNSprite->set_int_pos({ pTSprite->int_pos().X, pTSprite->int_pos().Y, pSector->int_floorz() }); + pNSprite->pos = { pTSprite->pos.X, pTSprite->pos.Y, pSector->floorz }; pNSprite->picnum = 624; uint8_t nShade = (pSector->int_floorz() - pTSprite->int_pos().Z) >> 8; pNSprite->shade = nShade - 32; @@ -499,7 +499,7 @@ static tspritetype* viewAddEffect(tspriteArray& tsprites, int nTSprite, VIEW_EFF if (!pNSprite) break; - pNSprite->set_int_pos({ pTSprite->int_pos().X, pTSprite->int_pos().Y, pTSprite->int_pos().Z - (32 << 8) - (weaponIcon.zOffset << 8) }); + pNSprite->pos = pTSprite->pos.plusZ(-32 - weaponIcon.zOffset); pNSprite->picnum = nTile; pNSprite->shade = pTSprite->shade; pNSprite->xrepeat = 32; diff --git a/source/games/blood/src/gameutil.h b/source/games/blood/src/gameutil.h index 5b63e289c..d615ceb89 100644 --- a/source/games/blood/src/gameutil.h +++ b/source/games/blood/src/gameutil.h @@ -47,6 +47,13 @@ void GetZRange(DBloodActor* pSprite, int* ceilZ, Collision* ceilHit, int* floorZ 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); void ClipMove(vec3_t& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, CollisionBase& hit, int tracecount = 3); +inline void ClipMove(DVector3& pos, sectortype** pSector, int xv, int yv, int wd, int cd, int fd, unsigned int nMask, CollisionBase& hit, int tracecount = 3) +{ + // this uses floats only partially. + vec3_t ipos = { int(pos.X * worldtoint), int(pos.Y * worldtoint), int(pos.Z * zworldtoint)}; + ClipMove(ipos, pSector, xv, yv, wd, cd, fd, nMask, hit, tracecount); + pos = { ipos.X * inttoworld, ipos.Y * inttoworld, ipos.Z * zinttoworld }; +} BitArray GetClosestSpriteSectors(sectortype* pSector, int x, int y, int nDist, TArray* pWalls, bool newSectCheckMethod = false); int picWidth(int nPic, int repeat); int picHeight(int nPic, int repeat); diff --git a/source/games/blood/src/nnexts.cpp b/source/games/blood/src/nnexts.cpp index 2a122ddd3..9268af00c 100644 --- a/source/games/blood/src/nnexts.cpp +++ b/source/games/blood/src/nnexts.cpp @@ -977,7 +977,7 @@ static DBloodActor* randomDropPickupObject(DBloodActor* sourceactor, int prevIte if (spawned) { sourceactor->xspr.dropMsg = uint8_t(spawned->spr.type); // store dropped item type in dropMsg - spawned->set_int_pos(sourceactor->int_pos()); + spawned->spr.pos = sourceactor->spr.pos; if ((sourceactor->spr.flags & kModernTypeFlag1) && (sourceactor->xspr.txID > 0 || (sourceactor->xspr.txID != 3 && sourceactor->xspr.lockMsg > 0))) { @@ -1676,10 +1676,8 @@ void debrisMove(int listIndex) auto oldcstat = actor->spr.cstat; actor->spr.cstat &= ~(CSTAT_SPRITE_BLOCK | CSTAT_SPRITE_BLOCK_HITSCAN); - auto pos = actor->int_pos(); - ClipMove(pos, &pSector, actor->vel.X >> 12, + ClipMove(actor->spr.pos, &pSector, actor->vel.X >> 12, actor->vel.Y >> 12, clipDist, ceilDist, floorDist, CLIPMASK0, moveHit); - actor->set_int_pos(pos); actor->hit.hit = moveHit; actor->spr.cstat = oldcstat; diff --git a/source/games/duke/src/actors_d.cpp b/source/games/duke/src/actors_d.cpp index 7798becdc..c23e1f901 100644 --- a/source/games/duke/src/actors_d.cpp +++ b/source/games/duke/src/actors_d.cpp @@ -2957,16 +2957,11 @@ static void fireflyflyingeffect(DDukeActor *actor) else actor->spr.cstat &= ~CSTAT_SPRITE_INVISIBLE; - double dx = Owner->int_pos().X - ps[p].GetActor()->int_pos().X; - double dy = Owner->int_pos().Y - ps[p].GetActor()->int_pos().Y; - double dist = sqrt(dx * dx + dy * dy); - if (dist != 0.0) - { - dx /= dist; - dy /= dist; - } + auto dvec = Owner->spr.pos.XY() - ps[p].GetActor()->spr.pos.XY(); + double dist = dvec.Length(); - actor->set_int_pos({ (int)(Owner->int_pos().X - (dx * -10.0)), (int)(Owner->int_pos().Y - (dy * -10.0)), Owner->int_pos().Z + 2048 }); + if (dist != 0.0) dvec /= dist; + actor->spr.pos = Owner->spr.pos + DVector3(dvec.X * -0.625, dvec.Y * -0.625, 8); if (Owner->spr.extra <= 0) { diff --git a/source/games/sw/src/draw.cpp b/source/games/sw/src/draw.cpp index 9037f5625..7b6f5bd07 100644 --- a/source/games/sw/src/draw.cpp +++ b/source/games/sw/src/draw.cpp @@ -427,7 +427,6 @@ void DoMotionBlur(tspriteArray& tsprites, tspritetype const * const tsp) void WarpCopySprite(tspriteArray& tsprites) { int spnum; - int xoff,yoff,zoff; int match; // look for the first one @@ -456,15 +455,7 @@ void WarpCopySprite(tspriteArray& tsprites) tspritetype* newTSpr = renderAddTsprite(tsprites, itActor2); newTSpr->statnum = 0; - - xoff = itActor->int_pos().X - newTSpr->int_pos().X; - yoff = itActor->int_pos().Y - newTSpr->int_pos().Y; - zoff = itActor->int_pos().Z - newTSpr->int_pos().Z; - - newTSpr->set_int_pos({ - itActor1->int_pos().X - xoff, - itActor1->int_pos().Y - yoff, - itActor1->int_pos().Z - zoff }); + newTSpr->pos += itActor1->spr.pos - itActor->spr.pos; newTSpr->sectp = itActor1->sector(); } @@ -481,7 +472,7 @@ void WarpCopySprite(tspriteArray& tsprites) newTSpr->statnum = 0; auto off = itActor1->int_pos() - newTSpr->int_pos(); - newTSpr->set_int_pos(itActor->int_pos() - off); + newTSpr->pos += itActor->spr.pos - itActor1->spr.pos; newTSpr->sectp = itActor->sector(); } } diff --git a/source/games/sw/src/player.cpp b/source/games/sw/src/player.cpp index eede56cfa..5a78f961b 100644 --- a/source/games/sw/src/player.cpp +++ b/source/games/sw/src/player.cpp @@ -1716,7 +1716,7 @@ void UpdatePlayerUnderSprite(PLAYER* pp) DSWActor* act_under = pp->PlayerUnderActor; - act_under->set_int_pos(act_over->int_pos()); + act_under->spr.pos = act_over->spr.pos; ChangeActorSect(act_under, act_over->sector()); SpriteWarpToUnderwater(act_under);