From b9dbcebe2ebfc1bed7242203489d50f80e3b6dfe Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 18 Aug 2022 19:14:50 +0200 Subject: [PATCH] - floatified SECTOR_OBJECT::pmid --- source/games/sw/src/game.h | 13 +++++++------ source/games/sw/src/interpso.cpp | 12 ++++++------ source/games/sw/src/save.cpp | 6 +++--- source/games/sw/src/sector.cpp | 2 +- source/games/sw/src/track.cpp | 27 ++++++++++++--------------- source/games/sw/src/weapon.cpp | 2 +- 6 files changed, 30 insertions(+), 32 deletions(-) diff --git a/source/games/sw/src/game.h b/source/games/sw/src/game.h index 42c4e7033..7b47bf93b 100644 --- a/source/games/sw/src/game.h +++ b/source/games/sw/src/game.h @@ -1406,7 +1406,7 @@ struct SECTOR_OBJECT { vec3_t int_pmid() const { - return __int_pmid; + return { int(pmid.X * worldtoint), int(pmid.Y * worldtoint),int(pmid.Z * zworldtoint) }; } soANIMATORp PreMoveAnimator; @@ -1416,7 +1416,7 @@ struct SECTOR_OBJECT TObjPtr sp_child; // child sprite that holds info for the sector object - vec3_t __int_pmid; // midpoints of the sector object + DVector3 pmid; // midpoints of the sector object TObjPtr so_actors[MAX_SO_SPRITE]; // hold the actors of the object TObjPtr match_event_actor; // spritenum of the match event sprite @@ -1567,10 +1567,11 @@ enum SO_TURRET = 97, SO_VEHICLE = 98, // #define SO_SPEED_BOAT 99 - MAXSO = INT32_MAX / 2 }; -inline bool SO_EMPTY(SECTOR_OBJECT* sop) { return (sop->__int_pmid.X == MAXSO); } +constexpr double MAXSO = INT32_MAX / 32; // make sure this does not overflow when converted to a Build int coordinate. + +inline bool SO_EMPTY(SECTOR_OBJECT* sop) { return (sop->pmid.X == MAXSO); } extern SECTOR_OBJECT SectorObject[MAX_SECTOR_OBJECTS]; @@ -2141,7 +2142,7 @@ struct ANIM case ANIM_Floorz: return sector[animindex].int_floorz(); case ANIM_SopZ: - return SectorObject[animindex].__int_pmid.Z; + return SectorObject[animindex].int_pmid().Z; case ANIM_Spritez: if (animactor == nullptr) return 0; return animactor->spr.int_pos().Z; @@ -2163,7 +2164,7 @@ struct ANIM sector[animindex].set_int_floorz(value); break; case ANIM_SopZ: - SectorObject[animindex].__int_pmid.Z = value; + SectorObject[animindex].pmid.Z = value * zinttoworld; break; case ANIM_Spritez: if (animactor == nullptr) return; diff --git a/source/games/sw/src/interpso.cpp b/source/games/sw/src/interpso.cpp index 2a399f5c4..9b841ef07 100644 --- a/source/games/sw/src/interpso.cpp +++ b/source/games/sw/src/interpso.cpp @@ -103,11 +103,11 @@ static double getvalue(so_interp::interp_data& element) case soi_floor: return sector[index].floorz; case soi_sox: - return SectorObject[index].__int_pmid.X; + return SectorObject[index].pmid.X; case soi_soy: - return SectorObject[index].__int_pmid.Y; + return SectorObject[index].pmid.Y; case soi_soz: - return SectorObject[index].__int_pmid.Z; + return SectorObject[index].pmid.Z; case soi_sprx: if (element.actorofang) return element.actorofang->spr.pos.X; @@ -147,13 +147,13 @@ static void setvalue(so_interp::interp_data& element, double value) sector[index].setfloorz(value); break; case soi_sox: - SectorObject[index].__int_pmid.X = (int)value; + SectorObject[index].pmid.X = value; break; case soi_soy: - SectorObject[index].__int_pmid.Y = (int)value; + SectorObject[index].pmid.Y = value; break; case soi_soz: - SectorObject[index].__int_pmid.Z = (int)value; + SectorObject[index].pmid.Z = value; break; case soi_sprx: if (element.actorofang) diff --git a/source/games/sw/src/save.cpp b/source/games/sw/src/save.cpp index ff0325111..13c12bdd3 100644 --- a/source/games/sw/src/save.cpp +++ b/source/games/sw/src/save.cpp @@ -637,9 +637,9 @@ FSerializer& Serialize(FSerializer& arc, const char* keyname, SECTOR_OBJECT& w, .Array("yorig", w.yorig, def->yorig, w.num_walls) ("controller", w.controller, def->controller) ("child", w.sp_child, def->sp_child) - ("xmid", w.__int_pmid.X, def->__int_pmid.X) - ("ymid", w.__int_pmid.Y, def->__int_pmid.Y) - ("zmid", w.__int_pmid.Z, def->__int_pmid.Z) + ("xmid", w.pmid.X, def->pmid.X) + ("ymid", w.pmid.Y, def->pmid.Y) + ("zmid", w.pmid.Z, def->pmid.Z) ("vel", w.vel, def->vel) ("vel_tgt", w.vel_tgt, def->vel_tgt) ("player_xoff", w.player_xoff, def->player_xoff) diff --git a/source/games/sw/src/sector.cpp b/source/games/sw/src/sector.cpp index ebe50494d..df54b002f 100644 --- a/source/games/sw/src/sector.cpp +++ b/source/games/sw/src/sector.cpp @@ -379,7 +379,7 @@ void SectorSetup(void) SectorObject[ndx].mid_sector = nullptr; SectorObject[ndx].op_main_sector = nullptr; SectorObject[ndx].morph_wall_point = nullptr; - SectorObject[ndx].__int_pmid.X = MAXSO; + SectorObject[ndx].pmid.X = MAXSO; } memset(SineWaveFloor, 0, sizeof(SineWaveFloor)); diff --git a/source/games/sw/src/track.cpp b/source/games/sw/src/track.cpp index 90e49b4a4..dd2c52dcb 100644 --- a/source/games/sw/src/track.cpp +++ b/source/games/sw/src/track.cpp @@ -707,9 +707,7 @@ void SectorObjectSetupBounds(SECTOR_OBJECT* sop) BoundActor = FindBoundSprite(SECT_SO_CENTER); if (BoundActor) { - sop->__int_pmid.X = BoundActor->int_pos().X; - sop->__int_pmid.Y = BoundActor->int_pos().Y; - sop->__int_pmid.Z = BoundActor->int_pos().Z; + sop->pmid = BoundActor->spr.pos; KillActor(BoundActor); } @@ -934,7 +932,7 @@ cont: ASSERT(zmid != -9999999); - sop->__int_pmid.Z = zmid; + sop->pmid.Z = zmid * inttoworld; for (i = 0; sop->so_actors[i] != nullptr; i++) { @@ -1028,7 +1026,7 @@ void SetupSectorObject(sectortype* sectp, short tag) case TAG_OBJECT_CENTER - 500: sop->mid_sector = sectp; - SectorMidPoint(sectp, &sop->__int_pmid.X, &sop->__int_pmid.Y, &sop->__int_pmid.Z); + sop->pmid = SectorMidPoint(sectp); sop->dir = 1; sop->track = sectp->hitag; @@ -1582,25 +1580,24 @@ void MovePoints(SECTOR_OBJECT* sop, short delta_ang, int nx, int ny) int i, rot_ang; bool PlayerMove = true; - if (sop->int_pmid().X >= MAXSO) + if (SO_EMPTY(sop)) PlayerMove = false; // move along little midpoint - sop->__int_pmid.X += nx; - sop->__int_pmid.Y += ny; + sop->pmid.X += nx * inttoworld; + sop->pmid.Y += ny * inttoworld; - if (sop->int_pmid().X >= MAXSO) + if (SO_EMPTY(sop)) PlayerMove = false; // move child sprite along also - sop->sp_child->set_int_xy(sop->int_pmid().X, sop->int_pmid().Y); - + sop->sp_child->spr.pos.XY() = sop->pmid.XY(); // setting floor z if need be if ((sop->flags & SOBJ_ZMID_FLOOR)) - sop->__int_pmid.Z = sop->mid_sector->int_floorz(); + sop->pmid.Z = sop->mid_sector->floorz; - DVector2 pivot = { sop->int_pmid().X * inttoworld, sop->int_pmid().Y * inttoworld}; + DVector2 pivot = sop->pmid.XY(); DVector2 move = { nx * inttoworld, ny * inttoworld }; for (sectp = sop->sectp, j = 0; *sectp; sectp++, j++) { @@ -1756,7 +1753,7 @@ PlayerPart: // Does not necessarily move with the sector so must accout for // moving across sectors - if (sop->int_pmid().X < MAXSO) // special case for operating SO's + if (!SO_EMPTY(sop)) // special case for operating SO's SetActorZ(sop->so_actors[i], actor->int_pos()); } @@ -1778,7 +1775,7 @@ PlayerPart: // update here AFTER sectors/player has been manipulated // prevents you from falling into map HOLEs created by moving // Sectors and sprites around. - //if (sop->xmid < MAXSO) + //if (!SO_EMPTY(sop)) updatesector(pp->pos.X, pp->pos.Y, &pp->cursector); // in case you are in a whirlpool diff --git a/source/games/sw/src/weapon.cpp b/source/games/sw/src/weapon.cpp index 65c3b4b22..9fa09aee3 100644 --- a/source/games/sw/src/weapon.cpp +++ b/source/games/sw/src/weapon.cpp @@ -15957,7 +15957,7 @@ int InitTurretMgun(SECTOR_OBJECT* sop) short delta; int xvect,yvect,zvect; - PlaySound(DIGI_BOATFIRE, &sop->__int_pmid, v3df_dontpan|v3df_doppler); + PlaySound(DIGI_BOATFIRE, sop->pmid, v3df_dontpan|v3df_doppler); for (i = 0; sop->so_actors[i] != nullptr; i++) {