]> git.localhorst.tv Git - tacos.git/blobdiff - src/physics/ray.cpp
ray/floor intersection experiments
[tacos.git] / src / physics / ray.cpp
diff --git a/src/physics/ray.cpp b/src/physics/ray.cpp
new file mode 100644 (file)
index 0000000..89ea5d7
--- /dev/null
@@ -0,0 +1,43 @@
+#include "ray.hpp"
+
+
+namespace tacos {
+
+bool TriangleIntersection(
+       const Ray &ray,
+       const glm::vec3 &p0,
+       const glm::vec3 &p1,
+       const glm::vec3 &p2,
+       glm::vec3 &point
+) noexcept {
+       glm::vec3 edge1(p1 - p0);
+       glm::vec3 edge2(p2 - p0);
+
+       glm::vec3 h(glm::cross(ray.direction, edge2));
+       float a = glm::dot(edge1, h);
+
+       if (std::fabs(a) < std::numeric_limits<float>::epsilon()) {
+               return false;
+       }
+
+       float f = 1.0f / a;
+       glm::vec3 s(ray.origin - p0);
+       float u = f * glm::dot(s, h);
+
+       if (u < 0.0f || u > 1.0f) {
+               return false;
+       }
+
+       glm::vec3 q(glm::cross(s, edge1));
+       float v = f * glm::dot(ray.direction, q);
+
+       if (v < 0.0f || u + v > 1.0f) {
+               return false;
+       }
+
+       float t = f * glm::dot(edge2, q);
+       point = ray.origin + (t * ray.direction);
+       return t > std::numeric_limits<float>::epsilon();
+}
+
+}