#include "common.h" #include "frustum.h" #include "display.h" #include static SVECTOR left, right, top, bottom; static INLINE void frustum_buildPlane(MATRIX *view_matrix, VECTOR *normal, SVECTOR *outPlane) { ApplyMatrixLV(view_matrix, normal, normal); VectorNormalS(normal, outPlane); outPlane->pad = m_dot12(cam_pos, *outPlane); } void frustum_update(MATRIX *view_matrix, int width, int height) { VECTOR l, r, t, b; int near; gte_ReadGeomScreen(&near); //FntPrint(-1, "N = %d, W = %d, H = %d\n", near, width, height); // 2 * near, shifted left for division near <<= 13; l.vx = near / width; l.vy = ONE; l.vz = 0; b.vx = 0; b.vy = ONE; b.vz = near / height; r.vx = -l.vx; r.vy = ONE; r.vz = 0; t.vx = 0; t.vy = ONE; t.vz = -b.vz; frustum_buildPlane(view_matrix, &l, &left); frustum_buildPlane(view_matrix, &r, &right); frustum_buildPlane(view_matrix, &t, &top); frustum_buildPlane(view_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); } u_char frustum_checkSphere(SVECTOR *sphere) { return 1; }