From d2d1f83b62de98a9f08f5197e9bed84306f12741 Mon Sep 17 00:00:00 2001
From: LJ Sonic <lamr@free.fr>
Date: Sat, 13 Feb 2021 17:45:54 +0100
Subject: [PATCH] Revert "Use R_PointToDist2 instead"

This reverts commit e19196a86e5347edf7f25b335214cede978b91b8.
---
 src/m_fixed.c | 40 ++++++++++++----------------------------
 src/r_main.c  | 24 +++++++++++++++++++++++-
 2 files changed, 35 insertions(+), 29 deletions(-)

diff --git a/src/m_fixed.c b/src/m_fixed.c
index 09d6936f2e..eb10fd5f80 100644
--- a/src/m_fixed.c
+++ b/src/m_fixed.c
@@ -18,10 +18,8 @@
  #define HAVE_SQRTF
  #endif
 #endif
-
 #include "doomdef.h"
 #include "m_fixed.h"
-#include "tables.h" // ANGLETOFINESHIFT
 
 #ifdef __USE_C_FIXEDMUL__
 
@@ -107,34 +105,20 @@ fixed_t FixedSqrt(fixed_t x)
 
 fixed_t FixedHypot(fixed_t x, fixed_t y)
 {
-	// Moved the code from R_PointToDist2 to here,
-	// since R_PointToDist2 did the same thing,
-	// except less prone to overflowing.
-
-	angle_t angle;
-	fixed_t dist;
-
-	x = abs(x);
-	y = abs(y);
-
-	if (y > x)
+	fixed_t ax, yx, yx2, yx1;
+	if (abs(y) > abs(x)) // |y|>|x|
 	{
-		fixed_t temp;
-
-		temp = x;
-		x = y;
-		y = temp;
+		ax = abs(y); // |y| => ax
+		yx = FixedDiv(x, y); // (x/y)
 	}
-
-	if (!y)
-		return x;
-
-	angle = (tantoangle[FixedDiv(y, x)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
-
-	// use as cosine
-	dist = FixedDiv(x, FINESINE(angle));
-
-	return dist;
+	else // |x|>|y|
+	{
+		ax = abs(x); // |x| => ax
+		yx = FixedDiv(y, x); // (x/y)
+	}
+	yx2 = FixedMul(yx, yx); // (x/y)^2
+	yx1 = FixedSqrt(1 * FRACUNIT + yx2); // (1 + (x/y)^2)^1/2
+	return FixedMul(ax, yx1); // |x|*((1 + (x/y)^2)^1/2)
 }
 
 vector2_t *FV2_Load(vector2_t *vec, fixed_t x, fixed_t y)
diff --git a/src/r_main.c b/src/r_main.c
index f6c05e312a..f82fb589e0 100644
--- a/src/r_main.c
+++ b/src/r_main.c
@@ -357,7 +357,29 @@ angle_t R_PointToAngle2(fixed_t pviewx, fixed_t pviewy, fixed_t x, fixed_t y)
 
 fixed_t R_PointToDist2(fixed_t px2, fixed_t py2, fixed_t px1, fixed_t py1)
 {
-	return FixedHypot(px1 - px2, py1 - py2);
+	angle_t angle;
+	fixed_t dx, dy, dist;
+
+	dx = abs(px1 - px2);
+	dy = abs(py1 - py2);
+
+	if (dy > dx)
+	{
+		fixed_t temp;
+
+		temp = dx;
+		dx = dy;
+		dy = temp;
+	}
+	if (!dy)
+		return dx;
+
+	angle = (tantoangle[FixedDiv(dy, dx)>>DBITS] + ANGLE_90) >> ANGLETOFINESHIFT;
+
+	// use as cosine
+	dist = FixedDiv(dx, FINESINE(angle));
+
+	return dist;
 }
 
 // Little extra utility. Works in the same way as R_PointToAngle2
-- 
GitLab