Add collision types
This commit is contained in:
parent
aef1d153a1
commit
28faaa2ccc
8 changed files with 228 additions and 7 deletions
31
src/cgmath/aabb.rs
Normal file
31
src/cgmath/aabb.rs
Normal file
|
@ -0,0 +1,31 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
//! Axis-aligned bounding boxes
|
||||
|
||||
use point::{Point2, Point3};
|
||||
use vector::{Vec2, Vec3};
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct AABB2<S> {
|
||||
center: Point2<S>,
|
||||
size: Vec2<S>,
|
||||
}
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct AABB3<S> {
|
||||
center: Point3<S>,
|
||||
size: Vec3<S>,
|
||||
}
|
26
src/cgmath/cylinder.rs
Normal file
26
src/cgmath/cylinder.rs
Normal file
|
@ -0,0 +1,26 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
//! Oriented bounding cylinder
|
||||
|
||||
use point::Point3;
|
||||
use vector::Vec3;
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct Cylinder<S> {
|
||||
center: Point3<S>,
|
||||
axis: Vec3<S>,
|
||||
radius: S,
|
||||
}
|
41
src/cgmath/frustum.rs
Normal file
41
src/cgmath/frustum.rs
Normal file
|
@ -0,0 +1,41 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
//! View frustum for visibility determination
|
||||
|
||||
use plane::Plane3;
|
||||
use point::Point3;
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct Frustum<S> {
|
||||
left: Plane3<S>,
|
||||
right: Plane3<S>,
|
||||
bottom: Plane3<S>,
|
||||
top: Plane3<S>,
|
||||
near: Plane3<S>,
|
||||
far: Plane3<S>,
|
||||
}
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct FrustumPoints<S> {
|
||||
near_top_left: Point3<S>,
|
||||
near_top_right: Point3<S>,
|
||||
near_bottom_left: Point3<S>,
|
||||
near_bottom_right: Point3<S>,
|
||||
far_top_left: Point3<S>,
|
||||
far_top_right: Point3<S>,
|
||||
far_bottom_left: Point3<S>,
|
||||
far_bottom_right: Point3<S>,
|
||||
}
|
|
@ -28,11 +28,19 @@ pub mod quaternion;
|
|||
pub mod vector;
|
||||
|
||||
pub mod angle;
|
||||
pub mod plane;
|
||||
pub mod point;
|
||||
pub mod ray;
|
||||
pub mod rotation;
|
||||
|
||||
pub mod frustum;
|
||||
pub mod projection;
|
||||
|
||||
pub mod aabb;
|
||||
pub mod cylinder;
|
||||
pub mod obb;
|
||||
pub mod sphere;
|
||||
|
||||
pub mod util {
|
||||
use std::num::one;
|
||||
|
||||
|
|
33
src/cgmath/obb.rs
Normal file
33
src/cgmath/obb.rs
Normal file
|
@ -0,0 +1,33 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
//! Oriented bounding boxes
|
||||
|
||||
use point::{Point2, Point3};
|
||||
use vector::{Vec2, Vec3};
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct OBB2<S> {
|
||||
center: Point2<S>,
|
||||
axis: Vec2<S>,
|
||||
extents: Vec2<S>,
|
||||
}
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct OBB3<S> {
|
||||
center: Point3<S>,
|
||||
axis: Vec3<S>,
|
||||
extents: Vec3<S>,
|
||||
}
|
43
src/cgmath/plane.rs
Normal file
43
src/cgmath/plane.rs
Normal file
|
@ -0,0 +1,43 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
use vector::Vec3;
|
||||
|
||||
use std::fmt;
|
||||
|
||||
/// A 3-dimendional plane formed from the equation: `Ax + Bx + Cx + D = 0`
|
||||
///
|
||||
/// # Fields
|
||||
///
|
||||
/// - `normal`: the normal of the plane where:
|
||||
/// - `normal.x`: corresponds to `A` in the plane equation
|
||||
/// - `normal.y`: corresponds to `B` in the plane equation
|
||||
/// - `normal.z`: corresponds to `C` in the plane equation
|
||||
/// - `distance`: the distance value, corresponding to `D` in the plane equation
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct Plane3<S> {
|
||||
normal: Vec3<S>,
|
||||
distance: S,
|
||||
}
|
||||
|
||||
impl<S: Clone + fmt::Float> ToStr for Plane3<S> {
|
||||
fn to_str(&self) -> ~str {
|
||||
format!("{:f}x + {:f}y + {:f}z + {:f} = 0",
|
||||
self.normal.x,
|
||||
self.normal.y,
|
||||
self.normal.z,
|
||||
self.distance)
|
||||
}
|
||||
}
|
|
@ -16,6 +16,7 @@
|
|||
use std::num::{zero, one};
|
||||
|
||||
use angle::{Angle, rad, tan, cot};
|
||||
use frustum::Frustum;
|
||||
use matrix::{Mat4, ToMat4};
|
||||
use util::two;
|
||||
|
||||
|
@ -62,7 +63,9 @@ pub fn ortho<S: Clone + Float>(left: S, right: S, bottom: S, top: S, near: S, fa
|
|||
}.to_mat4()
|
||||
}
|
||||
|
||||
pub trait Projection<S>: ToMat4<S> {}
|
||||
pub trait Projection<S>: ToMat4<S> {
|
||||
fn to_frustum(&self) -> Frustum<S>;
|
||||
}
|
||||
|
||||
/// A perspective projection based on a vertical field-of-view angle.
|
||||
#[deriving(Clone, Eq)]
|
||||
|
@ -90,6 +93,12 @@ impl<S: Clone + Float, A: Angle<S>> PerspectiveFov<S, A> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float, A: Angle<S>> Projection<S> for PerspectiveFov<S, A> {
|
||||
fn to_frustum(&self) -> Frustum<S> {
|
||||
self.to_perspective().to_frustum()
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float, A: Angle<S>> ToMat4<S> for PerspectiveFov<S, A> {
|
||||
fn to_mat4(&self) -> Mat4<S> {
|
||||
let half_turn: A = Angle::from(rad::<S>(Real::frac_pi_2()));
|
||||
|
@ -130,8 +139,6 @@ impl<S: Clone + Float, A: Angle<S>> ToMat4<S> for PerspectiveFov<S, A> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float, A: Angle<S>> Projection<S> for PerspectiveFov<S, A>;
|
||||
|
||||
/// A perspective projection with arbitrary left/right/bottom/top distances
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct Perspective<S> {
|
||||
|
@ -140,6 +147,12 @@ pub struct Perspective<S> {
|
|||
near: S, far: S,
|
||||
}
|
||||
|
||||
impl<S: Clone + Float> Projection<S> for Perspective<S> {
|
||||
fn to_frustum(&self) -> Frustum<S> {
|
||||
fail!("Not yet implemented!");
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float> ToMat4<S> for Perspective<S> {
|
||||
fn to_mat4(&self) -> Mat4<S> {
|
||||
assert!(self.left > self.right, "`left` cannot be greater than `right`, found: left: %? right: %?", self.left, self.right);
|
||||
|
@ -173,8 +186,6 @@ impl<S: Clone + Float> ToMat4<S> for Perspective<S> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float> Projection<S> for Perspective<S>;
|
||||
|
||||
/// An orthographic projection with arbitrary left/right/bottom/top distances
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct Ortho<S> {
|
||||
|
@ -183,6 +194,12 @@ pub struct Ortho<S> {
|
|||
near: S, far: S,
|
||||
}
|
||||
|
||||
impl<S: Clone + Float> Projection<S> for Ortho<S> {
|
||||
fn to_frustum(&self) -> Frustum<S> {
|
||||
fail!("Not yet implemented!");
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float> ToMat4<S> for Ortho<S> {
|
||||
fn to_mat4(&self) -> Mat4<S> {
|
||||
assert!(self.left > self.right, "`left` cannot be greater than `right`, found: left: %? right: %?", self.left, self.right);
|
||||
|
@ -215,5 +232,3 @@ impl<S: Clone + Float> ToMat4<S> for Ortho<S> {
|
|||
c3r0, c3r1, c3r2, c3r3)
|
||||
}
|
||||
}
|
||||
|
||||
impl<S: Clone + Float> Projection<S> for Ortho<S>;
|
||||
|
|
24
src/cgmath/sphere.rs
Normal file
24
src/cgmath/sphere.rs
Normal file
|
@ -0,0 +1,24 @@
|
|||
// Copyright 2013 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.
|
||||
|
||||
//! Bounding sphere
|
||||
|
||||
use point::Point3;
|
||||
|
||||
#[deriving(Clone, Eq)]
|
||||
pub struct Sphere<S> {
|
||||
center: Point3<S>,
|
||||
radius: S,
|
||||
}
|
Loading…
Reference in a new issue