]> git.localhorst.tv Git - tacos.git/blob - src/physics/ray.cpp
ray/floor intersection experiments
[tacos.git] / src / physics / ray.cpp
1 #include "ray.hpp"
2
3
4 namespace tacos {
5
6 bool TriangleIntersection(
7         const Ray &ray,
8         const glm::vec3 &p0,
9         const glm::vec3 &p1,
10         const glm::vec3 &p2,
11         glm::vec3 &point
12 ) noexcept {
13         glm::vec3 edge1(p1 - p0);
14         glm::vec3 edge2(p2 - p0);
15
16         glm::vec3 h(glm::cross(ray.direction, edge2));
17         float a = glm::dot(edge1, h);
18
19         if (std::fabs(a) < std::numeric_limits<float>::epsilon()) {
20                 return false;
21         }
22
23         float f = 1.0f / a;
24         glm::vec3 s(ray.origin - p0);
25         float u = f * glm::dot(s, h);
26
27         if (u < 0.0f || u > 1.0f) {
28                 return false;
29         }
30
31         glm::vec3 q(glm::cross(s, edge1));
32         float v = f * glm::dot(ray.direction, q);
33
34         if (v < 0.0f || u + v > 1.0f) {
35                 return false;
36         }
37
38         float t = f * glm::dot(edge2, q);
39         point = ray.origin + (t * ray.direction);
40         return t > std::numeric_limits<float>::epsilon();
41 }
42
43 }