|
|
|
@ -53,6 +53,15 @@ void frustum_update(int width, int height) |
|
|
|
// left.vx, left.pad, right.vx, right.pad, top.vz, top.pad, bottom.vz, bottom.pad); |
|
|
|
} |
|
|
|
|
|
|
|
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; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
u_char frustum_pointInside(const SVECTOR *point) |
|
|
|
{ |
|
|
|
if (m_dot12(left, *point) + left.pad < 0) return 0; |
|
|
|
@ -71,3 +80,16 @@ u_char frustum_sphereInside(const SVECTOR *sphere) |
|
|
|
if (m_dot12(bottom, *sphere) + bottom.pad < radius) return 0; |
|
|
|
return 1; |
|
|
|
} |
|
|
|
|
|
|
|
u_char frustum_boxInside(const SVECTOR *min, const SVECTOR *max) |
|
|
|
{ |
|
|
|
if (frustum_pointInside_((SVECTOR) { min->vx, min->vy, min->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { min->vx, min->vy, max->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { min->vx, max->vy, min->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { min->vx, max->vy, max->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { max->vx, min->vy, min->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { max->vx, min->vy, max->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { max->vx, max->vy, min->vz })) return 1; |
|
|
|
if (frustum_pointInside_((SVECTOR) { max->vx, max->vy, max->vz })) return 1; |
|
|
|
return 0; |
|
|
|
} |