MCPcopy Create free account
hub / github.com/Bloom-Engine/engine / ray_triangle_intersection

Function ray_triangle_intersection

native/shared/src/picking.rs:227–255  ·  view source on GitHub ↗
(
    origin: &[f32; 3], dir: &[f32; 3],
    v0: &[f32; 3], v1: &[f32; 3], v2: &[f32; 3],
)

Source from the content-addressed store, hash-verified

225// ============================================================
226
227fn ray_triangle_intersection(
228 origin: &[f32; 3], dir: &[f32; 3],
229 v0: &[f32; 3], v1: &[f32; 3], v2: &[f32; 3],
230) -> Option<(f32, f32, f32)> {
231 const EPSILON: f32 = 1e-7;
232
233 let e1 = [v1[0]-v0[0], v1[1]-v0[1], v1[2]-v0[2]];
234 let e2 = [v2[0]-v0[0], v2[1]-v0[1], v2[2]-v0[2]];
235
236 let h = cross(dir, &e2);
237 let a = dot(&e1, &h);
238 if a.abs() < EPSILON { return None; }
239
240 let f = 1.0 / a;
241 let s = [origin[0]-v0[0], origin[1]-v0[1], origin[2]-v0[2]];
242 let u = f * dot(&s, &h);
243 if u < 0.0 || u > 1.0 { return None; }
244
245 let q = cross(&s, &e1);
246 let v = f * dot(dir, &q);
247 if v < 0.0 || u + v > 1.0 { return None; }
248
249 let t = f * dot(&e2, &q);
250 if t > EPSILON {
251 Some((t, u, v))
252 } else {
253 None
254 }
255}
256
257fn cross(a: &[f32; 3], b: &[f32; 3]) -> [f32; 3] {
258 [

Callers 2

raycast_sceneFunction · 0.85
raycast_scene_allFunction · 0.85

Calls 2

dotFunction · 0.85
crossFunction · 0.70

Tested by

no test coverage detected