declarations
Version:
[](https://www.npmjs.com/package/declarations)
1,291 lines (1,032 loc) • 131 kB
text/typescript
/// <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
()=>{
// -------------------------------------------- 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( "intersectsBox", 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.intersectsBox( a ), "Passed!" );
ok( a.intersectsBox( b ), "Passed!" );
ok( a.intersectsBox( c ), "Passed!" );
ok( b.intersectsBox( a ), "Passed!" );
ok( c.intersectsBox( a ), "Passed!" );
ok( b.intersectsBox( c ), "Passed!" );
b.translate( new THREE.Vector2( 2, 2 ) );
ok( ! a.intersectsBox( b ), "Passed!" );
ok( ! b.intersectsBox( a ), "Passed!" );
ok( ! b.intersectsBox( 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( "intersectsBox", 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.intersectsBox( a ), "Passed!" );
ok( a.intersectsBox( b ), "Passed!" );
ok( a.intersectsBox( c ), "Passed!" );
ok( b.intersectsBox( a ), "Passed!" );
ok( c.intersectsBox( a ), "Passed!" );
ok( b.intersectsBox( c ), "Passed!" );
b.translate( new THREE.Vector3( 2, 2, 2 ) );
ok( ! a.intersectsBox( b ), "Passed!" );
ok( ! b.intersectsBox( a ), "Passed!" );
ok( ! b.intersectsBox( 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?: any) {
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?: any) {
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();
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 );
ok( ! matrixEquals3( a, b ), "Passed!" );
});
test( "copy", function() {
var a = new THREE.Matrix3();
a.set(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();
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 );
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();
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 );
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();
b.set(0, 0, 0, 0, 0, 0, 0, 0, 0);
var c = new THREE.Matrix4();
c.set(0, 0, 0, 0, 0, 0, 0, 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