Files
three.js/src/objects/LOD.js
T

80 lines
1.5 KiB
JavaScript

/**
* @author mikael emtinger / http://gomo.se/
* @author alteredq / http://alteredqualia.com/
* @author mr.doob / http://mrdoob.com/
*/
THREE.LOD = function () {
THREE.Object3D.call( this );
this.LODs = [];
};
THREE.LOD.prototype = new THREE.Object3D();
THREE.LOD.prototype.constructor = THREE.LOD;
THREE.LOD.prototype.supr = THREE.Object3D.prototype;
THREE.LOD.prototype.addLevel = function ( object3D, visibleAtDistance ) {
if ( visibleAtDistance === undefined ) {
visibleAtDistance = 0;
}
visibleAtDistance = Math.abs( visibleAtDistance );
for ( var l = 0; l < this.LODs.length; l++ ) {
if ( visibleAtDistance < this.LODs[ l ].visibleAtDistance ) {
break;
}
}
this.LODs.splice( l, 0, { visibleAtDistance: visibleAtDistance, object3D: object3D } );
this.add( object3D );
};
THREE.LOD.prototype.update = function ( camera ) {
if ( this.LODs.length > 1 ) {
camera.matrixWorldInverse.getInverse( camera.matrixWorld );
var inverse = camera.matrixWorldInverse;
var radius = this.boundRadius * this.boundRadiusScale;
var distance = -( inverse.n31 * this.position.x + inverse.n32 * this.position.y + inverse.n33 * this.position.z + inverse.n34 );
this.LODs[ 0 ].object3D.visible = true;
for ( var l = 1; l < this.LODs.length; l ++ ) {
if( distance >= this.LODs[ l ].visibleAtDistance ) {
this.LODs[ l - 1 ].object3D.visible = false;
this.LODs[ l ].object3D.visible = true;
} else {
break;
}
}
for( ; l < this.LODs.length; l ++ ) {
this.LODs[ l ].object3D.visible = false;
}
}
};