PageSourceSearch

https://genesisglobalgrp.com/lib/three/objects/LOD.js

js genesisglobalgrp.com collected 2026-10-06 15:13:49 UTC 3,173 bytes, 214 lines download raw bytes

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.