shithub: nanobsp

Download patch

ref: 1e63f7e03429f976fee4e0b493e9bbfe0be40edb
parent: 828febdc37b912fd6426ad797c898e6bc3a60944
author: Andrew Apted <ajapted@gmail.com>
date: Wed Dec 20 07:07:43 EST 2023

refactored BSP_ComputeIntersection() code.

--- a/nano_bsp.c
+++ b/nano_bsp.c
@@ -495,77 +495,66 @@
 
 //----------------------------------------------------------------------------
 
-fixed_t BSP_VertIntersection (fixed_t part_x, seg_t * seg)
+void BSP_ComputeIntersection (seg_t * part, seg_t * seg, fixed_t * x, fixed_t * y)
 {
-	// horizontal seg?
-	if (seg->v1->y == seg->v2->y)
-		return seg->v1->y;
+	fixed_t a, b;
 
-	fixed_t a = abs (seg->v1->x - part_x);
-	fixed_t b = abs (seg->v2->x - part_x);
+	if (part->v1->x == part->v2->x)
+	{
+		// vertical partition
 
-	fixed_t along = FixedDiv (a, a + b);
+		if (seg->v1->y == seg->v2->y)
+		{
+			// horizontal seg
+			*x = part->v1->x;
+			*y = seg->v1->y;
+			return;
+		}
 
-	return seg->v1->y + FixedMul (seg->v2->y - seg->v1->y, along);
-}
+		a = abs (seg->v1->x - part->v1->x);
+		b = abs (seg->v2->x - part->v1->x);
+	}
+	else if (part->v1->y == part->v2->y)
+	{
+		// horizontal partition
 
-fixed_t BSP_HorizIntersection (fixed_t part_y, seg_t * seg)
-{
-	// vertical seg?
-	if (seg->v1->x == seg->v2->x)
-		return seg->v1->x;
+		if (seg->v1->x == seg->v2->x)
+		{
+			// vertical seg
+			*x = seg->v1->x;
+			*y = part->v1->y;
+			return;
+		}
 
-	fixed_t a = abs (seg->v1->y - part_y);
-	fixed_t b = abs (seg->v2->y - part_y);
-
-	fixed_t along = FixedDiv (a, a + b);
-
-	return seg->v1->x + FixedMul (seg->v2->x - seg->v1->x, along);
-}
-
-void BSP_ComputeIntersection (seg_t * part, seg_t * seg, fixed_t * x, fixed_t * y)
-{
-	// vertical partition?
-	if (part->v1->x == part->v2->x)
-	{
-		*x = part->v1->x;
-		*y = BSP_VertIntersection (*x, seg);
-		return;
+		a = abs (seg->v1->y - part->v1->y);
+		b = abs (seg->v2->y - part->v1->y);
 	}
-
-	// horizontal partition?
-	if (part->v1->y == part->v2->y)
+	else
 	{
-		*y = part->v1->y;
-		*x = BSP_HorizIntersection (*y, seg);
-		return;
-	}
+		fixed_t	dx = part->v2->x - part->v1->x;
+		fixed_t	dy = part->v2->y - part->v1->y;
 
-	fixed_t	dx = part->v2->x - part->v1->x;
-	fixed_t	dy = part->v2->y - part->v1->y;
+		// compute seg coords relative to partition start
+		fixed_t x1 = seg->v1->x - part->v1->x;
+		fixed_t y1 = seg->v1->y - part->v1->y;
 
-	// compute seg coords relative to partition start
-	fixed_t x1 = seg->v1->x - part->v1->x;
-	fixed_t y1 = seg->v1->y - part->v1->y;
+		fixed_t x2 = seg->v2->x - part->v1->x;
+		fixed_t y2 = seg->v2->y - part->v1->y;
 
-	fixed_t x2 = seg->v2->x - part->v1->x;
-	fixed_t y2 = seg->v2->y - part->v1->y;
+		if (abs (dx) >= abs(dy))
+		{
+			fixed_t slope = FixedDiv (dy, dx);
 
-	fixed_t a, b;
+			a = abs (y1 - FixedMul (x1, slope));
+			b = abs (y2 - FixedMul (x2, slope));
+		}
+		else
+		{
+			fixed_t slope = FixedDiv (dx, dy);
 
-	if (abs (dx) >= abs(dy))
-	{
-		fixed_t slope = FixedDiv (dy, dx);
-
-		a = abs (y1 - FixedMul (x1, slope));
-		b = abs (y2 - FixedMul (x2, slope));
-	}
-	else
-	{
-		fixed_t slope = FixedDiv (dx, dy);
-
-		a = abs (x1 - FixedMul (y1, slope));
-		b = abs (x2 - FixedMul (y2, slope));
+			a = abs (x1 - FixedMul (y1, slope));
+			b = abs (x2 - FixedMul (y2, slope));
+		}
 	}
 
 	fixed_t along = FixedDiv (a, a + b);
--