vendor: 3,173 bytes, lines 1-214
1import { Vector3 } from '../math/Vector3.js'; 2import { Object3D } from '../core/Object3D.js'; 3 4const _v1 = /*@__PURE__*/ new Vector3(); 5const _v2 = /*@__PURE__*/ new Vector3(); 6 7class LOD extends Object3D { 8 9 constructor() { 10 11 super(); 12 13 this._currentLevel = 0; 14 15 this.type = 'LOD'; 16 17 Object.defineProperties( this, { 18 levels: { 19 enumerable: true, 20 value: [] 21 }, 22 isLOD: { 23 value: true, 24 } 25 } ); 26 27 this.autoUpdate = true; 28 29 } 30 31 copy( source ) { 32 33 super.copy( source, false ); 34 35 const levels = source.levels; 36 37 for ( let i = 0, l = levels.length; i < l; i ++ ) { 38 39 const level = levels[ i ]; 40 41 this.addLevel( level.object.clone(), level.distance, level.hysteresis ); 42 43 } 44 45 this.autoUpdate = source.autoUpdate; 46 47 return this; 48 49 } 50 51 addLevel( object, distance = 0, hysteresis = 0 ) { 52 53 distance = Math.abs( distance ); 54 55 const levels = this.levels; 56 57 let l; 58 59 for ( l = 0; l < levels.length; l ++ ) { 60 61 if ( distance < levels[ l ].distance ) { 62 63 break; 64 65 } 66 67 } 68 69 levels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } ); 70 71 this.add( object ); 72 73 return this; 74 75 } 76 77 getCurrentLevel() { 78 79 return this._currentLevel; 80 81 } 82 83 84 85 getObjectForDistance( distance ) { 86 87 const levels = this.levels; 88 89 if ( levels.length > 0 ) { 90 91 let i, l; 92 93 for ( i = 1, l = levels.length; i < l; i ++ ) { 94 95 let levelDistance = levels[ i ].distance; 96 97 if ( levels[ i ].object.visible ) { 98 99 levelDistance -= levelDistance * levels[ i ].hysteresis; 100 101 } 102 103 if ( distance < levelDistance ) { 104 105 break; 106 107 } 108 109 } 110 111 return levels[ i - 1 ].object; 112 113 } 114 115 return null; 116 117 } 118 119 raycast( raycaster, intersects ) { 120 121 const levels = this.levels; 122 123 if ( levels.length > 0 ) { 124 125 _v1.setFromMatrixPosition( this.matrixWorld ); 126 127 const distance = raycaster.ray.origin.distanceTo( _v1 ); 128 129 this.getObjectForDistance( distance ).raycast( raycaster, intersects ); 130 131 } 132 133 } 134 135 update( camera ) { 136 137 const levels = this.levels; 138 139 if ( levels.length > 1 ) { 140 141 _v1.setFromMatrixPosition( camera.matrixWorld ); 142 _v2.setFromMatrixPosition( this.matrixWorld ); 143 144 const distance = _v1.distanceTo( _v2 ) / camera.zoom; 145 146 levels[ 0 ].object.visible = true; 147 148 let i, l; 149 150 for ( i = 1, l = levels.length; i < l; i ++ ) { 151 152 let levelDistance = levels[ i ].distance; 153 154 if ( levels[ i ].object.visible ) { 155 156 levelDistance -= levelDistance * levels[ i ].hysteresis; 157 158 } 159 160 if ( distance >= levelDistance ) { 161 162 levels[ i - 1 ].object.visible = false; 163 levels[ i ].object.visible = true; 164 165 } else { 166 167 break; 168 169 } 170 171 } 172 173 this._currentLevel = i - 1; 174 175 for ( ; i < l; i ++ ) { 176 177 levels[ i ].object.visible = false; 178 179 } 180 181 } 182 183 } 184 185 toJSON( meta ) { 186 187 const data = super.toJSON( meta ); 188 189 if ( this.autoUpdate === false ) data.object.autoUpdate = false; 190 191 data.object.levels = []; 192 193 const levels = this.levels; 194 195 for ( let i = 0, l = levels.length; i < l; i ++ ) { 196 197 const level = levels[ i ]; 198 199 data.object.levels.push( { 200 object: level.object.uuid, 201 distance: level.distance, 202 hysteresis: level.hysteresis 203 } ); 204 205 } 206 207 return data; 208 209 } 210 211} 212 213 214export { LOD };
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.