summaryrefslogtreecommitdiff
path: root/assets/final/shaders/ray_triangle.wgsl
blob: 13341c8cdc5d07d2b6c9b8f4999d86cce7f1f1ea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// This file is part of the 64k demo project.
// Möller-Trumbore ray-triangle intersection algorithm.
// Reference: "Fast, Minimum Storage Ray-Triangle Intersection"

struct TriangleHit {
  uv: vec2<f32>,
  z: f32,
  N: vec3<f32>,
  hit: bool,
};

fn ray_triangle_intersection(
  orig: vec3<f32>,
  dir: vec3<f32>,
  p0: vec3<f32>,
  p1: vec3<f32>,
  p2: vec3<f32>
) -> TriangleHit {
  let d10 = p1 - p0;
  let d20 = p2 - p0;
  let N = cross(d10, d20);
  let det = -dot(dir, N);
  let invdet = 1.0 / det;
  let d0 = orig - p0;
  let nd = cross(d0, dir);
  let uv = vec2<f32>(dot(d20, nd), -dot(d10, nd)) * invdet;
  let z = dot(d0, N) * invdet;
  let hit = det > 0.0 && z >= 0.0 && uv.x >= 0.0 && uv.y >= 0.0 && (uv.x + uv.y) < 1.0;
  return TriangleHit(uv, z, N, hit);
}