|
|
|
@ -4,7 +4,7 @@ |
|
|
|
|
|
|
|
#include <inline_c.h> |
|
|
|
|
|
|
|
static SVECTOR left, right, top, bottom; |
|
|
|
static SVECTOR *left, *right, *top, *bottom; |
|
|
|
|
|
|
|
static INLINE void frustum_buildPlane(MATRIX *rot_matrix, VECTOR *normal, SVECTOR *outPlane) |
|
|
|
{ |
|
|
|
@ -44,10 +44,16 @@ void frustum_update(int width, int height) |
|
|
|
MATRIX rot_matrix; |
|
|
|
RotMatrixQ(&cam_rot, &rot_matrix); |
|
|
|
|
|
|
|
frustum_buildPlane(&rot_matrix, &l, &left); |
|
|
|
frustum_buildPlane(&rot_matrix, &r, &right); |
|
|
|
frustum_buildPlane(&rot_matrix, &t, &top); |
|
|
|
frustum_buildPlane(&rot_matrix, &b, &bottom); |
|
|
|
// Place the frustum planes at the start of the fast RAM buffer |
|
|
|
left = (SVECTOR*)(scratchpad + sizeof(SVECTOR) * 0); |
|
|
|
right = (SVECTOR*)(scratchpad + sizeof(SVECTOR) * 1); |
|
|
|
top = (SVECTOR*)(scratchpad + sizeof(SVECTOR) * 2); |
|
|
|
bottom = (SVECTOR*)(scratchpad + sizeof(SVECTOR) * 3); |
|
|
|
|
|
|
|
frustum_buildPlane(&rot_matrix, &l, left); |
|
|
|
frustum_buildPlane(&rot_matrix, &r, right); |
|
|
|
frustum_buildPlane(&rot_matrix, &t, top); |
|
|
|
frustum_buildPlane(&rot_matrix, &b, bottom); |
|
|
|
|
|
|
|
// FntPrint(-1, "l = %d %d, r = %d %d, t = %d %d, b = %d %d\n", |
|
|
|
// left.vx, left.pad, right.vx, right.pad, top.vz, top.pad, bottom.vz, bottom.pad); |
|
|
|
@ -55,29 +61,29 @@ void frustum_update(int width, int height) |
|
|
|
|
|
|
|
static INLINE u_char frustum_pointInside_(const SVECTOR p) |
|
|
|
{ |
|
|
|
if (m_dot12(left, p) + left.pad < 0) return 0; |
|
|
|
if (m_dot12(right, p) + right.pad < 0) return 0; |
|
|
|
if (m_dot12(top, p) + top.pad < 0) return 0; |
|
|
|
if (m_dot12(bottom, p) + bottom.pad < 0) return 0; |
|
|
|
if (m_dot12(*left, p) + left->pad < 0) return 0; |
|
|
|
if (m_dot12(*right, p) + right->pad < 0) return 0; |
|
|
|
if (m_dot12(*top, p) + top->pad < 0) return 0; |
|
|
|
if (m_dot12(*bottom, p) + bottom->pad < 0) return 0; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
u_char frustum_pointInside(const SVECTOR *point) |
|
|
|
{ |
|
|
|
if (m_dot12(left, *point) + left.pad < 0) return 0; |
|
|
|
if (m_dot12(right, *point) + right.pad < 0) return 0; |
|
|
|
if (m_dot12(top, *point) + top.pad < 0) return 0; |
|
|
|
if (m_dot12(bottom, *point) + bottom.pad < 0) return 0; |
|
|
|
if (m_dot12(*left, *point) + left->pad < 0) return 0; |
|
|
|
if (m_dot12(*right, *point) + right->pad < 0) return 0; |
|
|
|
if (m_dot12(*top, *point) + top->pad < 0) return 0; |
|
|
|
if (m_dot12(*bottom, *point) + bottom->pad < 0) return 0; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
u_char frustum_sphereInside(const SVECTOR *sphere) |
|
|
|
{ |
|
|
|
short radius = -sphere->pad; |
|
|
|
if (m_dot12(left, *sphere) + left.pad < radius) return 0; |
|
|
|
if (m_dot12(right, *sphere) + right.pad < radius) return 0; |
|
|
|
if (m_dot12(top, *sphere) + top.pad < radius) return 0; |
|
|
|
if (m_dot12(bottom, *sphere) + bottom.pad < radius) return 0; |
|
|
|
if (m_dot12(*left, *sphere) + left->pad < radius) return 0; |
|
|
|
if (m_dot12(*right, *sphere) + right->pad < radius) return 0; |
|
|
|
if (m_dot12(*top, *sphere) + top->pad < radius) return 0; |
|
|
|
if (m_dot12(*bottom, *sphere) + bottom->pad < radius) return 0; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
|