void SharedProgramState::setOrthoProjectionMatrix(const AABB& volume) { float minX, minY, minZ, maxX, maxY, maxZ; volume.bounds(minX, minY, minZ, maxX, maxY, maxZ); setProjectionMatrix(ortho(minX, maxX, minY, maxY, minZ, maxZ)); }
bool Frustum::contains(const AABB& box) const { float minX, minY, minZ, maxX, maxY, maxZ; box.bounds(minX, minY, minZ, maxX, maxY, maxZ); for (size_t i = 0; i < 6; i++) { const vec3 positive((planes[i].normal.x < 0.f) ? minX : maxX, (planes[i].normal.y < 0.f) ? minY : maxY, (planes[i].normal.z < 0.f) ? minZ : maxZ); if (!planes[i].contains(positive)) return false; } return true; }
bool Frustum::intersects(const AABB& box) const { float minX, minY, minZ, maxX, maxY, maxZ; box.bounds(minX, minY, minZ, maxX, maxY, maxZ); for (size_t i = 0; i < 6; i++) { const vec3 negative(planes[i].normal.x < 0.f ? maxX : minX, planes[i].normal.y < 0.f ? maxY : minY, planes[i].normal.z < 0.f ? maxZ : minZ); if (!planes[i].contains(negative)) return false; } return true; }
void Frustum::setOrtho(const AABB& volume) { float minX, minY, minZ, maxX, maxY, maxZ; volume.bounds(minX, minY, minZ, maxX, maxY, maxZ); setOrtho(minX, minY, minZ, maxX, maxY, maxZ); }