+
+ 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 glm::length(glm::cross(dir, orig - point));
+ }
+ float DistanceSquared(const glm::vec3 &point) const noexcept {
+ return glm::length2(glm::cross(dir, orig - point));
+ }