#include <algorithm>
#include <iosfwd>
#include <glm/glm.hpp>
+#include <glm/gtx/norm.hpp>
namespace blank {
std::ostream &operator <<(std::ostream &, const AABB &);
+// TODO: this should really use setters/getters for dir and inv_dir so
+// manipulating code doesn't "forget" to call Update()
struct Ray {
glm::vec3 orig;
glm::vec3 dir;
+
+ glm::vec3 inv_dir;
+
+ 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 length(cross(dir, orig - point));
+ }
+ float DistanceSquared(const glm::vec3 &point) const noexcept {
+ return length2(cross(dir, orig - point));
+ }
};
std::ostream &operator <<(std::ostream &, const Ray &);
+/// axis aligned boolean ray/box intersection test
+/// if true, dist constains distance from ray's origin to intersection point
+bool Intersection(
+ const Ray &,
+ const AABB &,
+ float &dist) noexcept;
+
+/// detailed oriented ray/box intersection test
bool Intersection(
const Ray &,
const AABB &,