declarations
Version:
[](https://www.npmjs.com/package/declarations)
1,092 lines (1,091 loc) • 124 kB
JavaScript
/// <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!");