diff --git a/src/bound.rs b/src/bound.rs new file mode 100644 index 0000000..33a20b9 --- /dev/null +++ b/src/bound.rs @@ -0,0 +1,60 @@ +// Copyright 2013-2014 The CGMath Developers. For a full listing of the authors, +// refer to the AUTHORS file at the top-level directory of this distribution. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! Generic spatial bounds. + +use aabb::{Aabb, Aabb3}; +use num::BaseNum; +use plane::Plane; +use point::{Point, Point3}; + +/// Spatial relation between two objects. +pub enum Relation { + /// Completely inside + In, + /// Crosses the boundary + Cross, + /// Completely outside + Out, +} + +/// Generic bound. +pub trait Bound { + /// Classify the spatial relation with a plane + fn relate(&self, &Plane) -> Relation; +} + +impl Bound for Point3 { + fn relate(&self, plane: &Plane) -> Relation { + let dist = self.dot(&plane.n); + if dist > plane.d { + Relation::In + }else if dist < plane.d { + Relation::Out + }else { + Relation::Cross + } + } +} + +impl Bound for Aabb3 { + fn relate(&self, plane: &Plane) -> Relation { + match (self.min.relate(plane), self.max.relate(plane)) { + (Relation::In, Relation::In) => Relation::In, + (Relation::Out, Relation::Out) => Relation::Out, + (_, _) => Relation::Cross, + } + } +} diff --git a/src/cgmath.rs b/src/cgmath.rs index c8335da..c0c7df8 100644 --- a/src/cgmath.rs +++ b/src/cgmath.rs @@ -16,6 +16,7 @@ #![crate_type = "rlib"] #![crate_type = "dylib"] #![feature(old_impl_check, plugin, core, std_misc, custom_derive)] +#![plugin(rand_macros)] //! Computer graphics-centric math. //! @@ -52,6 +53,7 @@ pub use transform::*; pub use projection::*; pub use aabb::*; +pub use bound::*; pub use cylinder::Cylinder; pub use frustum::{Frustum, FrustumPoints}; pub use intersect::Intersect; @@ -80,6 +82,7 @@ mod transform; mod projection; mod aabb; +mod bound; mod cylinder; mod frustum; mod intersect;