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);
--
⑨