--- /dev/null
+#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();
+}
+
+}