mirror of
https://github.com/wahyd4/three.js.git
synced 2026-08-09 13:06:01 +10:00
80 lines
1.5 KiB
JavaScript
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|