UNPKG

declarations

Version:

[![npm version](https://badge.fury.io/js/declarations.svg)](https://www.npmjs.com/package/declarations)

1,092 lines (1,091 loc) 124 kB
/// <reference path="../../three.d.ts" /> /// <reference path="../../../qunit/qunit.d.ts" /> /// <reference path="../three-tests-setup.ts" /> // https://github.com/mrdoob/three.js/tree/master/test/unit/math (function () { // -------------------------------------------- Constants var x = 2; var y = 3; var z = 4; var w = 5; var negInf2 = new THREE.Vector2(-Infinity, -Infinity); var posInf2 = new THREE.Vector2(Infinity, Infinity); var zero2 = new THREE.Vector2(); var one2 = new THREE.Vector2(1, 1); var two2 = new THREE.Vector2(2, 2); var negInf3 = new THREE.Vector3(-Infinity, -Infinity, -Infinity); var posInf3 = new THREE.Vector3(Infinity, Infinity, Infinity); var zero3 = new THREE.Vector3(); var one3 = new THREE.Vector3(1, 1, 1); var two3 = new THREE.Vector3(2, 2, 2); // -------------------------------------------- Box2 test("constructor", function () { var a = new THREE.Box2(); ok(a.min.equals(posInf2), "Passed!"); ok(a.max.equals(negInf2), "Passed!"); a = new THREE.Box2(zero2.clone(), zero2.clone()); ok(a.min.equals(zero2), "Passed!"); ok(a.max.equals(zero2), "Passed!"); a = new THREE.Box2(zero2.clone(), one2.clone()); ok(a.min.equals(zero2), "Passed!"); ok(a.max.equals(one2), "Passed!"); }); test("copy", function () { var a = new THREE.Box2(zero2.clone(), one2.clone()); var b = new THREE.Box2().copy(a); ok(b.min.equals(zero2), "Passed!"); ok(b.max.equals(one2), "Passed!"); // ensure that it is a true copy a.min = zero2; a.max = one2; ok(b.min.equals(zero2), "Passed!"); ok(b.max.equals(one2), "Passed!"); }); test("set", function () { var a = new THREE.Box2(); a.set(zero2, one2); ok(a.min.equals(zero2), "Passed!"); ok(a.max.equals(one2), "Passed!"); }); test("setFromPoints", function () { var a = new THREE.Box2(); a.setFromPoints([zero2, one2, two2]); ok(a.min.equals(zero2), "Passed!"); ok(a.max.equals(two2), "Passed!"); a.setFromPoints([one2]); ok(a.min.equals(one2), "Passed!"); ok(a.max.equals(one2), "Passed!"); a.setFromPoints([]); ok(a.empty(), "Passed!"); }); test("empty/makeEmpty", function () { var a = new THREE.Box2(); ok(a.empty(), "Passed!"); var a = new THREE.Box2(zero2.clone(), one2.clone()); ok(!a.empty(), "Passed!"); a.makeEmpty(); ok(a.empty(), "Passed!"); }); test("center", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); ok(a.center().equals(zero2), "Passed!"); a = new THREE.Box2(zero2, one2); var midpoint = one2.clone().multiplyScalar(0.5); ok(a.center().equals(midpoint), "Passed!"); }); test("size", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); ok(a.size().equals(zero2), "Passed!"); a = new THREE.Box2(zero2.clone(), one2.clone()); ok(a.size().equals(one2), "Passed!"); }); test("expandByPoint", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); a.expandByPoint(zero2); ok(a.size().equals(zero2), "Passed!"); a.expandByPoint(one2); ok(a.size().equals(one2), "Passed!"); a.expandByPoint(one2.clone().negate()); ok(a.size().equals(one2.clone().multiplyScalar(2)), "Passed!"); ok(a.center().equals(zero2), "Passed!"); }); test("expandByVector", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); a.expandByVector(zero2); ok(a.size().equals(zero2), "Passed!"); a.expandByVector(one2); ok(a.size().equals(one2.clone().multiplyScalar(2)), "Passed!"); ok(a.center().equals(zero2), "Passed!"); }); test("expandByScalar", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); a.expandByScalar(0); ok(a.size().equals(zero2), "Passed!"); a.expandByScalar(1); ok(a.size().equals(one2.clone().multiplyScalar(2)), "Passed!"); ok(a.center().equals(zero2), "Passed!"); }); test("containsPoint", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); ok(a.containsPoint(zero2), "Passed!"); ok(!a.containsPoint(one2), "Passed!"); a.expandByScalar(1); ok(a.containsPoint(zero2), "Passed!"); ok(a.containsPoint(one2), "Passed!"); ok(a.containsPoint(one2.clone().negate()), "Passed!"); }); test("containsBox", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(zero2.clone(), one2.clone()); var c = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.containsBox(a), "Passed!"); ok(!a.containsBox(b), "Passed!"); ok(!a.containsBox(c), "Passed!"); ok(b.containsBox(a), "Passed!"); ok(c.containsBox(a), "Passed!"); ok(!b.containsBox(c), "Passed!"); }); test("getParameter", function () { var a = new THREE.Box2(zero2.clone(), one2.clone()); var b = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.getParameter(new THREE.Vector2(0, 0)).equals(new THREE.Vector2(0, 0)), "Passed!"); ok(a.getParameter(new THREE.Vector2(1, 1)).equals(new THREE.Vector2(1, 1)), "Passed!"); ok(b.getParameter(new THREE.Vector2(-1, -1)).equals(new THREE.Vector2(0, 0)), "Passed!"); ok(b.getParameter(new THREE.Vector2(0, 0)).equals(new THREE.Vector2(0.5, 0.5)), "Passed!"); ok(b.getParameter(new THREE.Vector2(1, 1)).equals(new THREE.Vector2(1, 1)), "Passed!"); }); test("clampPoint", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.clampPoint(new THREE.Vector2(0, 0)).equals(new THREE.Vector2(0, 0)), "Passed!"); ok(a.clampPoint(new THREE.Vector2(1, 1)).equals(new THREE.Vector2(0, 0)), "Passed!"); ok(a.clampPoint(new THREE.Vector2(-1, -1)).equals(new THREE.Vector2(0, 0)), "Passed!"); ok(b.clampPoint(new THREE.Vector2(2, 2)).equals(new THREE.Vector2(1, 1)), "Passed!"); ok(b.clampPoint(new THREE.Vector2(1, 1)).equals(new THREE.Vector2(1, 1)), "Passed!"); ok(b.clampPoint(new THREE.Vector2(0, 0)).equals(new THREE.Vector2(0, 0)), "Passed!"); ok(b.clampPoint(new THREE.Vector2(-1, -1)).equals(new THREE.Vector2(-1, -1)), "Passed!"); ok(b.clampPoint(new THREE.Vector2(-2, -2)).equals(new THREE.Vector2(-1, -1)), "Passed!"); }); test("distanceToPoint", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.distanceToPoint(new THREE.Vector2(0, 0)) == 0, "Passed!"); ok(a.distanceToPoint(new THREE.Vector2(1, 1)) == Math.sqrt(2), "Passed!"); ok(a.distanceToPoint(new THREE.Vector2(-1, -1)) == Math.sqrt(2), "Passed!"); ok(b.distanceToPoint(new THREE.Vector2(2, 2)) == Math.sqrt(2), "Passed!"); ok(b.distanceToPoint(new THREE.Vector2(1, 1)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector2(0, 0)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector2(-1, -1)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector2(-2, -2)) == Math.sqrt(2), "Passed!"); }); test("isIntersectionBox", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(zero2.clone(), one2.clone()); var c = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.isIntersectionBox(a), "Passed!"); ok(a.isIntersectionBox(b), "Passed!"); ok(a.isIntersectionBox(c), "Passed!"); ok(b.isIntersectionBox(a), "Passed!"); ok(c.isIntersectionBox(a), "Passed!"); ok(b.isIntersectionBox(c), "Passed!"); b.translate(new THREE.Vector2(2, 2)); ok(!a.isIntersectionBox(b), "Passed!"); ok(!b.isIntersectionBox(a), "Passed!"); ok(!b.isIntersectionBox(c), "Passed!"); }); test("intersect", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(zero2.clone(), one2.clone()); var c = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.clone().intersect(a).equals(a), "Passed!"); ok(a.clone().intersect(b).equals(a), "Passed!"); ok(b.clone().intersect(b).equals(b), "Passed!"); ok(a.clone().intersect(c).equals(a), "Passed!"); ok(b.clone().intersect(c).equals(b), "Passed!"); ok(c.clone().intersect(c).equals(c), "Passed!"); }); test("union", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(zero2.clone(), one2.clone()); var c = new THREE.Box2(one2.clone().negate(), one2.clone()); ok(a.clone().union(a).equals(a), "Passed!"); ok(a.clone().union(b).equals(b), "Passed!"); ok(a.clone().union(c).equals(c), "Passed!"); ok(b.clone().union(c).equals(c), "Passed!"); }); test("translate", function () { var a = new THREE.Box2(zero2.clone(), zero2.clone()); var b = new THREE.Box2(zero2.clone(), one2.clone()); var c = new THREE.Box2(one2.clone().negate(), one2.clone()); var d = new THREE.Box2(one2.clone().negate(), zero2.clone()); ok(a.clone().translate(one2).equals(new THREE.Box2(one2, one2)), "Passed!"); ok(a.clone().translate(one2).translate(one2.clone().negate()).equals(a), "Passed!"); ok(d.clone().translate(one2).equals(b), "Passed!"); ok(b.clone().translate(one2.clone().negate()).equals(d), "Passed!"); }); // -------------------------------------------- Box3 test("constructor", function () { var a = new THREE.Box3(); ok(a.min.equals(posInf3), "Passed!"); ok(a.max.equals(negInf3), "Passed!"); a = new THREE.Box3(zero3.clone(), zero3.clone()); ok(a.min.equals(zero3), "Passed!"); ok(a.max.equals(zero3), "Passed!"); a = new THREE.Box3(zero3.clone(), one3.clone()); ok(a.min.equals(zero3), "Passed!"); ok(a.max.equals(one3), "Passed!"); }); test("copy", function () { var a = new THREE.Box3(zero3.clone(), one3.clone()); var b = new THREE.Box3().copy(a); ok(b.min.equals(zero3), "Passed!"); ok(b.max.equals(one3), "Passed!"); // ensure that it is a true copy a.min = zero3; a.max = one3; ok(b.min.equals(zero3), "Passed!"); ok(b.max.equals(one3), "Passed!"); }); test("set", function () { var a = new THREE.Box3(); a.set(zero3, one3); ok(a.min.equals(zero3), "Passed!"); ok(a.max.equals(one3), "Passed!"); }); test("setFromPoints", function () { var a = new THREE.Box3(); a.setFromPoints([zero3, one3, two3]); ok(a.min.equals(zero3), "Passed!"); ok(a.max.equals(two3), "Passed!"); a.setFromPoints([one3]); ok(a.min.equals(one3), "Passed!"); ok(a.max.equals(one3), "Passed!"); a.setFromPoints([]); ok(a.empty(), "Passed!"); }); test("empty/makeEmpty", function () { var a = new THREE.Box3(); ok(a.empty(), "Passed!"); var a = new THREE.Box3(zero3.clone(), one3.clone()); ok(!a.empty(), "Passed!"); a.makeEmpty(); ok(a.empty(), "Passed!"); }); test("center", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); ok(a.center().equals(zero3), "Passed!"); a = new THREE.Box3(zero3.clone(), one3.clone()); var midpoint = one3.clone().multiplyScalar(0.5); ok(a.center().equals(midpoint), "Passed!"); }); test("size", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); ok(a.size().equals(zero3), "Passed!"); a = new THREE.Box3(zero3.clone(), one3.clone()); ok(a.size().equals(one3), "Passed!"); }); test("expandByPoint", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); a.expandByPoint(zero3); ok(a.size().equals(zero3), "Passed!"); a.expandByPoint(one3); ok(a.size().equals(one3), "Passed!"); a.expandByPoint(one3.clone().negate()); ok(a.size().equals(one3.clone().multiplyScalar(2)), "Passed!"); ok(a.center().equals(zero3), "Passed!"); }); test("expandByVector", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); a.expandByVector(zero3); ok(a.size().equals(zero3), "Passed!"); a.expandByVector(one3); ok(a.size().equals(one3.clone().multiplyScalar(2)), "Passed!"); ok(a.center().equals(zero3), "Passed!"); }); test("expandByScalar", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); a.expandByScalar(0); ok(a.size().equals(zero3), "Passed!"); a.expandByScalar(1); ok(a.size().equals(one3.clone().multiplyScalar(2)), "Passed!"); ok(a.center().equals(zero3), "Passed!"); }); test("containsPoint", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); ok(a.containsPoint(zero3), "Passed!"); ok(!a.containsPoint(one3), "Passed!"); a.expandByScalar(1); ok(a.containsPoint(zero3), "Passed!"); ok(a.containsPoint(one3), "Passed!"); ok(a.containsPoint(one3.clone().negate()), "Passed!"); }); test("containsBox", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.containsBox(a), "Passed!"); ok(!a.containsBox(b), "Passed!"); ok(!a.containsBox(c), "Passed!"); ok(b.containsBox(a), "Passed!"); ok(c.containsBox(a), "Passed!"); ok(!b.containsBox(c), "Passed!"); }); test("getParameter", function () { var a = new THREE.Box3(zero3.clone(), one3.clone()); var b = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.getParameter(new THREE.Vector3(0, 0, 0)).equals(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(a.getParameter(new THREE.Vector3(1, 1, 1)).equals(new THREE.Vector3(1, 1, 1)), "Passed!"); ok(b.getParameter(new THREE.Vector3(-1, -1, -1)).equals(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(b.getParameter(new THREE.Vector3(0, 0, 0)).equals(new THREE.Vector3(0.5, 0.5, 0.5)), "Passed!"); ok(b.getParameter(new THREE.Vector3(1, 1, 1)).equals(new THREE.Vector3(1, 1, 1)), "Passed!"); }); test("clampPoint", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.clampPoint(new THREE.Vector3(0, 0, 0)).equals(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(a.clampPoint(new THREE.Vector3(1, 1, 1)).equals(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(a.clampPoint(new THREE.Vector3(-1, -1, -1)).equals(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(b.clampPoint(new THREE.Vector3(2, 2, 2)).equals(new THREE.Vector3(1, 1, 1)), "Passed!"); ok(b.clampPoint(new THREE.Vector3(1, 1, 1)).equals(new THREE.Vector3(1, 1, 1)), "Passed!"); ok(b.clampPoint(new THREE.Vector3(0, 0, 0)).equals(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(b.clampPoint(new THREE.Vector3(-1, -1, -1)).equals(new THREE.Vector3(-1, -1, -1)), "Passed!"); ok(b.clampPoint(new THREE.Vector3(-2, -2, -2)).equals(new THREE.Vector3(-1, -1, -1)), "Passed!"); }); test("distanceToPoint", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.distanceToPoint(new THREE.Vector3(0, 0, 0)) == 0, "Passed!"); ok(a.distanceToPoint(new THREE.Vector3(1, 1, 1)) == Math.sqrt(3), "Passed!"); ok(a.distanceToPoint(new THREE.Vector3(-1, -1, -1)) == Math.sqrt(3), "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(2, 2, 2)) == Math.sqrt(3), "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(1, 1, 1)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(0, 0, 0)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(-1, -1, -1)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(-2, -2, -2)) == Math.sqrt(3), "Passed!"); }); test("distanceToPoint", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.distanceToPoint(new THREE.Vector3(0, 0, 0)) == 0, "Passed!"); ok(a.distanceToPoint(new THREE.Vector3(1, 1, 1)) == Math.sqrt(3), "Passed!"); ok(a.distanceToPoint(new THREE.Vector3(-1, -1, -1)) == Math.sqrt(3), "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(2, 2, 2)) == Math.sqrt(3), "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(1, 1, 1)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(0, 0, 0)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(-1, -1, -1)) == 0, "Passed!"); ok(b.distanceToPoint(new THREE.Vector3(-2, -2, -2)) == Math.sqrt(3), "Passed!"); }); test("isIntersectionBox", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.isIntersectionBox(a), "Passed!"); ok(a.isIntersectionBox(b), "Passed!"); ok(a.isIntersectionBox(c), "Passed!"); ok(b.isIntersectionBox(a), "Passed!"); ok(c.isIntersectionBox(a), "Passed!"); ok(b.isIntersectionBox(c), "Passed!"); b.translate(new THREE.Vector3(2, 2, 2)); ok(!a.isIntersectionBox(b), "Passed!"); ok(!b.isIntersectionBox(a), "Passed!"); ok(!b.isIntersectionBox(c), "Passed!"); }); test("getBoundingSphere", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.getBoundingSphere().equals(new THREE.Sphere(zero3, 0)), "Passed!"); ok(b.getBoundingSphere().equals(new THREE.Sphere(one3.clone().multiplyScalar(0.5), Math.sqrt(3) * 0.5)), "Passed!"); ok(c.getBoundingSphere().equals(new THREE.Sphere(zero3, Math.sqrt(12) * 0.5)), "Passed!"); }); test("intersect", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.clone().intersect(a).equals(a), "Passed!"); ok(a.clone().intersect(b).equals(a), "Passed!"); ok(b.clone().intersect(b).equals(b), "Passed!"); ok(a.clone().intersect(c).equals(a), "Passed!"); ok(b.clone().intersect(c).equals(b), "Passed!"); ok(c.clone().intersect(c).equals(c), "Passed!"); }); test("union", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); ok(a.clone().union(a).equals(a), "Passed!"); ok(a.clone().union(b).equals(b), "Passed!"); ok(a.clone().union(c).equals(c), "Passed!"); ok(b.clone().union(c).equals(c), "Passed!"); }); var compareBox = function (a, b, threshold) { threshold = threshold || 0.0001; return (a.min.distanceTo(b.min) < threshold && a.max.distanceTo(b.max) < threshold); }; test("applyMatrix4", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); var d = new THREE.Box3(one3.clone().negate(), zero3.clone()); var m = new THREE.Matrix4().makeTranslation(1, -2, 1); var t1 = new THREE.Vector3(1, -2, 1); ok(compareBox(a.clone().applyMatrix4(m), a.clone().translate(t1)), "Passed!"); ok(compareBox(b.clone().applyMatrix4(m), b.clone().translate(t1)), "Passed!"); ok(compareBox(c.clone().applyMatrix4(m), c.clone().translate(t1)), "Passed!"); ok(compareBox(d.clone().applyMatrix4(m), d.clone().translate(t1)), "Passed!"); }); test("translate", function () { var a = new THREE.Box3(zero3.clone(), zero3.clone()); var b = new THREE.Box3(zero3.clone(), one3.clone()); var c = new THREE.Box3(one3.clone().negate(), one3.clone()); var d = new THREE.Box3(one3.clone().negate(), zero3.clone()); ok(a.clone().translate(one3).equals(new THREE.Box3(one3, one3)), "Passed!"); ok(a.clone().translate(one3).translate(one3.clone().negate()).equals(a), "Passed!"); ok(d.clone().translate(one3).equals(b), "Passed!"); ok(b.clone().translate(one3.clone().negate()).equals(d), "Passed!"); }); // -------------------------------------------- Color test("constructor", function () { var c = new THREE.Color(); ok(c.r, "Red: " + c.r); ok(c.g, "Green: " + c.g); ok(c.b, "Blue: " + c.b); }); test("rgb constructor", function () { var c = new THREE.Color(1, 1, 1); ok(c.r == 1, "Passed"); ok(c.g == 1, "Passed"); ok(c.b == 1, "Passed"); }); test("copyHex", function () { var c = new THREE.Color(); var c2 = new THREE.Color(0xF5FFFA); c.copy(c2); ok(c.getHex() == c2.getHex(), "Hex c: " + c.getHex() + " Hex c2: " + c2.getHex()); }); test("copyColorString", function () { var c = new THREE.Color(); var c2 = new THREE.Color('ivory'); c.copy(c2); ok(c.getHex() == c2.getHex(), "Hex c: " + c.getHex() + " Hex c2: " + c2.getHex()); }); test("setRGB", function () { var c = new THREE.Color(); c.setRGB(1, 0.2, 0.1); ok(c.r == 1, "Red: " + c.r); ok(c.g == 0.2, "Green: " + c.g); ok(c.b == 0.1, "Blue: " + c.b); }); test("copyGammaToLinear", function () { var c = new THREE.Color(); var c2 = new THREE.Color(); c2.setRGB(0.3, 0.5, 0.9); c.copyGammaToLinear(c2); ok(c.r == 0.09, "Red c: " + c.r + " Red c2: " + c2.r); ok(c.g == 0.25, "Green c: " + c.g + " Green c2: " + c2.g); ok(c.b == 0.81, "Blue c: " + c.b + " Blue c2: " + c2.b); }); test("copyLinearToGamma", function () { var c = new THREE.Color(); var c2 = new THREE.Color(); c2.setRGB(0.09, 0.25, 0.81); c.copyLinearToGamma(c2); ok(c.r == 0.3, "Red c: " + c.r + " Red c2: " + c2.r); ok(c.g == 0.5, "Green c: " + c.g + " Green c2: " + c2.g); ok(c.b == 0.9, "Blue c: " + c.b + " Blue c2: " + c2.b); }); test("convertGammaToLinear", function () { var c = new THREE.Color(); c.setRGB(0.3, 0.5, 0.9); c.convertGammaToLinear(); ok(c.r == 0.09, "Red: " + c.r); ok(c.g == 0.25, "Green: " + c.g); ok(c.b == 0.81, "Blue: " + c.b); }); test("convertLinearToGamma", function () { var c = new THREE.Color(); c.setRGB(4, 9, 16); c.convertLinearToGamma(); ok(c.r == 2, "Red: " + c.r); ok(c.g == 3, "Green: " + c.g); ok(c.b == 4, "Blue: " + c.b); }); test("setWithNum", function () { var c = new THREE.Color(); c.set(0xFF0000); ok(c.r == 1, "Red: " + c.r); ok(c.g === 0, "Green: " + c.g); ok(c.b === 0, "Blue: " + c.b); }); test("setWithString", function () { var c = new THREE.Color(); c.set('silver'); ok(c.getHex() == 0xC0C0C0, "Hex c: " + c.getHex()); }); test("clone", function () { var c = new THREE.Color('teal'); var c2 = c.clone(); ok(c2.getHex() == 0x008080, "Hex c2: " + c2.getHex()); }); test("lerp", function () { var c = new THREE.Color(); var c2 = new THREE.Color(); c.setRGB(0, 0, 0); c.lerp(c2, 0.2); ok(c.r == 0.2, "Red: " + c.r); ok(c.g == 0.2, "Green: " + c.g); ok(c.b == 0.2, "Blue: " + c.b); }); test("setStyleRGBRed", function () { var c = new THREE.Color(); c.setStyle('rgb(255,0,0)'); ok(c.r == 1, "Red: " + c.r); ok(c.g === 0, "Green: " + c.g); ok(c.b === 0, "Blue: " + c.b); }); test("setStyleRGBRedWithSpaces", function () { var c = new THREE.Color(); c.setStyle('rgb(255, 0, 0)'); ok(c.r == 1, "Red: " + c.r); ok(c.g === 0, "Green: " + c.g); ok(c.b === 0, "Blue: " + c.b); }); test("setStyleRGBPercent", function () { var c = new THREE.Color(); c.setStyle('rgb(100%,50%,10%)'); ok(c.r == 1, "Red: " + c.r); ok(c.g == 0.5, "Green: " + c.g); ok(c.b == 0.1, "Blue: " + c.b); }); test("setStyleRGBPercentWithSpaces", function () { var c = new THREE.Color(); c.setStyle('rgb(100%,50%,10%)'); ok(c.r == 1, "Red: " + c.r); ok(c.g == 0.5, "Green: " + c.g); ok(c.b == 0.1, "Blue: " + c.b); }); test("setStyleHexSkyBlue", function () { var c = new THREE.Color(); c.setStyle('#87CEEB'); ok(c.getHex() == 0x87CEEB, "Hex c: " + c.getHex()); }); test("setStyleHex2Olive", function () { var c = new THREE.Color(); c.setStyle('#F00'); ok(c.getHex() == 0xFF0000, "Hex c: " + c.getHex()); }); test("setStyleColorName", function () { var c = new THREE.Color(); c.setStyle('powderblue'); ok(c.getHex() == 0xB0E0E6, "Hex c: " + c.getHex()); }); test("getHex", function () { var c = new THREE.Color('red'); var res = c.getHex(); ok(res == 0xFF0000, "Hex: " + res); }); test("setHex", function () { var c = new THREE.Color(); c.setHex(0xFA8072); ok(c.getHex() == 0xFA8072, "Hex: " + c.getHex()); }); test("getHexString", function () { var c = new THREE.Color('tomato'); var res = c.getHexString(); ok(res == 'ff6347', "Hex: " + res); }); test("getStyle", function () { var c = new THREE.Color('plum'); var res = c.getStyle(); ok(res == 'rgb(221,160,221)', "style: " + res); }); test("getHSL", function () { var c = new THREE.Color(0x80ffff); var hsl = c.getHSL(); ok(hsl.h == 0.5, "hue: " + hsl.h); ok(hsl.s == 1.0, "saturation: " + hsl.s); ok((Math.round(parseFloat(hsl.l.toString()) * 100) / 100) == 0.75, "lightness: " + hsl.l); }); test("setHSL", function () { var c = new THREE.Color(); c.setHSL(0.75, 1.0, 0.25); var hsl = c.getHSL(); ok(hsl.h == 0.75, "hue: " + hsl.h); ok(hsl.s == 1.00, "saturation: " + hsl.s); ok(hsl.l == 0.25, "lightness: " + hsl.l); }); // -------------------------------------------- Euler var eulerZero = new THREE.Euler(0, 0, 0, "XYZ"); var eulerAxyz = new THREE.Euler(1, 0, 0, "XYZ"); var eulerAzyx = new THREE.Euler(0, 1, 0, "ZYX"); var matrixEquals4 = function (a, b) { var tolerance = 0.0001; if (a.elements.length != b.elements.length) { return false; } for (var i = 0, il = a.elements.length; i < il; i++) { var delta = a.elements[i] - b.elements[i]; if (delta > tolerance) { return false; } } return true; }; var eulerEquals = function (a, b, tolerance) { tolerance = tolerance || 0.0001; var diff = Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z); return (diff < tolerance); }; var quatEquals = function (a, b, tolerance) { tolerance = tolerance || 0.0001; var diff = Math.abs(a.x - b.x) + Math.abs(a.y - b.y) + Math.abs(a.z - b.z) + Math.abs(a.w - b.w); return (diff < tolerance); }; test("constructor/equals", function () { var a = new THREE.Euler(); ok(a.equals(eulerZero), "Passed!"); ok(!a.equals(eulerAxyz), "Passed!"); ok(!a.equals(eulerAzyx), "Passed!"); }); test("clone/copy/equals", function () { var a = eulerAxyz.clone(); ok(a.equals(eulerAxyz), "Passed!"); ok(!a.equals(eulerZero), "Passed!"); ok(!a.equals(eulerAzyx), "Passed!"); a.copy(eulerAzyx); ok(a.equals(eulerAzyx), "Passed!"); ok(!a.equals(eulerAxyz), "Passed!"); ok(!a.equals(eulerZero), "Passed!"); }); test("set/setFromVector3/toVector3", function () { var a = new THREE.Euler(); a.set(0, 1, 0, "ZYX"); ok(a.equals(eulerAzyx), "Passed!"); ok(!a.equals(eulerAxyz), "Passed!"); ok(!a.equals(eulerZero), "Passed!"); var vec = new THREE.Vector3(0, 1, 0); var b = new THREE.Euler().setFromVector3(vec, "ZYX"); console.log(a, b); ok(a.equals(b), "Passed!"); var c = b.toVector3(); console.log(c, vec); ok(c.equals(vec), "Passed!"); }); test("Quaternion.setFromEuler/Euler.fromQuaternion", function () { var testValues = [eulerZero, eulerAxyz, eulerAzyx]; for (var i = 0; i < testValues.length; i++) { var v = testValues[i]; var q = new THREE.Quaternion().setFromEuler(v); var v2 = new THREE.Euler().setFromQuaternion(q, v.order); var q2 = new THREE.Quaternion().setFromEuler(v2); ok(eulerEquals(q, q2), "Passed!"); } }); test("Matrix4.setFromEuler/Euler.fromRotationMatrix", function () { var testValues = [eulerZero, eulerAxyz, eulerAzyx]; for (var i = 0; i < testValues.length; i++) { var v = testValues[i]; var m = new THREE.Matrix4().makeRotationFromEuler(v); var v2 = new THREE.Euler().setFromRotationMatrix(m, v.order); var m2 = new THREE.Matrix4().makeRotationFromEuler(v2); ok(matrixEquals4(m, m2), "Passed!"); } }); test("reorder", function () { var testValues = [eulerZero, eulerAxyz, eulerAzyx]; for (var i = 0; i < testValues.length; i++) { var v = testValues[i]; var q = new THREE.Quaternion().setFromEuler(v); v.reorder('YZX'); var q2 = new THREE.Quaternion().setFromEuler(v); ok(quatEquals(q, q2), "Passed!"); v.reorder('ZXY'); var q3 = new THREE.Quaternion().setFromEuler(v); ok(quatEquals(q, q3), "Passed!"); } }); test("gimbalLocalQuat", function () { // known problematic quaternions var q1 = new THREE.Quaternion(0.5207769385244341, -0.4783214164122354, 0.520776938524434, 0.47832141641223547); var q2 = new THREE.Quaternion(0.11284905712620674, 0.6980437630368944, -0.11284905712620674, 0.6980437630368944); var eulerOrder = "ZYX"; // create Euler directly from a Quaternion var eViaQ1 = new THREE.Euler().setFromQuaternion(q1, eulerOrder); // there is likely a bug here // create Euler from Quaternion via an intermediate Matrix4 var mViaQ1 = new THREE.Matrix4().makeRotationFromQuaternion(q1); var eViaMViaQ1 = new THREE.Euler().setFromRotationMatrix(mViaQ1, eulerOrder); // the results here are different ok(eulerEquals(eViaQ1, eViaMViaQ1), "Passed!"); // this result is correct }); // -------------------------------------------- Frustum var unit3 = new THREE.Vector3(1, 0, 0); var planeEquals = function (a, b, tolerance) { tolerance = tolerance || 0.0001; if (a.normal.distanceTo(b.normal) > tolerance) { return false; } if (Math.abs(a.constant - b.constant) > tolerance) { return false; } return true; }; test("constructor", function () { var a = new THREE.Frustum(); ok(a.planes !== undefined, "Passed!"); ok(a.planes.length === 6, "Passed!"); var pDefault = new THREE.Plane(); for (var i = 0; i < 6; i++) { ok(a.planes[i].equals(pDefault), "Passed!"); } var p0 = new THREE.Plane(unit3, -1); var p1 = new THREE.Plane(unit3, 1); var p2 = new THREE.Plane(unit3, 2); var p3 = new THREE.Plane(unit3, 3); var p4 = new THREE.Plane(unit3, 4); var p5 = new THREE.Plane(unit3, 5); a = new THREE.Frustum(p0, p1, p2, p3, p4, p5); ok(a.planes[0].equals(p0), "Passed!"); ok(a.planes[1].equals(p1), "Passed!"); ok(a.planes[2].equals(p2), "Passed!"); ok(a.planes[3].equals(p3), "Passed!"); ok(a.planes[4].equals(p4), "Passed!"); ok(a.planes[5].equals(p5), "Passed!"); }); test("copy", function () { var p0 = new THREE.Plane(unit3, -1); var p1 = new THREE.Plane(unit3, 1); var p2 = new THREE.Plane(unit3, 2); var p3 = new THREE.Plane(unit3, 3); var p4 = new THREE.Plane(unit3, 4); var p5 = new THREE.Plane(unit3, 5); var b = new THREE.Frustum(p0, p1, p2, p3, p4, p5); var a = new THREE.Frustum().copy(b); ok(a.planes[0].equals(p0), "Passed!"); ok(a.planes[1].equals(p1), "Passed!"); ok(a.planes[2].equals(p2), "Passed!"); ok(a.planes[3].equals(p3), "Passed!"); ok(a.planes[4].equals(p4), "Passed!"); ok(a.planes[5].equals(p5), "Passed!"); // ensure it is a true copy by modifying source b.planes[0] = p1; ok(a.planes[0].equals(p0), "Passed!"); }); test("setFromMatrix/makeOrthographic/containsPoint", function () { var m = new THREE.Matrix4().makeOrthographic(-1, 1, -1, 1, 1, 100); var a = new THREE.Frustum().setFromMatrix(m); ok(!a.containsPoint(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(0, 0, -50)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(0, 0, -1.001)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(-1, -1, -1.001)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(-1.1, -1.1, -1.001)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(1, 1, -1.001)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(1.1, 1.1, -1.001)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(0, 0, -100)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(-1, -1, -100)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(-1.1, -1.1, -100.1)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(1, 1, -100)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(1.1, 1.1, -100.1)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(0, 0, -101)), "Passed!"); }); test("setFromMatrix/makeFrustum/containsPoint", function () { var m = new THREE.Matrix4().makeFrustum(-1, 1, -1, 1, 1, 100); var a = new THREE.Frustum().setFromMatrix(m); ok(!a.containsPoint(new THREE.Vector3(0, 0, 0)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(0, 0, -50)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(0, 0, -1.001)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(-1, -1, -1.001)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(-1.1, -1.1, -1.001)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(1, 1, -1.001)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(1.1, 1.1, -1.001)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(0, 0, -99.999)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(-99.999, -99.999, -99.999)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(-100.1, -100.1, -100.1)), "Passed!"); ok(a.containsPoint(new THREE.Vector3(99.999, 99.999, -99.999)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(100.1, 100.1, -100.1)), "Passed!"); ok(!a.containsPoint(new THREE.Vector3(0, 0, -101)), "Passed!"); }); test("setFromMatrix/makeFrustum/intersectsSphere", function () { var m = new THREE.Matrix4().makeFrustum(-1, 1, -1, 1, 1, 100); var a = new THREE.Frustum().setFromMatrix(m); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, 0), 0)), "Passed!"); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, 0), 0.9)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, 0), 1.1)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, -50), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, -1.001), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(-1, -1, -1.001), 0)), "Passed!"); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(-1.1, -1.1, -1.001), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(-1.1, -1.1, -1.001), 0.5)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(1, 1, -1.001), 0)), "Passed!"); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(1.1, 1.1, -1.001), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(1.1, 1.1, -1.001), 0.5)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, -99.999), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(-99.999, -99.999, -99.999), 0)), "Passed!"); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(-100.1, -100.1, -100.1), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(-100.1, -100.1, -100.1), 0.5)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(99.999, 99.999, -99.999), 0)), "Passed!"); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(100.1, 100.1, -100.1), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(100.1, 100.1, -100.1), 0.2)), "Passed!"); ok(!a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, -101), 0)), "Passed!"); ok(a.intersectsSphere(new THREE.Sphere(new THREE.Vector3(0, 0, -101), 1.1)), "Passed!"); }); test("clone", function () { var p0 = new THREE.Plane(unit3, -1); var p1 = new THREE.Plane(unit3, 1); var p2 = new THREE.Plane(unit3, 2); var p3 = new THREE.Plane(unit3, 3); var p4 = new THREE.Plane(unit3, 4); var p5 = new THREE.Plane(unit3, 5); var b = new THREE.Frustum(p0, p1, p2, p3, p4, p5); var a = b.clone(); ok(a.planes[0].equals(p0), "Passed!"); ok(a.planes[1].equals(p1), "Passed!"); ok(a.planes[2].equals(p2), "Passed!"); ok(a.planes[3].equals(p3), "Passed!"); ok(a.planes[4].equals(p4), "Passed!"); ok(a.planes[5].equals(p5), "Passed!"); // ensure it is a true copy by modifying source a.planes[0].copy(p1); ok(b.planes[0].equals(p0), "Passed!"); }); // -------------------------------------------- Line3 test("constructor/equals", function () { var a = new THREE.Line3(); ok(a.start.equals(zero3), "Passed!"); ok(a.end.equals(zero3), "Passed!"); a = new THREE.Line3(two3.clone(), one3.clone()); ok(a.start.equals(two3), "Passed!"); ok(a.end.equals(one3), "Passed!"); }); test("copy/equals", function () { var a = new THREE.Line3(zero3.clone(), one3.clone()); var b = new THREE.Line3().copy(a); ok(b.start.equals(zero3), "Passed!"); ok(b.end.equals(one3), "Passed!"); // ensure that it is a true copy a.start = zero3; a.end = one3; ok(b.start.equals(zero3), "Passed!"); ok(b.end.equals(one3), "Passed!"); }); test("set", function () { var a = new THREE.Line3(); a.set(one3, one3); ok(a.start.equals(one3), "Passed!"); ok(a.end.equals(one3), "Passed!"); }); test("at", function () { var a = new THREE.Line3(one3.clone(), new THREE.Vector3(1, 1, 2)); ok(a.at(-1).distanceTo(new THREE.Vector3(1, 1, 0)) < 0.0001, "Passed!"); ok(a.at(0).distanceTo(one3.clone()) < 0.0001, "Passed!"); ok(a.at(1).distanceTo(new THREE.Vector3(1, 1, 2)) < 0.0001, "Passed!"); ok(a.at(2).distanceTo(new THREE.Vector3(1, 1, 3)) < 0.0001, "Passed!"); }); test("closestPointToPoint/closestPointToPointParameter", function () { var a = new THREE.Line3(one3.clone(), new THREE.Vector3(1, 1, 2)); // nearby the ray ok(a.closestPointToPointParameter(zero3.clone(), true) == 0, "Passed!"); var b1 = a.closestPointToPoint(zero3.clone(), true); ok(b1.distanceTo(new THREE.Vector3(1, 1, 1)) < 0.0001, "Passed!"); // nearby the ray ok(a.closestPointToPointParameter(zero3.clone(), false) == -1, "Passed!"); var b2 = a.closestPointToPoint(zero3.clone(), false); ok(b2.distanceTo(new THREE.Vector3(1, 1, 0)) < 0.0001, "Passed!"); // nearby the ray ok(a.closestPointToPointParameter(new THREE.Vector3(1, 1, 5), true) == 1, "Passed!"); var b = a.closestPointToPoint(new THREE.Vector3(1, 1, 5), true); ok(b.distanceTo(new THREE.Vector3(1, 1, 2)) < 0.0001, "Passed!"); // exactly on the ray ok(a.closestPointToPointParameter(one3.clone(), true) == 0, "Passed!"); var c = a.closestPointToPoint(one3.clone(), true); ok(c.distanceTo(one3.clone()) < 0.0001, "Passed!"); }); // -------------------------------------------- Matrix3 var matrixEquals3 = function (a, b, tolerance) { tolerance = tolerance || 0.0001; if (a.elements.length != b.elements.length) { return false; } for (var i = 0, il = a.elements.length; i < il; i++) { var delta = a.elements[i] - b.elements[i]; if (delta > tolerance) { return false; } } return true; }; var toMatrix4 = function (m3) { var result = new THREE.Matrix4(); var re = result.elements; var me = m3.elements; re[0] = me[0]; re[1] = me[1]; re[2] = me[2]; re[4] = me[3]; re[5] = me[4]; re[6] = me[5]; re[8] = me[6]; re[9] = me[7]; re[10] = me[8]; return result; }; test("constructor", function () { var a = new THREE.Matrix3(); ok(a.determinant() == 1, "Passed!"); var b = new THREE.Matrix3(0, 1, 2, 3, 4, 5, 6, 7, 8); ok(b.elements[0] == 0); ok(b.elements[1] == 3); ok(b.elements[2] == 6); ok(b.elements[3] == 1); ok(b.elements[4] == 4); ok(b.elements[5] == 7); ok(b.elements[6] == 2); ok(b.elements[7] == 5); ok(b.elements[8] == 8); ok(!matrixEquals3(a, b), "Passed!"); }); test("copy", function () { var a = new THREE.Matrix3(0, 1, 2, 3, 4, 5, 6, 7, 8); var b = new THREE.Matrix3().copy(a); ok(matrixEquals3(a, b), "Passed!"); // ensure that it is a true copy a.elements[0] = 2; ok(!matrixEquals3(a, b), "Passed!"); }); test("set", function () { var b = new THREE.Matrix3(); ok(b.determinant() == 1, "Passed!"); b.set(0, 1, 2, 3, 4, 5, 6, 7, 8); ok(b.elements[0] == 0); ok(b.elements[1] == 3); ok(b.elements[2] == 6); ok(b.elements[3] == 1); ok(b.elements[4] == 4); ok(b.elements[5] == 7); ok(b.elements[6] == 2); ok(b.elements[7] == 5); ok(b.elements[8] == 8); }); test("identity", function () { var b = new THREE.Matrix3(0, 1, 2, 3, 4, 5, 6, 7, 8); ok(b.elements[0] == 0); ok(b.elements[1] == 3); ok(b.elements[2] == 6); ok(b.elements[3] == 1); ok(b.elements[4] == 4); ok(b.elements[5] == 7); ok(b.elements[6] == 2); ok(b.elements[7] == 5); ok(b.elements[8] == 8); var a = new THREE.Matrix3(); ok(!matrixEquals3(a, b), "Passed!"); b.identity(); ok(matrixEquals3(a, b), "Passed!"); }); test("multiplyScalar", function () { var b = new THREE.Matrix3(0, 1, 2, 3, 4, 5, 6, 7, 8); ok(b.elements[0] == 0); ok(b.elements[1] == 3); ok(b.elements[2] == 6); ok(b.elements[3] == 1); ok(b.elements[4] == 4); ok(b.elements[5] == 7); ok(b.elements[6] == 2); ok(b.elements[7] == 5); ok(b.elements[8] == 8); b.multiplyScalar(2); ok(b.elements[0] == 0 * 2); ok(b.elements[1] == 3 * 2); ok(b.elements[2] == 6 * 2); ok(b.elements[3] == 1 * 2); ok(b.elements[4] == 4 * 2); ok(b.elements[5] == 7 * 2); ok(b.elements[6] == 2 * 2); ok(b.elements[7] == 5 * 2); ok(b.elements[8] == 8 * 2); }); test("determinant", function () { var a = new THREE.Matrix3(); ok(a.determinant() == 1, "Passed!"); a.elements[0] = 2; ok(a.determinant() == 2, "Passed!"); a.elements[0] = 0; ok(a.determinant() == 0, "Passed!"); // calculated via http://www.euclideanspace.com/maths/algebra/matrix/functions/determinant/threeD/index.htm a.set(2, 3, 4, 5, 13, 7, 8, 9, 11); ok(a.determinant() == -73, "Passed!"); }); test("getInverse", function () { var identity = new THREE.Matrix4(); var a = new THREE.Matrix4(); var b = new THREE.Matrix3(0, 0, 0, 0, 0, 0, 0, 0, 0); var c = new THREE.Matrix4(0, 0, 0, 0, 0, 0, 0, 0, 0); ok(!matrixEquals3(a, b), "Passed!"); b.getInverse(a, false); ok(matrixEquals3(b, new THREE.Matrix3()), "Passed!"); try { b.getInverse(c, true); ok(false, "Passed!"); // should never get here. } catch (err) { ok(true, "Passed!"); } var testMatrices = [ new THREE.Matrix4().makeRotationX(0.3), new THREE.Matrix4().makeRotationX(-0.3), new THREE.Matrix4().makeRotationY(0.3), new THREE.Matrix4().makeRotationY(-0.3), new THREE.Matrix4().makeRotationZ(0.3), new THREE.Matrix4().makeRotationZ(-0.3), new THREE.Matrix4().makeScale(1, 2, 3), new THREE.Matrix4().makeScale(1 / 8, 1 / 2, 1 / 3) ]; for (var i = 0, il = testMatrices.length; i < il; i++) { var m = testMatrices[i]; var mInverse3 = new THREE.Matrix3().getInverse(m); var mInverse = toMatrix4(mInverse3); // the determinant of the inverse should be the reciprocal ok(Math.abs(m.determinant() * mInverse3.determinant() - 1) < 0.0001, "Passed!"); ok(Math.abs(m.determinant() * mInverse.determinant() - 1) < 0.0001, "Passed!"); var mProduct = new THREE.Matrix4().multiplyMatrices(m, mInverse); ok(Math.abs(mProduct.determinant() - 1) < 0.0001, "Passed!"); ok(matrixEquals3(mProduct, identity), "Passed!"); } }); test("transpose", function () { var a = new THREE.Matrix3(); var b = a.clone().transpose(); ok(matrixEquals3(a, b), "Passed!"); b = new THREE.Matrix3(0, 1, 2, 3, 4, 5, 6, 7, 8); var c = b.clone().transpose(); ok(!matrixEquals3(b, c), "Passed!"); c.transpose(); ok(matrixEquals3(b, c), "Passed!"); }); test("clone", function () { var a = new THREE.Matrix3(0, 1, 2, 3, 4, 5, 6, 7, 8); var b = a.clone(); ok(matrixEquals3(a, b), "Passed!"); // ensure that it is a true copy a.elements[0] = 2; ok(!matrixEquals3(a, b), "Passed!"); }); // -------------------------------------------- Matrix4 var matrixEquals4 = function (a, b) { var tolerance = 0.0001; if (a.elements.length != b.elements.length) { return false; } for (var i = 0, il = a.elements.length; i < il; i++) { var delta = a.elements[i] - b.elements[i]; if (delta > tolerance) { return false; } } return true; }; test("constructor", function () { var a = new THREE.Matrix4(); ok(a.determinant() == 1, "Passed!"); var b = new THREE.Matrix4(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); ok(b.elements[0] == 0); ok(b.elements[1] == 4); ok(b.elements[2] == 8); ok(b.elements[3] == 12); ok(b.elements[4] == 1); ok(b.elements[5] == 5); ok(b.elements[6] == 9); ok(b.elements[7] == 13); ok(b.elements[8] == 2); ok(b.elements[9] == 6); ok(b.elements[10] == 10); ok(b.elements[11] == 14); ok(b.elements[12] == 3); ok(b.elements[13] == 7); ok(b.elements[14] == 11); ok(b.elements[15] == 15); ok(!matrixEquals4(a, b), "Passed!"); }); test("copy", function () { var a = new THREE.Matrix4(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15); var b = new THREE.Matrix4().copy(a); ok(matrixEquals4(a, b), "Passed!");