X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmodel%2Fgeometry.hpp;h=0bc17c162b73afb2e457866ca5c0d98617f59865;hb=0ab149c70b3f984b2cc0c7a122b4aa347bc5fd79;hp=d6e3d2847782e2b1d882e49d7e5cf3fa7e77386a;hpb=b7d09e1e35ef90282c97509e0020b20db3c7ea9f;p=blank.git diff --git a/src/model/geometry.hpp b/src/model/geometry.hpp index d6e3d28..0bc17c1 100644 --- a/src/model/geometry.hpp +++ b/src/model/geometry.hpp @@ -2,6 +2,7 @@ #define BLANK_MODEL_GEOMETRY_H_ #include +#include #include @@ -13,6 +14,40 @@ constexpr float PI_0p5 = PI * 0.5f; constexpr float PI_1p5 = PI * 1.5f; constexpr float PI_2p0 = PI * 2.0f; +constexpr float PI_inv = 1.0f / PI; +constexpr float PI_0p5_inv = 1.0f / PI_0p5; + +constexpr float DEG_RAD_FACTOR = PI / 180.0f; +constexpr float RAD_DEG_FACTOR = 180.0f / PI; + +constexpr float deg2rad(float d) { + return d * DEG_RAD_FACTOR; +} + +constexpr float rad2deg(float r) { + return r * RAD_DEG_FACTOR; +} + + +template +inline bool iszero(const T &v) { + return dot(v, v) < std::numeric_limits::epsilon(); +} + + +template +T manhattan_distance(const glm::tvec3 &a, const glm::tvec3 &b) { + glm::tvec3 diff(abs(a - b)); + return diff.x + diff.y + diff.z; +} + +template +T manhattan_radius(const glm::tvec3 &v) { + glm::tvec3 a(abs(v)); + return std::max(a.x, std::max(a.y, a.z)); +} + + struct AABB { glm::vec3 min; glm::vec3 max; @@ -22,6 +57,10 @@ struct AABB { if (max.y < min.y) std::swap(max.y, min.y); if (max.z < min.z) std::swap(max.z, min.z); } + + glm::vec3 Center() const noexcept { + return min + (max - min) * 0.5f; + } }; struct Ray { @@ -36,6 +75,14 @@ bool Intersection( float *dist = nullptr, glm::vec3 *normal = nullptr) noexcept; +bool Intersection( + const AABB &a_box, + const glm::mat4 &a_m, + const AABB &b_box, + const glm::mat4 &b_m, + float &depth, + glm::vec3 &normal) noexcept; + bool CullTest(const AABB &box, const glm::mat4 &MVP) noexcept; }