class Frustum3D
{
public:
   // Create perspective frustum, same format as gluPerspective()
   void     init(float fFov, float fAspect,
                 float fNear, float fFar);

   // Set frustum to camera position, orientation
   void     setFrustum(geoGL::Camera3D &camera);

   // Return true if a sphere is within view frustum
   bool     visible(const geoGL::fVector3D &point3D, float fRadius);

   // Return true if 3D object within view frustum
   bool     visible(const ObjectSet3D &objSet);
private:
   // Names of 6 sides to view frustum
   enum FrustumList ;

   // Information about view frustum
   geoGL::fVector3D  vFrustum   [NUM_FRUSTUM];     // 6 frustum planes at origin
   geoGL::fVector3D  vRotFrustum[NUM_FRUSTUM];     // 6 frustum planes translated & rotated
   float             fFrustumD  [NUM_FRUSTUM];     // Distance to each of 6 frustum planes

   geoGL::fVector3D  vTranslate;                   // Current position of view frustum

   // Set frustum position and orientation manually
   void     rotateFrustum(const fMatrix4x4 &rotateMatrix);
   void     translateFrustum(const fVector3D &trans);

   // Compute distance of frustum plane from point
   float    distance(FrustumList which, const geoGL::fVector3D &point3D);
};