X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fmath%2Fgeometry.hpp;h=b4a9f50bb43c86c283691a65736f90981b62368a;hb=3989da924c4e33c52f500aead5ae62bb40294781;hp=6410ee013cb622f84879e3788dfd5dee8bb6d720;hpb=348143f5e41a5692ed7c8deab200f3c62f4395a2;p=blobs.git diff --git a/src/math/geometry.hpp b/src/math/geometry.hpp index 6410ee0..b4a9f50 100644 --- a/src/math/geometry.hpp +++ b/src/math/geometry.hpp @@ -4,6 +4,8 @@ #include "glm.hpp" #include +#include +#include namespace blobs { @@ -26,6 +28,9 @@ struct AABB { }; +inline std::ostream &operator <<(std::ostream &out, const AABB &b) { + return out << "AABB(" << b.min << ", " << b.max << ")"; +} /// matrices must not scale bool Intersect( const AABB &a_box, @@ -35,6 +40,7 @@ bool Intersect( glm::dvec3 &normal, double &depth) noexcept; + class Ray { public: @@ -54,6 +60,16 @@ private: }; +inline Ray operator *(const glm::dmat4 &m, const Ray &r) noexcept { + glm::dvec4 o(m * glm::dvec4(r.Origin(), 1.0)); + glm::dvec4 d(m * glm::dvec4(r.Origin() + r.Direction(), 1.0)); + return Ray(glm::dvec3(o) / o.w, glm::normalize((glm::dvec3(d) / d.w) - (glm::dvec3(o) / o.w))); +} + +inline std::ostream &operator <<(std::ostream &out, const Ray &r) { + return out << "Ray(" << r.Origin() << ", " << r.Direction() << ")"; +} + /// oriented ray/box intersection test bool Intersect( const Ray &, @@ -62,6 +78,32 @@ bool Intersect( glm::dvec3 &normal, double &dist) noexcept; + +struct Sphere { + + glm::dvec3 origin; + double radius; + +}; + +/// matrix may scale, but only uniformly +inline Sphere operator *(const glm::dmat4 &m, const Sphere &s) noexcept { + glm::dvec4 o(m * glm::dvec4(s.origin, 1.0)); + glm::dvec4 p(m * glm::dvec4(s.origin + glm::dvec3(s.radius, 0.0, 0.0), 1.0)); + return Sphere{glm::dvec3(o) / o.w, glm::length((glm::dvec3(p) / p.w) - (glm::dvec3(o) / o.w))}; +} + +inline std::ostream &operator <<(std::ostream &out, const Sphere &s) { + return out << "Sphere(" << s.origin << ", " << s.radius << ")"; +} + +/// oriented ray/sphere intersection test +bool Intersect( + const Ray &, + const Sphere &, + glm::dvec3 &normal, + double &dist) noexcept; + } }