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
|