struct RayBounds { t_entry: f32, t_exit: f32, hit: bool, }; fn ray_box_intersection(ro: vec3, rd: vec3, extent: vec3) -> RayBounds { let inv_rd = 1.0 / rd; let t0 = (-extent - ro) * inv_rd; let t1 = (extent - ro) * inv_rd; let tmin_vec = min(t0, t1); let tmax_vec = max(t0, t1); let t_entry = max(0.0, max(tmin_vec.x, max(tmin_vec.y, tmin_vec.z))); let t_exit = min(tmax_vec.x, min(tmax_vec.y, tmax_vec.z)); return RayBounds(t_entry, t_exit, t_entry <= t_exit); }