easy-three-utils 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/package.json +12 -0
  2. package/src/common/index.ts +24 -0
  3. package/src/common/useLine2.ts +87 -0
  4. package/src/common/useLoader.ts +184 -0
  5. package/src/common/useLocationCalculator.ts +145 -0
  6. package/src/common/useMark.ts +42 -0
  7. package/src/common/useTween.ts +86 -0
  8. package/src/core/basic/camera.ts +28 -0
  9. package/src/core/basic/clock.ts +11 -0
  10. package/src/core/basic/control.ts +32 -0
  11. package/src/core/basic/index.ts +35 -0
  12. package/src/core/basic/labelRenderer.ts +26 -0
  13. package/src/core/basic/light.ts +63 -0
  14. package/src/core/basic/renderer.ts +37 -0
  15. package/src/core/basic/scene.ts +11 -0
  16. package/src/core/basic/stats.ts +16 -0
  17. package/src/core/event.ts +74 -0
  18. package/src/core/index.ts +11 -0
  19. package/src/core/main.ts +389 -0
  20. package/src/draco/README.md +32 -0
  21. package/src/draco/draco_decoder.js +34 -0
  22. package/src/draco/draco_decoder.wasm +0 -0
  23. package/src/draco/draco_encoder.js +33 -0
  24. package/src/draco/draco_wasm_wrapper.js +117 -0
  25. package/src/draco/gltf/draco_decoder.js +33 -0
  26. package/src/draco/gltf/draco_decoder.wasm +0 -0
  27. package/src/draco/gltf/draco_encoder.js +33 -0
  28. package/src/draco/gltf/draco_wasm_wrapper.js +116 -0
  29. package/src/tileRenderer/base/Tile.d.ts +50 -0
  30. package/src/tileRenderer/base/TileBase.d.ts +76 -0
  31. package/src/tileRenderer/base/TileInternal.d.ts +36 -0
  32. package/src/tileRenderer/base/TilesRendererBase.d.ts +35 -0
  33. package/src/tileRenderer/base/TilesRendererBase.js +847 -0
  34. package/src/tileRenderer/base/Tileset.d.ts +66 -0
  35. package/src/tileRenderer/base/constants.d.ts +6 -0
  36. package/src/tileRenderer/base/constants.js +16 -0
  37. package/src/tileRenderer/base/loaders/B3DMLoaderBase.d.ts +18 -0
  38. package/src/tileRenderer/base/loaders/B3DMLoaderBase.js +85 -0
  39. package/src/tileRenderer/base/loaders/CMPTLoaderBase.d.ts +22 -0
  40. package/src/tileRenderer/base/loaders/CMPTLoaderBase.js +61 -0
  41. package/src/tileRenderer/base/loaders/I3DMLoaderBase.d.ts +21 -0
  42. package/src/tileRenderer/base/loaders/I3DMLoaderBase.js +130 -0
  43. package/src/tileRenderer/base/loaders/LoaderBase.d.ts +10 -0
  44. package/src/tileRenderer/base/loaders/LoaderBase.js +73 -0
  45. package/src/tileRenderer/base/loaders/PNTSLoaderBase.d.ts +17 -0
  46. package/src/tileRenderer/base/loaders/PNTSLoaderBase.js +82 -0
  47. package/src/tileRenderer/base/plugins/ImplicitTilingPlugin.js +12 -0
  48. package/src/tileRenderer/base/traverseFunctions.js +468 -0
  49. package/src/tileRenderer/gltf.js +144 -0
  50. package/src/tileRenderer/index.d.ts +41 -0
  51. package/src/tileRenderer/index.js +44 -0
  52. package/src/tileRenderer/plugins/README.md +578 -0
  53. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.d.ts +2 -0
  54. package/src/tileRenderer/plugins/base/ImplicitTilingPlugin.js +84 -0
  55. package/src/tileRenderer/plugins/base/SUBTREELoader.js +876 -0
  56. package/src/tileRenderer/plugins/index.d.ts +17 -0
  57. package/src/tileRenderer/plugins/index.js +17 -0
  58. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.d.ts +9 -0
  59. package/src/tileRenderer/plugins/three/CesiumIonAuthPlugin.js +175 -0
  60. package/src/tileRenderer/plugins/three/DebugTilesPlugin.d.ts +29 -0
  61. package/src/tileRenderer/plugins/three/DebugTilesPlugin.js +677 -0
  62. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.d.ts +18 -0
  63. package/src/tileRenderer/plugins/three/GLTFExtensionsPlugin.js +86 -0
  64. package/src/tileRenderer/plugins/three/GoogleAttributionsManager.js +62 -0
  65. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.d.ts +5 -0
  66. package/src/tileRenderer/plugins/three/GoogleCloudAuthPlugin.js +200 -0
  67. package/src/tileRenderer/plugins/three/ReorientationPlugin.d.ts +12 -0
  68. package/src/tileRenderer/plugins/three/ReorientationPlugin.js +136 -0
  69. package/src/tileRenderer/plugins/three/TileCompressionPlugin.d.ts +18 -0
  70. package/src/tileRenderer/plugins/three/TileCompressionPlugin.js +223 -0
  71. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.d.ts +5 -0
  72. package/src/tileRenderer/plugins/three/UpdateOnChangePlugin.js +87 -0
  73. package/src/tileRenderer/plugins/three/fade/FadeManager.js +370 -0
  74. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.d.ts +9 -0
  75. package/src/tileRenderer/plugins/three/fade/TilesFadePlugin.js +318 -0
  76. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.d.ts +5 -0
  77. package/src/tileRenderer/plugins/three/gltf/GLTFCesiumRTCExtension.js +27 -0
  78. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.d.ts +30 -0
  79. package/src/tileRenderer/plugins/three/gltf/GLTFMeshFeaturesExtension.js +76 -0
  80. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.d.ts +49 -0
  81. package/src/tileRenderer/plugins/three/gltf/GLTFStructuralMetadataExtension.js +147 -0
  82. package/src/tileRenderer/plugins/three/gltf/metadata/classes/ClassProperty.js +149 -0
  83. package/src/tileRenderer/plugins/three/gltf/metadata/classes/MeshFeatures.js +215 -0
  84. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyAttributeAccessor.js +107 -0
  85. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertySetAccessor.js +45 -0
  86. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTableAccessor.js +209 -0
  87. package/src/tileRenderer/plugins/three/gltf/metadata/classes/PropertyTextureAccessor.js +244 -0
  88. package/src/tileRenderer/plugins/three/gltf/metadata/classes/StructuralMetadata.js +202 -0
  89. package/src/tileRenderer/plugins/three/gltf/metadata/math/Matrix2.js +55 -0
  90. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/ClassPropertyHelpers.js +495 -0
  91. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TexCoordUtilities.js +72 -0
  92. package/src/tileRenderer/plugins/three/gltf/metadata/utilities/TextureReadUtility.js +154 -0
  93. package/src/tileRenderer/plugins/three/objects/EllipsoidRegionHelper.js +186 -0
  94. package/src/tileRenderer/plugins/three/objects/SphereHelper.js +55 -0
  95. package/src/tileRenderer/r3f/README.md +238 -0
  96. package/src/tileRenderer/r3f/components/CameraControls.jsx +132 -0
  97. package/src/tileRenderer/r3f/components/CameraTransition.jsx +177 -0
  98. package/src/tileRenderer/r3f/components/CanvasDOMOverlay.jsx +54 -0
  99. package/src/tileRenderer/r3f/components/CompassGizmo.jsx +260 -0
  100. package/src/tileRenderer/r3f/components/TilesAttributionOverlay.jsx +110 -0
  101. package/src/tileRenderer/r3f/components/TilesRenderer.jsx +239 -0
  102. package/src/tileRenderer/r3f/index.jsx +6 -0
  103. package/src/tileRenderer/r3f/utilities/useForceUpdate.jsx +8 -0
  104. package/src/tileRenderer/r3f/utilities/useObjectDep.jsx +59 -0
  105. package/src/tileRenderer/r3f/utilities/useOptions.jsx +143 -0
  106. package/src/tileRenderer/three/DebugTilesRenderer.d.ts +28 -0
  107. package/src/tileRenderer/three/DebugTilesRenderer.js +58 -0
  108. package/src/tileRenderer/three/TilesGroup.d.ts +9 -0
  109. package/src/tileRenderer/three/TilesGroup.js +91 -0
  110. package/src/tileRenderer/three/TilesRenderer.d.ts +37 -0
  111. package/src/tileRenderer/three/TilesRenderer.js +1049 -0
  112. package/src/tileRenderer/three/controls/CameraTransitionManager.js +305 -0
  113. package/src/tileRenderer/three/controls/EnvironmentControls.js +1295 -0
  114. package/src/tileRenderer/three/controls/GlobeControls.js +684 -0
  115. package/src/tileRenderer/three/controls/PivotPointMesh.js +104 -0
  116. package/src/tileRenderer/three/controls/PointerTracker.js +257 -0
  117. package/src/tileRenderer/three/controls/utils.js +113 -0
  118. package/src/tileRenderer/three/loaders/B3DMLoader.d.ts +26 -0
  119. package/src/tileRenderer/three/loaders/B3DMLoader.js +85 -0
  120. package/src/tileRenderer/three/loaders/CMPTLoader.d.ts +19 -0
  121. package/src/tileRenderer/three/loaders/CMPTLoader.js +97 -0
  122. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.d.ts +11 -0
  123. package/src/tileRenderer/three/loaders/GLTFExtensionLoader.js +68 -0
  124. package/src/tileRenderer/three/loaders/I3DMLoader.d.ts +26 -0
  125. package/src/tileRenderer/three/loaders/I3DMLoader.js +256 -0
  126. package/src/tileRenderer/three/loaders/PNTSLoader.d.ts +25 -0
  127. package/src/tileRenderer/three/loaders/PNTSLoader.js +202 -0
  128. package/src/tileRenderer/three/loaders/gltf/GLTFCesiumRTCExtension.js +12 -0
  129. package/src/tileRenderer/three/loaders/gltf/GLTFMeshFeaturesExtension.js +12 -0
  130. package/src/tileRenderer/three/loaders/gltf/GLTFStructuralMetadataExtension.js +12 -0
  131. package/src/tileRenderer/three/math/Ellipsoid.d.ts +31 -0
  132. package/src/tileRenderer/three/math/Ellipsoid.js +337 -0
  133. package/src/tileRenderer/three/math/EllipsoidRegion.d.ts +23 -0
  134. package/src/tileRenderer/three/math/EllipsoidRegion.js +178 -0
  135. package/src/tileRenderer/three/math/ExtendedFrustum.js +65 -0
  136. package/src/tileRenderer/three/math/GeoConstants.d.ts +4 -0
  137. package/src/tileRenderer/three/math/GeoConstants.js +5 -0
  138. package/src/tileRenderer/three/math/GeoUtils.d.ts +9 -0
  139. package/src/tileRenderer/three/math/GeoUtils.js +106 -0
  140. package/src/tileRenderer/three/math/OBB.js +179 -0
  141. package/src/tileRenderer/three/math/TileBoundingVolume.js +272 -0
  142. package/src/tileRenderer/three/plugins/CesiumIonAuthPlugin.js +12 -0
  143. package/src/tileRenderer/three/plugins/DebugTilesPlugin.js +26 -0
  144. package/src/tileRenderer/three/plugins/GoogleCloudAuthPlugin.js +12 -0
  145. package/src/tileRenderer/three/raycastTraverse.js +178 -0
  146. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.d.ts +14 -0
  147. package/src/tileRenderer/three/renderers/CesiumIonTilesRenderer.js +21 -0
  148. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.d.ts +43 -0
  149. package/src/tileRenderer/three/renderers/GoogleTilesRenderer.js +48 -0
  150. package/src/tileRenderer/three/utilities.js +54 -0
  151. package/src/tileRenderer/utilities/BatchTable.d.ts +24 -0
  152. package/src/tileRenderer/utilities/BatchTable.js +82 -0
  153. package/src/tileRenderer/utilities/BatchTableHierarchyExtension.js +127 -0
  154. package/src/tileRenderer/utilities/FeatureTable.d.ts +30 -0
  155. package/src/tileRenderer/utilities/FeatureTable.js +159 -0
  156. package/src/tileRenderer/utilities/LRUCache.d.ts +8 -0
  157. package/src/tileRenderer/utilities/LRUCache.js +385 -0
  158. package/src/tileRenderer/utilities/PriorityQueue.d.ts +16 -0
  159. package/src/tileRenderer/utilities/PriorityQueue.js +137 -0
  160. package/src/tileRenderer/utilities/arrayToString.js +7 -0
  161. package/src/tileRenderer/utilities/readMagicBytes.js +29 -0
  162. package/src/tileRenderer/utilities/rgb565torgb.js +22 -0
  163. package/src/tileRenderer/utilities/urlExtension.js +34 -0
  164. package/tsconfig.json +42 -0
  165. package/tsconfig.node.json +11 -0
  166. package/typings/three.d.ts +27 -0
@@ -0,0 +1,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
+ }