78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
/*
|
||
* Copyright (c), Recep Aslantas.
|
||
*
|
||
* MIT License (MIT), http://opensource.org/licenses/MIT
|
||
* Full license can be found in the LICENSE file
|
||
*/
|
||
|
||
/*
|
||
Functions:
|
||
CGLM_INLINE bool glm_line_triangle_intersect(vec3 origin,
|
||
vec3 direction,
|
||
vec3 v0,
|
||
vec3 v1,
|
||
vec3 v2,
|
||
float *d);
|
||
*/
|
||
|
||
#ifndef cglm_ray_h
|
||
#define cglm_ray_h
|
||
|
||
#include "vec3.h"
|
||
|
||
/*!
|
||
* @brief Möller–Trumbore ray-triangle intersection algorithm
|
||
*
|
||
* @param[in] origin origin of ray
|
||
* @param[in] direction direction of ray
|
||
* @param[in] v0 first vertex of triangle
|
||
* @param[in] v1 second vertex of triangle
|
||
* @param[in] v2 third vertex of triangle
|
||
* @param[in, out] d distance to intersection
|
||
* @return whether there is intersection
|
||
*/
|
||
|
||
CGLM_INLINE
|
||
bool
|
||
glm_ray_triangle(vec3 origin,
|
||
vec3 direction,
|
||
vec3 v0,
|
||
vec3 v1,
|
||
vec3 v2,
|
||
float *d) {
|
||
vec3 edge1, edge2, p, t, q;
|
||
float det, inv_det, u, v, dist;
|
||
const float epsilon = 0.000001f;
|
||
|
||
glm_vec3_sub(v1, v0, edge1);
|
||
glm_vec3_sub(v2, v0, edge2);
|
||
glm_vec3_cross(direction, edge2, p);
|
||
|
||
det = glm_vec3_dot(edge1, p);
|
||
if (det > -epsilon && det < epsilon)
|
||
return false;
|
||
|
||
inv_det = 1.0f / det;
|
||
|
||
glm_vec3_sub(origin, v0, t);
|
||
|
||
u = inv_det * glm_vec3_dot(t, p);
|
||
if (u < 0.0f || u > 1.0f)
|
||
return false;
|
||
|
||
glm_vec3_cross(t, edge1, q);
|
||
|
||
v = inv_det * glm_vec3_dot(direction, q);
|
||
if (v < 0.0f || u + v > 1.0f)
|
||
return false;
|
||
|
||
dist = inv_det * glm_vec3_dot(edge2, q);
|
||
|
||
if (d)
|
||
*d = dist;
|
||
|
||
return dist > epsilon;
|
||
}
|
||
|
||
#endif
|