From 5232da8f2423992c1bea0a78b3d755af00f61236 Mon Sep 17 00:00:00 2001 From: toaster Date: Sat, 18 Mar 2023 00:25:22 +0000 Subject: [PATCH] HUD tracking polish Inexplicably, all positional checks were inverted. This wasn't causing too many problems because the onScreen condition was inverted too, but if it would be above your screen on the opposite side of you, it would be considered onscreen when facing 180 degrees away perfectly. By swapping viewx/y/z and point->x/y/z, and inverting onScreen, we kill this annoying lack of polish for good. --- src/k_hud.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/k_hud.c b/src/k_hud.c index c963e06e8..6e9c02439 100644 --- a/src/k_hud.c +++ b/src/k_hud.c @@ -957,7 +957,7 @@ void K_ObjectTracking(trackingResult_t *result, const vector3_t *point, boolean // Determine viewpoint factors. h = R_PointToDist2(point->x, point->y, viewx, viewy); - da = AngleDeltaSigned(viewpointAngle, R_PointToAngle2(point->x, point->y, viewx, viewy)); + da = AngleDeltaSigned(viewpointAngle, R_PointToAngle2(viewx, viewy, point->x, point->y)); dp = AngleDeltaSigned(viewpointAiming, R_PointToAngle2(0, 0, h, viewz)); if (reverse) @@ -967,7 +967,7 @@ void K_ObjectTracking(trackingResult_t *result, const vector3_t *point, boolean // Set results relative to top left! result->x = FixedMul(NEWTAN(da), fg); - result->y = FixedMul((NEWTAN(viewpointAiming) - FixedDiv((viewz - point->z), 1 + FixedMul(NEWCOS(da), h))), fg); + result->y = FixedMul((NEWTAN(viewpointAiming) - FixedDiv((point->z-viewz), 1 + FixedMul(NEWCOS(da), h))), fg); result->angle = da; result->pitch = dp; @@ -994,7 +994,7 @@ void K_ObjectTracking(trackingResult_t *result, const vector3_t *point, boolean result->scale = FixedDiv(screenHalfW, h+1); - result->onScreen = ((abs(da) > ANG60) || (abs(AngleDeltaSigned(viewpointAiming, R_PointToAngle2(0, 0, h, (viewz - point->z)))) > ANGLE_45)); + result->onScreen = !((abs(da) > ANG60) || (abs(AngleDeltaSigned(viewpointAiming, R_PointToAngle2(0, 0, h, (viewz - point->z)))) > ANGLE_45)); // Cheap dirty hacks for some split-screen related cases if (result->x < 0 || result->x > (screenWidth << FRACBITS))