UNPKG

closure-builder

Version:

Simple Closure, Soy and JavaScript Build system

628 lines (534 loc) 22.1 kB
<!DOCTYPE html> <html> <!-- Copyright 2011 The Closure Library Authors. All Rights Reserved. Use of this source code is governed by the Apache License, Version 2.0. See the COPYING file for details. --> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="UTF-8" /> <title>Closure Unit Tests - goog.vec.Matrix4</title> <script src="../base.js"></script> <script> goog.require('goog.vec.Float32Array'); goog.require('goog.vec.Matrix4'); goog.require('goog.testing.jsunit'); </script> </head> <body> <script> function testConstructor() { var m0 = goog.vec.Matrix4.create(); assertElementsEquals([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], m0); var m1 = goog.vec.Matrix4.createFromArray( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m1); var m2 = goog.vec.Matrix4.clone(m1); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m1); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m2); var m3 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m3); var m4 = goog.vec.Matrix4.createIdentity(); assertElementsEquals([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], m4); } function testSet() { var m0 = goog.vec.Matrix4.create(); var m1 = goog.vec.Matrix4.createFromArray( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); goog.vec.Matrix4.setFromArray(m0, m1); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); goog.vec.Matrix4.setFromValues( m0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17); assertElementsEquals( [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], m0); } function testSetDiagonal() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setDiagonalValues(m0, 1, 2, 3, 4); assertElementsEquals( [1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4], m0); goog.vec.Matrix4.setDiagonal(m0, [4, 5, 6, 7]); assertElementsEquals( [4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 0, 0, 0, 0, 7], m0); } function testSetGetColumn() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setColumn(m0, 0, [1, 2, 3, 4]); goog.vec.Matrix4.setColumn(m0, 1, [5, 6, 7, 8]); goog.vec.Matrix4.setColumn(m0, 2, [9, 10, 11, 12]); goog.vec.Matrix4.setColumn(m0, 3, [13, 14, 15, 16]); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); var v0 = [0, 0, 0, 0]; goog.vec.Matrix4.getColumn(m0, 0, v0); assertElementsEquals([1, 2, 3, 4], v0); goog.vec.Matrix4.getColumn(m0, 1, v0); assertElementsEquals([5, 6, 7, 8], v0); goog.vec.Matrix4.getColumn(m0, 2, v0); assertElementsEquals([9, 10, 11, 12], v0); goog.vec.Matrix4.getColumn(m0, 3, v0); assertElementsEquals([13, 14, 15, 16], v0); } function testSetGetColumns() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setColumns( m0, [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); var v0 = [0, 0, 0, 0], v1 = [0, 0, 0, 0]; var v2 = [0, 0, 0, 0], v3 = [0, 0, 0, 0]; goog.vec.Matrix4.getColumns(m0, v0, v1, v2, v3); assertElementsEquals([1, 2, 3, 4], v0); assertElementsEquals([5, 6, 7, 8], v1); assertElementsEquals([9, 10, 11, 12], v2); assertElementsEquals([13, 14, 15, 16], v3); } function testSetGetRow() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setRow(m0, 0, [1, 2, 3, 4]); goog.vec.Matrix4.setRow(m0, 1, [5, 6, 7, 8]); goog.vec.Matrix4.setRow(m0, 2, [9, 10, 11, 12]); goog.vec.Matrix4.setRow(m0, 3, [13, 14, 15, 16]); assertElementsEquals( [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16], m0); var v0 = [0, 0, 0, 0]; goog.vec.Matrix4.getRow(m0, 0, v0); assertElementsEquals([1, 2, 3, 4], v0); goog.vec.Matrix4.getRow(m0, 1, v0); assertElementsEquals([5, 6, 7, 8], v0); goog.vec.Matrix4.getRow(m0, 2, v0); assertElementsEquals([9, 10, 11, 12], v0); goog.vec.Matrix4.getRow(m0, 3, v0); assertElementsEquals([13, 14, 15, 16], v0); } function testSetGetRows() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setRows( m0, [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]); assertElementsEquals( [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16], m0); var v0 = [0, 0, 0, 0], v1 = [0, 0, 0, 0]; var v2 = [0, 0, 0, 0], v3 = [0, 0, 0, 0]; goog.vec.Matrix4.getRows(m0, v0, v1, v2, v3); assertElementsEquals([1, 2, 3, 4], v0); assertElementsEquals([5, 6, 7, 8], v1); assertElementsEquals([9, 10, 11, 12], v2); assertElementsEquals([13, 14, 15, 16], v3); } function testSetRowMajorArray() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setFromRowMajorArray( m0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); assertElementsEquals( [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16], m0); } function testSetZero() { var m0 = goog.vec.Matrix4.createFromArray( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); goog.vec.Matrix4.setZero(m0); assertElementsEquals( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], m0); } function testSetIdentity() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setIdentity(m0); assertElementsEquals( [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], m0); } function testSetGetElement() { var m0 = goog.vec.Matrix4.create(); for (var r = 0; r < 4; r++) { for (var c = 0; c < 4; c++) { var value = c * 4 + r + 1; goog.vec.Matrix4.setElement(m0, r, c, value); assertEquals(value, goog.vec.Matrix4.getElement(m0, r, c)); } } assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); } function testAdd() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m1 = goog.vec.Matrix4.createFromValues( 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8); var m2 = goog.vec.Matrix4.create(); goog.vec.Matrix4.add(m0, m1, m2); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); assertElementsEquals( [9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8], m1); assertElementsEquals( [10, 12, 14, 16, 18, 20, 22, 24, 10, 12, 14, 16, 18, 20, 22, 24], m2); goog.vec.Matrix4.add(m0, m1, m0); assertElementsEquals( [9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8], m1); assertElementsEquals( [10, 12, 14, 16, 18, 20, 22, 24, 10, 12, 14, 16, 18, 20, 22, 24], m0); } function testSubtract() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m1 = goog.vec.Matrix4.createFromValues( 9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8); var m2 = goog.vec.Matrix4.create(); goog.vec.Matrix4.subtract(m0, m1, m2); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); assertElementsEquals( [9, 10, 11, 12, 13, 14, 15, 16, 1, 2, 3, 4, 5, 6, 7, 8], m1); assertElementsEquals( [-8, -8, -8, -8, -8, -8, -8, -8, 8, 8, 8, 8, 8, 8, 8, 8], m2); goog.vec.Matrix4.subtract(m1, m0, m1); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); assertElementsEquals( [8, 8, 8, 8, 8, 8, 8, 8, -8, -8, -8, -8, -8, -8, -8, -8], m1); } function testScale() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.scale(m0, 2, m1); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m0); assertElementsEquals( [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32], m1); goog.vec.Matrix4.scale(m0, 5, m0); assertElementsEquals( [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80], m0); } function testMultMat() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m1 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m2 = goog.vec.Matrix4.create(); goog.vec.Matrix4.multMat(m0, m1, m2); assertElementsEquals( [90, 100, 110, 120, 202, 228, 254, 280, 314, 356, 398, 440, 426, 484, 542, 600], m2); goog.vec.Matrix4.scale(m1, 2, m1); goog.vec.Matrix4.multMat(m1, m0, m1); assertElementsEquals( [180, 200, 220, 240, 404, 456, 508, 560, 628, 712, 796, 880, 852, 968, 1084, 1200], m1); } function testTranspose() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.transpose(m0, m1); assertElementsEquals( [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16], m1); goog.vec.Matrix4.transpose(m1, m1); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], m1); } function testDeterminant() { var m0 = goog.vec.Matrix4.createFromValues( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); assertEquals(0, goog.vec.Matrix4.determinant(m0)); assertElementsEquals( [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], m0); goog.vec.Matrix4.setFromValues( m0, 1, 2, 3, 4, 2, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 3); assertEquals(160, goog.vec.Matrix4.determinant(m0)); assertElementsEquals( [1, 2, 3, 4, 2, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 3], m0); } function testInvert() { var m0 = goog.vec.Matrix4.createFromValues( 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); assertFalse(goog.vec.Matrix4.invert(m0, m0)); assertElementsEquals( [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], m0); goog.vec.Matrix4.setFromValues( m0, 1, 2, 3, 4, 2, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 3); assertTrue(goog.vec.Matrix4.invert(m0, m0)); assertElementsRoughlyEqual( [-0.225, 0.025, 0.025, 0.275, 0.025, 0.025, 0.275, -0.225, 0.025, 0.275, -0.225, 0.025, 0.275, -0.225, 0.025, 0.025], m0, goog.vec.EPSILON); goog.vec.Matrix4.makeScale(m0, .01, .01, .01); assertTrue(goog.vec.Matrix4.invert(m0, m0)); var m1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeScale(m1, 100, 100, 100); assertElementsEquals(m1, m0); } function testEquals() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var m1 = goog.vec.Matrix4.clone(m0); assertTrue(goog.vec.Matrix4.equals(m0, m1)); assertTrue(goog.vec.Matrix4.equals(m1, m0)); for (var i = 0; i < 16; i++) { m1[i] = 18; assertFalse(goog.vec.Matrix4.equals(m0, m1)); assertFalse(goog.vec.Matrix4.equals(m1, m0)); m1[i] = i + 1; } } function testMultVec3() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var v0 = [1, 2, 3]; var v1 = [0, 0, 0]; goog.vec.Matrix4.multVec3(m0, v0, v1); assertElementsEquals([1, 2, 3], v0); assertElementsEquals([51, 58, 65], v1); goog.vec.Matrix4.multVec3(m0, v0, v0); assertElementsEquals([51, 58, 65], v0); v0 = [1, 2, 3]; goog.vec.Matrix4.multVec3ToArray(m0, v0, v0); assertElementsEquals([51, 58, 65], v0); } function testMultVec3NoTranslate() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var v0 = [1, 2, 3]; var v1 = [0, 0, 0]; goog.vec.Matrix4.multVec3NoTranslate(m0, v0, v1); assertElementsEquals([1, 2, 3], v0); assertElementsEquals([38, 44, 50], v1); goog.vec.Matrix4.multVec3NoTranslate(m0, v0, v0); assertElementsEquals([38, 44, 50], v0); } function testMultVec3Projective() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var v0 = [1, 2, 3]; var v1 = [0, 0, 0]; var invw = 1 / 72; goog.vec.Matrix4.multVec3Projective(m0, v0, v1); assertElementsEquals([1, 2, 3], v0); assertElementsEquals( [51 * invw, 58 * invw, 65 * invw], v1); goog.vec.Matrix4.multVec3Projective(m0, v0, v0); assertElementsEquals( [51 * invw, 58 * invw, 65 * invw], v0); } function testMultVec4() { var m0 = goog.vec.Matrix4.createFromValues( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var v0 = [1, 2, 3, 4]; var v1 = [0, 0, 0, 0]; goog.vec.Matrix4.multVec4(m0, v0, v1); assertElementsEquals([90, 100, 110, 120], v1); goog.vec.Matrix4.multVec4(m0, v0, v0); assertElementsEquals([90, 100, 110, 120], v0); var v0 = [1, 2, 3, 4]; goog.vec.Matrix4.multVec4ToArray(m0, v0, v0); assertElementsEquals([90, 100, 110, 120], v0); } function testSetValues() { var a0 = goog.vec.Matrix4.create(); assertElementsEquals( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], a0); a0 = goog.vec.Matrix4.createFromArray( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], a0); var a1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.setDiagonalValues(a1, 1, 2, 3, 4); assertElementsEquals( [1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4], a1); goog.vec.Matrix4.setColumnValues(a1, 0, 2, 3, 4, 5); goog.vec.Matrix4.setColumnValues(a1, 1, 6, 7, 8, 9); goog.vec.Matrix4.setColumnValues(a1, 2, 10, 11, 12, 13); goog.vec.Matrix4.setColumnValues(a1, 3, 14, 15, 16, 1); assertElementsEquals( [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1], a1); goog.vec.Matrix4.setRowValues(a1, 0, 1, 5, 9, 13); goog.vec.Matrix4.setRowValues(a1, 1, 2, 6, 10, 14); goog.vec.Matrix4.setRowValues(a1, 2, 3, 7, 11, 15); goog.vec.Matrix4.setRowValues(a1, 3, 4, 8, 12, 16); assertElementsEquals( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16], a1); } function testMakeTranslate() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeTranslate(m0, 3, 4, 5); assertElementsEquals( [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3, 4, 5, 1], m0); } function testMakeScale() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeScale(m0, 3, 4, 5); assertElementsEquals( [3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1], m0); } function testMakeRotate() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeAxisAngleRotate(m0, Math.PI / 2, 0, 0, 1); assertElementsRoughlyEqual( [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], m0, goog.vec.EPSILON); var m1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeAxisAngleRotate(m1, -Math.PI / 4, 0, 0, 1); goog.vec.Matrix4.multMat(m0, m1, m1); assertElementsRoughlyEqual( [0.7071068, 0.7071068, 0, 0, -0.7071068, 0.7071068, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], m1, goog.vec.EPSILON); } function testApplyTranslate() { var m0 = goog.vec.Matrix4.createIdentity(); goog.vec.Matrix4.applyTranslate(m0, 3, 4, 5); assertElementsEquals( [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 3, 4, 5, 1], m0); goog.vec.Matrix4.setFromValues( m0, 1, 2, 3, 4, 2, 3, 4, 1, 3, 4, 1, 2, 4, 1, 2, 3); var m1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeTranslate(m1, 5, 6, 7); var m2 = goog.vec.Matrix4.create(); goog.vec.Matrix4.multMat(m0, m1, m2); goog.vec.Matrix4.applyTranslate(m0, 5, 6, 7); assertElementsEquals(m2, m0); } function testApplyScale() { var m0 = goog.vec.Matrix4.createIdentity(); goog.vec.Matrix4.applyScale(m0, 3, 4, 5); assertElementsEquals([3, 0, 0, 0, 0, 4, 0, 0, 0, 0, 5, 0, 0, 0, 0, 1], m0); } function testApplyRotate() { var m0 = goog.vec.Matrix4.createIdentity(); goog.vec.Matrix4.applyRotate(m0, Math.PI / 2, 0, 0, 1); assertElementsRoughlyEqual( [0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], m0, goog.vec.EPSILON); goog.vec.Matrix4.applyRotate(m0, -Math.PI / 4, 0, 0, 1); assertElementsRoughlyEqual( [0.7071068, 0.7071068, 0, 0, -0.7071068, 0.7071068, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1], m0, goog.vec.EPSILON); } function testMakeFrustum() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeFrustum(m0, -1, 2, -2, 1, .1, 1.1); assertElementsRoughlyEqual( [0.06666666, 0, 0, 0, 0, 0.06666666, 0, 0, 0.33333333, -0.33333333, -1.2, -1, 0, 0, -0.22, 0], m0, goog.vec.EPSILON); } function testMakePerspective() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makePerspective(m0, 90 * Math.PI / 180, 2, 0.1, 1.1); assertElementsRoughlyEqual( [0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, -1.2, -1, 0, 0, -0.22, 0], m0, goog.vec.EPSILON); } function testMakeOrtho() { var m0 = goog.vec.Matrix4.create(); goog.vec.Matrix4.makeOrtho(m0, -1, 2, -2, 1, 0.1, 1.1); assertElementsRoughlyEqual( [0.6666666, 0, 0, 0, 0, 0.6666666, 0, 0, 0, 0, -2, 0, -0.333333, 0.3333333, -1.2, 1], m0, goog.vec.EPSILON); } function testEulerZXZ() { var m0 = goog.vec.Matrix4.create(); var roll = Math.random() * 2 * Math.PI; var tilt = -Math.random() * Math.PI / 2; var pan = Math.random() * 2 * Math.PI; goog.vec.Matrix4.makeAxisAngleRotate(m0, roll, 0, 0, 1); goog.vec.Matrix4.applyRotate(m0, tilt, 1, 0, 0); goog.vec.Matrix4.applyRotate(m0, pan, 0, 0, 1); var m1 = goog.vec.Matrix4.create(); goog.vec.Matrix4.fromEulerZXZ(m1, roll, tilt, pan); assertElementsRoughlyEqual(m0, m1, goog.vec.EPSILON); var euler = [0, 0, 0]; goog.vec.Matrix4.toEulerZXZ(m0, euler); // Bring them to their range. euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2); euler[1] = (euler[1] - Math.PI * 2) % (Math.PI * 2); euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2); assertElementsRoughlyEqual([roll, tilt, pan], euler, goog.vec.EPSILON); } function testEulerZXZExtrema() { var m0 = goog.vec.Matrix4.createFromArray( [1, 0, 0, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 1]); var m1 = goog.vec.Matrix4.createFromArray( [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); var euler = [0, 0, 0]; goog.vec.Matrix4.toEulerZXZ(m0, euler); assertElementsRoughlyEqual([0, -Math.PI / 2, 0], euler, goog.vec.EPSILON); goog.vec.Matrix4.fromEulerZXZ(m1, euler[0], euler[1], euler[2]); assertElementsRoughlyEqual(m0, m1, goog.vec.EPSILON); } function testLookAt() { var viewMatrix = goog.vec.Matrix4.create(); goog.vec.Matrix4.lookAt( viewMatrix, [0, 0, 0], [1, 0, 0], [0, 1, 0]); assertElementsRoughlyEqual( [0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1], viewMatrix, goog.vec.EPSILON); } function testToLookAt() { // This test does not use the default precision goog.vec.EPSILON due to // precision issues in some browsers leading to flaky tests. var EPSILON = 1e-4; var eyeExp = [0, 0, 0]; var fwdExp = [1, 0, 0]; var upExp = [0, 1, 0]; var centerExp = [0, 0, 0]; goog.vec.Vec3.add(eyeExp, fwdExp, centerExp); var view = goog.vec.Matrix4.create(); goog.vec.Matrix4.lookAt(view, eyeExp, centerExp, upExp); var eyeRes = [0, 0, 0]; var fwdRes = [0, 0, 0]; var upRes = [0, 0, 0]; goog.vec.Matrix4.toLookAt(view, eyeRes, fwdRes, upRes); assertElementsRoughlyEqual(eyeExp, eyeRes, EPSILON); assertElementsRoughlyEqual(fwdExp, fwdRes, EPSILON); assertElementsRoughlyEqual(upExp, upRes, EPSILON); } function testLookAtDecomposition() { // This test does not use the default precision goog.vec.EPSILON due to // precision issues in some browsers, which leads to flaky tests. var EPSILON = 1e-4; var viewExp = goog.vec.Matrix4.create(); var viewRes = goog.vec.Matrix4.create(); var tmp = goog.vec.Matrix4.create(); // Get a valid set of random vectors eye, forward, up by decomposing // a random matrix into a set of lookAt vectors. for (var i = 0; i < tmp.length; i++) tmp[i] = Math.random(); var eyeExp = [0, 0, 0]; var fwdExp = [0, 0, 0]; var upExp = [0, 0, 0]; var centerExp = [0, 0, 0]; // Project the random matrix into a real modelview matrix. goog.vec.Matrix4.toLookAt(tmp, eyeExp, fwdExp, upExp); goog.vec.Vec3.add(eyeExp, fwdExp, centerExp); // Compute the expected modelview matrix from a set of valid random vectors. goog.vec.Matrix4.lookAt(viewExp, eyeExp, centerExp, upExp); var eyeRes = [0, 0, 0]; var fwdRes = [0, 0, 0]; var upRes = [0, 0, 0]; var centerRes = [0, 0, 0]; goog.vec.Matrix4.toLookAt(viewExp, eyeRes, fwdRes, upRes); goog.vec.Vec3.add(eyeRes, fwdRes, centerRes); goog.vec.Matrix4.lookAt(viewRes, eyeRes, centerRes, upRes); assertElementsRoughlyEqual(eyeExp, eyeRes, EPSILON); assertElementsRoughlyEqual(fwdExp, fwdRes, EPSILON); assertElementsRoughlyEqual(upExp, upRes, EPSILON); assertElementsRoughlyEqual(viewExp, viewRes, EPSILON); } </script> </body>