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;
}
//
--
⑨