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.
- package/package.json +12 -0
- package/src/common/index.ts +24 -0
- package/src/common/useLine2.ts +87 -0
- package/src/common/useLoader.ts +184 -0
- package/src/common/useLocationCalculator.ts +145 -0
- package/src/common/useMark.ts +42 -0
- package/src/common/useTween.ts +86 -0
- package/src/core/basic/camera.ts +28 -0
- package/src/core/basic/clock.ts +11 -0
- package/src/core/basic/control.ts +32 -0
- package/src/core/basic/index.ts +35 -0
- package/src/core/basic/labelRenderer.ts +26 -0
- package/src/core/basic/light.ts +63 -0
- package/src/core/basic/renderer.ts +37 -0
- package/src/core/basic/scene.ts +11 -0
- package/src/core/basic/stats.ts +16 -0
- package/src/core/event.ts +74 -0
- package/src/core/index.ts +11 -0
- package/src/core/main.ts +389 -0
- package/src/draco/README.md +32 -0
- package/src/draco/draco_decoder.js +34 -0
- package/src/draco/draco_decoder.wasm +0 -0
- package/src/draco/draco_encoder.js +33 -0
- package/src/draco/draco_wasm_wrapper.js +117 -0
- package/src/draco/gltf/draco_decoder.js +33 -0
- package/src/draco/gltf/draco_decoder.wasm +0 -0
- package/src/draco/gltf/draco_encoder.js +33 -0
- package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
- package/src/tileRenderer/base/Tile.d.ts +50 -0
- package/src/tileRenderer/base/TileBase.d.ts +76 -0
- package/src/tileRenderer/base/TileInternal.d.ts +36 -0
- package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
- package/src/tileRenderer/base/TilesRendererBase.js +847 -0
- package/src/tileRenderer/base/Tileset.d.ts +66 -0
- package/src/tileRenderer/base/constants.d.ts +6 -0
- package/src/tileRenderer/base/constants.js +16 -0
- package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
- package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
- package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
- package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
- package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
- package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
- package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
- package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
- package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
- package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
- package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
- package/src/tileRenderer/base/traverseFunctions.js +468 -0
- package/src/tileRenderer/gltf.js +144 -0
- package/src/tileRenderer/index.d.ts +41 -0
- package/src/tileRenderer/index.js +44 -0
- package/src/tileRenderer/plugins/README.md +578 -0
- package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
- package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
- package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
- package/src/tileRenderer/plugins/index.d.ts +17 -0
- package/src/tileRenderer/plugins/index.js +17 -0
- package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
- package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
- package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
- package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
- package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
- package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
- package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
- package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
- package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
- package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
- package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
- package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
- package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
- package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
- package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
- package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
- package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
- package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
- package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
- package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
- package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
- package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
- package/src/tileRenderer/r3f/README.md +238 -0
- package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
- package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
- package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
- package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
- package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
- package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
- package/src/tileRenderer/r3f/index.jsx +6 -0
- package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
- package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
- package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
- package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
- package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
- package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
- package/src/tileRenderer/three/TilesGroup.js +91 -0
- package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
- package/src/tileRenderer/three/TilesRenderer.js +1049 -0
- package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
- package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
- package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
- package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
- package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
- package/src/tileRenderer/three/controls/utils.js +113 -0
- package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
- package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
- package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
- package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
- package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
- package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
- package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
- package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
- package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
- package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
- package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
- package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
- package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
- package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
- package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
- package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
- package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
- package/src/tileRenderer/three/math/GeoConstants.js +5 -0
- package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
- package/src/tileRenderer/three/math/GeoUtils.js +106 -0
- package/src/tileRenderer/three/math/OBB.js +179 -0
- package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
- package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
- package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
- package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
- package/src/tileRenderer/three/raycastTraverse.js +178 -0
- package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
- package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
- package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
- package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
- package/src/tileRenderer/three/utilities.js +54 -0
- package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
- package/src/tileRenderer/utilities/BatchTable.js +82 -0
- package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
- package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
- package/src/tileRenderer/utilities/FeatureTable.js +159 -0
- package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
- package/src/tileRenderer/utilities/LRUCache.js +385 -0
- package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
- package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
- package/src/tileRenderer/utilities/arrayToString.js +7 -0
- package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
- package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
- package/src/tileRenderer/utilities/urlExtension.js +34 -0
- package/tsconfig.json +42 -0
- package/tsconfig.node.json +11 -0
- 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,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
|
+
}
|