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,104 @@
1
+ import { Mesh, PlaneGeometry, ShaderMaterial, Vector2 } from 'three';
2
+ export class PivotPointMesh extends Mesh {
3
+
4
+ constructor() {
5
+
6
+ super( new PlaneGeometry( 0, 0 ), new PivotMaterial() );
7
+ this.renderOrder = Infinity;
8
+
9
+ }
10
+
11
+ onBeforeRender( renderer ) {
12
+
13
+ const uniforms = this.material.uniforms;
14
+ renderer.getSize( uniforms.resolution.value );
15
+
16
+ }
17
+
18
+ updateMatrixWorld() {
19
+
20
+ this.matrixWorld.makeTranslation( this.position );
21
+
22
+ }
23
+
24
+ dispose() {
25
+
26
+ this.geometry.dispose();
27
+ this.material.dispose();
28
+
29
+ }
30
+
31
+ }
32
+
33
+ class PivotMaterial extends ShaderMaterial {
34
+
35
+ constructor() {
36
+
37
+ super( {
38
+
39
+ depthWrite: false,
40
+ depthTest: false,
41
+ transparent: true,
42
+
43
+ uniforms: {
44
+
45
+ resolution: { value: new Vector2() },
46
+ size: { value: 15 },
47
+ thickness: { value: 2 },
48
+ opacity: { value: 1 },
49
+
50
+ },
51
+
52
+ vertexShader: /* glsl */`
53
+
54
+ uniform float pixelRatio;
55
+ uniform float size;
56
+ uniform float thickness;
57
+ uniform vec2 resolution;
58
+ varying vec2 vUv;
59
+
60
+ void main() {
61
+
62
+ vUv = uv;
63
+
64
+ float aspect = resolution.x / resolution.y;
65
+ vec2 offset = uv * 2.0 - vec2( 1.0 );
66
+ offset.y *= aspect;
67
+
68
+ vec4 screenPoint = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
69
+ screenPoint.xy += offset * ( size + thickness ) * screenPoint.w / resolution.x;
70
+
71
+ gl_Position = screenPoint;
72
+
73
+ }
74
+ `,
75
+
76
+ fragmentShader: /* glsl */`
77
+
78
+ uniform float size;
79
+ uniform float thickness;
80
+ uniform float opacity;
81
+
82
+ varying vec2 vUv;
83
+ void main() {
84
+
85
+ float ht = 0.5 * thickness;
86
+ float planeDim = size + thickness;
87
+ float offset = ( planeDim - ht - 2.0 ) / planeDim;
88
+ float texelThickness = ht / planeDim;
89
+
90
+ vec2 vec = vUv * 2.0 - vec2( 1.0 );
91
+ float dist = abs( length( vec ) - offset );
92
+ float fw = fwidth( dist ) * 0.5;
93
+ float a = smoothstep( texelThickness - fw, texelThickness + fw, dist );
94
+
95
+ gl_FragColor = vec4( 1, 1, 1, opacity * ( 1.0 - a ) );
96
+
97
+ }
98
+ `,
99
+
100
+ } );
101
+
102
+ }
103
+
104
+ }
@@ -0,0 +1,257 @@
1
+ import { Vector2 } from 'three';
2
+
3
+ const _vec = new Vector2();
4
+ const _vec2 = new Vector2();
5
+ export class PointerTracker {
6
+
7
+ constructor() {
8
+
9
+ this.domElement = null;
10
+ this.buttons = 0;
11
+ this.pointerType = null;
12
+ this.pointerOrder = [];
13
+ this.previousPositions = {};
14
+ this.pointerPositions = {};
15
+ this.startPositions = {};
16
+ this.pointerSetThisFrame = {};
17
+ this.hoverPosition = new Vector2();
18
+ this.hoverSet = false;
19
+
20
+ }
21
+
22
+ reset() {
23
+
24
+ this.buttons = 0;
25
+ this.pointerType = null;
26
+ this.pointerOrder = [];
27
+ this.previousPositions = {};
28
+ this.pointerPositions = {};
29
+ this.startPositions = {};
30
+ this.pointerSetThisFrame = {};
31
+ this.hoverPosition = new Vector2();
32
+ this.hoverSet = false;
33
+
34
+ }
35
+
36
+ // The pointers can be set multiple times per frame so track whether the pointer has
37
+ // been set this frame or not so we don't overwrite the previous position and lose information
38
+ // about pointer movement
39
+ updateFrame() {
40
+
41
+ const { previousPositions, pointerPositions } = this;
42
+ for ( const id in pointerPositions ) {
43
+
44
+ previousPositions[ id ].copy( pointerPositions[ id ] );
45
+
46
+ }
47
+
48
+ }
49
+
50
+ setHoverEvent( e ) {
51
+
52
+ if ( e.pointerType === 'mouse' || e.type === 'wheel' ) {
53
+
54
+ this.getAdjustedPointer( e, this.hoverPosition );
55
+ this.hoverSet = true;
56
+
57
+ }
58
+
59
+ }
60
+
61
+ getLatestPoint( target ) {
62
+
63
+ if ( this.pointerType !== null ) {
64
+
65
+ this.getCenterPoint( target );
66
+ return target;
67
+
68
+ } else if ( this.hoverSet ) {
69
+
70
+ target.copy( this.hoverPosition );
71
+ return target;
72
+
73
+ } else {
74
+
75
+ return null;
76
+
77
+ }
78
+
79
+ }
80
+
81
+ // get the pointer position in the coordinate system of the target element
82
+ getAdjustedPointer( e, target ) {
83
+
84
+ const domRef = this.domElement ? this.domElement : e.target;
85
+ const rect = domRef.getBoundingClientRect();
86
+ const x = e.clientX - rect.left;
87
+ const y = e.clientY - rect.top;
88
+ target.set( x, y );
89
+
90
+ }
91
+
92
+ addPointer( e ) {
93
+
94
+ const id = e.pointerId;
95
+ const position = new Vector2();
96
+ this.getAdjustedPointer( e, position );
97
+ this.pointerOrder.push( id );
98
+ this.pointerPositions[ id ] = position;
99
+ this.previousPositions[ id ] = position.clone();
100
+ this.startPositions[ id ] = position.clone();
101
+
102
+ if ( this.getPointerCount() === 1 ) {
103
+
104
+ this.pointerType = e.pointerType;
105
+ this.buttons = e.buttons;
106
+
107
+ }
108
+
109
+ }
110
+
111
+ updatePointer( e ) {
112
+
113
+ const id = e.pointerId;
114
+ if ( ! ( id in this.pointerPositions ) ) {
115
+
116
+ return false;
117
+
118
+ }
119
+
120
+ this.getAdjustedPointer( e, this.pointerPositions[ id ] );
121
+ return true;
122
+
123
+ }
124
+
125
+ deletePointer( e ) {
126
+
127
+ const id = e.pointerId;
128
+ const pointerOrder = this.pointerOrder;
129
+ pointerOrder.splice( pointerOrder.indexOf( id ), 1 );
130
+ delete this.pointerPositions[ id ];
131
+ delete this.previousPositions[ id ];
132
+ delete this.startPositions[ id ];
133
+
134
+ if ( this.getPointerCount.length === 0 ) {
135
+
136
+ this.buttons = 0;
137
+ this.pointerType = null;
138
+
139
+ }
140
+
141
+ }
142
+
143
+ getPointerCount() {
144
+
145
+ return this.pointerOrder.length;
146
+
147
+ }
148
+
149
+ getCenterPoint( target, pointerPositions = this.pointerPositions ) {
150
+
151
+ const pointerOrder = this.pointerOrder;
152
+ if ( this.getPointerCount() === 1 || this.getPointerType() === 'mouse' ) {
153
+
154
+ const id = pointerOrder[ 0 ];
155
+ target.copy( pointerPositions[ id ] );
156
+ return target;
157
+
158
+ } else if ( this.getPointerCount() === 2 ) {
159
+
160
+ const id0 = this.pointerOrder[ 0 ];
161
+ const id1 = this.pointerOrder[ 1 ];
162
+
163
+ const p0 = pointerPositions[ id0 ];
164
+ const p1 = pointerPositions[ id1 ];
165
+
166
+ target.addVectors( p0, p1 ).multiplyScalar( 0.5 );
167
+ return target;
168
+
169
+ }
170
+
171
+ return null;
172
+
173
+ }
174
+
175
+ getPreviousCenterPoint( target ) {
176
+
177
+ return this.getCenterPoint( target, this.previousPositions );
178
+
179
+ }
180
+
181
+ getStartCenterPoint( target ) {
182
+
183
+ return this.getCenterPoint( target, this.startPositions );
184
+
185
+ }
186
+
187
+ getMoveDistance() {
188
+
189
+ this.getCenterPoint( _vec );
190
+ this.getPreviousCenterPoint( _vec2 );
191
+
192
+ return _vec.sub( _vec2 ).length();
193
+
194
+ }
195
+
196
+ getTouchPointerDistance( pointerPositions = this.pointerPositions ) {
197
+
198
+ if ( this.getPointerCount() <= 1 || this.getPointerType() === 'mouse' ) {
199
+
200
+ return 0;
201
+
202
+ }
203
+
204
+ const { pointerOrder } = this;
205
+ const id0 = pointerOrder[ 0 ];
206
+ const id1 = pointerOrder[ 1 ];
207
+
208
+ const p0 = pointerPositions[ id0 ];
209
+ const p1 = pointerPositions[ id1 ];
210
+
211
+ return p0.distanceTo( p1 );
212
+
213
+ }
214
+
215
+ getPreviousTouchPointerDistance() {
216
+
217
+ return this.getTouchPointerDistance( this.previousPositions );
218
+
219
+ }
220
+
221
+ getStartTouchPointerDistance() {
222
+
223
+ return this.getTouchPointerDistance( this.startPositions );
224
+
225
+ }
226
+
227
+ getPointerType() {
228
+
229
+ return this.pointerType;
230
+
231
+ }
232
+
233
+ isPointerTouch() {
234
+
235
+ return this.getPointerType() === 'touch';
236
+
237
+ }
238
+
239
+ getPointerButtons() {
240
+
241
+ return this.buttons;
242
+
243
+ }
244
+
245
+ isLeftClicked() {
246
+
247
+ return Boolean( this.buttons & 1 );
248
+
249
+ }
250
+
251
+ isRightClicked() {
252
+
253
+ return Boolean( this.buttons & 2 );
254
+
255
+ }
256
+
257
+ }
@@ -0,0 +1,113 @@
1
+ import { Matrix4, Ray, Vector3 } from 'three';
2
+
3
+ const _matrix = new Matrix4();
4
+ const _ray = new Ray();
5
+ const _vec = new Vector3();
6
+
7
+ // helper function for constructing a matrix for rotating around a point
8
+ export function makeRotateAroundPoint( point, quat, target ) {
9
+
10
+ target.makeTranslation( - point.x, - point.y, - point.z );
11
+
12
+ _matrix.makeRotationFromQuaternion( quat );
13
+ target.premultiply( _matrix );
14
+
15
+ _matrix.makeTranslation( point.x, point.y, point.z );
16
+ target.premultiply( _matrix );
17
+
18
+ return target;
19
+
20
+ }
21
+
22
+ // get the three.js pointer coords from an event
23
+ export function mouseToCoords( clientX, clientY, element, target ) {
24
+
25
+ target.x = ( ( clientX - element.offsetLeft ) / element.clientWidth ) * 2 - 1;
26
+ target.y = - ( ( clientY - element.offsetTop ) / element.clientHeight ) * 2 + 1;
27
+
28
+ if ( target.isVector3 ) {
29
+
30
+ target.z = 0;
31
+
32
+ }
33
+
34
+ }
35
+
36
+ // Returns an estimate of the closest point on the ellipsoid to the ray. Returns
37
+ // the surface intersection if they collide.
38
+ export function closestRayEllipsoidSurfacePointEstimate( ray, ellipsoid, target ) {
39
+
40
+ if ( ellipsoid.intersectRay( ray, target ) ) {
41
+
42
+ return target;
43
+
44
+ } else {
45
+
46
+ _matrix.makeScale( ...ellipsoid.radius ).invert();
47
+ _ray.copy( ray ).applyMatrix4( _matrix );
48
+
49
+ _vec.set( 0, 0, 0 );
50
+ _ray.closestPointToPoint( _vec, target ).normalize();
51
+
52
+ _matrix.makeScale( ...ellipsoid.radius );
53
+ return target.applyMatrix4( _matrix );
54
+
55
+ }
56
+
57
+ }
58
+
59
+ // find the closest ray on the horizon when the ray passes above the sphere
60
+ export function closestRaySpherePointFromRotation( ray, radius, target ) {
61
+
62
+ const hypotenuse = ray.origin.length();
63
+
64
+ // angle inside the sphere
65
+ const theta = Math.acos( radius / hypotenuse );
66
+
67
+ // the direction to the camera
68
+ target
69
+ .copy( ray.origin )
70
+ .multiplyScalar( - 1 )
71
+ .normalize();
72
+
73
+ // get the normal of the plane the ray and origin lie in
74
+ const rotationVec = _vec
75
+ .crossVectors( target, ray.direction )
76
+ .normalize();
77
+
78
+ // rotate the camera direction by angle and scale it to the surface
79
+ target
80
+ .multiplyScalar( - 1 )
81
+ .applyAxisAngle( rotationVec, - theta )
82
+ .normalize()
83
+ .multiplyScalar( radius );
84
+
85
+ }
86
+
87
+
88
+ // custom version of set raycaster from camera that relies on the underlying matrices
89
+ // so the ray origin is position at the camera near clip.
90
+ export function setRaycasterFromCamera( raycaster, coords, camera ) {
91
+
92
+ const { origin, direction } = raycaster.ray;
93
+
94
+ // get the origin and direction of the frustum ray
95
+ origin
96
+ .set( coords.x, coords.y, - 1 )
97
+ .unproject( camera );
98
+
99
+ direction
100
+ .set( coords.x, coords.y, 1 )
101
+ .unproject( camera )
102
+ .sub( origin );
103
+
104
+ // compute the far value based on the distance from point on the near
105
+ // plane and point on the far plane. Then normalize the direction.
106
+ raycaster.near = 0;
107
+ raycaster.far = direction.length();
108
+ raycaster.camera = camera;
109
+
110
+ // normalize the ray direction
111
+ direction.normalize();
112
+
113
+ }
@@ -0,0 +1,26 @@
1
+ import { B3DMBaseResult } from '../../base/loaders/B3DMLoaderBase';
2
+ import { BatchTable } from '../../utilities/BatchTable';
3
+ import { FeatureTable } from '../../utilities/FeatureTable';
4
+ import { LoadingManager, Group } from 'three';
5
+ import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
6
+
7
+ interface B3DMScene extends Group {
8
+
9
+ batchTable : BatchTable;
10
+ featureTable : FeatureTable;
11
+
12
+ }
13
+
14
+ export interface B3DMResult extends GLTF, B3DMBaseResult {
15
+
16
+ scene : B3DMScene;
17
+
18
+ }
19
+
20
+ export class B3DMLoader {
21
+
22
+ constructor( manager : LoadingManager );
23
+ load( url : String ) : Promise< B3DMResult >;
24
+ parse( buffer : ArrayBuffer ) : Promise < B3DMResult >;
25
+
26
+ }
@@ -0,0 +1,85 @@
1
+ import { B3DMLoaderBase } from '../../base/loaders/B3DMLoaderBase.js';
2
+ import { DefaultLoadingManager, Matrix4 } from 'three';
3
+ import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
4
+
5
+ export class B3DMLoader extends B3DMLoaderBase {
6
+
7
+ constructor( manager = DefaultLoadingManager ) {
8
+
9
+ super();
10
+ this.manager = manager;
11
+ this.adjustmentTransform = new Matrix4();
12
+
13
+ }
14
+
15
+ parse( buffer ) {
16
+
17
+ const b3dm = super.parse( buffer );
18
+ const gltfBuffer = b3dm.glbBytes.slice().buffer;
19
+ return new Promise( ( resolve, reject ) => {
20
+
21
+ const manager = this.manager;
22
+ const fetchOptions = this.fetchOptions;
23
+ const loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );
24
+
25
+ if ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {
26
+
27
+ loader.setCrossOrigin( 'use-credentials' );
28
+
29
+ }
30
+
31
+ if ( 'credentials' in fetchOptions ) {
32
+
33
+ loader.setWithCredentials( fetchOptions.credentials === 'include' );
34
+
35
+ }
36
+
37
+ if ( fetchOptions.headers ) {
38
+
39
+ loader.setRequestHeader( fetchOptions.headers );
40
+
41
+ }
42
+
43
+ // GLTFLoader assumes the working path ends in a slash
44
+ let workingPath = this.workingPath;
45
+ if ( ! /[\\/]$/.test( workingPath ) && workingPath.length ) {
46
+
47
+ workingPath += '/';
48
+
49
+ }
50
+
51
+ const adjustmentTransform = this.adjustmentTransform;
52
+
53
+ loader.parse( gltfBuffer, workingPath, model => {
54
+
55
+ const { batchTable, featureTable } = b3dm;
56
+ const { scene } = model;
57
+
58
+ const rtcCenter = featureTable.getData( 'RTC_CENTER' );
59
+ if ( rtcCenter ) {
60
+
61
+ scene.position.x += rtcCenter[ 0 ];
62
+ scene.position.y += rtcCenter[ 1 ];
63
+ scene.position.z += rtcCenter[ 2 ];
64
+
65
+ }
66
+
67
+ model.scene.updateMatrix();
68
+ model.scene.matrix.multiply( adjustmentTransform );
69
+ model.scene.matrix.decompose( model.scene.position, model.scene.quaternion, model.scene.scale );
70
+
71
+ model.batchTable = batchTable;
72
+ model.featureTable = featureTable;
73
+
74
+ scene.batchTable = batchTable;
75
+ scene.featureTable = featureTable;
76
+
77
+ resolve( model );
78
+
79
+ }, reject );
80
+
81
+ } );
82
+
83
+ }
84
+
85
+ }
@@ -0,0 +1,19 @@
1
+ import { B3DMBaseResult } from '../../base/loaders/B3DMLoaderBase';
2
+ import { I3DMBaseResult } from '../../base/loaders/I3DMLoaderBase';
3
+ import { PNTSBaseResult } from '../../base/loaders/PNTSLoaderBase';
4
+ import { Group, LoadingManager } from 'three';
5
+
6
+ export interface CMPTResult {
7
+
8
+ tiles : Array< B3DMBaseResult|I3DMBaseResult|PNTSBaseResult >;
9
+ scene : Group;
10
+
11
+ }
12
+
13
+ export class CMPTLoader {
14
+
15
+ constructor( manager : LoadingManager );
16
+ load( url : String ) : Promise< CMPTResult >;
17
+ parse( buffer : ArrayBuffer ) : Promise< CMPTResult >;
18
+
19
+ }
@@ -0,0 +1,97 @@
1
+ import { Group, DefaultLoadingManager, Matrix4 } from 'three';
2
+ import { CMPTLoaderBase } from '../../base/loaders/CMPTLoaderBase.js';
3
+ import { B3DMLoader } from './B3DMLoader.js';
4
+ import { PNTSLoader } from './PNTSLoader.js';
5
+ import { I3DMLoader } from './I3DMLoader.js';
6
+ import { WGS84_ELLIPSOID } from '../math/GeoConstants.js';
7
+
8
+ export class CMPTLoader extends CMPTLoaderBase {
9
+
10
+ constructor( manager = DefaultLoadingManager ) {
11
+
12
+ super();
13
+ this.manager = manager;
14
+ this.adjustmentTransform = new Matrix4();
15
+ this.ellipsoid = WGS84_ELLIPSOID.clone();
16
+
17
+ }
18
+
19
+ parse( buffer ) {
20
+
21
+ const result = super.parse( buffer );
22
+ const { manager, ellipsoid, adjustmentTransform } = this;
23
+ const promises = [];
24
+
25
+ for ( const i in result.tiles ) {
26
+
27
+ const { type, buffer } = result.tiles[ i ];
28
+ switch ( type ) {
29
+
30
+ case 'b3dm': {
31
+
32
+ const slicedBuffer = buffer.slice();
33
+ const loader = new B3DMLoader( manager );
34
+ loader.workingPath = this.workingPath;
35
+ loader.fetchOptions = this.fetchOptions;
36
+ loader.adjustmentTransform.copy( adjustmentTransform );
37
+
38
+ const promise = loader.parse( slicedBuffer.buffer );
39
+ promises.push( promise );
40
+ break;
41
+
42
+ }
43
+
44
+ case 'pnts': {
45
+
46
+ const slicedBuffer = buffer.slice();
47
+ const loader = new PNTSLoader( manager );
48
+ loader.workingPath = this.workingPath;
49
+ loader.fetchOptions = this.fetchOptions;
50
+
51
+ const promise = loader.parse( slicedBuffer.buffer );
52
+ promises.push( promise );
53
+ break;
54
+
55
+ }
56
+
57
+ case 'i3dm': {
58
+
59
+ const slicedBuffer = buffer.slice();
60
+ const loader = new I3DMLoader( manager );
61
+ loader.workingPath = this.workingPath;
62
+ loader.fetchOptions = this.fetchOptions;
63
+
64
+ loader.ellipsoid.copy( ellipsoid );
65
+ loader.adjustmentTransform.copy( adjustmentTransform );
66
+
67
+ const promise = loader.parse( slicedBuffer.buffer );
68
+ promises.push( promise );
69
+ break;
70
+
71
+ }
72
+
73
+ }
74
+
75
+ }
76
+
77
+ return Promise.all( promises ).then( results => {
78
+
79
+ const group = new Group();
80
+ results.forEach( result => {
81
+
82
+ group.add( result.scene );
83
+
84
+ } );
85
+
86
+ return {
87
+
88
+ tiles: results,
89
+ scene: group,
90
+
91
+ };
92
+
93
+ } );
94
+
95
+ }
96
+
97
+ }
@@ -0,0 +1,11 @@
1
+
2
+ import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
3
+ import { LoaderBase } from '../../base/loaders/LoaderBase';
4
+ import { LoadingManager } from 'three';
5
+
6
+ export class GLTFExtensionLoader extends LoaderBase {
7
+
8
+ constructor( manager : LoadingManager );
9
+ parse( buffer : ArrayBuffer ) : Promise< GLTF >;
10
+
11
+ }