]> git.localhorst.tv Git - blank.git/blobdiff - src/geometry/primitive.hpp
some linting
[blank.git] / src / geometry / primitive.hpp
index 72da84749140ca6f2d6b2c71a069c3fd9c031199..52a3617835245382b6e2014091116cc881fc3c87 100644 (file)
@@ -1,9 +1,11 @@
 #ifndef BLANK_GEOMETRY_PRIMITIVE_HPP_
 #define BLANK_GEOMETRY_PRIMITIVE_HPP_
 
+#include "../graphics/glm.hpp"
+
 #include <algorithm>
 #include <iosfwd>
-#include <glm/glm.hpp>
+#include <glm/gtx/norm.hpp>
 
 
 namespace blank {
@@ -24,8 +26,8 @@ struct AABB {
 
        /// return distance between origin and farthest vertex
        float OriginRadius() const noexcept {
-               glm::vec3 high(glm::max(abs(min), abs(max)));
-               return length(high);
+               glm::vec3 high(glm::max(glm::abs(min), glm::abs(max)));
+               return glm::length(high);
        }
 };
 
@@ -42,6 +44,19 @@ struct Ray {
        void Update() noexcept {
                inv_dir = 1.0f / dir;
        }
+
+       /// get shortest distance of this ray's line to given point
+       float Distance(const glm::vec3 &point) const noexcept {
+               // d = |(x2-x1)×(x1-x0)|/|x2-x1|
+               // where x0 is point, and x1 and x2 are points on the line
+               // for derivation, see http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html
+               // x1 = orig
+               // x2-x1 = dir, which means |x2-x1| is 1.0
+               return glm::length(glm::cross(dir, orig - point));
+       }
+       float DistanceSquared(const glm::vec3 &point) const noexcept {
+               return glm::length2(glm::cross(dir, orig - point));
+       }
 };
 
 std::ostream &operator <<(std::ostream &, const Ray &);
@@ -87,11 +102,11 @@ struct Plane {
 
        Plane(const glm::vec3 &n, float d)
        : normal(n), dist(d) { }
-       Plane(const glm::vec4 &abcd)
+       explicit Plane(const glm::vec4 &abcd)
        : normal(abcd), dist(abcd.w) { }
 
        void Normalize() noexcept {
-               const float l = length(normal);
+               const float l = glm::length(normal);
                normal /= l;
                dist /= l;
        }
@@ -115,14 +130,14 @@ struct Frustum {
        const Plane &Far() const noexcept { return plane[5]; }
 
        /// create frustum from transposed MVP
-       Frustum(const glm::mat4 &mat)
+       explicit Frustum(const glm::mat4 &mat)
        : plane{
-               { mat[3] + mat[0] },
-               { mat[3] - mat[0] },
-               { mat[3] + mat[1] },
-               { mat[3] - mat[1] },
-               { mat[3] + mat[2] },
-               { mat[3] - mat[2] },
+               Plane{ mat[3] + mat[0] },
+               Plane{ mat[3] - mat[0] },
+               Plane{ mat[3] + mat[1] },
+               Plane{ mat[3] - mat[1] },
+               Plane{ mat[3] + mat[2] },
+               Plane{ mat[3] - mat[2] },
        } { }
 
        void Normalize() noexcept {