# ray

Header: cglm/ray.h

This is for collision-checks used by ray-tracers and the like.

## Table of contents (click to go):

Functions:

1. `glm_ray_triangle()`

2. `glm_ray_sphere()`

3. `glm_ray_at()`

## Functions documentation

bool glm_ray_triangle(vec3 origin, vec3 direction, vec3 v0, vec3 v1, vec3 v2, float *d)

  Möller–Trumbore ray-triangle intersection algorithm

  Parameters:
    [in] origin origin of ray
    [in] direction direction of ray
    [in] v0 first vertex of triangle
    [in] v1 second vertex of triangle
    [in] v2 third vertex of triangle
    [in, out] d float pointer to save distance to intersection
    [out] intersection whether there is intersection

bool glm_ray_sphere(vec3 origin, vec3 dir, vec4 s, float *__restrict t1, float *__restrict t2)

  ray sphere intersection

  returns false if there is no intersection if true:

  - t1 > 0, t2 > 0: ray intersects the sphere at t1 and t2 both ahead of the origin

  - t1 < 0, t2 > 0: ray starts inside the sphere, exits at t2

  - t1 < 0, t2 < 0: no intersection ahead of the ray ( returns false )

  - the caller can check if the intersection points (t1 and t2) fall within a specific range (for example, tmin < t1, t2 < tmax) to determine if the intersections are within a desired segment of the ray

  Parameters:
    [in] origin ray origin
    [in] dir normalized ray direction
    [in] s sphere [center.x, center.y, center.z, radii]
    [out] t1 near point1 (closer to origin)
    [out] t2 far point2 (farther from origin)
  Return:
    whether there is intersection

bool glm_ray_at(vec3 orig, vec3 dir, float t, vec3 point)

  point using t by 𝐏(𝑡)=𝐀+𝑡𝐛

  Parameters:
    [in] origin ray origin
    [in] dir ray direction
    [out] t parameter
    [out] point point at t
  Return:
    point at t