shithub: nanobsp

Download patch

ref: 6aaf1cc828f8aec18649c0ff89b3d32bf00367e4
parent: 712ec411c9e9aafb1fb6e1de942c0f437548f677
author: Andrew Apted <ajapted@gmail.com>
date: Sat Dec 9 06:30:26 EST 2023

rewrote BSP_PickNode_Fast() to find both a horizontal and vertical seg.

--- a/nano_bsp.c
+++ b/nano_bsp.c
@@ -234,6 +234,7 @@
 	int side1 = BSP_PointOnSide (part, seg->v1->x, seg->v1->y);
 	int side2 = BSP_PointOnSide (part, seg->v2->x, seg->v2->y);
 
+	// colinear?
 	if (side1 == 0 && side2 == 0)
 		return BSP_SameDirection (part, seg) ? +1 : -1;
 
@@ -301,33 +302,55 @@
 	fixed_t mid_x = bbox[BOXLEFT]   / 2 + bbox[BOXRIGHT] / 2;
 	fixed_t mid_y = bbox[BOXBOTTOM] / 2 + bbox[BOXTOP]   / 2;
 
-	seg_t * part;
-	seg_t * best = NULL;
-	fixed_t best_score = -1;
+	seg_t * vert_part = NULL;
+	fixed_t vert_dist = (1 << 30);
 
+	seg_t * horiz_part = NULL;
+	fixed_t horiz_dist = (1 << 30);
+
+	seg_t * part;
 	for (part = soup ; part != NULL ; part = part->next)
 	{
-		boolean vert  = (part->v1->x == part->v2->x);
-		boolean horiz = (part->v1->y == part->v2->y);
+		if (part->v1->x == part->v2->x)
+		{
+			fixed_t dist = abs (part->v1->x - mid_x);
 
-		if (! (vert || horiz))
-			continue;
-
-		fixed_t score = abs (vert ? (part->v1->x - mid_x) : (part->v1->y - mid_y));
-
-		if (score > best_score)
+			if (dist < vert_dist)
+			{
+				vert_part = part;
+				vert_dist = dist;
+			}
+		}
+		else if (part->v1->y == part->v2->y)
 		{
-			struct NodeEval eval;
+			fixed_t dist = abs (part->v1->y - mid_y);
 
-			if (BSP_EvalPartition (part, soup, &eval))
+			if (dist < horiz_dist)
 			{
-				best = part;
-				best_score = score;
+				horiz_part = part;
+				horiz_dist = dist;
 			}
 		}
 	}
 
-	return best;
+	struct NodeEval v_eval;
+	struct NodeEval h_eval;
+
+	boolean vert_ok  = BSP_EvalPartition (vert_part,  soup, &v_eval);
+	boolean horiz_ok = BSP_EvalPartition (horiz_part, soup, &h_eval);
+
+	if (vert_ok && horiz_ok)
+	{
+		int vert_cost  = abs (v_eval.left - v_eval.right) * 100 + v_eval.split * 17;
+		int horiz_cost = abs (h_eval.left - h_eval.right) * 100 + h_eval.split * 17;
+
+		return (horiz_cost < vert_cost) ? horiz_part : vert_part;
+	}
+
+	if (vert_ok)  return vert_part;
+	if (horiz_ok) return horiz_part;
+
+	return NULL;
 }
 
 //
--