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,186 @@
|
|
|
1
|
+
import { EllipsoidRegion } from '../../../three/math/EllipsoidRegion.js';
|
|
2
|
+
import { Mesh, Vector3, MathUtils, BoxGeometry, BufferGeometry, EdgesGeometry, LineSegments, BufferAttribute } from 'three';
|
|
3
|
+
|
|
4
|
+
const _norm = new Vector3();
|
|
5
|
+
const _norm2 = new Vector3();
|
|
6
|
+
const _pos = new Vector3();
|
|
7
|
+
const _vec1 = new Vector3();
|
|
8
|
+
const _vec2 = new Vector3();
|
|
9
|
+
|
|
10
|
+
// Converts a geometry with a given set of groups rendering a smaller set of
|
|
11
|
+
// geometry into a new one with only the relevant triangles.
|
|
12
|
+
function toGroupGeometry( geometry ) {
|
|
13
|
+
|
|
14
|
+
// non indexed makes this process easier
|
|
15
|
+
geometry = geometry.toNonIndexed();
|
|
16
|
+
|
|
17
|
+
// prep the arrays
|
|
18
|
+
const { groups } = geometry;
|
|
19
|
+
const { position, normal } = geometry.attributes;
|
|
20
|
+
const newNorm = [];
|
|
21
|
+
const newPos = [];
|
|
22
|
+
|
|
23
|
+
// add the normals and the positions
|
|
24
|
+
for ( const group of groups ) {
|
|
25
|
+
|
|
26
|
+
const { start, count } = group;
|
|
27
|
+
for ( let i = start, l = ( start + count ); i < l; i ++ ) {
|
|
28
|
+
|
|
29
|
+
_vec1.fromBufferAttribute( position, i );
|
|
30
|
+
_vec2.fromBufferAttribute( normal, i );
|
|
31
|
+
|
|
32
|
+
newPos.push( ..._vec1 );
|
|
33
|
+
newNorm.push( ..._vec2 );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// set the new geometry
|
|
40
|
+
const newGeometry = new BufferGeometry();
|
|
41
|
+
newGeometry.setAttribute( 'position', new BufferAttribute( new Float32Array( newPos ), 3 ) );
|
|
42
|
+
newGeometry.setAttribute( 'normal', new BufferAttribute( new Float32Array( newNorm ), 3 ) );
|
|
43
|
+
|
|
44
|
+
return newGeometry;
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function getRegionGeometry( ellipsoidRegion ) {
|
|
49
|
+
|
|
50
|
+
// retrieve the relevant fields
|
|
51
|
+
const {
|
|
52
|
+
latStart = - Math.PI / 2, latEnd = Math.PI / 2,
|
|
53
|
+
lonStart = 0, lonEnd = 2 * Math.PI,
|
|
54
|
+
heightStart = 0, heightEnd = 0,
|
|
55
|
+
} = ellipsoidRegion;
|
|
56
|
+
|
|
57
|
+
// get the attributes
|
|
58
|
+
const geometry = new BoxGeometry( 1, 1, 1, 32, 32 );
|
|
59
|
+
const { normal, position } = geometry.attributes;
|
|
60
|
+
|
|
61
|
+
// clone the position buffer so we can reference it for normal calculations later
|
|
62
|
+
const refPosition = position.clone();
|
|
63
|
+
|
|
64
|
+
// perturb the position buffer into an ellipsoid region
|
|
65
|
+
for ( let i = 0, l = position.count; i < l; i ++ ) {
|
|
66
|
+
|
|
67
|
+
_pos.fromBufferAttribute( position, i );
|
|
68
|
+
|
|
69
|
+
const lat = MathUtils.mapLinear( _pos.x, - 0.5, 0.5, latStart, latEnd );
|
|
70
|
+
const lon = MathUtils.mapLinear( _pos.y, - 0.5, 0.5, lonStart, lonEnd );
|
|
71
|
+
|
|
72
|
+
let height = heightStart;
|
|
73
|
+
ellipsoidRegion.getCartographicToNormal( lat, lon, _norm );
|
|
74
|
+
if ( _pos.z < 0 ) {
|
|
75
|
+
|
|
76
|
+
height = heightEnd;
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
ellipsoidRegion.getCartographicToPosition( lat, lon, height, _pos );
|
|
80
|
+
position.setXYZ( i, ..._pos );
|
|
81
|
+
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// compute the vertex normals so we can get the edge normals
|
|
85
|
+
geometry.computeVertexNormals();
|
|
86
|
+
|
|
87
|
+
// compute the top and bottom cap normals
|
|
88
|
+
for ( let i = 0, l = refPosition.count; i < l; i ++ ) {
|
|
89
|
+
|
|
90
|
+
_pos.fromBufferAttribute( refPosition, i );
|
|
91
|
+
|
|
92
|
+
const lat = MathUtils.mapLinear( _pos.x, - 0.5, 0.5, latStart, latEnd );
|
|
93
|
+
const lon = MathUtils.mapLinear( _pos.y, - 0.5, 0.5, lonStart, lonEnd );
|
|
94
|
+
|
|
95
|
+
_norm.fromBufferAttribute( normal, i );
|
|
96
|
+
ellipsoidRegion.getCartographicToNormal( lat, lon, _norm2 );
|
|
97
|
+
|
|
98
|
+
// exclude the sides so we get sharp corners
|
|
99
|
+
if ( Math.abs( _norm.dot( _norm2 ) ) > 0.1 ) {
|
|
100
|
+
|
|
101
|
+
if ( _pos.z > 0 ) {
|
|
102
|
+
|
|
103
|
+
_norm2.multiplyScalar( - 1 );
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
normal.setXYZ( i, ..._norm2 );
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return geometry;
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export class EllipsoidRegionLineHelper extends LineSegments {
|
|
118
|
+
|
|
119
|
+
constructor( ellipsoidRegion = new EllipsoidRegion(), color = 0xffff00 ) {
|
|
120
|
+
|
|
121
|
+
super();
|
|
122
|
+
this.ellipsoidRegion = ellipsoidRegion;
|
|
123
|
+
this.material.color.set( color );
|
|
124
|
+
this.update();
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
update() {
|
|
129
|
+
|
|
130
|
+
const geometry = getRegionGeometry( this.ellipsoidRegion );
|
|
131
|
+
this.geometry.dispose();
|
|
132
|
+
this.geometry = new EdgesGeometry( geometry, 80 );
|
|
133
|
+
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
dispose() {
|
|
137
|
+
|
|
138
|
+
this.geometry.dispose();
|
|
139
|
+
this.material.dispose();
|
|
140
|
+
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
export class EllipsoidRegionHelper extends Mesh {
|
|
146
|
+
|
|
147
|
+
constructor( ellipsoidRegion = new EllipsoidRegion(), color = 0xffff00 ) {
|
|
148
|
+
|
|
149
|
+
super();
|
|
150
|
+
this.ellipsoidRegion = ellipsoidRegion;
|
|
151
|
+
this.material.color.set( color );
|
|
152
|
+
this.update();
|
|
153
|
+
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
update() {
|
|
157
|
+
|
|
158
|
+
// dispose of the existing geometry
|
|
159
|
+
this.geometry.dispose();
|
|
160
|
+
|
|
161
|
+
// retrieve the relevant fields
|
|
162
|
+
const geometry = getRegionGeometry( this.ellipsoidRegion );
|
|
163
|
+
const { lonStart, lonEnd } = this;
|
|
164
|
+
|
|
165
|
+
// exclude the side tris if the region wraps around
|
|
166
|
+
if ( lonEnd - lonStart >= 2 * Math.PI ) {
|
|
167
|
+
|
|
168
|
+
geometry.groups.splice( 2, 2 );
|
|
169
|
+
this.geometry = toGroupGeometry( geometry );
|
|
170
|
+
|
|
171
|
+
} else {
|
|
172
|
+
|
|
173
|
+
this.geometry = geometry;
|
|
174
|
+
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
dispose() {
|
|
180
|
+
|
|
181
|
+
this.geometry.dispose();
|
|
182
|
+
this.material.dispose();
|
|
183
|
+
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { LineSegments, BufferGeometry, Vector3, BufferAttribute, LineBasicMaterial } from 'three';
|
|
2
|
+
|
|
3
|
+
const _vector = new Vector3();
|
|
4
|
+
const axes = [ 'x', 'y', 'z' ];
|
|
5
|
+
export class SphereHelper extends LineSegments {
|
|
6
|
+
|
|
7
|
+
constructor( sphere, color = 0xffff00, angleSteps = 40 ) {
|
|
8
|
+
|
|
9
|
+
const geometry = new BufferGeometry();
|
|
10
|
+
const positions = [];
|
|
11
|
+
for ( let i = 0; i < 3; i ++ ) {
|
|
12
|
+
|
|
13
|
+
const axis1 = axes[ i ];
|
|
14
|
+
const axis2 = axes[ ( i + 1 ) % 3 ];
|
|
15
|
+
_vector.set( 0, 0, 0 );
|
|
16
|
+
|
|
17
|
+
for ( let a = 0; a < angleSteps; a ++ ) {
|
|
18
|
+
|
|
19
|
+
let angle;
|
|
20
|
+
angle = 2 * Math.PI * a / ( angleSteps - 1 );
|
|
21
|
+
_vector[ axis1 ] = Math.sin( angle );
|
|
22
|
+
_vector[ axis2 ] = Math.cos( angle );
|
|
23
|
+
|
|
24
|
+
positions.push( _vector.x, _vector.y, _vector.z );
|
|
25
|
+
|
|
26
|
+
angle = 2 * Math.PI * ( a + 1 ) / ( angleSteps - 1 );
|
|
27
|
+
_vector[ axis1 ] = Math.sin( angle );
|
|
28
|
+
_vector[ axis2 ] = Math.cos( angle );
|
|
29
|
+
|
|
30
|
+
positions.push( _vector.x, _vector.y, _vector.z );
|
|
31
|
+
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
geometry.setAttribute( 'position', new BufferAttribute( new Float32Array( positions ), 3 ) );
|
|
38
|
+
geometry.computeBoundingSphere();
|
|
39
|
+
|
|
40
|
+
super( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );
|
|
41
|
+
this.sphere = sphere;
|
|
42
|
+
this.type = 'SphereHelper';
|
|
43
|
+
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
updateMatrixWorld( force ) {
|
|
47
|
+
|
|
48
|
+
const sphere = this.sphere;
|
|
49
|
+
this.position.copy( sphere.center );
|
|
50
|
+
this.scale.setScalar( sphere.radius );
|
|
51
|
+
super.updateMatrixWorld( force );
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
}
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
# 3D Tiles React Components
|
|
2
|
+
|
|
3
|
+
Set of components for loading and rendering 3D Tiles in [@react-three/fiber](https://r3f.docs.pmnd.rs/).
|
|
4
|
+
|
|
5
|
+
**Examples**
|
|
6
|
+
|
|
7
|
+
[Basic example](https://nasa-ammos.github.io/3DTilesRendererJS/example/bundle/r3f/basic.html)
|
|
8
|
+
|
|
9
|
+
[Cesium Ion example](https://nasa-ammos.github.io/3DTilesRendererJS/example/bundle/r3f/ion.html)
|
|
10
|
+
|
|
11
|
+
[Google Photorealistic Tiles example](https://nasa-ammos.github.io/3DTilesRendererJS/example/bundle/r3f/globe.html)
|
|
12
|
+
|
|
13
|
+
# Use
|
|
14
|
+
|
|
15
|
+
## Simple
|
|
16
|
+
|
|
17
|
+
```jsx
|
|
18
|
+
import { TilesRenderer } from '3d-tiles-renderer/r3f';
|
|
19
|
+
|
|
20
|
+
const TILESET_URL = /* your tile set url */;
|
|
21
|
+
const cameraPosition = [ x, y, z ]; // Set the camera position so the tiles are visible
|
|
22
|
+
export default function App() {
|
|
23
|
+
return (
|
|
24
|
+
<Canvas camera={ { position: cameraPosition } }>
|
|
25
|
+
<TilesRenderer url={ TILESET_URL } />
|
|
26
|
+
</Canvas>
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## With Plugins, Controls, & Attribution
|
|
32
|
+
|
|
33
|
+
Basic set up for Google Photorealistic tiles, Globe controls, and an overlay for displaying data set attributions.
|
|
34
|
+
|
|
35
|
+
```jsx
|
|
36
|
+
import { TilesRenderer, TilesPlugin, GlobeControls, TilesAttributionOverlay } from '3d-tiles-renderer/r3f';
|
|
37
|
+
import { DebugTilesPlugin, GoogleCloudAuthPlugin } from '3d-tiles-renderer';
|
|
38
|
+
|
|
39
|
+
export default function App() {
|
|
40
|
+
return (
|
|
41
|
+
<Canvas camera={ { position: [ 0, 0, 1e8 ] } }>
|
|
42
|
+
<TilesRenderer>
|
|
43
|
+
<TilesPlugin plugin={ DebugTilesPlugin } displayBoxBounds={ true } />
|
|
44
|
+
<TilesPlugin plugin={ GoogleCloudAuthPlugin } args={ { apiToken: /* your api token here */ } } />
|
|
45
|
+
<GlobeControls />
|
|
46
|
+
<TilesAttributionOverlay />
|
|
47
|
+
</TilesRenderer>
|
|
48
|
+
</Canvas>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Cesium Ion & Google Cloud
|
|
54
|
+
|
|
55
|
+
Simplified wrappers for using the TilesRenderer with Cesium Ion and Google Cloud for Photorealistic Tiles. Use the `TilesAttributionOverlay` to display appropriate credits for the data sets.
|
|
56
|
+
|
|
57
|
+
```jsx
|
|
58
|
+
import { TilesRenderer, TilesPlugin } from '3d-tiles-renderer/r3f';
|
|
59
|
+
import { CesiumIonAuthPlugin, GoogleCloudAuthPlugin } from '3d-tiles-renderer';
|
|
60
|
+
|
|
61
|
+
function GoogleTilesRenderer( { children, apiToken, ...rest } ) {
|
|
62
|
+
return (
|
|
63
|
+
<TilesRenderer { ...rest } key={ apiToken }>
|
|
64
|
+
<TilesPlugin plugin={ GoogleCloudAuthPlugin } args={ { apiToken } } />
|
|
65
|
+
{ children }
|
|
66
|
+
</TilesRenderer>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function CesiumIonTilesRenderer( { children, apiToken, assetId, ...rest } ) {
|
|
71
|
+
return (
|
|
72
|
+
<TilesRenderer { ...rest } key={ apiToken + assetId }>
|
|
73
|
+
<TilesPlugin plugin={ CesiumIonAuthPlugin } args={ { apiToken, assetId } } />
|
|
74
|
+
{ children }
|
|
75
|
+
</TilesRenderer>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
# Components
|
|
81
|
+
|
|
82
|
+
## TilesRenderer
|
|
83
|
+
|
|
84
|
+
Wrapper for the three.js `TilesRenderer` class. Listening for events are specified with a camel-case property prefixed with `on`, such as `onModelLoad`, and all other properties are specified as individual properties with dashes being used to indicate nested properties. For example, `lruCache-minSize` is used to set `lruCache.minSize`.
|
|
85
|
+
|
|
86
|
+
```jsx
|
|
87
|
+
<TilesRenderer
|
|
88
|
+
url={ tilesetUrl }
|
|
89
|
+
|
|
90
|
+
// pass properties to apply to the tile set root object
|
|
91
|
+
group={ {
|
|
92
|
+
position: [ 0, 10, 0 ],
|
|
93
|
+
rotation: [ Math.PI / 2, 0, 0 ],
|
|
94
|
+
} }
|
|
95
|
+
|
|
96
|
+
// set options to the TilesRenderer object
|
|
97
|
+
errorTarget={ 6 }
|
|
98
|
+
errorThreshold={ 10 }
|
|
99
|
+
|
|
100
|
+
// set nested object options of the TilesRenderer
|
|
101
|
+
parseQueue-maxJobs={ 30 }
|
|
102
|
+
downloadQueue-maxJobs={ 10 }
|
|
103
|
+
lruCache-minBytesSize={ 0.25 * 1e6 }
|
|
104
|
+
lruCache-maxBytesSize={ 0.5 * 1e6 }
|
|
105
|
+
|
|
106
|
+
// event registration
|
|
107
|
+
onTileSetLoad={ onTileSetLoadCallback }
|
|
108
|
+
onModelLoad={ onModelLoadCallback }
|
|
109
|
+
/>
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## TilesPlugin
|
|
113
|
+
|
|
114
|
+
Plugins can be set as children of the TilesRenderer component to add additional functionality. TilePlugin components must be nested inside a TilesRenderer component. Constructor arguments are passed via the `args` parameter while local members can be passed via the regular properties. But note that depending on the plugin some properties cannot be changed after construction and initialization.
|
|
115
|
+
|
|
116
|
+
See the [PLUGINS documentation](https://github.com/NASA-AMMOS/3DTilesRendererJS/blob/master/PLUGINS.md) for docs on all avilable plugins.
|
|
117
|
+
|
|
118
|
+
```jsx
|
|
119
|
+
<TilesRenderer url={ tilesetUrl }>
|
|
120
|
+
<TilesPlugin
|
|
121
|
+
plugin={ PluginClassName }
|
|
122
|
+
args={ /* constructor arguments as array or object */ }
|
|
123
|
+
{ ...pluginProps }
|
|
124
|
+
/>
|
|
125
|
+
</TilesRenderer>
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
And a practical example of creating and using a plugin:
|
|
129
|
+
|
|
130
|
+
```jsx
|
|
131
|
+
<TilesRenderer url={ tilesetUrl } >
|
|
132
|
+
<TilesPlugin plugin={ GLTFExtensionsPlugin }
|
|
133
|
+
dracoLoader={ dracoLoader }
|
|
134
|
+
ktxLoader={ ktx2Loader }
|
|
135
|
+
autoDispose={ false }
|
|
136
|
+
{ /*
|
|
137
|
+
// alternatively the options can be passed via constructor arguments
|
|
138
|
+
// or a mix of both can be used.
|
|
139
|
+
args = { {
|
|
140
|
+
dracoLoader,
|
|
141
|
+
ktxLoader,
|
|
142
|
+
autoDispose: false,
|
|
143
|
+
} }
|
|
144
|
+
*/ }
|
|
145
|
+
/>
|
|
146
|
+
</TilesRenderer>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## Controls
|
|
150
|
+
|
|
151
|
+
These `EnvironmentControls` and `GlobeControls` classes have been wrapped as components to handle user-interaction. They will both be set to the `controls` react three fiber state field when in use. All properties on the original classes can be passed as properties:
|
|
152
|
+
|
|
153
|
+
```jsx
|
|
154
|
+
<>
|
|
155
|
+
<TilesRenderer url={ url } { ...props } />
|
|
156
|
+
<EnvironmentControls enableDamping={ true } enabled={ true } />
|
|
157
|
+
</>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
The `GlobeControls` component must be set as a child of the `TilesRenderer` component that is providing the ellipsoid to orbit around.
|
|
161
|
+
|
|
162
|
+
```jsx
|
|
163
|
+
<TilesRenderer url={ url } { ...props }>
|
|
164
|
+
<GlobeControls enableDamping={ true } />
|
|
165
|
+
</TilesRenderer>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## EastNorthUpFrame
|
|
169
|
+
|
|
170
|
+
The `EastNorthUpFrame` creates a root object that is centered on the provided point relative to the tile sets ellipsoid, specified via lat/lon/height and euler angle props and is used to place 3D objects relative to that point. It does not rotate the original tile set and must be a child of a `TilesRenderer` component.
|
|
171
|
+
|
|
172
|
+
It can be used to place markers on the surface of the ellipsoid, such as a cone for pointing to a location:
|
|
173
|
+
|
|
174
|
+
```jsx
|
|
175
|
+
<TilesRenderer url={ url } { ...props }>
|
|
176
|
+
{ /* ... */ }
|
|
177
|
+
<EastNorthUpFrame
|
|
178
|
+
{/* The latitude and longitude to place the frame at in radians */}
|
|
179
|
+
lat={ lat }
|
|
180
|
+
lon={ lon }
|
|
181
|
+
|
|
182
|
+
{/* The height above the ellipsoid to place the frame at in meters */}
|
|
183
|
+
height={ 100 }
|
|
184
|
+
|
|
185
|
+
{/*
|
|
186
|
+
The azimuth, elevation, and roll around the "north" axis, applied
|
|
187
|
+
in that order intrinsicly, in radians
|
|
188
|
+
*/}
|
|
189
|
+
az={ 0 }
|
|
190
|
+
el={ 0 }
|
|
191
|
+
roll={ 0 }
|
|
192
|
+
>
|
|
193
|
+
{/* Children are position relative to the east, north, up frame */}
|
|
194
|
+
<mesh rotation-x={ - Math.PI / 2 } scale={ 100 } position-z={ 50 }>
|
|
195
|
+
<coneGeometry args={ [ 0.5 ] } />
|
|
196
|
+
<meshStandardMaterial color={ 'red' } />
|
|
197
|
+
</mesh>
|
|
198
|
+
</EastNorthUpFrame>
|
|
199
|
+
</TilesRenderer>
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
## TilesAttributionOverlay
|
|
203
|
+
|
|
204
|
+
The `TilesAttributionOverlay` component must be embedded in a tile set and will automatically display the credits associated with the loaded data set.
|
|
205
|
+
|
|
206
|
+
```jsx
|
|
207
|
+
<TilesRenderer url={ url } { ...props }>
|
|
208
|
+
<TilesAttributionOverlay />
|
|
209
|
+
</TilesRenderer>
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## CompassGizmo
|
|
213
|
+
|
|
214
|
+
Adds a compass to the bottom right of the page that orients to "north" based on the camera position and orientation. Must be nested in a `TilesRenderer` component.
|
|
215
|
+
|
|
216
|
+
Any children passed into the class will replace the default red and white compass design with +Y pointing north and +X pointing east. The graphic children should fit within a volume from - 0.5 to 0.5 along all axes.
|
|
217
|
+
|
|
218
|
+
```jsx
|
|
219
|
+
<CompassGizmo
|
|
220
|
+
{/* Specifies whether the compass will render in '2d' or '3d' */}
|
|
221
|
+
mode={ '3d' }
|
|
222
|
+
|
|
223
|
+
{/* The size of the compass in pixels */}
|
|
224
|
+
scale={ 35 }
|
|
225
|
+
|
|
226
|
+
{/* The number pixels in margin to add relative to the bottom right of the screen */}
|
|
227
|
+
margin={ 10 }
|
|
228
|
+
|
|
229
|
+
{/* Whether to render the main scene */}
|
|
230
|
+
overrideRenderLoop={ true }
|
|
231
|
+
|
|
232
|
+
{/* Whether the gizmo is visible and rendering */}
|
|
233
|
+
visible={ true }
|
|
234
|
+
|
|
235
|
+
{/* Any remaining props including click events are passed through to the parent group */}
|
|
236
|
+
onClick={ () => console.log( 'compass clicked!' ) }
|
|
237
|
+
/>
|
|
238
|
+
```
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { forwardRef, useMemo, useEffect, useContext } from 'react';
|
|
2
|
+
import { useThree, useFrame } from '@react-three/fiber';
|
|
3
|
+
import { EnvironmentControls as EnvironmentControlsImpl } from '../../three/controls/EnvironmentControls.js';
|
|
4
|
+
import { GlobeControls as GlobeControlsImpl } from '../../three/controls/GlobeControls.js';
|
|
5
|
+
import { useShallowOptions } from '../utilities/useOptions.jsx';
|
|
6
|
+
import { TilesRendererContext } from './TilesRenderer.jsx';
|
|
7
|
+
|
|
8
|
+
// Add a base component implementation for both EnvironmentControls and GlobeControls
|
|
9
|
+
const ControlsBaseComponent = forwardRef( function ControlsBaseComponent( props, ref ) {
|
|
10
|
+
|
|
11
|
+
const { controlsConstructor, domElement, scene, camera, tilesRenderer, ...rest } = props;
|
|
12
|
+
|
|
13
|
+
const [ defaultCamera ] = useThree( state => [ state.camera ] );
|
|
14
|
+
const [ gl ] = useThree( state => [ state.gl ] );
|
|
15
|
+
const [ defaultScene ] = useThree( state => [ state.scene ] );
|
|
16
|
+
const [ invalidate ] = useThree( state => [ state.invalidate ] );
|
|
17
|
+
const [ get ] = useThree( state => [ state.get ] );
|
|
18
|
+
const [ set ] = useThree( state => [ state.set ] );
|
|
19
|
+
|
|
20
|
+
const defaultTilesRenderer = useContext( TilesRendererContext );
|
|
21
|
+
const appliedCamera = camera || defaultCamera || null;
|
|
22
|
+
const appliedScene = scene || defaultScene || null;
|
|
23
|
+
const appliedDomElement = domElement || gl.domElement || null;
|
|
24
|
+
const appliedTilesRenderer = tilesRenderer || defaultTilesRenderer || null;
|
|
25
|
+
|
|
26
|
+
// create a controls instance
|
|
27
|
+
const controls = useMemo( () => {
|
|
28
|
+
|
|
29
|
+
return new controlsConstructor();
|
|
30
|
+
|
|
31
|
+
}, [ controlsConstructor ] );
|
|
32
|
+
|
|
33
|
+
// assign / call the reference
|
|
34
|
+
useEffect( () => {
|
|
35
|
+
|
|
36
|
+
if ( ref ) {
|
|
37
|
+
|
|
38
|
+
if ( ref instanceof Function ) {
|
|
39
|
+
|
|
40
|
+
ref( controls );
|
|
41
|
+
|
|
42
|
+
} else {
|
|
43
|
+
|
|
44
|
+
ref.current = controls;
|
|
45
|
+
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
}, [ controls, ref ] );
|
|
51
|
+
|
|
52
|
+
// fire invalidate callbacks
|
|
53
|
+
useEffect( () => {
|
|
54
|
+
|
|
55
|
+
const callback = () => invalidate();
|
|
56
|
+
controls.addEventListener( 'change', callback );
|
|
57
|
+
controls.addEventListener( 'start', callback );
|
|
58
|
+
controls.addEventListener( 'end', callback );
|
|
59
|
+
return () => {
|
|
60
|
+
|
|
61
|
+
controls.removeEventListener( 'change', callback );
|
|
62
|
+
controls.removeEventListener( 'start', callback );
|
|
63
|
+
controls.removeEventListener( 'end', callback );
|
|
64
|
+
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
}, [ controls, invalidate ] );
|
|
68
|
+
|
|
69
|
+
// assign the camera
|
|
70
|
+
useEffect( () => {
|
|
71
|
+
|
|
72
|
+
controls.setCamera( appliedCamera );
|
|
73
|
+
|
|
74
|
+
}, [ controls, appliedCamera ] );
|
|
75
|
+
|
|
76
|
+
// assign the scene
|
|
77
|
+
useEffect( () => {
|
|
78
|
+
|
|
79
|
+
controls.setScene( appliedScene );
|
|
80
|
+
|
|
81
|
+
}, [ controls, appliedScene ] );
|
|
82
|
+
|
|
83
|
+
// assign the tiles renderer
|
|
84
|
+
useEffect( () => {
|
|
85
|
+
|
|
86
|
+
controls.setTilesRenderer( appliedTilesRenderer );
|
|
87
|
+
|
|
88
|
+
}, [ controls, appliedTilesRenderer ] );
|
|
89
|
+
|
|
90
|
+
// attach to the dom element
|
|
91
|
+
useEffect( () => {
|
|
92
|
+
|
|
93
|
+
controls.attach( appliedDomElement );
|
|
94
|
+
return () => {
|
|
95
|
+
|
|
96
|
+
controls.detach();
|
|
97
|
+
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
}, [ controls, appliedDomElement ] );
|
|
101
|
+
|
|
102
|
+
// set the controls for global use
|
|
103
|
+
useEffect( () => {
|
|
104
|
+
|
|
105
|
+
const old = get().controls;
|
|
106
|
+
set( { controls } );
|
|
107
|
+
return () => set( { controls: old } );
|
|
108
|
+
|
|
109
|
+
}, [ controls, get, set ] );
|
|
110
|
+
|
|
111
|
+
// update the controls with a priority of - 1 so it happens before tiles renderer update
|
|
112
|
+
useFrame( () => {
|
|
113
|
+
|
|
114
|
+
controls.update();
|
|
115
|
+
|
|
116
|
+
}, - 1 );
|
|
117
|
+
|
|
118
|
+
useShallowOptions( controls, rest );
|
|
119
|
+
|
|
120
|
+
} );
|
|
121
|
+
|
|
122
|
+
export function EnvironmentControls( props ) {
|
|
123
|
+
|
|
124
|
+
return <ControlsBaseComponent { ...props } controlsConstructor={ EnvironmentControlsImpl } />;
|
|
125
|
+
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export function GlobeControls( props ) {
|
|
129
|
+
|
|
130
|
+
return <ControlsBaseComponent { ...props } controlsConstructor={ GlobeControlsImpl } />;
|
|
131
|
+
|
|
132
|
+
}
|