easy-three-utils 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/package.json +12 -0
  2. package/src/common/index.ts +24 -0
  3. package/src/common/useLine2.ts +87 -0
  4. package/src/common/useLoader.ts +184 -0
  5. package/src/common/useLocationCalculator.ts +145 -0
  6. package/src/common/useMark.ts +42 -0
  7. package/src/common/useTween.ts +86 -0
  8. package/src/core/basic/camera.ts +28 -0
  9. package/src/core/basic/clock.ts +11 -0
  10. package/src/core/basic/control.ts +32 -0
  11. package/src/core/basic/index.ts +35 -0
  12. package/src/core/basic/labelRenderer.ts +26 -0
  13. package/src/core/basic/light.ts +63 -0
  14. package/src/core/basic/renderer.ts +37 -0
  15. package/src/core/basic/scene.ts +11 -0
  16. package/src/core/basic/stats.ts +16 -0
  17. package/src/core/event.ts +74 -0
  18. package/src/core/index.ts +11 -0
  19. package/src/core/main.ts +389 -0
  20. package/src/draco/README.md +32 -0
  21. package/src/draco/draco_decoder.js +34 -0
  22. package/src/draco/draco_decoder.wasm +0 -0
  23. package/src/draco/draco_encoder.js +33 -0
  24. package/src/draco/draco_wasm_wrapper.js +117 -0
  25. package/src/draco/gltf/draco_decoder.js +33 -0
  26. package/src/draco/gltf/draco_decoder.wasm +0 -0
  27. package/src/draco/gltf/draco_encoder.js +33 -0
  28. package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
  29. package/src/tileRenderer/base/Tile.d.ts +50 -0
  30. package/src/tileRenderer/base/TileBase.d.ts +76 -0
  31. package/src/tileRenderer/base/TileInternal.d.ts +36 -0
  32. package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
  33. package/src/tileRenderer/base/TilesRendererBase.js +847 -0
  34. package/src/tileRenderer/base/Tileset.d.ts +66 -0
  35. package/src/tileRenderer/base/constants.d.ts +6 -0
  36. package/src/tileRenderer/base/constants.js +16 -0
  37. package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
  38. package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
  39. package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
  40. package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
  41. package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
  42. package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
  43. package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
  44. package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
  45. package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
  46. package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
  47. package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
  48. package/src/tileRenderer/base/traverseFunctions.js +468 -0
  49. package/src/tileRenderer/gltf.js +144 -0
  50. package/src/tileRenderer/index.d.ts +41 -0
  51. package/src/tileRenderer/index.js +44 -0
  52. package/src/tileRenderer/plugins/README.md +578 -0
  53. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
  54. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
  55. package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
  56. package/src/tileRenderer/plugins/index.d.ts +17 -0
  57. package/src/tileRenderer/plugins/index.js +17 -0
  58. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
  59. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
  60. package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
  61. package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
  62. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
  63. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
  64. package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
  65. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
  66. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
  67. package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
  68. package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
  69. package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
  70. package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
  71. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
  72. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
  73. package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
  74. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
  75. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
  76. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
  77. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
  78. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
  79. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
  80. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
  81. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
  82. package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
  83. package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
  84. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
  85. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
  86. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
  87. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
  88. package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
  89. package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
  90. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
  91. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
  92. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
  93. package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
  94. package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
  95. package/src/tileRenderer/r3f/README.md +238 -0
  96. package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
  97. package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
  98. package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
  99. package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
  100. package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
  101. package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
  102. package/src/tileRenderer/r3f/index.jsx +6 -0
  103. package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
  104. package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
  105. package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
  106. package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
  107. package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
  108. package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
  109. package/src/tileRenderer/three/TilesGroup.js +91 -0
  110. package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
  111. package/src/tileRenderer/three/TilesRenderer.js +1049 -0
  112. package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
  113. package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
  114. package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
  115. package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
  116. package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
  117. package/src/tileRenderer/three/controls/utils.js +113 -0
  118. package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
  119. package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
  120. package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
  121. package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
  122. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
  123. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
  124. package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
  125. package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
  126. package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
  127. package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
  128. package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
  129. package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
  130. package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
  131. package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
  132. package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
  133. package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
  134. package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
  135. package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
  136. package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
  137. package/src/tileRenderer/three/math/GeoConstants.js +5 -0
  138. package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
  139. package/src/tileRenderer/three/math/GeoUtils.js +106 -0
  140. package/src/tileRenderer/three/math/OBB.js +179 -0
  141. package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
  142. package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
  143. package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
  144. package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
  145. package/src/tileRenderer/three/raycastTraverse.js +178 -0
  146. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
  147. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
  148. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
  149. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
  150. package/src/tileRenderer/three/utilities.js +54 -0
  151. package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
  152. package/src/tileRenderer/utilities/BatchTable.js +82 -0
  153. package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
  154. package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
  155. package/src/tileRenderer/utilities/FeatureTable.js +159 -0
  156. package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
  157. package/src/tileRenderer/utilities/LRUCache.js +385 -0
  158. package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
  159. package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
  160. package/src/tileRenderer/utilities/arrayToString.js +7 -0
  161. package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
  162. package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
  163. package/src/tileRenderer/utilities/urlExtension.js +34 -0
  164. package/tsconfig.json +42 -0
  165. package/tsconfig.node.json +11 -0
  166. package/typings/three.d.ts +27 -0
@@ -0,0 +1,677 @@
1
+ import { Box3Helper, Group, MeshStandardMaterial, PointsMaterial, Sphere, Color } from 'three';
2
+ import { SphereHelper } from './objects/SphereHelper.js';
3
+ import { EllipsoidRegionLineHelper } from './objects/EllipsoidRegionHelper.js';
4
+
5
+ const ORIGINAL_MATERIAL = Symbol( 'ORIGINAL_MATERIAL' );
6
+ const HAS_RANDOM_COLOR = Symbol( 'HAS_RANDOM_COLOR' );
7
+ const HAS_RANDOM_NODE_COLOR = Symbol( 'HAS_RANDOM_NODE_COLOR' );
8
+ const LOAD_TIME = Symbol( 'LOAD_TIME' );
9
+
10
+ const _sphere = /* @__PURE__ */ new Sphere();
11
+ const emptyRaycast = () => {};
12
+ const colors = {};
13
+
14
+ // Return a consistant random color for an index
15
+ export function getIndexedRandomColor( index ) {
16
+
17
+ if ( ! colors[ index ] ) {
18
+
19
+ const h = Math.random();
20
+ const s = 0.5 + Math.random() * 0.5;
21
+ const l = 0.375 + Math.random() * 0.25;
22
+
23
+ colors[ index ] = new Color().setHSL( h, s, l );
24
+
25
+ }
26
+ return colors[ index ];
27
+
28
+ }
29
+
30
+ // color modes
31
+ export const NONE = 0;
32
+ export const SCREEN_ERROR = 1;
33
+ export const GEOMETRIC_ERROR = 2;
34
+ export const DISTANCE = 3;
35
+ export const DEPTH = 4;
36
+ export const RELATIVE_DEPTH = 5;
37
+ export const IS_LEAF = 6;
38
+ export const RANDOM_COLOR = 7;
39
+ export const RANDOM_NODE_COLOR = 8;
40
+ export const CUSTOM_COLOR = 9;
41
+ export const LOAD_ORDER = 10;
42
+
43
+ export class DebugTilesPlugin {
44
+
45
+ constructor( options ) {
46
+
47
+ options = {
48
+ displayBoxBounds: false,
49
+ displaySphereBounds: false,
50
+ displayRegionBounds: false,
51
+ colorMode: NONE,
52
+ maxDebugDepth: - 1,
53
+ maxDebugDistance: - 1,
54
+ maxDebugError: - 1,
55
+ customColorCallback: null,
56
+ ...options,
57
+ };
58
+
59
+ this.name = 'DEBUG_TILES_PLUGIN';
60
+ this.tiles = null;
61
+
62
+ this.extremeDebugDepth = - 1;
63
+ this.extremeDebugError = - 1;
64
+ this.boxGroup = null;
65
+ this.sphereGroup = null;
66
+ this.regionGroup = null;
67
+
68
+ // options
69
+ this.displayBoxBounds = options.displayBoxBounds;
70
+ this.displaySphereBounds = options.displaySphereBounds;
71
+ this.displayRegionBounds = options.displayRegionBounds;
72
+ this.colorMode = options.colorMode;
73
+ this.maxDebugDepth = options.maxDebugDepth;
74
+ this.maxDebugDistance = options.maxDebugDistance;
75
+ this.maxDebugError = options.maxDebugError;
76
+ this.customColorCallback = options.customColorCallback;
77
+
78
+ this.getDebugColor = ( value, target ) => {
79
+
80
+ target.setRGB( value, value, value );
81
+
82
+ };
83
+
84
+ }
85
+
86
+ // initialize the groups for displaying helpers, register events, and initialize existing tiles
87
+ init( tiles ) {
88
+
89
+ this.tiles = tiles;
90
+
91
+ // initialize groups
92
+ const tilesGroup = tiles.group;
93
+ this.boxGroup = new Group();
94
+ this.boxGroup.name = 'DebugTilesRenderer.boxGroup';
95
+ tilesGroup.add( this.boxGroup );
96
+ this.boxGroup.updateMatrixWorld();
97
+
98
+ this.sphereGroup = new Group();
99
+ this.sphereGroup.name = 'DebugTilesRenderer.sphereGroup';
100
+ tilesGroup.add( this.sphereGroup );
101
+ this.sphereGroup.updateMatrixWorld();
102
+
103
+ this.regionGroup = new Group();
104
+ this.regionGroup.name = 'DebugTilesRenderer.regionGroup';
105
+ tilesGroup.add( this.regionGroup );
106
+ this.regionGroup.updateMatrixWorld();
107
+
108
+ // register events
109
+ this._onLoadTileSetCB = () => {
110
+
111
+ this._initExtremes();
112
+
113
+ };
114
+
115
+ this._onLoadModelCB = ( { scene, tile } ) => {
116
+
117
+ this._onLoadModel( scene, tile );
118
+
119
+ };
120
+
121
+ this._onDisposeModelCB = ( { tile } ) => {
122
+
123
+ this._onDisposeModel( tile );
124
+
125
+ };
126
+
127
+ this._onUpdateAfterCB = () => {
128
+
129
+ this._onUpdateAfter();
130
+
131
+ };
132
+
133
+ this._onTileVisibilityChangeCB = ( { scene, tile, visible } ) => {
134
+
135
+ this._onTileVisibilityChange( tile, visible );
136
+
137
+ };
138
+
139
+ tiles.addEventListener( 'load-tile-set', this._onLoadTileSetCB );
140
+ tiles.addEventListener( 'load-model', this._onLoadModelCB );
141
+ tiles.addEventListener( 'dispose-model', this._onDisposeModelCB );
142
+ tiles.addEventListener( 'update-after', this._onUpdateAfterCB );
143
+ tiles.addEventListener( 'tile-visibility-change', this._onTileVisibilityChangeCB );
144
+
145
+ // initialize an already-loaded tiles
146
+ tiles.traverse( tile => {
147
+
148
+ if ( tile.cached.scene ) {
149
+
150
+ this._onLoadModel( tile.cached.scene, tile );
151
+
152
+ }
153
+
154
+ } );
155
+
156
+ tiles.visibleTiles.forEach( tile => {
157
+
158
+ this._onTileVisibilityChange( tile, true );
159
+
160
+ } );
161
+
162
+ }
163
+
164
+ getTileInformationFromActiveObject( object ) {
165
+
166
+ // Find which tile this scene is associated with. This is slow and
167
+ // intended for debug purposes only.
168
+ let targetTile = null;
169
+ const activeTiles = this.tiles.activeTiles;
170
+ activeTiles.forEach( tile => {
171
+
172
+ if ( targetTile ) {
173
+
174
+ return true;
175
+
176
+ }
177
+
178
+ const scene = tile.cached.scene;
179
+ if ( scene ) {
180
+
181
+ scene.traverse( c => {
182
+
183
+ if ( c === object ) {
184
+
185
+ targetTile = tile;
186
+
187
+ }
188
+
189
+ } );
190
+
191
+ }
192
+
193
+ } );
194
+
195
+ if ( targetTile ) {
196
+
197
+ return {
198
+
199
+ distanceToCamera: targetTile.__distanceFromCamera,
200
+ geometricError: targetTile.geometricError,
201
+ screenSpaceError: targetTile.__error,
202
+ depth: targetTile.__depth,
203
+ isLeaf: targetTile.__isLeaf
204
+
205
+ };
206
+
207
+ } else {
208
+
209
+ return null;
210
+
211
+ }
212
+
213
+ }
214
+
215
+ _initExtremes() {
216
+
217
+ // initialize the extreme values of the hierarchy
218
+ let maxDepth = - 1;
219
+ this.tiles.traverse( tile => {
220
+
221
+ maxDepth = Math.max( maxDepth, tile.__depth );
222
+
223
+ } );
224
+
225
+ let maxError = - 1;
226
+ this.tiles.traverse( tile => {
227
+
228
+ maxError = Math.max( maxError, tile.geometricError );
229
+
230
+ } );
231
+
232
+ this.extremeDebugDepth = maxDepth;
233
+ this.extremeDebugError = maxError;
234
+
235
+ }
236
+
237
+ _onUpdateAfter() {
238
+
239
+ const tiles = this.tiles;
240
+
241
+ if ( ! tiles.root ) {
242
+
243
+ return;
244
+
245
+ }
246
+
247
+ // set box or sphere visibility
248
+ this.boxGroup.visible = this.displayBoxBounds;
249
+ this.sphereGroup.visible = this.displaySphereBounds;
250
+ this.regionGroup.visible = this.displayRegionBounds;
251
+
252
+ // get max values to use for materials
253
+ let maxDepth = - 1;
254
+ if ( this.maxDebugDepth === - 1 ) {
255
+
256
+ maxDepth = this.extremeDebugDepth;
257
+
258
+ } else {
259
+
260
+ maxDepth = this.maxDebugDepth;
261
+
262
+ }
263
+
264
+ let maxError = - 1;
265
+ if ( this.maxDebugError === - 1 ) {
266
+
267
+ maxError = this.extremeDebugError;
268
+
269
+ } else {
270
+
271
+ maxError = this.maxDebugError;
272
+
273
+ }
274
+
275
+ let maxDistance = - 1;
276
+ if ( this.maxDebugDistance === - 1 ) {
277
+
278
+ tiles.getBoundingSphere( _sphere );
279
+ maxDistance = _sphere.radius;
280
+
281
+ } else {
282
+
283
+ maxDistance = this.maxDebugDistance;
284
+
285
+ }
286
+
287
+ const errorTarget = this.errorTarget;
288
+ const colorMode = this.colorMode;
289
+ const visibleTiles = tiles.visibleTiles;
290
+ let sortedTiles;
291
+ if ( colorMode === LOAD_ORDER ) {
292
+
293
+ sortedTiles = Array.from( visibleTiles ).sort( ( a, b ) => {
294
+
295
+ return a[ LOAD_TIME ] - b[ LOAD_TIME ];
296
+
297
+ } );
298
+
299
+ }
300
+
301
+ // update plugins
302
+ visibleTiles.forEach( tile => {
303
+
304
+ const scene = tile.cached.scene;
305
+
306
+ // create a random color per-tile
307
+ let h, s, l;
308
+ if ( colorMode === RANDOM_COLOR ) {
309
+
310
+ h = Math.random();
311
+ s = 0.5 + Math.random() * 0.5;
312
+ l = 0.375 + Math.random() * 0.25;
313
+
314
+ }
315
+
316
+ scene.traverse( c => {
317
+
318
+ if ( colorMode === RANDOM_NODE_COLOR ) {
319
+
320
+ h = Math.random();
321
+ s = 0.5 + Math.random() * 0.5;
322
+ l = 0.375 + Math.random() * 0.25;
323
+
324
+ }
325
+
326
+ const currMaterial = c.material;
327
+ if ( currMaterial ) {
328
+
329
+ // Reset the material if needed
330
+ const originalMaterial = c[ ORIGINAL_MATERIAL ];
331
+ if ( colorMode === NONE && currMaterial !== originalMaterial ) {
332
+
333
+ c.material.dispose();
334
+ c.material = c[ ORIGINAL_MATERIAL ];
335
+
336
+ } else if ( colorMode !== NONE && currMaterial === originalMaterial ) {
337
+
338
+ if ( c.isPoints ) {
339
+
340
+ const pointsMaterial = new PointsMaterial();
341
+ pointsMaterial.size = originalMaterial.size;
342
+ pointsMaterial.sizeAttenuation = originalMaterial.sizeAttenuation;
343
+ c.material = pointsMaterial;
344
+
345
+ } else {
346
+
347
+ c.material = new MeshStandardMaterial();
348
+ c.material.flatShading = true;
349
+
350
+ }
351
+
352
+ }
353
+
354
+ if ( colorMode !== RANDOM_COLOR ) {
355
+
356
+ delete c.material[ HAS_RANDOM_COLOR ];
357
+
358
+ }
359
+
360
+ if ( colorMode !== RANDOM_NODE_COLOR ) {
361
+
362
+ delete c.material[ HAS_RANDOM_NODE_COLOR ];
363
+
364
+ }
365
+
366
+ // Set the color on the basic material
367
+ switch ( colorMode ) {
368
+
369
+ case DEPTH: {
370
+
371
+ const val = tile.__depth / maxDepth;
372
+ this.getDebugColor( val, c.material.color );
373
+ break;
374
+
375
+ }
376
+ case RELATIVE_DEPTH: {
377
+
378
+ const val = tile.__depthFromRenderedParent / maxDepth;
379
+ this.getDebugColor( val, c.material.color );
380
+ break;
381
+
382
+ }
383
+ case SCREEN_ERROR: {
384
+
385
+ const val = tile.__error / errorTarget;
386
+ if ( val > 1.0 ) {
387
+
388
+ c.material.color.setRGB( 1.0, 0.0, 0.0 );
389
+
390
+ } else {
391
+
392
+ this.getDebugColor( val, c.material.color );
393
+
394
+ }
395
+ break;
396
+
397
+ }
398
+ case GEOMETRIC_ERROR: {
399
+
400
+ const val = Math.min( tile.geometricError / maxError, 1 );
401
+ this.getDebugColor( val, c.material.color );
402
+ break;
403
+
404
+ }
405
+ case DISTANCE: {
406
+
407
+ // We don't update the distance if the geometric error is 0.0 so
408
+ // it will always be black.
409
+ const val = Math.min( tile.__distanceFromCamera / maxDistance, 1 );
410
+ this.getDebugColor( val, c.material.color );
411
+ break;
412
+
413
+ }
414
+ case IS_LEAF: {
415
+
416
+ if ( ! tile.children || tile.children.length === 0 ) {
417
+
418
+ this.getDebugColor( 1.0, c.material.color );
419
+
420
+ } else {
421
+
422
+ this.getDebugColor( 0.0, c.material.color );
423
+
424
+ }
425
+ break;
426
+
427
+ }
428
+ case RANDOM_NODE_COLOR: {
429
+
430
+ if ( ! c.material[ HAS_RANDOM_NODE_COLOR ] ) {
431
+
432
+ c.material.color.setHSL( h, s, l );
433
+ c.material[ HAS_RANDOM_NODE_COLOR ] = true;
434
+
435
+ }
436
+ break;
437
+
438
+ }
439
+ case RANDOM_COLOR: {
440
+
441
+ if ( ! c.material[ HAS_RANDOM_COLOR ] ) {
442
+
443
+ c.material.color.setHSL( h, s, l );
444
+ c.material[ HAS_RANDOM_COLOR ] = true;
445
+
446
+ }
447
+ break;
448
+
449
+ }
450
+ case CUSTOM_COLOR: {
451
+
452
+ if ( this.customColorCallback ) {
453
+
454
+ this.customColorCallback( tile, c );
455
+
456
+ } else {
457
+
458
+ console.warn( 'DebugTilesRenderer: customColorCallback not defined' );
459
+
460
+ }
461
+ break;
462
+
463
+ }
464
+ case LOAD_ORDER: {
465
+
466
+ const value = sortedTiles.indexOf( tile );
467
+ this.getDebugColor( value / ( sortedTiles.length - 1 ), c.material.color );
468
+ break;
469
+
470
+ }
471
+
472
+ }
473
+
474
+ }
475
+
476
+ } );
477
+
478
+ } );
479
+
480
+ }
481
+
482
+ _onTileVisibilityChange( tile, visible ) {
483
+
484
+ const cached = tile.cached;
485
+ const sphereGroup = this.sphereGroup;
486
+ const boxGroup = this.boxGroup;
487
+ const regionGroup = this.regionGroup;
488
+ const boxHelperGroup = cached.boxHelperGroup;
489
+ const sphereHelper = cached.sphereHelper;
490
+ const regionHelper = cached.regionHelper;
491
+
492
+ if ( ! visible ) {
493
+
494
+ if ( boxHelperGroup ) {
495
+
496
+ boxGroup.remove( boxHelperGroup );
497
+
498
+ }
499
+
500
+ if ( sphereHelper ) {
501
+
502
+ sphereGroup.remove( sphereHelper );
503
+
504
+ }
505
+
506
+ if ( regionHelper ) {
507
+
508
+ regionGroup.remove( regionHelper );
509
+
510
+ }
511
+
512
+ } else {
513
+
514
+ if ( boxHelperGroup ) {
515
+
516
+ boxGroup.add( boxHelperGroup );
517
+ boxHelperGroup.updateMatrixWorld( true );
518
+
519
+ }
520
+
521
+ if ( sphereHelper ) {
522
+
523
+ sphereGroup.add( sphereHelper );
524
+ sphereHelper.updateMatrixWorld( true );
525
+
526
+ }
527
+
528
+ if ( regionHelper ) {
529
+
530
+ regionGroup.add( regionHelper );
531
+ regionHelper.updateMatrixWorld( true );
532
+
533
+ }
534
+
535
+ }
536
+
537
+ }
538
+
539
+ _onLoadModel( scene, tile ) {
540
+
541
+ tile[ LOAD_TIME ] = performance.now();
542
+
543
+ const tiles = this.tiles;
544
+ const cached = tile.cached;
545
+ const { sphere, obb, region } = cached.boundingVolume;
546
+ if ( obb ) {
547
+
548
+ // Create debug bounding box
549
+ // In some cases the bounding box may have a scale of 0 in one dimension resulting
550
+ // in the NaNs in an extracted rotation so we disable matrix updates instead.
551
+ const boxHelperGroup = new Group();
552
+ boxHelperGroup.name = 'DebugTilesRenderer.boxHelperGroup';
553
+ boxHelperGroup.matrix.copy( obb.transform );
554
+ boxHelperGroup.matrixAutoUpdate = false;
555
+
556
+ const boxHelper = new Box3Helper( obb.box, getIndexedRandomColor( tile.__depth ) );
557
+ boxHelper.raycast = emptyRaycast;
558
+ boxHelperGroup.add( boxHelper );
559
+
560
+ cached.boxHelperGroup = boxHelperGroup;
561
+
562
+ if ( tiles.visibleTiles.has( tile ) && this.displayBoxBounds ) {
563
+
564
+ this.boxGroup.add( boxHelperGroup );
565
+ boxHelperGroup.updateMatrixWorld( true );
566
+
567
+ }
568
+
569
+ }
570
+
571
+ if ( sphere ) {
572
+
573
+ // Create debug bounding sphere
574
+ const sphereHelper = new SphereHelper( sphere, getIndexedRandomColor( tile.__depth ) );
575
+ sphereHelper.raycast = emptyRaycast;
576
+ cached.sphereHelper = sphereHelper;
577
+
578
+ if ( tiles.visibleTiles.has( tile ) && this.displaySphereBounds ) {
579
+
580
+ this.sphereGroup.add( sphereHelper );
581
+ sphereHelper.updateMatrixWorld( true );
582
+
583
+ }
584
+
585
+ }
586
+
587
+ if ( region ) {
588
+
589
+ // Create debug bounding region
590
+ const regionHelper = new EllipsoidRegionLineHelper( region, getIndexedRandomColor( tile.__depth ) );
591
+ regionHelper.raycast = emptyRaycast;
592
+
593
+ // recenter the geometry to avoid rendering artifacts
594
+ const sphere = new Sphere();
595
+ region.getBoundingSphere( sphere );
596
+ regionHelper.position.copy( sphere.center );
597
+
598
+ sphere.center.multiplyScalar( - 1 );
599
+ regionHelper.geometry.translate( ...sphere.center );
600
+
601
+ cached.regionHelper = regionHelper;
602
+
603
+ if ( tiles.visibleTiles.has( tile ) && this.displayRegionBounds ) {
604
+
605
+ this.regionGroup.add( regionHelper );
606
+ regionHelper.updateMatrixWorld( true );
607
+
608
+ }
609
+
610
+ }
611
+
612
+ // Cache the original materials
613
+ scene.traverse( c => {
614
+
615
+ const material = c.material;
616
+ if ( material ) {
617
+
618
+ c[ ORIGINAL_MATERIAL ] = material;
619
+
620
+ }
621
+
622
+ } );
623
+
624
+ }
625
+
626
+ _onDisposeModel( tile ) {
627
+
628
+ const cached = tile.cached;
629
+ if ( cached.boxHelperGroup ) {
630
+
631
+ cached.boxHelperGroup.children[ 0 ].geometry.dispose();
632
+ delete cached.boxHelperGroup;
633
+
634
+ }
635
+
636
+ if ( cached.sphereHelper ) {
637
+
638
+ cached.sphereHelper.geometry.dispose();
639
+ delete cached.sphereHelper;
640
+
641
+ }
642
+
643
+ if ( cached.regionHelper ) {
644
+
645
+ cached.regionHelper.geometry.dispose();
646
+ delete cached.regionHelper;
647
+
648
+ }
649
+
650
+ }
651
+
652
+ dispose() {
653
+
654
+ const tiles = this.tiles;
655
+ tiles.removeEventListener( 'load-tile-set', this._onLoadTileSetCB );
656
+ tiles.removeEventListener( 'load-model', this._onLoadModelCB );
657
+ tiles.removeEventListener( 'dispose-model', this._onDisposeModelCB );
658
+ tiles.removeEventListener( 'update-after', this._onUpdateAfterCB );
659
+
660
+ // reset all materials
661
+ this.colorMode = NONE;
662
+ this._onUpdateAfter();
663
+
664
+ // dispose of all helper objects
665
+ tiles.traverse( tile => {
666
+
667
+ this._onDisposeModel( tile );
668
+
669
+ } );
670
+
671
+ this.boxGroup.removeFromParent();
672
+ this.sphereGroup.removeFromParent();
673
+ this.regionGroup.removeFromParent();
674
+
675
+ }
676
+
677
+ }
@@ -0,0 +1,18 @@
1
+ import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';
2
+ import { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader';
3
+ import { GLTFLoaderPlugin, GLTFParser } from 'three/examples/jsm/loaders/GLTFLoader';
4
+
5
+ export class GLTFExtensionsPlugin {
6
+
7
+ constructor( options: {
8
+ metadata: Boolean,
9
+ rtc: Boolean,
10
+
11
+ plugins: Array<( parser: GLTFParser ) => GLTFLoaderPlugin>,
12
+
13
+ dracoLoader: DRACOLoader | null,
14
+ ktxLoader: KTX2Loader | null,
15
+ autoDispose: Boolean,
16
+ } );
17
+
18
+ }