/* This file contains proprietary software owned by Motorola Mobility, Inc.
No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
(c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved.
*/ MAX_VAL = 1e+38; function box() { this.min = [MAX_VAL, MAX_VAL, MAX_VAL]; this.max = [-MAX_VAL, -MAX_VAL, -MAX_VAL]; } box.prototype.addBox = function(a) { this.min = vec3.min( this.min, a.min ); this.max = vec3.max( this.max, a.max ); // this.min = vec3.min( this.min, a.min ); // this.max = vec3.max( this.max, a.max ); } box.prototype.addVec3 = function(a) { this.min = vec3.min( this.min, a ); this.max = vec3.max( this.max, a ); } box.prototype.set = function(min, max) { this.min[0] = min[0]; this.min[1] = min[1]; this.min[2] = min[2]; this.max[0] = max[0]; this.max[1] = max[1]; this.max[2] = max[2]; } box.prototype.reset = function() { this.min[0] = MAX_VAL; this.min[1] = MAX_VAL; this.min[2] = MAX_VAL; this.max[0] = -MAX_VAL; this.max[1] = -MAX_VAL; this.max[2] = -MAX_VAL; } box.prototype.getCenter = function() { return [0.5*(this.min[0]+this.max[0]), 0.5*(this.min[1]+this.max[1]), 0.5*(this.min[2]+this.max[2])]; } box.prototype.isVisible = function(frustum) { var center = this.getCenter(); var radius = vec3.distance( this.max, center ); // var diag = vec3.sub( this.max, center ); var i = 0; while(i < frustum.length) { var plane = frustum[i]; var dist = vec3.dot( plane, center ) + plane[3]; if( dist < -radius ) { return false; } i++; } return true; } box.prototype.isValid = function() { return !(this.min[0] > this.max[0] || this.min[1] > this.max[1] || this.min[2] > this.max[2]); } box.prototype.transform = function(mat) { var out = new box(); var pts = []; pts.push( [ this.min[0], this.min[1], this.min[2] ] ); pts.push( [ this.min[0], this.max[1], this.min[2] ] ); pts.push( [ this.max[0], this.max[1], this.min[2] ] ); pts.push( [ this.max[0], this.min[1], this.min[2] ] ); pts.push( [ this.min[0], this.min[1], this.max[2] ] ); pts.push( [ this.min[0], this.max[1], this.max[2] ] ); pts.push( [ this.max[0], this.max[1], this.max[2] ] ); pts.push( [ this.max[0], this.min[1], this.max[2] ] ); var i = pts.length - 1; do { out.addVec3( mat4.transformPoint( mat, pts[i] ) ); } while(i--); return out; } /* box.prototype.transform = function(mat) { var newBox = new box(); var e, f; newBox.b[0] = mat[12]; newBox.b[1] = mat[13]; newBox.b[2] = mat[14]; newBox.t[0] = mat[12]; newBox.t[1] = mat[13]; newBox.t[2] = mat[14]; e = mat[0] * this.min[0]; f = mat[0] * this.max[0]; newBox.b[0] += (e < f) ? e : f; newBox.t[0] += (e < f) ? f : e; e = mat[4] * this.min[1]; f = mat[4] * this.max[1]; newBox.b[0] += (e < f) ? e : f; newBox.t[0] += (e < f) ? f : e; e = mat[8] * this.min[2]; f = mat[8] * this.max[2]; newBox.b[0] += (e < f) ? e : f; newBox.t[0] += (e < f) ? f : e; e = mat[1] * this.min[0]; f = mat[1] * this.max[0]; newBox.b[1] += (e < f) ? e : f; newBox.t[1] += (e < f) ? f : e; e = mat[5] * this.min[1]; f = mat[5] * this.max[1]; newBox.b[1] += (e < f) ? e : f; newBox.t[1] += (e < f) ? f : e; e = mat[9] * this.min[2]; f = mat[9] * this.max[2]; newBox.b[1] += (e < f) ? e : f; newBox.t[1] += (e < f) ? f : e; e = mat[2] * this.min[0]; f = mat[2] * this.max[0]; newBox.b[2] += (e < f) ? e : f; newBox.t[2] += (e < f) ? f : e; e = mat[6] * this.min[1]; f = mat[6] * this.max[1]; newBox.b[2] += (e < f) ? e : f; newBox.t[2] += (e < f) ? f : e; e = mat[10] * this.min[2]; f = mat[10] * this.max[2]; newBox.b[2] += (e < f) ? e : f; newBox.t[2] += (e < f) ? f : e; return newBox; } */