use na; use query::{Ray, RayCast, RayIntersection}; use shape::Plane; use math::{Isometry, Point}; /// Computes the toi of a ray with a plane described by its center and normal. #[inline] pub fn plane_toi_with_ray( center: &P, normal: &P::Vector, ray: &Ray

, ) -> Option { let dpos = *center - ray.origin; let t = na::dot(normal, &dpos) / na::dot(normal, &ray.dir); if t >= na::zero() { Some(t) } else { None } } impl> RayCast for Plane { #[inline] fn toi_and_normal_with_ray( &self, m: &M, ray: &Ray

, solid: bool, ) -> Option> { let ls_ray = ray.inverse_transform_by(m); let dpos = -ls_ray.origin; let dot_normal_dpos = na::dot(self.normal().as_ref(), &dpos.coordinates()); if solid && dot_normal_dpos > na::zero() { // The ray is inside of the solid half-space. return Some(RayIntersection::new(na::zero(), na::zero())); } let t = dot_normal_dpos / na::dot(self.normal().as_ref(), &ls_ray.dir); if t >= na::zero() { let n = if dot_normal_dpos > na::zero() { -*self.normal() } else { *self.normal() }; Some(RayIntersection::new(t, m.rotate_vector(&n))) } else { None } } }