30 FRUSTUM_CORNER_BOTTOM_LEFT = 0,
31 FRUSTUM_CORNER_BOTTOM_RIGHT,
32 FRUSTUM_CORNER_TOP_RIGHT,
33 FRUSTUM_CORNER_TOP_LEFT,
37 enum FrustumClassification {
38 FRUSTUM_CONTAINS_NONE = 0,
39 FRUSTUM_CONTAINS_PARTIAL,
47 void build(
const Mat4* modelview_projection);
54 bool intersects_sphere(
const Vec3& pos,
const float diameter);
55 bool intersects_aabb(
const AABB &box)
const;
56 bool intersects_cube(
const Vec3& center,
float size)
const;
58 bool initialized()
const {
return initialized_; }
60 float near_height()
const {
62 return (near_corners_[FRUSTUM_CORNER_BOTTOM_LEFT] - near_corners_[FRUSTUM_CORNER_TOP_LEFT]).length();
65 float far_height()
const {
67 return (far_corners_[FRUSTUM_CORNER_BOTTOM_LEFT] - far_corners_[FRUSTUM_CORNER_TOP_LEFT]).length();
70 float near_width()
const {
72 return (near_corners_[FRUSTUM_CORNER_BOTTOM_LEFT] - near_corners_[FRUSTUM_CORNER_BOTTOM_RIGHT]).length();
75 float far_width()
const {
77 return (far_corners_[FRUSTUM_CORNER_BOTTOM_LEFT] - far_corners_[FRUSTUM_CORNER_BOTTOM_RIGHT]).length();
87 Vec3 near_avg, far_avg;
89 for(uint32_t i = 0; i < FRUSTUM_CORNER_MAX; ++i) {
90 near_avg += near_corners_[i];
91 far_avg += far_corners_[i];
94 near_avg /= FRUSTUM_CORNER_MAX;
95 far_avg /= FRUSTUM_CORNER_MAX;
97 return (far_avg - near_avg).length();
100 Plane plane(FrustumPlane p)
const {
104 Vec3 direction()
const;
108 float width_at_distance(
float distance)
const;
109 float height_at_distance(
float distance)
const;
111 float aspect_ratio()
const;
115 std::vector<Vec3> near_corners_;
116 std::vector<Vec3> far_corners_;
117 std::vector<Plane> planes_;