Browse Source

Fixed frustum calculation and implemented point and sphere tests. Now also tested and looking decent.

unrollquadloop
Nico de Poel 3 years ago
parent
commit
ec0eebce3c
  1. 2
      display.c
  2. 35
      frustum.c
  3. 5
      frustum.h

2
display.c

@ -180,7 +180,7 @@ void display_start()
CompMatrixLV(&proj_matrix, &view_matrix, &vp_matrix);
int screenheight = (GetVideoMode() == MODE_NTSC) ? SCREENHEIGHT_NTSC : SCREENHEIGHT_PAL;
frustum_update(&view_matrix, (SCREENWIDTH << 12) / aspect_scale.vx, (screenheight << 12) / aspect_scale.vy);
frustum_update((SCREENWIDTH << 12) / aspect_scale.vx, (screenheight << 12) / aspect_scale.vy);
}
void display_finish()

35
frustum.c

@ -6,14 +6,14 @@
static SVECTOR left, right, top, bottom;
static INLINE void frustum_buildPlane(MATRIX *view_matrix, VECTOR *normal, SVECTOR *outPlane)
static INLINE void frustum_buildPlane(MATRIX *rot_matrix, VECTOR *normal, SVECTOR *outPlane)
{
ApplyMatrixLV(view_matrix, normal, normal);
ApplyMatrixLV(rot_matrix, normal, normal);
VectorNormalS(normal, outPlane);
outPlane->pad = m_dot12(cam_pos, *outPlane);
outPlane->pad = -m_dot12(cam_pos, *outPlane);
}
void frustum_update(MATRIX *view_matrix, int width, int height)
void frustum_update(int width, int height)
{
VECTOR l, r, t, b;
@ -41,16 +41,33 @@ void frustum_update(MATRIX *view_matrix, int width, int height)
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);
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);
// 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)
u_char frustum_pointInside(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;
return 1;
}
u_char frustum_sphereInside(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;
return 1;
}

5
frustum.h

@ -1,7 +1,8 @@
#ifndef __FRUSTUM_H__
#define __FRUSTUM_H__
void frustum_update(MATRIX *view_matrix, int width, int height);
u_char frustum_checkSphere(SVECTOR *sphere);
void frustum_update(int width, int height);
u_char frustum_pointInside(SVECTOR *point);
u_char frustum_sphereInside(SVECTOR *sphere);
#endif // __FRUSTUM_H__
Loading…
Cancel
Save