#pragma once #include #include #include namespace mbgl { namespace util { enum class IntersectionResult : int { Separate, Intersects, Contains, }; class AABB { public: AABB(); AABB(const vec3& min_, const vec3& max_); vec3 closestPoint(const vec3& point) const; // Computes the shortest manhattan distance to the provided point vec3 distanceXYZ(const vec3& point) const; // Creates an aabb covering one quadrant of the aabb on XZ-plane. AABB quadrant(int idx) const; bool intersects(const AABB& aabb) const; bool operator==(const AABB& aabb) const; bool operator!=(const AABB& aabb) const; vec3 min; vec3 max; }; class Frustum { public: Frustum(const std::array& points_, const std::array& planes_); static Frustum fromInvProjMatrix(const mat4& invProj, double worldSize, double zoom, bool flippedY = false); // Performs conservative intersection test using separating axis theorem. // Some accuracy is traded for better performance. False positive rate is < 1% IntersectionResult intersects(const AABB& aabb) const; // Performs precise intersection test using separating axis theorem. // It is possible run only edge cases that were not covered in intersects() IntersectionResult intersectsPrecise(const AABB& aabb, bool edgeCasesOnly = false) const; const std::array& getPoints() const { return points; } const std::array& getPlanes() const { return planes; } private: struct Projection { vec3 axis; Point projection; }; AABB bounds; std::array points; std::array planes; std::array projections; }; } // namespace util } // namespace mbgl