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,318 @@
1
+ import { Group, Matrix4, Vector3, Quaternion } from 'three';
2
+ import { FadeManager } from './FadeManager.js';
3
+
4
+ const HAS_POPPED_IN = Symbol( 'HAS_POPPED_IN' );
5
+ const _fromPos = new Vector3();
6
+ const _toPos = new Vector3();
7
+ const _fromQuat = new Quaternion();
8
+ const _toQuat = new Quaternion();
9
+ const _scale = new Vector3();
10
+
11
+ function onTileVisibilityChange( scene, tile, visible ) {
12
+
13
+ // ensure the tiles are marked as visible on visibility toggle since
14
+ // it's possible we disable them when adjusting visibility based on frustum
15
+ scene.visible = true;
16
+
17
+ if ( ! visible ) {
18
+
19
+ this._fadeGroup.add( scene );
20
+ this._fadeManager.fadeOut( scene );
21
+
22
+ } else {
23
+
24
+ // if this is a root renderable tile and this is the first time rendering in
25
+ // then pop it in
26
+ const isRootRenderableTile = tile.__depthFromRenderedParent === 1;
27
+ if ( isRootRenderableTile ) {
28
+
29
+ if ( tile[ HAS_POPPED_IN ] || this.fadeRootTiles ) {
30
+
31
+ this._fadeManager.fadeIn( scene );
32
+
33
+ }
34
+
35
+ tile[ HAS_POPPED_IN ] = true;
36
+
37
+
38
+ } else {
39
+
40
+ this._fadeManager.fadeIn( scene );
41
+
42
+ }
43
+
44
+ }
45
+
46
+ }
47
+
48
+ function onLoadModel( scene, tile ) {
49
+
50
+ this._fadeManager.prepareObject( scene );
51
+ this._tileMap.set( scene, tile );
52
+
53
+ }
54
+
55
+ function onDisposeModel( scene ) {
56
+
57
+ this._fadeManager.deleteObject( scene );
58
+ this._tileMap.delete( scene );
59
+
60
+ }
61
+
62
+ function onFadeComplete( object ) {
63
+
64
+ // when the fade finishes ensure we dispose the tile and remove it from the fade group
65
+ if ( object.parent === this._fadeGroup ) {
66
+
67
+ this._fadeGroup.remove( object );
68
+
69
+ }
70
+
71
+ }
72
+
73
+ function onAddCamera( camera ) {
74
+
75
+ this._prevCameraTransforms.set( camera, new Matrix4() );
76
+
77
+ }
78
+
79
+ function onDeleteCamera( camera ) {
80
+
81
+ this._prevCameraTransforms.delete( camera );
82
+
83
+ }
84
+
85
+ function onUpdateBefore() {
86
+
87
+ const fadeManager = this._fadeManager;
88
+ const tiles = this.tiles;
89
+
90
+ // store the tiles renderer state before the tiles update so we can check
91
+ // whether fading started or stopped completely
92
+ this._fadingBefore = fadeManager.fadeCount;
93
+ this._displayActiveTiles = tiles.displayActiveTiles;
94
+
95
+ // we need to display all active tiles in this case so we don't fade tiles in
96
+ // when moving from off screen
97
+ tiles.displayActiveTiles = true;
98
+
99
+ }
100
+
101
+ function onUpdateAfter() {
102
+
103
+ const fadeManager = this._fadeManager;
104
+ const fadeGroup = this._fadeGroup;
105
+ const displayActiveTiles = this._displayActiveTiles;
106
+ const fadingBefore = this._fadingBefore;
107
+ const tiles = this.tiles;
108
+ const prevCameraTransforms = this._prevCameraTransforms;
109
+ const tileMap = this._tileMap;
110
+ const lruCache = tiles.lruCache;
111
+ const cameras = tiles.cameras;
112
+
113
+ // reset state
114
+ tiles.displayActiveTiles = displayActiveTiles;
115
+
116
+ // update fades
117
+ fadeManager.update();
118
+
119
+ // fire an event
120
+ const fadingAfter = fadeManager.fadeCount;
121
+ if ( fadingBefore !== 0 && fadingAfter !== 0 ) {
122
+
123
+ tiles.dispatchEvent( { type: 'fade-change' } );
124
+ tiles.dispatchEvent( { type: 'force-rerender' } );
125
+
126
+ }
127
+
128
+ // update the visibility of tiles based on visibility since we must use
129
+ // the active tiles for rendering fade
130
+ if ( ! displayActiveTiles ) {
131
+
132
+ tiles.visibleTiles.forEach( t => {
133
+
134
+ t.cached.scene.visible = t.__inFrustum;
135
+
136
+ } );
137
+
138
+ }
139
+
140
+ if ( this.maximumFadeOutTiles < fadeGroup.children.length ) {
141
+
142
+ // determine whether all the rendering cameras are moving
143
+ // quickly so we can adjust how tiles fade accordingly
144
+ let isMovingFast = true;
145
+ cameras.forEach( camera => {
146
+
147
+ if ( ! prevCameraTransforms.has( camera ) ) {
148
+
149
+ return;
150
+
151
+ }
152
+
153
+ const currMatrix = camera.matrixWorld;
154
+ const prevMatrix = prevCameraTransforms.get( camera );
155
+
156
+ currMatrix.decompose( _toPos, _toQuat, _scale );
157
+ prevMatrix.decompose( _fromPos, _fromQuat, _scale );
158
+
159
+ const angleTo = _toQuat.angleTo( _fromQuat );
160
+ const positionTo = _toPos.distanceTo( _fromPos );
161
+
162
+ // if rotation is moving > 0.25 radians per frame or position is moving > 0.1 units
163
+ // then we are considering the camera to be moving too fast to notice a faster / abrupt fade
164
+ isMovingFast = isMovingFast && ( angleTo > 0.25 || positionTo > 0.1 );
165
+
166
+ } );
167
+
168
+ if ( isMovingFast ) {
169
+
170
+ fadeManager.completeAllFades();
171
+
172
+ }
173
+
174
+ }
175
+
176
+ // track the camera movement so we can use it for next frame
177
+ cameras.forEach( camera => {
178
+
179
+ prevCameraTransforms.get( camera ).copy( camera.matrixWorld );
180
+
181
+ } );
182
+
183
+ // prevent faded tiles from being unloaded
184
+ fadeManager.forEachObject( scene => {
185
+
186
+ lruCache.markUsed( tileMap.get( scene ) );
187
+
188
+ } );
189
+
190
+ }
191
+
192
+ export class TilesFadePlugin {
193
+
194
+ get fadeDuration() {
195
+
196
+ return this._fadeManager.duration;
197
+
198
+ }
199
+
200
+ set fadeDuration( value ) {
201
+
202
+ this._fadeManager.duration = Number( value );
203
+
204
+ }
205
+
206
+ get fadingTiles() {
207
+
208
+ return this._fadeManager.fadeCount;
209
+
210
+ }
211
+
212
+ constructor( options ) {
213
+
214
+ options = {
215
+
216
+ maximumFadeOutTiles: 50,
217
+ fadeRootTiles: false,
218
+ fadeDuration: 250,
219
+ ...options,
220
+
221
+ };
222
+
223
+ this.name = 'FADE_TILES_PLUGIN';
224
+
225
+ this.tiles = null;
226
+ this._fadeManager = new FadeManager();
227
+ this._prevCameraTransforms = null;
228
+ this._fadeGroup = null;
229
+ this._tileMap = null;
230
+
231
+ this.maximumFadeOutTiles = options.maximumFadeOutTiles;
232
+ this.fadeRootTiles = options.fadeRootTiles;
233
+ this.fadeDuration = options.fadeDuration;
234
+
235
+ }
236
+
237
+ init( tiles ) {
238
+
239
+ const fadeGroup = new Group();
240
+ fadeGroup.name = 'TilesFadeGroup';
241
+ tiles.group.add( fadeGroup );
242
+
243
+ const fadeManager = this._fadeManager;
244
+ fadeManager.onFadeSetStart = () => {
245
+
246
+ tiles.dispatchEvent( { type: 'fade-start' } );
247
+ tiles.dispatchEvent( { type: 'force-rerender' } );
248
+
249
+ };
250
+
251
+ fadeManager.onFadeSetComplete = () => {
252
+
253
+ tiles.dispatchEvent( { type: 'fade-end' } );
254
+ tiles.dispatchEvent( { type: 'force-rerender' } );
255
+
256
+ };
257
+
258
+ fadeManager.onFadeComplete = onFadeComplete.bind( this );
259
+
260
+ this.tiles = tiles;
261
+ this._fadeManager = fadeManager;
262
+ this._fadeGroup = fadeGroup;
263
+ this._tileMap = new Map();
264
+ this._prevCameraTransforms = new Map();
265
+
266
+ tiles.cameras.forEach( camera => {
267
+
268
+ this._prevCameraTransforms.set( camera, new Matrix4() );
269
+
270
+ } );
271
+
272
+ tiles.forEachLoadedModel( ( scene, tile ) => {
273
+
274
+ onLoadModel.call( this, scene, tile );
275
+
276
+ } );
277
+
278
+ this._onLoadModel = e => onLoadModel.call( this, e.scene, e.tile );
279
+ this._onDisposeModel = e => onDisposeModel.call( this, e.scene );
280
+ this._onTileVisibilityChange = e => onTileVisibilityChange.call( this, e.scene, e.tile, e.visible );
281
+ this._onAddCamera = e => onAddCamera.call( this, e.camera );
282
+ this._onDeleteCamera = e => onDeleteCamera.call( this, e.camera );
283
+ this._onUpdateBefore = () => onUpdateBefore.call( this );
284
+ this._onUpdateAfter = () => onUpdateAfter.call( this );
285
+
286
+ tiles.addEventListener( 'load-model', this._onLoadModel );
287
+ tiles.addEventListener( 'dispose-model', this._onDisposeModel );
288
+ tiles.addEventListener( 'tile-visibility-change', this._onTileVisibilityChange );
289
+ tiles.addEventListener( 'add-camera', this._onAddCamera );
290
+ tiles.addEventListener( 'delete-camera', this._onDeleteCamera );
291
+ tiles.addEventListener( 'update-before', this._onUpdateBefore );
292
+ tiles.addEventListener( 'update-after', this._onUpdateAfter );
293
+
294
+ }
295
+
296
+ dispose() {
297
+
298
+ const tiles = this.tiles;
299
+ tiles.removeEventListener( 'load-model', this._onLoadModel );
300
+ tiles.removeEventListener( 'dispose-model', this._onDisposeModel );
301
+ tiles.removeEventListener( 'tile-visibility-change', this._onTileVisibilityChange );
302
+ tiles.removeEventListener( 'add-camera', this._onAddCamera );
303
+ tiles.removeEventListener( 'delete-camera', this._onDeleteCamera );
304
+ tiles.removeEventListener( 'update-before', this._onUpdateBefore );
305
+ tiles.removeEventListener( 'update-after', this._onUpdateAfter );
306
+ tiles.forEachLoadedModel( scene => {
307
+
308
+ this._fadeManager.deleteObject( scene );
309
+ this._tileMap.delete( scene );
310
+ scene.visible = true;
311
+
312
+ } );
313
+
314
+ this._fadeGroup.removeFromParent();
315
+
316
+ }
317
+
318
+ }
@@ -0,0 +1,5 @@
1
+ export class GLTFCesiumRTCExtension {
2
+
3
+ name: 'CESIUM_RTC';
4
+
5
+ }
@@ -0,0 +1,27 @@
1
+ export class GLTFCesiumRTCExtension {
2
+
3
+ constructor() {
4
+
5
+ this.name = 'CESIUM_RTC';
6
+
7
+ }
8
+
9
+ afterRoot( res ) {
10
+
11
+ if ( res.parser.json.extensions && res.parser.json.extensions.CESIUM_RTC ) {
12
+
13
+ const { center } = res.parser.json.extensions.CESIUM_RTC;
14
+
15
+ if ( center ) {
16
+
17
+ res.scene.position.x += center[ 0 ];
18
+ res.scene.position.y += center[ 1 ];
19
+ res.scene.position.z += center[ 2 ];
20
+
21
+ }
22
+
23
+ }
24
+
25
+ }
26
+
27
+ }
@@ -0,0 +1,30 @@
1
+ import { Vector3 } from 'three';
2
+
3
+ export class GLTFMeshFeaturesExtension {
4
+
5
+ name: 'EXT_mesh_features';
6
+
7
+ }
8
+
9
+ export class MeshFeatures {
10
+
11
+ getFeatures( triangle: Number, barycoord: Vector3 ): Array<Number>;
12
+ getFeaturesAsync( triangle: Number, barycoord: Vector3 ): Promise<Array<Number>>;
13
+ getFeaturesInfo(): Array<{ label: String, propertyTable: Number, nullFeatureId: Number | null }>;
14
+ dispose(): void;
15
+
16
+ }
17
+
18
+ declare module 'three' {
19
+
20
+ export interface Object3D {
21
+
22
+ userData: {
23
+
24
+ meshFeatures?: MeshFeatures;
25
+
26
+ }
27
+
28
+ }
29
+
30
+ }
@@ -0,0 +1,76 @@
1
+ import { MeshFeatures } from './metadata/classes/MeshFeatures.js';
2
+
3
+ // https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_mesh_features
4
+
5
+ const EXT_NAME = 'EXT_mesh_features';
6
+
7
+ function forEachPrimitiveExtension( scene, parser, callback ) {
8
+
9
+ scene.traverse( c => {
10
+
11
+ if ( parser.associations.has( c ) ) {
12
+
13
+ // check if this object has extension references
14
+ const { meshes, primitives } = parser.associations.get( c );
15
+ const primitive = parser.json.meshes[ meshes ].primitives[ primitives ];
16
+
17
+ if ( primitive && primitive.extensions && primitive.extensions[ EXT_NAME ] ) {
18
+
19
+ callback( c, primitive.extensions[ EXT_NAME ] );
20
+
21
+ }
22
+
23
+ }
24
+
25
+ } );
26
+
27
+ }
28
+
29
+ export class GLTFMeshFeaturesExtension {
30
+
31
+ constructor( parser ) {
32
+
33
+ this.parser = parser;
34
+ this.name = EXT_NAME;
35
+
36
+ }
37
+
38
+ async afterRoot( { scene, parser } ) {
39
+
40
+ // skip if the extension is not present
41
+ const extensionsUsed = parser.json.extensionsUsed;
42
+ if ( ! extensionsUsed || ! extensionsUsed.includes( EXT_NAME ) ) {
43
+
44
+ return;
45
+
46
+ }
47
+
48
+ // get fetch the relevant textures are loaded
49
+ const textureCount = parser.json.textures?.length || 0;
50
+ const promises = new Array( textureCount ).fill( null );
51
+ forEachPrimitiveExtension( scene, parser, ( child, { featureIds } ) => {
52
+
53
+ featureIds.forEach( info => {
54
+
55
+ if ( info.texture && promises[ info.texture.index ] === null ) {
56
+
57
+ const index = info.texture.index;
58
+ promises[ index ] = parser.loadTexture( index );
59
+
60
+ }
61
+
62
+ } );
63
+
64
+ } );
65
+
66
+ // initialize mesh features on each primitive
67
+ const textures = await Promise.all( promises );
68
+ forEachPrimitiveExtension( scene, parser, ( child, extension ) => {
69
+
70
+ child.userData.meshFeatures = new MeshFeatures( child.geometry, textures, extension );
71
+
72
+ } );
73
+
74
+ }
75
+
76
+ }
@@ -0,0 +1,49 @@
1
+ import { Vector3, Texture } from 'three';
2
+
3
+ export class GLTFStructuralMetadataExtension {
4
+
5
+ name: 'EXT_structural_metadata';
6
+
7
+ }
8
+
9
+ class StructuralMetadata {
10
+
11
+ textures: Array<Texture | null>;
12
+
13
+ getPropertyTableData( tableIndices: Array<Number>, ids: Array<Number>, target: Array = [] ): Array<any>;
14
+ getPropertyTableInfo( tableIndices: Array<Number> | null = null ): Array<{ name: String, className: string }>;
15
+
16
+ getPropertyTextureData( triangle: Number, barycoord: Vector3, target: Array = [] ): Array<any>;
17
+ getPropertyTextureDataAsync( triangle: Number, barycoord: Vector3, target: Array = [] ): Promise<Array<any>>;
18
+ getPropertyTextureInfo(): Array<{
19
+ name: String,
20
+ className: string,
21
+ properties: {
22
+ [key: string]: {
23
+ index: Number,
24
+ texCoord: Number,
25
+ channels: Array<Number>,
26
+ }
27
+ }
28
+ }>;
29
+
30
+ getPropertyAttributeData( attributeIndex: Number, target: Array = [] ): Array<any>;
31
+ getPropertyAttributeInfo(): Array<{ name: String, className: string }>;
32
+
33
+ dispose(): void;
34
+
35
+ }
36
+
37
+ declare module 'three' {
38
+
39
+ export interface Object3D {
40
+
41
+ userData: {
42
+
43
+ structuralMetadata?: StructuralMetadata;
44
+
45
+ }
46
+
47
+ }
48
+
49
+ }
@@ -0,0 +1,147 @@
1
+ // https://github.com/CesiumGS/glTF/tree/3d-tiles-next/extensions/2.0/Vendor/EXT_structural_metadata
2
+
3
+ import { FileLoader } from 'three';
4
+ import { StructuralMetadata } from './metadata/classes/StructuralMetadata.js';
5
+
6
+ const EXT_NAME = 'EXT_structural_metadata';
7
+
8
+ // returns the set of textures required by the property texture definitions
9
+ function getRelevantTextures( parser, propertyTextures = [] ) {
10
+
11
+ const textureCount = parser.json.textures?.length || 0;
12
+ const result = new Array( textureCount ).fill( null );
13
+
14
+ propertyTextures.forEach( ( { properties } ) => {
15
+
16
+ for ( const key in properties ) {
17
+
18
+ const { index } = properties[ key ];
19
+ if ( result[ index ] === null ) {
20
+
21
+ result[ index ] = parser.loadTexture( index );
22
+
23
+ }
24
+
25
+ }
26
+
27
+ } );
28
+
29
+ return Promise.all( result );
30
+
31
+ }
32
+
33
+ // returns the set of buffers required by the property table definitions
34
+ function getRelevantBuffers( parser, propertyTables = [] ) {
35
+
36
+ const textureCount = parser.json.bufferViews?.length || 0;
37
+ const result = new Array( textureCount ).fill( null );
38
+
39
+ propertyTables.forEach( ( { properties } ) => {
40
+
41
+ for ( const key in properties ) {
42
+
43
+ const { values, arrayOffsets, stringOffsets } = properties[ key ];
44
+ if ( result[ values ] === null ) {
45
+
46
+ result[ values ] = parser.loadBufferView( values );
47
+
48
+ }
49
+
50
+ if ( result[ arrayOffsets ] === null ) {
51
+
52
+ result[ arrayOffsets ] = parser.loadBufferView( arrayOffsets );
53
+
54
+ }
55
+
56
+ if ( result[ stringOffsets ] === null ) {
57
+
58
+ result[ stringOffsets ] = parser.loadBufferView( stringOffsets );
59
+
60
+ }
61
+
62
+ }
63
+
64
+ } );
65
+
66
+ return Promise.all( result );
67
+
68
+ }
69
+
70
+ export class GLTFStructuralMetadataExtension {
71
+
72
+ constructor( parser ) {
73
+
74
+ this.parser = parser;
75
+ this.name = EXT_NAME;
76
+
77
+ }
78
+
79
+ async afterRoot( { scene, parser } ) {
80
+
81
+ // skip if the extension is not present
82
+ const extensionsUsed = parser.json.extensionsUsed;
83
+ if ( ! extensionsUsed || ! extensionsUsed.includes( EXT_NAME ) ) {
84
+
85
+ return;
86
+
87
+ }
88
+
89
+ // load the remote schema definition if present
90
+ let schemaPromise = null;
91
+ let rootExtension = parser.json.extensions[ EXT_NAME ];
92
+ if ( rootExtension.schemaUri ) {
93
+
94
+ // TODO: cache the loaded schema so we can share it and dispose of it when the
95
+ // extension is no longer available
96
+ const { manager, path, requestHeader, crossOrigin } = parser.options;
97
+ const finalUri = new URL( rootExtension.schemaUri, path ).toString();
98
+ const fileLoader = new FileLoader( manager );
99
+ fileLoader.setCrossOrigin( crossOrigin );
100
+ fileLoader.setResponseType( 'json' );
101
+ fileLoader.setRequestHeader( requestHeader );
102
+
103
+ schemaPromise = fileLoader.loadAsync( finalUri )
104
+ .then( schema => {
105
+
106
+ rootExtension = { ...rootExtension, schema };
107
+
108
+ } );
109
+
110
+ }
111
+
112
+ // prep the textures and buffers
113
+ const [ textures, buffers ] = await Promise.all( [
114
+ getRelevantTextures( parser, rootExtension.propertyTextures ),
115
+ getRelevantBuffers( parser, rootExtension.propertyTables ),
116
+ schemaPromise,
117
+ ] );
118
+
119
+ // initialize the extension
120
+ const rootMetadata = new StructuralMetadata( rootExtension, textures, buffers );
121
+ scene.userData.structuralMetadata = rootMetadata;
122
+
123
+ scene.traverse( child => {
124
+
125
+ if ( parser.associations.has( child ) ) {
126
+
127
+ // check if this object has extension references and use a child-specific version of the extension
128
+ const { meshes, primitives } = parser.associations.get( child );
129
+ const primitive = parser.json.meshes[ meshes ].primitives[ primitives ];
130
+ if ( primitive && primitive.extensions && primitive.extensions[ EXT_NAME ] ) {
131
+
132
+ const extension = primitive.extensions[ EXT_NAME ];
133
+ child.userData.structuralMetadata = new StructuralMetadata( rootExtension, textures, buffers, extension, child );
134
+
135
+ } else {
136
+
137
+ child.userData.structuralMetadata = rootMetadata;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ } );
144
+
145
+ }
146
+
147
+ }