|
@@ -2,116 +2,118 @@
|
|
* @author Ben Houston / [email protected] / http://github.com/bhouston
|
|
* @author Ben Houston / [email protected] / http://github.com/bhouston
|
|
*/
|
|
*/
|
|
|
|
|
|
-( function ( THREE ) {
|
|
|
|
|
|
+THREE.Box3 = function ( min, max ) {
|
|
|
|
|
|
- THREE.Box3 = function ( min, max ) {
|
|
|
|
|
|
+ // TODO: Is this valid JavaScript to check if the parameters are specified?
|
|
|
|
+ if( ! min && ! max ) {
|
|
|
|
+ this.makeEmpty();
|
|
|
|
+ }
|
|
|
|
+ else {
|
|
|
|
+ this.min = min || new THREE.Vector3();
|
|
|
|
+ this.max = max || this.min; // This is done on purpose so you can make a box using a single point and then expand it.
|
|
|
|
+ }
|
|
|
|
+};
|
|
|
|
|
|
- // TODO: Is this valid JavaScript to check if the parameters are specified?
|
|
|
|
- if( ! min && ! max ) {
|
|
|
|
- this.makeEmpty();
|
|
|
|
- }
|
|
|
|
- else {
|
|
|
|
- this.min = min || new THREE.Vector3();
|
|
|
|
- this.max = max || this.min; // This is done on purpose so you can make a box using a single point and then expand it.
|
|
|
|
- }
|
|
|
|
- };
|
|
|
|
|
|
+THREE.Box3.fromPoints = function ( points ) {
|
|
|
|
|
|
- THREE.Box3.fromPoints = function ( points ) {
|
|
|
|
|
|
+ var boundingBox = new THREE.Box3();
|
|
|
|
+ for( var i = 0, numPoints = points.length; i < numPoints; i ++ ) {
|
|
|
|
+ boundingBox.extendByPoint( points[i] );
|
|
|
|
+ }
|
|
|
|
|
|
- var boundingBox = new THREE.Box3();
|
|
|
|
- for( var i = 0, numPoints = points.length; i < numPoints; i ++ ) {
|
|
|
|
- boundingBox.extendByPoint( points[i] );
|
|
|
|
- }
|
|
|
|
|
|
+ return boundingBox;
|
|
|
|
+};
|
|
|
|
|
|
- return boundingBox;
|
|
|
|
- };
|
|
|
|
|
|
+THREE.Box3.fromCenterAndSize = function ( center, size ) {
|
|
|
|
|
|
- THREE.Box3.fromCenterAndSize = function ( center, size ) {
|
|
|
|
|
|
+ var halfSize = new THREE.Vector3().copy( size ).multiplyScalar( 0.5 );
|
|
|
|
+ var box = new THREE.Box3( center, center );
|
|
|
|
+ box.min.subSelf( halfSize );
|
|
|
|
+ box.min.addSelf( halfSize );
|
|
|
|
|
|
- var halfSize = new THREE.Vector3().copy( size ).multiplyScalar( 0.5 );
|
|
|
|
- var box = new THREE.Box3( center, center );
|
|
|
|
- box.min.subSelf( halfSize );
|
|
|
|
- box.min.addSelf( halfSize );
|
|
|
|
|
|
+ return box;
|
|
|
|
+};
|
|
|
|
|
|
- return box;
|
|
|
|
- };
|
|
|
|
|
|
+THREE.Box3.prototype = {
|
|
|
|
|
|
- THREE.Box3.prototype.set = function ( min, max ) {
|
|
|
|
|
|
+ constructor: THREE.Box3,
|
|
|
|
+
|
|
|
|
+ set: function ( min, max ) {
|
|
|
|
|
|
this.min = min;
|
|
this.min = min;
|
|
this.max = max;
|
|
this.max = max;
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.copy = function ( box ) {
|
|
|
|
|
|
+ copy: function ( box ) {
|
|
|
|
|
|
this.min = box.min;
|
|
this.min = box.min;
|
|
this.max = box.max;
|
|
this.max = box.max;
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.makeEmpty = function () {
|
|
|
|
|
|
+ makeEmpty: function () {
|
|
|
|
|
|
this.min.x = this.min.y = this.min.z = Number.MAX_VALUE;
|
|
this.min.x = this.min.y = this.min.z = Number.MAX_VALUE;
|
|
this.max.x = this.max.y = this.max.z = -Number.MAX_VALUE;
|
|
this.max.x = this.max.y = this.max.z = -Number.MAX_VALUE;
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.empty = function () {
|
|
|
|
|
|
+ empty: function () {
|
|
|
|
|
|
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
|
|
// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes
|
|
return
|
|
return
|
|
( this.max.x < this.min.x ) ||
|
|
( this.max.x < this.min.x ) ||
|
|
( this.max.y < this.min.y ) ||
|
|
( this.max.y < this.min.y ) ||
|
|
( this.max.z < this.min.z );
|
|
( this.max.z < this.min.z );
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.volume = function () {
|
|
|
|
|
|
+ volume: function () {
|
|
|
|
|
|
return
|
|
return
|
|
( this.max.x - this.min.x ) *
|
|
( this.max.x - this.min.x ) *
|
|
( this.max.y - this.min.y ) *
|
|
( this.max.y - this.min.y ) *
|
|
( this.max.z - this.min.z );
|
|
( this.max.z - this.min.z );
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.center = function () {
|
|
|
|
|
|
+ center: function () {
|
|
|
|
|
|
return new THREE.Vector3().add( this.min, this.max ).multiplyScalar( 0.5 );
|
|
return new THREE.Vector3().add( this.min, this.max ).multiplyScalar( 0.5 );
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.size = function () {
|
|
|
|
|
|
+ size: function () {
|
|
|
|
|
|
return new THREE.Vector3().sub( this.max, this.min );
|
|
return new THREE.Vector3().sub( this.max, this.min );
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.expandByPoint = function ( point ) {
|
|
|
|
|
|
+ expandByPoint: function ( point ) {
|
|
|
|
|
|
this.min.minSelf( point );
|
|
this.min.minSelf( point );
|
|
this.max.maxSelf( point );
|
|
this.max.maxSelf( point );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.expandByVector = function ( vector ) {
|
|
|
|
|
|
+ expandByVector: function ( vector ) {
|
|
|
|
|
|
this.min.subSelf( vector );
|
|
this.min.subSelf( vector );
|
|
this.max.addSelf( vector );
|
|
this.max.addSelf( vector );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.expandByScalar = function ( scalar ) {
|
|
|
|
|
|
+ expandByScalar: function ( scalar ) {
|
|
|
|
|
|
this.min.addScalar( -scalar );
|
|
this.min.addScalar( -scalar );
|
|
this.max.addScalar( scalar );
|
|
this.max.addScalar( scalar );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.containsPoint = function ( point ) {
|
|
|
|
|
|
+ containsPoint: function ( point ) {
|
|
if(
|
|
if(
|
|
( this.min.x <= point.x ) && ( point.x <= this.max.x ) &&
|
|
( this.min.x <= point.x ) && ( point.x <= this.max.x ) &&
|
|
( this.min.y <= point.y ) && ( point.y <= this.max.y ) &&
|
|
( this.min.y <= point.y ) && ( point.y <= this.max.y ) &&
|
|
@@ -120,9 +122,9 @@
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.containsBox = function ( box ) {
|
|
|
|
|
|
+ containsBox: function ( box ) {
|
|
if(
|
|
if(
|
|
( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&
|
|
( this.min.x <= box.min.x ) && ( box.max.x <= this.max.x ) &&
|
|
( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&
|
|
( this.min.y <= box.min.y ) && ( box.max.y <= this.max.y ) &&
|
|
@@ -131,9 +133,9 @@
|
|
return true;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
return false;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.isIntersection = function ( box ) {
|
|
|
|
|
|
+ isIntersection: function ( box ) {
|
|
// using 6 splitting planes to rule out intersections.
|
|
// using 6 splitting planes to rule out intersections.
|
|
if(
|
|
if(
|
|
( this.max.x < box.min.x ) || ( box.min.x > this.max.x ) ||
|
|
( this.max.x < box.min.x ) || ( box.min.x > this.max.x ) ||
|
|
@@ -143,9 +145,9 @@
|
|
return false;
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
return true;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.getParameter = function ( point ) {
|
|
|
|
|
|
+ getParameter: function ( point ) {
|
|
// This can potentially have a divide by zero if the box
|
|
// This can potentially have a divide by zero if the box
|
|
// has a size dimension of 0.
|
|
// has a size dimension of 0.
|
|
return new THREE.Vector3(
|
|
return new THREE.Vector3(
|
|
@@ -153,48 +155,48 @@
|
|
( point.y - this.min.y ) / ( this.max.y - this.min.y ),
|
|
( point.y - this.min.y ) / ( this.max.y - this.min.y ),
|
|
( point.z - this.min.z ) / ( this.max.z - this.min.z )
|
|
( point.z - this.min.z ) / ( this.max.z - this.min.z )
|
|
);
|
|
);
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.clampPoint = function ( point ) {
|
|
|
|
|
|
+ clampPoint: function ( point ) {
|
|
|
|
|
|
return new THREE.Vector3().copy( point ).maxSelf( this.min ).minSelf( this.max );
|
|
return new THREE.Vector3().copy( point ).maxSelf( this.min ).minSelf( this.max );
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.distanceToPoint = function ( point ) {
|
|
|
|
|
|
+ distanceToPoint: function ( point ) {
|
|
|
|
|
|
return this.clampPoint( point ).subSelf( point ).length();
|
|
return this.clampPoint( point ).subSelf( point ).length();
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.intersect = function ( box ) {
|
|
|
|
|
|
+ intersect: function ( box ) {
|
|
|
|
|
|
this.min.maxSelf( box.min );
|
|
this.min.maxSelf( box.min );
|
|
this.max.minSelf( box.max );
|
|
this.max.minSelf( box.max );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.union = function ( box ) {
|
|
|
|
|
|
+ union: function ( box ) {
|
|
|
|
|
|
this.min.minSelf( box.min );
|
|
this.min.minSelf( box.min );
|
|
this.max.maxSelf( box.max );
|
|
this.max.maxSelf( box.max );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.translate = function ( offset ) {
|
|
|
|
|
|
+ translate: function ( offset ) {
|
|
|
|
|
|
this.min.addSelf( offset );
|
|
this.min.addSelf( offset );
|
|
this.max.addSelf( offset );
|
|
this.max.addSelf( offset );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
|
|
+ },
|
|
|
|
|
|
- THREE.Box3.prototype.scale = function ( factor ) {
|
|
|
|
|
|
+ scale: function ( factor ) {
|
|
|
|
|
|
var sizeDeltaHalf = this.size().multiplyScalar( ( 1 - factor ) * 0.5 );
|
|
var sizeDeltaHalf = this.size().multiplyScalar( ( 1 - factor ) * 0.5 );
|
|
this.expandByVector( sizeDeltaHalf );
|
|
this.expandByVector( sizeDeltaHalf );
|
|
|
|
|
|
return this;
|
|
return this;
|
|
- };
|
|
|
|
-
|
|
|
|
-}( THREE ) );
|
|
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+};
|