From aae87475950928847a6fbbfc2664efe5204ef83b Mon Sep 17 00:00:00 2001 From: Colin Sherratt Date: Sat, 4 Oct 2014 20:09:56 -0400 Subject: [PATCH] Fix ortho projection matrix --- src/projection.rs | 2 +- tests/projection.rs | 69 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 tests/projection.rs diff --git a/src/projection.rs b/src/projection.rs index 3ac3c63..2645a86 100644 --- a/src/projection.rs +++ b/src/projection.rs @@ -234,7 +234,7 @@ impl ToMatrix4 for Ortho { let c2r0 = zero(); let c2r1 = zero(); let c2r2 = -two / (self.far - self.near); - let c2r3 = -one::(); + let c2r3 = zero(); let c3r0 = -(self.right + self.left) / (self.right - self.left); let c3r1 = -(self.top + self.bottom) / (self.top - self.bottom); diff --git a/tests/projection.rs b/tests/projection.rs new file mode 100644 index 0000000..7e4d788 --- /dev/null +++ b/tests/projection.rs @@ -0,0 +1,69 @@ +// 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. + +extern crate cgmath; + +use cgmath::{Vector4, ortho, Matrix, Matrix4, Vector}; + +#[test] +fn test_ortho_scale() { + // An orthographic projection can be used to scale points + // but this will result in the clip space (Z) being swapped (-1 -> 1) + // this test asserts that this property is true of our ortho projection + + let vec_near: Vector4 = Vector4::new(-1., -1., -1., 1.); + let vec_orig: Vector4 = Vector4::new(0., 0., 0., 1.); + let vec_far: Vector4 = Vector4::new(1., 1., 1., 1.); + + let o: Matrix4 = ortho(-1., 1., -1., 1., -1., 1.); + let near = o.mul_v(&vec_near); + let orig = o.mul_v(&vec_orig); + let far = o.mul_v(&vec_far); + + assert_eq!(near, Vector4::new(-1f32, -1., 1., 1.)); + assert_eq!(orig, Vector4::new(0f32, 0., 0., 1.)); + assert_eq!(far, Vector4::new(1f32, 1., -1., 1.)); + + + let o: Matrix4 = ortho(-2., 2., -2., 2., -2., 2.); + let near = o.mul_v(&vec_near); + let orig = o.mul_v(&vec_orig); + let far = o.mul_v(&vec_far); + + assert_eq!(near, Vector4::new(-0.5f32, -0.5, 0.5, 1.)); + assert_eq!(orig, Vector4::new(0f32, 0., 0., 1.)); + assert_eq!(far, Vector4::new(0.5f32, 0.5, -0.5, 1.)); +} + +#[test] +fn test_ortho_translate() { + // An orthographic projection can be used to translate a point + // but this will result in the clip space (Z) being swapped (-1 -> 1) + // this test asserts that this property is true of our ortho projection + + let vec_orig: Vector4 = Vector4::new(0., 0., 0., 1.); + + let o: Matrix4 = ortho(-1., 1., -1., 1., -1., 1.); + let orig = o.mul_v(&vec_orig); + assert_eq!(orig, Vector4::new(0., 0., 0., 1.)); + + let o: Matrix4 = ortho(0., 2., 0., 2., 0., 2.); + let orig = o.mul_v(&vec_orig); + assert_eq!(orig, Vector4::new(-1., -1., -1., 1.)); + + let o: Matrix4 = ortho(-2., 0., -2., 0., -2., 0.); + let orig = o.mul_v(&vec_orig); + assert_eq!(orig, Vector4::new(1., 1., 1., 1.)); +}