From e456d59c0e1f2753383882b7fdc6d2803ff3f8be Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sat, 28 Jun 2025 23:28:26 -0400 Subject: [PATCH] Dont always call R_PointInSubsector if thing has not moved in P_CheckPosition https://github.com/Indev450/SRB2Kart-Saturn/pull/148 --- src/p_map.c | 33 +++++++++++++++++++++++++-------- src/p_mobj.c | 3 +++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/src/p_map.c b/src/p_map.c index 367f0915d..659fd5546 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -1783,7 +1783,11 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *re g_tm.bbox[BOXRIGHT] = x + g_tm.thing->radius; g_tm.bbox[BOXLEFT] = x - g_tm.thing->radius; - newsubsec = R_PointInSubsector(x, y); + if (thing->x != x || thing->y != y || thing->subsector == NULL) + newsubsec = R_PointInSubsector(x, y); + else + newsubsec = thing->subsector; + g_tm.ceilingline = NULL; g_tm.blocking = false; @@ -1821,7 +1825,7 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *re for (rover = newsubsec->sector->ffloors; rover; rover = rover->next) { - fixed_t topheight, bottomheight; + fixed_t topheight, bottomheight, midheight; if (!(rover->fofflags & FOF_EXISTS)) continue; @@ -1895,10 +1899,10 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *re continue; } - delta1 = thing->z - (bottomheight - + ((topheight - bottomheight)/2)); - delta2 = thingtop - (bottomheight - + ((topheight - bottomheight)/2)); + midheight = (bottomheight + ((topheight - bottomheight)/2)); + + delta1 = thing->z - midheight; + delta2 = thingtop - midheight; if (topheight > g_tm.floorz && abs(delta1) < abs(delta2) && !(rover->fofflags & FOF_REVERSEPLATFORM)) @@ -1936,6 +1940,8 @@ boolean P_CheckPosition(mobj_t *thing, fixed_t x, fixed_t y, TryMoveResult_t *re BMBOUNDFIX(xl, xh, yl, yh); // Check polyobjects and see if g_tm.floorz/g_tm.ceilingz need to be altered + // do we really have to iterate through the complete blockmap for polyobjects if there are no polyobjects on the map? + if (numPolyObjects) { validcount++; @@ -2122,7 +2128,11 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) g_tm.bbox[BOXRIGHT] = x + thiscam->radius; g_tm.bbox[BOXLEFT] = x - thiscam->radius; - newsubsec = R_PointInSubsector(x, y); + if (thiscam->x != x || thiscam->y != y || thiscam->subsector == NULL) + newsubsec = R_PointInSubsector(x, y); + else + newsubsec = thiscam->subsector; + g_tm.ceilingline = NULL; mapcampointer = thiscam; @@ -2201,6 +2211,8 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) BMBOUNDFIX(xl, xh, yl, yh); // Check polyobjects and see if g_tm.floorz/g_tm.ceilingz need to be altered + // do we really have to iterate through the complete blockmap for polyobjects if there are no polyobjects on the map? + if (numPolyObjects) { validcount++; @@ -2292,7 +2304,7 @@ boolean P_CheckCameraPosition(fixed_t x, fixed_t y, camera_t *thiscam) // boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam) { - subsector_t *s = R_PointInSubsector(x, y); + subsector_t *s = NULL; boolean retval = true; UINT8 i; @@ -2352,6 +2364,11 @@ boolean P_TryCameraMove(fixed_t x, fixed_t y, camera_t *thiscam) g_tm.floatok = true; + if (thiscam->x != x || thiscam->y != y || thiscam->subsector == NULL) + s = R_PointInSubsector(x, y); + else + s = thiscam->subsector; + if (g_tm.ceilingz - thiscam->z < thiscam->height) { if (s == thiscam->subsector && g_tm.ceilingz >= thiscam->z) diff --git a/src/p_mobj.c b/src/p_mobj.c index 3d4cff403..e5053ac82 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -2648,6 +2648,9 @@ static boolean P_PlayerPolyObjectZMovement(mobj_t *mo) msecnode_t *node; boolean stopmovecut = false; + if (!numPolyObjects) + return false; + for (node = mo->touching_sectorlist; node; node = node->m_sectorlist_next) { sector_t *sec = node->m_sector;