| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- /**
- * @author mikael emtinger / http://gomo.se/
- * @author alteredq / http://alteredqualia.com/
- * @author mrdoob / http://mrdoob.com/
- */
- THREE.LOD = function () {
- THREE.Object3D.call( this );
- this.LODs = [];
- };
- THREE.LOD.prototype = Object.create( 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 distance = -( inverse.elements[2] * this.matrixWorld.elements[12] + inverse.elements[6] * this.matrixWorld.elements[13] + inverse.elements[10] * this.matrixWorld.elements[14] + inverse.elements[14] );
- 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;
- }
- }
- };
|