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,178 @@
|
|
|
1
|
+
import { Matrix4, Ray, Vector3, REVISION } from 'three';
|
|
2
|
+
|
|
3
|
+
// In three.js r165 and higher raycast traversal can be ended early
|
|
4
|
+
const REVISION_LESS_165 = parseInt( REVISION ) < 165;
|
|
5
|
+
const _mat = new Matrix4();
|
|
6
|
+
const _localRay = new Ray();
|
|
7
|
+
const _vec = new Vector3();
|
|
8
|
+
const _hitArray = [];
|
|
9
|
+
|
|
10
|
+
function distanceSort( a, b ) {
|
|
11
|
+
|
|
12
|
+
return a.distance - b.distance;
|
|
13
|
+
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function intersectTileScene( tile, raycaster, renderer, intersects ) {
|
|
17
|
+
|
|
18
|
+
const { scene } = tile.cached;
|
|
19
|
+
if ( REVISION_LESS_165 ) {
|
|
20
|
+
|
|
21
|
+
// Don't intersect the box3 helpers because those are used for debugging
|
|
22
|
+
scene.traverse( c => {
|
|
23
|
+
|
|
24
|
+
// We set the default raycast function to empty so three.js doesn't automatically cast against it
|
|
25
|
+
Object.getPrototypeOf( c ).raycast.call( c, raycaster, intersects );
|
|
26
|
+
|
|
27
|
+
} );
|
|
28
|
+
|
|
29
|
+
} else {
|
|
30
|
+
|
|
31
|
+
const didRaycast = renderer.invokeOnePlugin( plugin => plugin.raycastTile && plugin.raycastTile( tile, scene, raycaster, intersects ) );
|
|
32
|
+
if ( ! didRaycast ) {
|
|
33
|
+
|
|
34
|
+
raycaster.intersectObject( scene, true, intersects );
|
|
35
|
+
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function intersectTileSceneFirstHist( tile, raycaster, renderer ) {
|
|
43
|
+
|
|
44
|
+
intersectTileScene( tile, raycaster, renderer, _hitArray );
|
|
45
|
+
_hitArray.sort( distanceSort );
|
|
46
|
+
|
|
47
|
+
const hit = _hitArray[ 0 ] || null;
|
|
48
|
+
_hitArray.length = 0;
|
|
49
|
+
return hit;
|
|
50
|
+
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Returns the closest hit when traversing the tree
|
|
54
|
+
export function raycastTraverseFirstHit( renderer, tile, raycaster, localRay = null ) {
|
|
55
|
+
|
|
56
|
+
const { group, activeTiles } = renderer;
|
|
57
|
+
renderer.ensureChildrenArePreprocessed( tile );
|
|
58
|
+
|
|
59
|
+
// get the ray in the local group frame
|
|
60
|
+
if ( localRay === null ) {
|
|
61
|
+
|
|
62
|
+
localRay = _localRay;
|
|
63
|
+
_mat.copy( group.matrixWorld ).invert();
|
|
64
|
+
localRay.copy( raycaster.ray ).applyMatrix4( _mat );
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// get a set of intersections so we intersect the nearest one first
|
|
69
|
+
const array = [];
|
|
70
|
+
const children = tile.children;
|
|
71
|
+
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
72
|
+
|
|
73
|
+
const child = children[ i ];
|
|
74
|
+
if ( ! child.__used ) {
|
|
75
|
+
|
|
76
|
+
continue;
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// track the tile and hit distance for sorting
|
|
81
|
+
const boundingVolume = child.cached.boundingVolume;
|
|
82
|
+
if ( boundingVolume.intersectRay( localRay, _vec ) !== null ) {
|
|
83
|
+
|
|
84
|
+
_vec.applyMatrix4( group.matrixWorld );
|
|
85
|
+
array.push( {
|
|
86
|
+
distance: _vec.distanceToSquared( raycaster.ray.origin ),
|
|
87
|
+
tile: child,
|
|
88
|
+
} );
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// sort them by ascending distance
|
|
95
|
+
array.sort( distanceSort );
|
|
96
|
+
|
|
97
|
+
// If the root is active make sure we've checked it
|
|
98
|
+
let bestHit = null;
|
|
99
|
+
let bestHitDistSq = Infinity;
|
|
100
|
+
if ( activeTiles.has( tile ) ) {
|
|
101
|
+
|
|
102
|
+
const hit = intersectTileSceneFirstHist( tile, raycaster, renderer );
|
|
103
|
+
if ( hit ) {
|
|
104
|
+
|
|
105
|
+
bestHit = hit;
|
|
106
|
+
bestHitDistSq = hit.distance * hit.distance;
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// traverse until we find the best hit and early out if a tile bounds
|
|
113
|
+
// couldn't possible include a best hit
|
|
114
|
+
for ( let i = 0, l = array.length; i < l; i ++ ) {
|
|
115
|
+
|
|
116
|
+
const data = array[ i ];
|
|
117
|
+
const boundingVolumeDistSq = data.distance;
|
|
118
|
+
const tile = data.tile;
|
|
119
|
+
if ( boundingVolumeDistSq > bestHitDistSq ) {
|
|
120
|
+
|
|
121
|
+
break;
|
|
122
|
+
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const hit = raycastTraverseFirstHit( renderer, tile, raycaster, localRay );
|
|
126
|
+
if ( hit ) {
|
|
127
|
+
|
|
128
|
+
const hitDistSq = hit.distance * hit.distance;
|
|
129
|
+
if ( hitDistSq < bestHitDistSq ) {
|
|
130
|
+
|
|
131
|
+
bestHit = hit;
|
|
132
|
+
bestHitDistSq = hitDistSq;
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return bestHit;
|
|
141
|
+
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export function raycastTraverse( renderer, tile, raycaster, intersects, localRay = null ) {
|
|
145
|
+
|
|
146
|
+
const { group, activeTiles } = renderer;
|
|
147
|
+
const { boundingVolume } = tile.cached;
|
|
148
|
+
renderer.ensureChildrenArePreprocessed( tile );
|
|
149
|
+
|
|
150
|
+
// get the ray in the local group frame
|
|
151
|
+
if ( localRay === null ) {
|
|
152
|
+
|
|
153
|
+
localRay = _localRay;
|
|
154
|
+
_mat.copy( group.matrixWorld ).invert();
|
|
155
|
+
localRay.copy( raycaster.ray ).applyMatrix4( _mat );
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if ( ! tile.__used || ! boundingVolume.intersectsRay( localRay ) ) {
|
|
160
|
+
|
|
161
|
+
return;
|
|
162
|
+
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if ( activeTiles.has( tile ) ) {
|
|
166
|
+
|
|
167
|
+
intersectTileScene( tile, raycaster, renderer, intersects );
|
|
168
|
+
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const children = tile.children;
|
|
172
|
+
for ( let i = 0, l = children.length; i < l; i ++ ) {
|
|
173
|
+
|
|
174
|
+
raycastTraverse( renderer, children[ i ], raycaster, intersects, localRay );
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TilesRenderer } from '../TilesRenderer';
|
|
2
|
+
import { DebugTilesRenderer } from '../DebugTilesRenderer';
|
|
3
|
+
|
|
4
|
+
export class CesiumIonTilesRenderer extends TilesRenderer {
|
|
5
|
+
|
|
6
|
+
constructor( ionAssetId: String, ionAccessToken: String );
|
|
7
|
+
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class DebugCesiumIonTilesRenderer extends DebugTilesRenderer {
|
|
11
|
+
|
|
12
|
+
constructor( ionAssetId: String, ionAccessToken: String );
|
|
13
|
+
|
|
14
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TilesRenderer } from '../TilesRenderer.js';
|
|
2
|
+
import { DebugTilesRenderer } from '../DebugTilesRenderer.js';
|
|
3
|
+
import { CesiumIonAuthPlugin } from '../plugins/CesiumIonAuthPlugin.js';
|
|
4
|
+
|
|
5
|
+
const CesiumIonTilesRendererMixin = base => class extends base {
|
|
6
|
+
|
|
7
|
+
constructor( ionAssetId, ionAccessToken ) {
|
|
8
|
+
|
|
9
|
+
super();
|
|
10
|
+
|
|
11
|
+
this.registerPlugin( new CesiumIonAuthPlugin( { apiToken: ionAccessToken, assetId: ionAssetId } ) );
|
|
12
|
+
console.warn( 'CesiumIonTilesRenderer: Class has been deprecated. Use "TilesRenderer" with "CesiumIonAuthPlugin" instead.' );
|
|
13
|
+
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export const CesiumIonTilesRenderer = CesiumIonTilesRendererMixin( TilesRenderer );
|
|
19
|
+
export const DebugCesiumIonTilesRenderer = CesiumIonTilesRendererMixin( DebugTilesRenderer );
|
|
20
|
+
|
|
21
|
+
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { TilesRenderer } from '../TilesRenderer';
|
|
2
|
+
import { DebugTilesRenderer } from '../DebugTilesRenderer';
|
|
3
|
+
import { Ellipsoid } from '../math/Ellipsoid';
|
|
4
|
+
|
|
5
|
+
export class GoogleTilesRenderer extends TilesRenderer {
|
|
6
|
+
|
|
7
|
+
ellipsoid: Ellipsoid;
|
|
8
|
+
|
|
9
|
+
constructor( apiKey: String );
|
|
10
|
+
getCreditsString(): String;
|
|
11
|
+
setLatLonToYUp( lat: Number, lon: Number ): void;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class DebugGoogleTilesRenderer extends DebugTilesRenderer {
|
|
16
|
+
|
|
17
|
+
ellipsoid: Ellipsoid;
|
|
18
|
+
|
|
19
|
+
constructor( apiKey: String );
|
|
20
|
+
getCreditsString(): String;
|
|
21
|
+
setLatLonToYUp( lat: Number, lon: Number ): void;
|
|
22
|
+
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export class GooglePhotorealisticTilesRenderer extends TilesRenderer {
|
|
26
|
+
|
|
27
|
+
ellipsoid: Ellipsoid;
|
|
28
|
+
|
|
29
|
+
constructor( url?: string );
|
|
30
|
+
getCreditsString(): String;
|
|
31
|
+
setLatLonToYUp( lat: Number, lon: Number ): void;
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class DebugGooglePhotorealisticTilesRenderer extends DebugTilesRenderer {
|
|
36
|
+
|
|
37
|
+
ellipsoid: Ellipsoid;
|
|
38
|
+
|
|
39
|
+
constructor( url?: string );
|
|
40
|
+
getCreditsString(): String;
|
|
41
|
+
setLatLonToYUp( lat: Number, lon: Number ): void;
|
|
42
|
+
|
|
43
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { TilesRenderer } from '../TilesRenderer.js';
|
|
2
|
+
import { DebugTilesRenderer } from '../DebugTilesRenderer.js';
|
|
3
|
+
import { GoogleCloudAuthPlugin } from '../plugins/GoogleCloudAuthPlugin.js';
|
|
4
|
+
|
|
5
|
+
const API_ORIGIN = 'https://tile.googleapis.com';
|
|
6
|
+
const TILE_URL = `${ API_ORIGIN }/v1/3dtiles/root.json`;
|
|
7
|
+
|
|
8
|
+
const GooglePhotorealisticTilesRendererMixin = base => class extends base {
|
|
9
|
+
|
|
10
|
+
constructor( url = TILE_URL ) {
|
|
11
|
+
|
|
12
|
+
super( url );
|
|
13
|
+
|
|
14
|
+
console.warn( 'GooglePhotorealisticTilesRenderer: Class has been deprecated. Use "TilesRenderer" with "GoogleCloudAuthPlugin" instead.' );
|
|
15
|
+
|
|
16
|
+
this.parseQueue.maxJobs = 10;
|
|
17
|
+
this.downloadQueue.maxJobs = 30;
|
|
18
|
+
this.errorTarget = 40;
|
|
19
|
+
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
getCreditsString() {
|
|
23
|
+
|
|
24
|
+
console.warn( 'GooglePhotorealisticTilesRenderer: "getCreditsString" function is deprecated. Use "getAttributions", instead.' );
|
|
25
|
+
return this.getAttributions()[ 0 ].value;
|
|
26
|
+
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const GoogleTilesRendererMixin = base => class extends GooglePhotorealisticTilesRendererMixin( base ) {
|
|
32
|
+
|
|
33
|
+
constructor( apiToken, url ) {
|
|
34
|
+
|
|
35
|
+
super( url );
|
|
36
|
+
this.registerPlugin( new GoogleCloudAuthPlugin( { apiToken } ) );
|
|
37
|
+
|
|
38
|
+
console.warn( 'GoogleTilesRenderer: Class has been deprecated. Use "GoogleCloudAuthPlugin" instead.' );
|
|
39
|
+
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export const GoogleTilesRenderer = GoogleTilesRendererMixin( TilesRenderer );
|
|
45
|
+
export const DebugGoogleTilesRenderer = GoogleTilesRendererMixin( DebugTilesRenderer );
|
|
46
|
+
|
|
47
|
+
export const GooglePhotorealisticTilesRenderer = GooglePhotorealisticTilesRendererMixin( TilesRenderer );
|
|
48
|
+
export const DebugGooglePhotorealisticTilesRenderer = GooglePhotorealisticTilesRendererMixin( DebugTilesRenderer );
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { estimateBytesUsed as _estimateBytesUsed } from 'three/examples/jsm/utils/BufferGeometryUtils.js';
|
|
2
|
+
import * as THREE from 'three';
|
|
3
|
+
|
|
4
|
+
// Returns the estimated number of bytes used by the object
|
|
5
|
+
export function estimateBytesUsed( object ) {
|
|
6
|
+
|
|
7
|
+
// NOTE: This is for backwards compatibility and should be removed later
|
|
8
|
+
const { TextureUtils } = THREE;
|
|
9
|
+
if ( ! TextureUtils ) {
|
|
10
|
+
|
|
11
|
+
return 0;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const dedupeSet = new Set();
|
|
16
|
+
|
|
17
|
+
let totalBytes = 0;
|
|
18
|
+
object.traverse( c => {
|
|
19
|
+
|
|
20
|
+
// get geometry bytes
|
|
21
|
+
if ( c.geometry && ! dedupeSet.has( c.geometry ) ) {
|
|
22
|
+
|
|
23
|
+
totalBytes += _estimateBytesUsed( c.geometry );
|
|
24
|
+
dedupeSet.add( c.geometry );
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// get material bytes
|
|
29
|
+
if ( c.material ) {
|
|
30
|
+
|
|
31
|
+
const material = c.material;
|
|
32
|
+
for ( const key in material ) {
|
|
33
|
+
|
|
34
|
+
const value = material[ key ];
|
|
35
|
+
if ( value && value.isTexture && ! dedupeSet.has( value ) ) {
|
|
36
|
+
|
|
37
|
+
const { format, type, image } = value;
|
|
38
|
+
const { width, height } = image;
|
|
39
|
+
const bytes = TextureUtils.getByteLength( width, height, format, type );
|
|
40
|
+
totalBytes += value.generateMipmaps ? bytes * 4 / 3 : bytes;
|
|
41
|
+
|
|
42
|
+
dedupeSet.add( value );
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
} );
|
|
51
|
+
|
|
52
|
+
return totalBytes;
|
|
53
|
+
|
|
54
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export class BatchTable {
|
|
2
|
+
|
|
3
|
+
count : Number;
|
|
4
|
+
|
|
5
|
+
constructor(
|
|
6
|
+
buffer : ArrayBuffer,
|
|
7
|
+
count : Number,
|
|
8
|
+
start : Number,
|
|
9
|
+
headerLength : Number,
|
|
10
|
+
binLength : Number
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
getKeys() : Array< String >;
|
|
14
|
+
|
|
15
|
+
getDataFromId(
|
|
16
|
+
id: Number,
|
|
17
|
+
target?: Object
|
|
18
|
+
) : Object;
|
|
19
|
+
|
|
20
|
+
getPropertyArray(
|
|
21
|
+
key: String,
|
|
22
|
+
) : Number | String | ArrayBufferView;
|
|
23
|
+
|
|
24
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { BatchTableHierarchyExtension } from './BatchTableHierarchyExtension.js';
|
|
2
|
+
import { FeatureTable } from './FeatureTable.js';
|
|
3
|
+
|
|
4
|
+
export class BatchTable extends FeatureTable {
|
|
5
|
+
|
|
6
|
+
get batchSize() {
|
|
7
|
+
|
|
8
|
+
console.warn( 'BatchTable.batchSize has been deprecated and replaced with BatchTable.count.' );
|
|
9
|
+
return this.count;
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
constructor( buffer, count, start, headerLength, binLength ) {
|
|
14
|
+
|
|
15
|
+
super( buffer, start, headerLength, binLength );
|
|
16
|
+
this.count = count;
|
|
17
|
+
|
|
18
|
+
this.extensions = {};
|
|
19
|
+
const extensions = this.header.extensions;
|
|
20
|
+
if ( extensions ) {
|
|
21
|
+
|
|
22
|
+
if ( extensions[ '3DTILES_batch_table_hierarchy' ] ) {
|
|
23
|
+
|
|
24
|
+
this.extensions[ '3DTILES_batch_table_hierarchy' ] = new BatchTableHierarchyExtension( this );
|
|
25
|
+
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
getData( key, componentType = null, type = null ) {
|
|
33
|
+
|
|
34
|
+
console.warn( 'BatchTable: BatchTable.getData is deprecated. Use BatchTable.getDataFromId to get all' +
|
|
35
|
+
'properties for an id or BatchTable.getPropertyArray for getting an array of value for a property.' );
|
|
36
|
+
return super.getData( key, this.count, componentType, type );
|
|
37
|
+
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
getDataFromId( id, target = {} ) {
|
|
41
|
+
|
|
42
|
+
if ( id < 0 || id >= this.count ) {
|
|
43
|
+
|
|
44
|
+
throw new Error( `BatchTable: id value "${ id }" out of bounds for "${ this.count }" features number.` );
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
for ( const key of this.getKeys() ) {
|
|
49
|
+
|
|
50
|
+
if ( key !== 'extensions' ) {
|
|
51
|
+
|
|
52
|
+
target[ key ] = super.getData( key, this.count )[ id ];
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
for ( const extensionName in this.extensions ) {
|
|
59
|
+
|
|
60
|
+
const extension = this.extensions[ extensionName ];
|
|
61
|
+
|
|
62
|
+
if ( extension.getDataFromId instanceof Function ) {
|
|
63
|
+
|
|
64
|
+
target[ extensionName ] = target[ extensionName ] || {};
|
|
65
|
+
extension.getDataFromId( id, target[ extensionName ] );
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return target;
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
getPropertyArray( key ) {
|
|
76
|
+
|
|
77
|
+
return super.getData( key, this.count );
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { parseBinArray } from './FeatureTable.js';
|
|
2
|
+
|
|
3
|
+
export class BatchTableHierarchyExtension {
|
|
4
|
+
|
|
5
|
+
constructor( batchTable ) {
|
|
6
|
+
|
|
7
|
+
this.batchTable = batchTable;
|
|
8
|
+
|
|
9
|
+
const extensionHeader = batchTable.header.extensions[ '3DTILES_batch_table_hierarchy' ];
|
|
10
|
+
|
|
11
|
+
this.classes = extensionHeader.classes;
|
|
12
|
+
for ( const classDef of this.classes ) {
|
|
13
|
+
|
|
14
|
+
const instances = classDef.instances;
|
|
15
|
+
for ( const property in instances ) {
|
|
16
|
+
|
|
17
|
+
classDef.instances[ property ] = this._parseProperty( instances[ property ], classDef.length, property );
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
this.instancesLength = extensionHeader.instancesLength;
|
|
24
|
+
|
|
25
|
+
this.classIds = this._parseProperty( extensionHeader.classIds, this.instancesLength, 'classIds' );
|
|
26
|
+
|
|
27
|
+
if ( extensionHeader.parentCounts ) {
|
|
28
|
+
|
|
29
|
+
this.parentCounts = this._parseProperty( extensionHeader.parentCounts, this.instancesLength, 'parentCounts' );
|
|
30
|
+
|
|
31
|
+
} else {
|
|
32
|
+
|
|
33
|
+
this.parentCounts = new Array( this.instancesLength ).fill( 1 );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if ( extensionHeader.parentIds ) {
|
|
38
|
+
|
|
39
|
+
const parentIdsLength = this.parentCounts.reduce( ( a, b ) => a + b, 0 );
|
|
40
|
+
this.parentIds = this._parseProperty( extensionHeader.parentIds, parentIdsLength, 'parentIds' );
|
|
41
|
+
|
|
42
|
+
} else {
|
|
43
|
+
|
|
44
|
+
this.parentIds = null;
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
this.instancesIds = [];
|
|
49
|
+
const classCounter = {};
|
|
50
|
+
for ( const classId of this.classIds ) {
|
|
51
|
+
|
|
52
|
+
classCounter[ classId ] = classCounter[ classId ] ?? 0;
|
|
53
|
+
this.instancesIds.push( classCounter[ classId ] );
|
|
54
|
+
classCounter[ classId ] ++;
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
_parseProperty( property, propertyLength, propertyName ) {
|
|
61
|
+
|
|
62
|
+
if ( Array.isArray( property ) ) {
|
|
63
|
+
|
|
64
|
+
return property;
|
|
65
|
+
|
|
66
|
+
} else {
|
|
67
|
+
|
|
68
|
+
const { buffer, binOffset } = this.batchTable;
|
|
69
|
+
|
|
70
|
+
const byteOffset = property.byteOffset;
|
|
71
|
+
const componentType = property.componentType || 'UNSIGNED_SHORT';
|
|
72
|
+
|
|
73
|
+
const arrayStart = binOffset + byteOffset;
|
|
74
|
+
|
|
75
|
+
return parseBinArray( buffer, arrayStart, propertyLength, 'SCALAR', componentType, propertyName );
|
|
76
|
+
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
getDataFromId( id, target = {} ) {
|
|
82
|
+
|
|
83
|
+
// Get properties inherited from parents
|
|
84
|
+
|
|
85
|
+
const parentCount = this.parentCounts[ id ];
|
|
86
|
+
|
|
87
|
+
if ( this.parentIds && parentCount > 0 ) {
|
|
88
|
+
|
|
89
|
+
let parentIdsOffset = 0;
|
|
90
|
+
for ( let i = 0; i < id; i ++ ) {
|
|
91
|
+
|
|
92
|
+
parentIdsOffset += this.parentCounts[ i ];
|
|
93
|
+
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
for ( let i = 0; i < parentCount; i ++ ) {
|
|
97
|
+
|
|
98
|
+
const parentId = this.parentIds[ parentIdsOffset + i ];
|
|
99
|
+
if ( parentId !== id ) {
|
|
100
|
+
|
|
101
|
+
this.getDataFromId( parentId, target );
|
|
102
|
+
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Get properties proper to this instance
|
|
110
|
+
|
|
111
|
+
const classId = this.classIds[ id ];
|
|
112
|
+
const instances = this.classes[ classId ].instances;
|
|
113
|
+
const className = this.classes[ classId ].name;
|
|
114
|
+
const instanceId = this.instancesIds[ id ];
|
|
115
|
+
|
|
116
|
+
for ( const key in instances ) {
|
|
117
|
+
|
|
118
|
+
target[ className ] = target[ className ] || {};
|
|
119
|
+
target[ className ][ key ] = instances[ key ][ instanceId ];
|
|
120
|
+
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return target;
|
|
124
|
+
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
interface FeatureTableHeader {
|
|
2
|
+
|
|
3
|
+
extensions?: Object;
|
|
4
|
+
extras?: any;
|
|
5
|
+
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export class FeatureTable {
|
|
9
|
+
|
|
10
|
+
header: FeatureTableHeader;
|
|
11
|
+
|
|
12
|
+
constructor(
|
|
13
|
+
buffer : ArrayBuffer,
|
|
14
|
+
start : Number,
|
|
15
|
+
headerLength : Number,
|
|
16
|
+
binLength : Number
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
getKeys() : Array< String >;
|
|
20
|
+
|
|
21
|
+
getData(
|
|
22
|
+
key : String,
|
|
23
|
+
count : Number,
|
|
24
|
+
defaultComponentType? : String | null,
|
|
25
|
+
defaultType? : String | null
|
|
26
|
+
) : Number | String | ArrayBufferView;
|
|
27
|
+
|
|
28
|
+
getBuffer( byteOffset : Number, byteLength : Number ) : ArrayBuffer;
|
|
29
|
+
|
|
30
|
+
}
|