UNPKG

declarations

Version:

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

1,291 lines (1,032 loc) 131 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 ()=>{ // -------------------------------------------- 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