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,239 @@
|
|
|
1
|
+
import { createContext, useContext, useState, useEffect, useRef, forwardRef, useMemo } from 'react';
|
|
2
|
+
import { useThree, useFrame } from '@react-three/fiber';
|
|
3
|
+
import { Vector3 } from 'three';
|
|
4
|
+
import { TilesRenderer as TilesRendererImpl } from '../../three/TilesRenderer.js';
|
|
5
|
+
import { useDeepOptions, useShallowOptions } from '../utilities/useOptions.jsx';
|
|
6
|
+
import { useObjectDep } from '../utilities/useObjectDep.jsx';
|
|
7
|
+
import { useForceUpdate } from '../utilities/useForceUpdate.jsx';
|
|
8
|
+
|
|
9
|
+
// context for accessing the tile set
|
|
10
|
+
export const TilesRendererContext = createContext( null );
|
|
11
|
+
|
|
12
|
+
// group that matches the transform of the tile set root group
|
|
13
|
+
function TileSetRoot( { children } ) {
|
|
14
|
+
|
|
15
|
+
const tiles = useContext( TilesRendererContext );
|
|
16
|
+
const ref = useRef();
|
|
17
|
+
useEffect( () => {
|
|
18
|
+
|
|
19
|
+
if ( tiles ) {
|
|
20
|
+
|
|
21
|
+
ref.current.matrixWorld = tiles.group.matrixWorld;
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
}, [ tiles ] );
|
|
26
|
+
|
|
27
|
+
return <group ref={ ref } matrixWorldAutoUpdate={ false } matrixAutoUpdate={ false }>{ children }</group>;
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const _vec = /* @__PURE__ */ new Vector3();
|
|
32
|
+
export function EastNorthUpFrame( props ) {
|
|
33
|
+
|
|
34
|
+
const {
|
|
35
|
+
lat = 0,
|
|
36
|
+
lon = 0,
|
|
37
|
+
height = 0,
|
|
38
|
+
az = 0,
|
|
39
|
+
el = 0,
|
|
40
|
+
roll = 0,
|
|
41
|
+
children,
|
|
42
|
+
} = props;
|
|
43
|
+
const ref = useRef();
|
|
44
|
+
const tiles = useContext( TilesRendererContext );
|
|
45
|
+
const ellipsoid = tiles && tiles.ellipsoid || null;
|
|
46
|
+
useEffect( () => {
|
|
47
|
+
|
|
48
|
+
if ( ellipsoid === null ) {
|
|
49
|
+
|
|
50
|
+
return;
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const group = ref.current;
|
|
55
|
+
group.matrix.identity();
|
|
56
|
+
|
|
57
|
+
ellipsoid.getRotationMatrixFromAzElRoll( lat, lon, az, el, roll, group.matrix );
|
|
58
|
+
ellipsoid.getCartographicToPosition( lat, lon, height, _vec );
|
|
59
|
+
group.matrix.setPosition( _vec );
|
|
60
|
+
group.matrix.decompose( group.position, group.quaternion, group.scale );
|
|
61
|
+
group.updateMatrixWorld();
|
|
62
|
+
|
|
63
|
+
}, [ ellipsoid, lat, lon, height, az, el, roll ] );
|
|
64
|
+
|
|
65
|
+
return <group ref={ ref }>{ children }</group>;
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// component for registering a plugin
|
|
70
|
+
export const TilesPlugin = forwardRef( function TilesPlugin( props, ref ) {
|
|
71
|
+
|
|
72
|
+
const { plugin, args, ...options } = props;
|
|
73
|
+
const tiles = useContext( TilesRendererContext );
|
|
74
|
+
|
|
75
|
+
// create the instance
|
|
76
|
+
const instance = useMemo( () => {
|
|
77
|
+
|
|
78
|
+
if ( tiles === null ) {
|
|
79
|
+
|
|
80
|
+
return null;
|
|
81
|
+
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let instance;
|
|
85
|
+
if ( Array.isArray( args ) ) {
|
|
86
|
+
|
|
87
|
+
instance = new plugin( ...args );
|
|
88
|
+
|
|
89
|
+
} else {
|
|
90
|
+
|
|
91
|
+
instance = new plugin( args );
|
|
92
|
+
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return instance;
|
|
96
|
+
|
|
97
|
+
// we must create a new plugin if the tile set has changed
|
|
98
|
+
|
|
99
|
+
}, [ tiles, plugin, useObjectDep( args ) ] ); // eslint-disable-line
|
|
100
|
+
|
|
101
|
+
// assigns any provided options to the plugin
|
|
102
|
+
useShallowOptions( instance, options );
|
|
103
|
+
|
|
104
|
+
// assign ref
|
|
105
|
+
useEffect( () => {
|
|
106
|
+
|
|
107
|
+
if ( ref ) {
|
|
108
|
+
|
|
109
|
+
if ( ref instanceof Function ) {
|
|
110
|
+
|
|
111
|
+
ref( instance );
|
|
112
|
+
|
|
113
|
+
} else {
|
|
114
|
+
|
|
115
|
+
ref.current = instance;
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
}, [ instance, ref ] );
|
|
122
|
+
|
|
123
|
+
// register the instance
|
|
124
|
+
useEffect( () => {
|
|
125
|
+
|
|
126
|
+
if ( tiles === null ) {
|
|
127
|
+
|
|
128
|
+
return;
|
|
129
|
+
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
tiles.registerPlugin( instance );
|
|
133
|
+
return () => {
|
|
134
|
+
|
|
135
|
+
tiles.unregisterPlugin( instance );
|
|
136
|
+
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
}, [ instance, tiles ] );
|
|
140
|
+
|
|
141
|
+
} );
|
|
142
|
+
|
|
143
|
+
// component for adding a TilesRenderer to the scene
|
|
144
|
+
export const TilesRenderer = forwardRef( function TilesRenderer( props, ref ) {
|
|
145
|
+
|
|
146
|
+
const { url, group = {}, children, ...options } = props;
|
|
147
|
+
const [ tiles, setTiles ] = useState( null );
|
|
148
|
+
const [ camera, gl, invalidate ] = useThree( state => [ state.camera, state.gl, state.invalidate ] );
|
|
149
|
+
const [ forceUpdateIndex, forceUpdate ] = useForceUpdate();
|
|
150
|
+
|
|
151
|
+
// create the tile set
|
|
152
|
+
useEffect( () => {
|
|
153
|
+
|
|
154
|
+
const tiles = new TilesRendererImpl( url );
|
|
155
|
+
tiles.addEventListener( 'load-content', () => invalidate() );
|
|
156
|
+
tiles.addEventListener( 'force-rerender', () => invalidate() );
|
|
157
|
+
setTiles( tiles );
|
|
158
|
+
|
|
159
|
+
return () => {
|
|
160
|
+
|
|
161
|
+
tiles.dispose();
|
|
162
|
+
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
}, [ url, invalidate ] );
|
|
166
|
+
|
|
167
|
+
// update the resolution for the camera
|
|
168
|
+
useFrame( () => {
|
|
169
|
+
|
|
170
|
+
if ( tiles === null ) {
|
|
171
|
+
|
|
172
|
+
return;
|
|
173
|
+
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
camera.updateMatrixWorld();
|
|
177
|
+
tiles.setResolutionFromRenderer( camera, gl );
|
|
178
|
+
tiles.update();
|
|
179
|
+
|
|
180
|
+
} );
|
|
181
|
+
|
|
182
|
+
// add the camera
|
|
183
|
+
useEffect( () => {
|
|
184
|
+
|
|
185
|
+
if ( tiles === null ) {
|
|
186
|
+
|
|
187
|
+
return;
|
|
188
|
+
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
tiles.setCamera( camera );
|
|
192
|
+
return () => {
|
|
193
|
+
|
|
194
|
+
tiles.deleteCamera( camera );
|
|
195
|
+
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
}, [ tiles, camera ] );
|
|
199
|
+
|
|
200
|
+
// assign ref
|
|
201
|
+
useEffect( () => {
|
|
202
|
+
|
|
203
|
+
if ( ref ) {
|
|
204
|
+
|
|
205
|
+
if ( ref instanceof Function ) {
|
|
206
|
+
|
|
207
|
+
ref( tiles );
|
|
208
|
+
|
|
209
|
+
} else {
|
|
210
|
+
|
|
211
|
+
ref.current = tiles;
|
|
212
|
+
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
}, [ tiles, ref ] );
|
|
218
|
+
|
|
219
|
+
// assign options recursively
|
|
220
|
+
useDeepOptions( tiles, options );
|
|
221
|
+
|
|
222
|
+
// because options modify tiles settings non-reactively we force an update and
|
|
223
|
+
// pass the update index into the tiles context to force children to update
|
|
224
|
+
useEffect( () => {
|
|
225
|
+
|
|
226
|
+
forceUpdate();
|
|
227
|
+
|
|
228
|
+
}, [ tiles, useObjectDep( options ) ] ); // eslint-disable-line
|
|
229
|
+
|
|
230
|
+
return <>
|
|
231
|
+
{ tiles ? <primitive object={ tiles.group } { ...group } /> : null }
|
|
232
|
+
<TilesRendererContext.Provider value={ tiles } key={ forceUpdateIndex }>
|
|
233
|
+
<TileSetRoot>
|
|
234
|
+
{ children }
|
|
235
|
+
</TileSetRoot>
|
|
236
|
+
</TilesRendererContext.Provider>
|
|
237
|
+
</>;
|
|
238
|
+
|
|
239
|
+
} );
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './components/TilesRenderer.jsx';
|
|
2
|
+
export * from './components/TilesAttributionOverlay.jsx';
|
|
3
|
+
export * from './components/CanvasDOMOverlay.jsx';
|
|
4
|
+
export * from './components/CameraControls.jsx';
|
|
5
|
+
export * from './components/CompassGizmo.jsx';
|
|
6
|
+
export * from './components/CameraTransition.jsx';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { useRef } from 'react';
|
|
2
|
+
|
|
3
|
+
// checks if the first level of object key-values are equal
|
|
4
|
+
function areObjectsEqual( a, b ) {
|
|
5
|
+
|
|
6
|
+
// early check for equivalence
|
|
7
|
+
if ( a === b ) {
|
|
8
|
+
|
|
9
|
+
return true;
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// if either of the objects is null or undefined, then perform a simple check
|
|
14
|
+
if ( ! a || ! b ) {
|
|
15
|
+
|
|
16
|
+
return a === b;
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// check all keys and values in the first object
|
|
21
|
+
for ( const key in a ) {
|
|
22
|
+
|
|
23
|
+
if ( a[ key ] !== b[ key ] ) {
|
|
24
|
+
|
|
25
|
+
return false;
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// check all keys and values in the second object
|
|
32
|
+
for ( const key in b ) {
|
|
33
|
+
|
|
34
|
+
if ( a[ key ] !== b[ key ] ) {
|
|
35
|
+
|
|
36
|
+
return false;
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return true;
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Helper for using an object as a dependency in a useEffect or useMemo array
|
|
47
|
+
export function useObjectDep( object ) {
|
|
48
|
+
|
|
49
|
+
// only modify the returned object reference if it has changed
|
|
50
|
+
const ref = useRef();
|
|
51
|
+
if ( ! areObjectsEqual( ref.current, object ) ) {
|
|
52
|
+
|
|
53
|
+
ref.current = object;
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return ref.current;
|
|
58
|
+
|
|
59
|
+
}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { useEffect } from 'react';
|
|
2
|
+
import { useObjectDep } from './useObjectDep.jsx';
|
|
3
|
+
|
|
4
|
+
// return true if the given key is for registering an event
|
|
5
|
+
function isEventName( key ) {
|
|
6
|
+
|
|
7
|
+
return /^on/g.test( key );
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
// returns the event name to register for the given key
|
|
12
|
+
function getEventName( key ) {
|
|
13
|
+
|
|
14
|
+
return key
|
|
15
|
+
.replace( /^on/, '' )
|
|
16
|
+
.replace( /[a-z][A-Z]/g, match => `${ match[ 0 ] }-${ match[ 1 ] }` )
|
|
17
|
+
.toLowerCase();
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// returns a dash-separated key as a list of tokens
|
|
22
|
+
function getPath( key ) {
|
|
23
|
+
|
|
24
|
+
return key.split( '-' );
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// gets the value from the object at the given path
|
|
29
|
+
function getValueAtPath( object, path ) {
|
|
30
|
+
|
|
31
|
+
let curr = object;
|
|
32
|
+
const tokens = [ ...path ];
|
|
33
|
+
while ( tokens.length !== 0 ) {
|
|
34
|
+
|
|
35
|
+
const key = tokens.shift();
|
|
36
|
+
curr = curr[ key ];
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
return curr;
|
|
41
|
+
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// sets the value of the object at the given path
|
|
45
|
+
function setValueAtPath( object, path, value ) {
|
|
46
|
+
|
|
47
|
+
const tokens = [ ...path ];
|
|
48
|
+
const finalKey = tokens.pop();
|
|
49
|
+
getValueAtPath( object, tokens )[ finalKey ] = value;
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Recursively assigns a set of options to an object, interpreting dashes as periods
|
|
54
|
+
export function useDeepOptions( target, options ) {
|
|
55
|
+
|
|
56
|
+
// assign options recursively
|
|
57
|
+
useEffect( () => {
|
|
58
|
+
|
|
59
|
+
if ( target === null ) {
|
|
60
|
+
|
|
61
|
+
return;
|
|
62
|
+
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const previousState = {};
|
|
66
|
+
for ( const key in options ) {
|
|
67
|
+
|
|
68
|
+
if ( isEventName( key ) ) {
|
|
69
|
+
|
|
70
|
+
target.addEventListener( getEventName( key ), options[ key ] );
|
|
71
|
+
|
|
72
|
+
} else {
|
|
73
|
+
|
|
74
|
+
const path = getPath( key );
|
|
75
|
+
previousState[ key ] = getValueAtPath( target, path );
|
|
76
|
+
setValueAtPath( target, path, options[ key ] );
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return () => {
|
|
83
|
+
|
|
84
|
+
for ( const key in options ) {
|
|
85
|
+
|
|
86
|
+
if ( isEventName( key ) ) {
|
|
87
|
+
|
|
88
|
+
target.removeEventListener( getEventName( key ), options[ key ] );
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
for ( const key in options ) {
|
|
95
|
+
|
|
96
|
+
const path = getPath( key );
|
|
97
|
+
setValueAtPath( target, path, options[ key ] );
|
|
98
|
+
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
}, [ target, useObjectDep( options ) ] ); // eslint-disable-line
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Assigns a set of options to an object shallowly, interpreting dashes as periods
|
|
108
|
+
export function useShallowOptions( instance, options ) {
|
|
109
|
+
|
|
110
|
+
// assigns any provided options to the plugin
|
|
111
|
+
useEffect( () => {
|
|
112
|
+
|
|
113
|
+
if ( instance === null ) {
|
|
114
|
+
|
|
115
|
+
return;
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const previousState = {};
|
|
120
|
+
for ( const key in options ) {
|
|
121
|
+
|
|
122
|
+
if ( key in instance ) {
|
|
123
|
+
|
|
124
|
+
previousState[ key ] = instance[ key ];
|
|
125
|
+
instance[ key ] = options[ key ];
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return () => {
|
|
132
|
+
|
|
133
|
+
for ( const key in previousState ) {
|
|
134
|
+
|
|
135
|
+
instance[ key ] = previousState[ key ];
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
}, [ instance, useObjectDep( options ) ] ); // eslint-disable-line
|
|
142
|
+
|
|
143
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { TilesRenderer } from './TilesRenderer';
|
|
2
|
+
import { Color } from 'three';
|
|
3
|
+
|
|
4
|
+
export enum ColorMode {}
|
|
5
|
+
export const NONE : ColorMode;
|
|
6
|
+
export const SCREEN_ERROR : ColorMode;
|
|
7
|
+
export const GEOMETRIC_ERROR : ColorMode;
|
|
8
|
+
export const DISTANCE : ColorMode;
|
|
9
|
+
export const DEPTH : ColorMode;
|
|
10
|
+
export const RELATIVE_DEPTH : ColorMode;
|
|
11
|
+
export const IS_LEAF : ColorMode;
|
|
12
|
+
export const RANDOM_COLOR : ColorMode;
|
|
13
|
+
export const RANDOM_NODE_COLOR: ColorMode;
|
|
14
|
+
export const CUSTOM_COLOR: ColorMode;
|
|
15
|
+
export class DebugTilesRenderer extends TilesRenderer {
|
|
16
|
+
|
|
17
|
+
displayBoxBounds : Boolean;
|
|
18
|
+
displaySphereBounds : Boolean;
|
|
19
|
+
displayRegionBounds : Boolean;
|
|
20
|
+
colorMode : ColorMode;
|
|
21
|
+
|
|
22
|
+
maxDebugDepth : Number;
|
|
23
|
+
maxDebugDistance : Number;
|
|
24
|
+
maxDebugError : Number;
|
|
25
|
+
|
|
26
|
+
getDebugColor : ( val: Number, target: Color ) => void;
|
|
27
|
+
|
|
28
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { TilesRenderer } from './TilesRenderer.js';
|
|
2
|
+
import { DebugTilesPlugin } from './plugins/DebugTilesPlugin.js';
|
|
3
|
+
|
|
4
|
+
export * from './plugins/DebugTilesPlugin.js';
|
|
5
|
+
|
|
6
|
+
const DEBUG_PLUGIN = Symbol( 'DEBUG_PLUGIN' );
|
|
7
|
+
export class DebugTilesRenderer extends TilesRenderer {
|
|
8
|
+
|
|
9
|
+
constructor( ...args ) {
|
|
10
|
+
|
|
11
|
+
super( ...args );
|
|
12
|
+
|
|
13
|
+
console.warn( 'DebugTilesRenderer: "DebugTilesRenderer" has been deprecated in favor of "DebugTilesPlugin".' );
|
|
14
|
+
|
|
15
|
+
this[ DEBUG_PLUGIN ] = new DebugTilesPlugin();
|
|
16
|
+
this.registerPlugin( this[ DEBUG_PLUGIN ] );
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
[
|
|
23
|
+
'displayBoxBounds',
|
|
24
|
+
'displaySphereBounds',
|
|
25
|
+
'displayRegionBounds',
|
|
26
|
+
'colorMode',
|
|
27
|
+
'customColorCallback',
|
|
28
|
+
'boxGroup',
|
|
29
|
+
'sphereGroup',
|
|
30
|
+
'regionGroup',
|
|
31
|
+
'maxDebugDepth',
|
|
32
|
+
'maxDebugDistance',
|
|
33
|
+
'maxDebugError',
|
|
34
|
+
'getDebugColor',
|
|
35
|
+
'extremeDebugDepth',
|
|
36
|
+
'extremeDebugError',
|
|
37
|
+
].forEach( key => {
|
|
38
|
+
|
|
39
|
+
Object.defineProperty(
|
|
40
|
+
DebugTilesRenderer.prototype,
|
|
41
|
+
key,
|
|
42
|
+
{
|
|
43
|
+
get() {
|
|
44
|
+
|
|
45
|
+
return this[ DEBUG_PLUGIN ][ key ];
|
|
46
|
+
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
set( v ) {
|
|
50
|
+
|
|
51
|
+
this[ DEBUG_PLUGIN ][ key ] = v;
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
} );
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { Group, Matrix4 } from 'three';
|
|
2
|
+
|
|
3
|
+
// Specialization of "Group" that only updates world matrices of children if
|
|
4
|
+
// the transform has changed since the last update and ignores the "force"
|
|
5
|
+
// parameter under the assumption that the children tiles will not move.
|
|
6
|
+
const tempMat = new Matrix4();
|
|
7
|
+
export class TilesGroup extends Group {
|
|
8
|
+
|
|
9
|
+
constructor( tilesRenderer ) {
|
|
10
|
+
|
|
11
|
+
super();
|
|
12
|
+
this.name = 'TilesRenderer.TilesGroup';
|
|
13
|
+
this.tilesRenderer = tilesRenderer;
|
|
14
|
+
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
raycast( raycaster, intersects ) {
|
|
18
|
+
|
|
19
|
+
// returning "false" ends raycast traversal
|
|
20
|
+
if ( this.tilesRenderer.optimizeRaycast ) {
|
|
21
|
+
|
|
22
|
+
this.tilesRenderer.raycast( raycaster, intersects );
|
|
23
|
+
return false;
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return true;
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
updateMatrixWorld( force ) {
|
|
32
|
+
|
|
33
|
+
if ( this.matrixAutoUpdate ) {
|
|
34
|
+
|
|
35
|
+
this.updateMatrix();
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
if ( this.matrixWorldNeedsUpdate || force ) {
|
|
40
|
+
|
|
41
|
+
if ( this.parent === null ) {
|
|
42
|
+
|
|
43
|
+
tempMat.copy( this.matrix );
|
|
44
|
+
|
|
45
|
+
} else {
|
|
46
|
+
|
|
47
|
+
tempMat.multiplyMatrices( this.parent.matrixWorld, this.matrix );
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
this.matrixWorldNeedsUpdate = false;
|
|
52
|
+
|
|
53
|
+
// check if the matrix changed relative to what it was.
|
|
54
|
+
const elA = tempMat.elements;
|
|
55
|
+
const elB = this.matrixWorld.elements;
|
|
56
|
+
let isDifferent = false;
|
|
57
|
+
for ( let i = 0; i < 16; i ++ ) {
|
|
58
|
+
|
|
59
|
+
const itemA = elA[ i ];
|
|
60
|
+
const itemB = elB[ i ];
|
|
61
|
+
const diff = Math.abs( itemA - itemB );
|
|
62
|
+
|
|
63
|
+
if ( diff > Number.EPSILON ) {
|
|
64
|
+
|
|
65
|
+
isDifferent = true;
|
|
66
|
+
break;
|
|
67
|
+
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if ( isDifferent ) {
|
|
73
|
+
|
|
74
|
+
this.matrixWorld.copy( tempMat );
|
|
75
|
+
|
|
76
|
+
// update children
|
|
77
|
+
// the children will not have to change unless the parent group has updated
|
|
78
|
+
const children = this.children;
|
|
79
|
+
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
80
|
+
|
|
81
|
+
children[ i ].updateMatrixWorld();
|
|
82
|
+
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { Box3, Camera, Vector2, Matrix4, WebGLRenderer, Object3D, LoadingManager, Sphere } from 'three';
|
|
2
|
+
import { Tile } from '../base/Tile';
|
|
3
|
+
import { TilesRendererBase } from '../base/TilesRendererBase';
|
|
4
|
+
import { TilesGroup } from './TilesGroup';
|
|
5
|
+
import { Ellipsoid } from './math/Ellipsoid';
|
|
6
|
+
|
|
7
|
+
export class TilesRenderer extends TilesRendererBase {
|
|
8
|
+
|
|
9
|
+
ellipsoid: Ellipsoid;
|
|
10
|
+
autoDisableRendererCulling : Boolean;
|
|
11
|
+
optimizeRaycast : Boolean;
|
|
12
|
+
|
|
13
|
+
manager : LoadingManager;
|
|
14
|
+
|
|
15
|
+
group : TilesGroup;
|
|
16
|
+
|
|
17
|
+
getBoundingBox( box : Box3 ) : Boolean;
|
|
18
|
+
getOrientedBoundingBox( box : Box3, matrix : Matrix4 ) : Boolean;
|
|
19
|
+
getBoundingSphere( sphere: Sphere ) : Boolean;
|
|
20
|
+
|
|
21
|
+
hasCamera( camera : Camera ) : Boolean;
|
|
22
|
+
setCamera( camera : Camera ) : Boolean;
|
|
23
|
+
deleteCamera( camera : Camera ) : Boolean;
|
|
24
|
+
|
|
25
|
+
setResolution( camera : Camera, x : Number, y : Number ) : Boolean;
|
|
26
|
+
setResolution( camera : Camera, resolution : Vector2 ) : Boolean;
|
|
27
|
+
setResolutionFromRenderer( camera : Camera, renderer : WebGLRenderer ) : Boolean;
|
|
28
|
+
|
|
29
|
+
forEachLoadedModel( callback : ( scene : Object3D, tile : Tile ) => void ) : void;
|
|
30
|
+
|
|
31
|
+
addEventListener( type: String, cb: ( e : Object ) => void );
|
|
32
|
+
hasEventListener( type: String, cb: ( e : Object ) => void );
|
|
33
|
+
removeEventListener( type: String, cb: ( e : Object ) => void );
|
|
34
|
+
dispatchEvent( e : Object );
|
|
35
|
+
|
|
36
|
+
setLatLonToYUp( lat : number, lon : number)
|
|
37
|
+
}
|