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,68 @@
|
|
|
1
|
+
import { DefaultLoadingManager } from 'three';
|
|
2
|
+
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
|
|
3
|
+
import { LoaderBase } from '../../base/loaders/LoaderBase.js';
|
|
4
|
+
import { GLTFCesiumRTCExtension } from './gltf/GLTFCesiumRTCExtension.js';
|
|
5
|
+
|
|
6
|
+
export class GLTFExtensionLoader extends LoaderBase {
|
|
7
|
+
|
|
8
|
+
constructor( manager = DefaultLoadingManager ) {
|
|
9
|
+
|
|
10
|
+
super();
|
|
11
|
+
this.manager = manager;
|
|
12
|
+
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
parse( buffer ) {
|
|
16
|
+
|
|
17
|
+
return new Promise( ( resolve, reject ) => {
|
|
18
|
+
|
|
19
|
+
const manager = this.manager;
|
|
20
|
+
const fetchOptions = this.fetchOptions;
|
|
21
|
+
let loader = manager.getHandler( 'path.gltf' ) || manager.getHandler( 'path.glb' );
|
|
22
|
+
|
|
23
|
+
if ( ! loader ) {
|
|
24
|
+
|
|
25
|
+
loader = new GLTFLoader( manager );
|
|
26
|
+
|
|
27
|
+
loader.register( () => new GLTFCesiumRTCExtension() );
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
if ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {
|
|
32
|
+
|
|
33
|
+
loader.setCrossOrigin( 'use-credentials' );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if ( 'credentials' in fetchOptions ) {
|
|
38
|
+
|
|
39
|
+
loader.setWithCredentials( fetchOptions.credentials === 'include' );
|
|
40
|
+
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if ( fetchOptions.headers ) {
|
|
44
|
+
|
|
45
|
+
loader.setRequestHeader( fetchOptions.headers );
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// assume any pre-registered loader has paths configured as the user desires, but if we're making
|
|
50
|
+
// a new loader, use the working path during parse to support relative uris on other hosts
|
|
51
|
+
let resourcePath = loader.resourcePath || loader.path || this.workingPath;
|
|
52
|
+
if ( ! /[\\/]$/.test( resourcePath ) && resourcePath.length ) {
|
|
53
|
+
|
|
54
|
+
resourcePath += '/';
|
|
55
|
+
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
loader.parse( buffer, resourcePath, model => {
|
|
59
|
+
|
|
60
|
+
resolve( model );
|
|
61
|
+
|
|
62
|
+
}, reject );
|
|
63
|
+
|
|
64
|
+
} );
|
|
65
|
+
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { I3DMBaseResult } from '../../base/loaders/I3DMLoaderBase';
|
|
2
|
+
import { BatchTable } from '../../utilities/BatchTable';
|
|
3
|
+
import { FeatureTable } from '../../utilities/FeatureTable';
|
|
4
|
+
import { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';
|
|
5
|
+
import { Group, LoadingManager } from 'three';
|
|
6
|
+
|
|
7
|
+
interface I3DMScene extends Group {
|
|
8
|
+
|
|
9
|
+
batchTable : BatchTable;
|
|
10
|
+
featureTable : FeatureTable;
|
|
11
|
+
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface I3DMResult extends GLTF, I3DMBaseResult {
|
|
15
|
+
|
|
16
|
+
scene : I3DMScene;
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export class I3DMLoader {
|
|
21
|
+
|
|
22
|
+
constructor( manager : LoadingManager );
|
|
23
|
+
load( url : String ) : Promise< I3DMResult >;
|
|
24
|
+
parse( buffer : ArrayBuffer ) : Promise< I3DMResult >;
|
|
25
|
+
|
|
26
|
+
}
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import { I3DMLoaderBase } from '../../base/loaders/I3DMLoaderBase.js';
|
|
2
|
+
import { DefaultLoadingManager, Matrix4, InstancedMesh, Vector3, Quaternion } from 'three';
|
|
3
|
+
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
|
|
4
|
+
import { WGS84_ELLIPSOID } from '../math/GeoConstants.js';
|
|
5
|
+
|
|
6
|
+
const tempFwd = /* @__PURE__ */ new Vector3();
|
|
7
|
+
const tempUp = /* @__PURE__ */ new Vector3();
|
|
8
|
+
const tempRight = /* @__PURE__ */ new Vector3();
|
|
9
|
+
const tempPos = /* @__PURE__ */ new Vector3();
|
|
10
|
+
const tempQuat = /* @__PURE__ */ new Quaternion();
|
|
11
|
+
const tempSca = /* @__PURE__ */ new Vector3();
|
|
12
|
+
const tempMat = /* @__PURE__ */ new Matrix4();
|
|
13
|
+
const tempMat2 = /* @__PURE__ */ new Matrix4();
|
|
14
|
+
|
|
15
|
+
const tempGlobePos = /* @__PURE__ */ new Vector3();
|
|
16
|
+
const tempEnuFrame = /* @__PURE__ */ new Matrix4();
|
|
17
|
+
const tempLocalQuat = /* @__PURE__ */ new Quaternion();
|
|
18
|
+
const tempLatLon = {};
|
|
19
|
+
|
|
20
|
+
export class I3DMLoader extends I3DMLoaderBase {
|
|
21
|
+
|
|
22
|
+
constructor( manager = DefaultLoadingManager ) {
|
|
23
|
+
|
|
24
|
+
super();
|
|
25
|
+
this.manager = manager;
|
|
26
|
+
this.adjustmentTransform = new Matrix4();
|
|
27
|
+
this.ellipsoid = WGS84_ELLIPSOID.clone();
|
|
28
|
+
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
resolveExternalURL( url ) {
|
|
32
|
+
|
|
33
|
+
return this.manager.resolveURL( super.resolveExternalURL( url ) );
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
parse( buffer ) {
|
|
38
|
+
|
|
39
|
+
return super
|
|
40
|
+
.parse( buffer )
|
|
41
|
+
.then( i3dm => {
|
|
42
|
+
|
|
43
|
+
const { featureTable, batchTable } = i3dm;
|
|
44
|
+
const gltfBuffer = i3dm.glbBytes.slice().buffer;
|
|
45
|
+
return new Promise( ( resolve, reject ) => {
|
|
46
|
+
|
|
47
|
+
const fetchOptions = this.fetchOptions;
|
|
48
|
+
const manager = this.manager;
|
|
49
|
+
const loader = manager.getHandler( 'path.gltf' ) || new GLTFLoader( manager );
|
|
50
|
+
|
|
51
|
+
if ( fetchOptions.credentials === 'include' && fetchOptions.mode === 'cors' ) {
|
|
52
|
+
|
|
53
|
+
loader.setCrossOrigin( 'use-credentials' );
|
|
54
|
+
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if ( 'credentials' in fetchOptions ) {
|
|
58
|
+
|
|
59
|
+
loader.setWithCredentials( fetchOptions.credentials === 'include' );
|
|
60
|
+
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if ( fetchOptions.headers ) {
|
|
64
|
+
|
|
65
|
+
loader.setRequestHeader( fetchOptions.headers );
|
|
66
|
+
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// GLTFLoader assumes the working path ends in a slash
|
|
70
|
+
let workingPath = i3dm.gltfWorkingPath ?? this.workingPath;
|
|
71
|
+
if ( ! /[\\/]$/.test( workingPath ) ) {
|
|
72
|
+
|
|
73
|
+
workingPath += '/';
|
|
74
|
+
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const adjustmentTransform = this.adjustmentTransform;
|
|
78
|
+
|
|
79
|
+
loader.parse( gltfBuffer, workingPath, model => {
|
|
80
|
+
|
|
81
|
+
const INSTANCES_LENGTH = featureTable.getData( 'INSTANCES_LENGTH' );
|
|
82
|
+
const POSITION = featureTable.getData( 'POSITION', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );
|
|
83
|
+
const NORMAL_UP = featureTable.getData( 'NORMAL_UP', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );
|
|
84
|
+
const NORMAL_RIGHT = featureTable.getData( 'NORMAL_RIGHT', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );
|
|
85
|
+
const SCALE_NON_UNIFORM = featureTable.getData( 'SCALE_NON_UNIFORM', INSTANCES_LENGTH, 'FLOAT', 'VEC3' );
|
|
86
|
+
const SCALE = featureTable.getData( 'SCALE', INSTANCES_LENGTH, 'FLOAT', 'SCALAR' );
|
|
87
|
+
const RTC_CENTER = featureTable.getData( 'RTC_CENTER' );
|
|
88
|
+
const EAST_NORTH_UP = featureTable.getData( 'EAST_NORTH_UP' );
|
|
89
|
+
|
|
90
|
+
[
|
|
91
|
+
'QUANTIZED_VOLUME_OFFSET',
|
|
92
|
+
'QUANTIZED_VOLUME_SCALE',
|
|
93
|
+
'POSITION_QUANTIZED',
|
|
94
|
+
'NORMAL_UP_OCT32P',
|
|
95
|
+
'NORMAL_RIGHT_OCT32P',
|
|
96
|
+
].forEach( feature => {
|
|
97
|
+
|
|
98
|
+
if ( feature in featureTable.header ) {
|
|
99
|
+
|
|
100
|
+
console.warn( `I3DMLoader: Unsupported FeatureTable feature "${ feature }" detected.` );
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
} );
|
|
105
|
+
|
|
106
|
+
// get the average vector center so we can avoid floating point error due to lower
|
|
107
|
+
// precision transformation calculations on the GPU
|
|
108
|
+
const averageVector = new Vector3();
|
|
109
|
+
for ( let i = 0; i < INSTANCES_LENGTH; i ++ ) {
|
|
110
|
+
|
|
111
|
+
averageVector.x += POSITION[ i * 3 + 0 ] / INSTANCES_LENGTH;
|
|
112
|
+
averageVector.y += POSITION[ i * 3 + 1 ] / INSTANCES_LENGTH;
|
|
113
|
+
averageVector.z += POSITION[ i * 3 + 2 ] / INSTANCES_LENGTH;
|
|
114
|
+
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// find all the children and create associated instance meshes
|
|
118
|
+
const instances = [];
|
|
119
|
+
const meshes = [];
|
|
120
|
+
model.scene.updateMatrixWorld();
|
|
121
|
+
|
|
122
|
+
model.scene.traverse( child => {
|
|
123
|
+
|
|
124
|
+
if ( child.isMesh ) {
|
|
125
|
+
|
|
126
|
+
meshes.push( child );
|
|
127
|
+
|
|
128
|
+
const { geometry, material } = child;
|
|
129
|
+
const instancedMesh = new InstancedMesh( geometry, material, INSTANCES_LENGTH );
|
|
130
|
+
instancedMesh.position.copy( averageVector );
|
|
131
|
+
|
|
132
|
+
if ( RTC_CENTER ) {
|
|
133
|
+
|
|
134
|
+
instancedMesh.position.x += RTC_CENTER[ 0 ];
|
|
135
|
+
instancedMesh.position.y += RTC_CENTER[ 1 ];
|
|
136
|
+
instancedMesh.position.z += RTC_CENTER[ 2 ];
|
|
137
|
+
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
instances.push( instancedMesh );
|
|
141
|
+
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
} );
|
|
145
|
+
|
|
146
|
+
// generate positions for all instances
|
|
147
|
+
for ( let i = 0; i < INSTANCES_LENGTH; i ++ ) {
|
|
148
|
+
|
|
149
|
+
// position
|
|
150
|
+
tempPos.set(
|
|
151
|
+
POSITION[ i * 3 + 0 ] - averageVector.x,
|
|
152
|
+
POSITION[ i * 3 + 1 ] - averageVector.y,
|
|
153
|
+
POSITION[ i * 3 + 2 ] - averageVector.z,
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
// rotation
|
|
157
|
+
tempQuat.identity();
|
|
158
|
+
|
|
159
|
+
// account for EAST_NORTH_UP per-instance below
|
|
160
|
+
|
|
161
|
+
if ( NORMAL_UP ) {
|
|
162
|
+
|
|
163
|
+
tempUp.set(
|
|
164
|
+
NORMAL_UP[ i * 3 + 0 ],
|
|
165
|
+
NORMAL_UP[ i * 3 + 1 ],
|
|
166
|
+
NORMAL_UP[ i * 3 + 2 ],
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
tempRight.set(
|
|
170
|
+
NORMAL_RIGHT[ i * 3 + 0 ],
|
|
171
|
+
NORMAL_RIGHT[ i * 3 + 1 ],
|
|
172
|
+
NORMAL_RIGHT[ i * 3 + 2 ],
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
tempFwd.crossVectors( tempRight, tempUp )
|
|
176
|
+
.normalize();
|
|
177
|
+
|
|
178
|
+
tempMat.makeBasis(
|
|
179
|
+
tempRight,
|
|
180
|
+
tempUp,
|
|
181
|
+
tempFwd,
|
|
182
|
+
);
|
|
183
|
+
|
|
184
|
+
tempQuat.setFromRotationMatrix( tempMat );
|
|
185
|
+
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// scale
|
|
189
|
+
tempSca.set( 1, 1, 1 );
|
|
190
|
+
|
|
191
|
+
if ( SCALE_NON_UNIFORM ) {
|
|
192
|
+
|
|
193
|
+
tempSca.set(
|
|
194
|
+
SCALE_NON_UNIFORM[ i * 3 + 0 ],
|
|
195
|
+
SCALE_NON_UNIFORM[ i * 3 + 1 ],
|
|
196
|
+
SCALE_NON_UNIFORM[ i * 3 + 2 ],
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
if ( SCALE ) {
|
|
202
|
+
|
|
203
|
+
tempSca.multiplyScalar( SCALE[ i ] );
|
|
204
|
+
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// multiple in the original meshes world transform
|
|
208
|
+
for ( let j = 0, l = instances.length; j < l; j ++ ) {
|
|
209
|
+
|
|
210
|
+
const instance = instances[ j ];
|
|
211
|
+
tempLocalQuat.copy( tempQuat );
|
|
212
|
+
|
|
213
|
+
// Handle east-north-up frame generation
|
|
214
|
+
if ( EAST_NORTH_UP ) {
|
|
215
|
+
|
|
216
|
+
instance.updateMatrixWorld();
|
|
217
|
+
|
|
218
|
+
// transform the instance position to global frame and get the rotation from the associated ENU frame.
|
|
219
|
+
tempGlobePos.copy( tempPos ).applyMatrix4( instance.matrixWorld );
|
|
220
|
+
this.ellipsoid.getPositionToCartographic( tempGlobePos, tempLatLon );
|
|
221
|
+
this.ellipsoid.getEastNorthUpFrame( tempLatLon.lat, tempLatLon.lon, tempEnuFrame );
|
|
222
|
+
tempLocalQuat.setFromRotationMatrix( tempEnuFrame );
|
|
223
|
+
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
tempMat.compose( tempPos, tempLocalQuat, tempSca ).multiply( adjustmentTransform );
|
|
227
|
+
|
|
228
|
+
const mesh = meshes[ j ];
|
|
229
|
+
tempMat2.multiplyMatrices( tempMat, mesh.matrixWorld );
|
|
230
|
+
instance.setMatrixAt( i, tempMat2 );
|
|
231
|
+
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// replace all geometry with the instances
|
|
237
|
+
model.scene.clear();
|
|
238
|
+
model.scene.add( ...instances );
|
|
239
|
+
|
|
240
|
+
model.batchTable = batchTable;
|
|
241
|
+
model.featureTable = featureTable;
|
|
242
|
+
|
|
243
|
+
model.scene.batchTable = batchTable;
|
|
244
|
+
model.scene.featureTable = featureTable;
|
|
245
|
+
|
|
246
|
+
resolve( model );
|
|
247
|
+
|
|
248
|
+
}, reject );
|
|
249
|
+
|
|
250
|
+
} );
|
|
251
|
+
|
|
252
|
+
} );
|
|
253
|
+
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { PNTSBaseResult, PNTSLoaderBase } from '../../base/loaders/PNTSLoaderBase';
|
|
2
|
+
import { BatchTable } from '../../utilities/BatchTable';
|
|
3
|
+
import { FeatureTable } from '../../utilities/FeatureTable';
|
|
4
|
+
import { Points, LoadingManager } from 'three';
|
|
5
|
+
|
|
6
|
+
interface PNTSScene extends Points {
|
|
7
|
+
|
|
8
|
+
batchTable : BatchTable
|
|
9
|
+
featureTable : FeatureTable;
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface PNTSResult extends PNTSBaseResult {
|
|
14
|
+
|
|
15
|
+
scene : PNTSScene;
|
|
16
|
+
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class PNTSLoader extends PNTSLoaderBase {
|
|
20
|
+
|
|
21
|
+
constructor( manager : LoadingManager );
|
|
22
|
+
load( url : String ) : Promise< PNTSResult >;
|
|
23
|
+
parse( buffer : ArrayBuffer ) : Promise< PNTSResult >;
|
|
24
|
+
|
|
25
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
import { PNTSLoaderBase } from '../../base/loaders/PNTSLoaderBase.js';
|
|
2
|
+
import {
|
|
3
|
+
Points,
|
|
4
|
+
PointsMaterial,
|
|
5
|
+
BufferGeometry,
|
|
6
|
+
BufferAttribute,
|
|
7
|
+
DefaultLoadingManager,
|
|
8
|
+
Vector3,
|
|
9
|
+
Color,
|
|
10
|
+
} from 'three';
|
|
11
|
+
import { rgb565torgb } from '../../utilities/rgb565torgb.js';
|
|
12
|
+
|
|
13
|
+
const DRACO_ATTRIBUTE_MAP = {
|
|
14
|
+
RGB: 'color',
|
|
15
|
+
POSITION: 'position',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
export class PNTSLoader extends PNTSLoaderBase {
|
|
19
|
+
|
|
20
|
+
constructor( manager = DefaultLoadingManager ) {
|
|
21
|
+
|
|
22
|
+
super();
|
|
23
|
+
this.manager = manager;
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
parse( buffer ) {
|
|
28
|
+
|
|
29
|
+
return super.parse( buffer ).then( async ( result ) => {
|
|
30
|
+
|
|
31
|
+
const { featureTable, batchTable } = result;
|
|
32
|
+
|
|
33
|
+
const material = new PointsMaterial();
|
|
34
|
+
const extensions = featureTable.header.extensions;
|
|
35
|
+
const translationOffset = new Vector3();
|
|
36
|
+
let geometry;
|
|
37
|
+
|
|
38
|
+
// handle loading the draco data
|
|
39
|
+
if ( extensions && extensions[ '3DTILES_draco_point_compression' ] ) {
|
|
40
|
+
|
|
41
|
+
const { byteOffset, byteLength, properties } = extensions[ '3DTILES_draco_point_compression' ];
|
|
42
|
+
const dracoLoader = this.manager.getHandler( 'draco.drc' );
|
|
43
|
+
if ( dracoLoader == null ) {
|
|
44
|
+
|
|
45
|
+
throw new Error( 'PNTSLoader: dracoLoader not available.' );
|
|
46
|
+
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// map PNTS keys to draco types
|
|
50
|
+
const attributeIDs = {};
|
|
51
|
+
for ( const key in properties ) {
|
|
52
|
+
|
|
53
|
+
if ( key in DRACO_ATTRIBUTE_MAP && key in properties ) {
|
|
54
|
+
|
|
55
|
+
const mappedKey = DRACO_ATTRIBUTE_MAP[ key ];
|
|
56
|
+
attributeIDs[ mappedKey ] = properties[ key ];
|
|
57
|
+
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// decode the geometry
|
|
63
|
+
const taskConfig = {
|
|
64
|
+
attributeIDs,
|
|
65
|
+
attributeTypes: {
|
|
66
|
+
position: 'Float32Array',
|
|
67
|
+
color: 'Uint8Array',
|
|
68
|
+
},
|
|
69
|
+
useUniqueIDs: true,
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const buffer = featureTable.getBuffer( byteOffset, byteLength );
|
|
73
|
+
geometry = await dracoLoader.decodeGeometry( buffer, taskConfig );
|
|
74
|
+
if ( geometry.attributes.color ) {
|
|
75
|
+
|
|
76
|
+
material.vertexColors = true;
|
|
77
|
+
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
} else {
|
|
81
|
+
|
|
82
|
+
// handle non compressed case
|
|
83
|
+
const POINTS_LENGTH = featureTable.getData( 'POINTS_LENGTH' );
|
|
84
|
+
const POSITION = featureTable.getData( 'POSITION', POINTS_LENGTH, 'FLOAT', 'VEC3' );
|
|
85
|
+
const RGB = featureTable.getData( 'RGB', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC3' );
|
|
86
|
+
const RGBA = featureTable.getData( 'RGBA', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC4' );
|
|
87
|
+
const RGB565 = featureTable.getData( 'RGB565', POINTS_LENGTH, 'UNSIGNED_SHORT', 'SCALAR' );
|
|
88
|
+
const CONSTANT_RGBA = featureTable.getData( 'CONSTANT_RGBA', POINTS_LENGTH, 'UNSIGNED_BYTE', 'VEC4' );
|
|
89
|
+
const POSITION_QUANTIZED = featureTable.getData( 'POSITION_QUANTIZED', POINTS_LENGTH, 'UNSIGNED_SHORT', 'VEC3' );
|
|
90
|
+
const QUANTIZED_VOLUME_SCALE = featureTable.getData( 'QUANTIZED_VOLUME_SCALE', POINTS_LENGTH, 'FLOAT', 'VEC3' );
|
|
91
|
+
const QUANTIZED_VOLUME_OFFSET = featureTable.getData( 'QUANTIZED_VOLUME_OFFSET', POINTS_LENGTH, 'FLOAT', 'VEC3' );
|
|
92
|
+
|
|
93
|
+
geometry = new BufferGeometry();
|
|
94
|
+
|
|
95
|
+
if ( POSITION_QUANTIZED ) {
|
|
96
|
+
|
|
97
|
+
const decodedPositions = new Float32Array( POINTS_LENGTH * 3 );
|
|
98
|
+
for ( let i = 0; i < POINTS_LENGTH; i ++ ) {
|
|
99
|
+
|
|
100
|
+
for ( let j = 0; j < 3; j ++ ) {
|
|
101
|
+
|
|
102
|
+
const index = 3 * i + j;
|
|
103
|
+
decodedPositions[ index ] = ( POSITION_QUANTIZED[ index ] / 65535.0 ) * QUANTIZED_VOLUME_SCALE[ j ];
|
|
104
|
+
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
translationOffset.x = QUANTIZED_VOLUME_OFFSET[ 0 ];
|
|
109
|
+
translationOffset.y = QUANTIZED_VOLUME_OFFSET[ 1 ];
|
|
110
|
+
translationOffset.z = QUANTIZED_VOLUME_OFFSET[ 2 ];
|
|
111
|
+
geometry.setAttribute( 'position', new BufferAttribute( decodedPositions, 3, false ) );
|
|
112
|
+
|
|
113
|
+
} else {
|
|
114
|
+
|
|
115
|
+
geometry.setAttribute( 'position', new BufferAttribute( POSITION, 3, false ) );
|
|
116
|
+
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if ( RGBA !== null ) {
|
|
120
|
+
|
|
121
|
+
geometry.setAttribute( 'color', new BufferAttribute( RGBA, 4, true ) );
|
|
122
|
+
material.vertexColors = true;
|
|
123
|
+
material.transparent = true;
|
|
124
|
+
material.depthWrite = false;
|
|
125
|
+
|
|
126
|
+
} else if ( RGB !== null ) {
|
|
127
|
+
|
|
128
|
+
geometry.setAttribute( 'color', new BufferAttribute( RGB, 3, true ) );
|
|
129
|
+
material.vertexColors = true;
|
|
130
|
+
|
|
131
|
+
} else if ( RGB565 !== null ) {
|
|
132
|
+
|
|
133
|
+
const color = new Uint8Array( POINTS_LENGTH * 3 );
|
|
134
|
+
for ( let i = 0; i < POINTS_LENGTH; i ++ ) {
|
|
135
|
+
|
|
136
|
+
const rgbColor = rgb565torgb( RGB565[ i ] );
|
|
137
|
+
for ( let j = 0; j < 3; j ++ ) {
|
|
138
|
+
|
|
139
|
+
const index = 3 * i + j;
|
|
140
|
+
color[ index ] = rgbColor[ j ];
|
|
141
|
+
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
}
|
|
145
|
+
geometry.setAttribute( 'color', new BufferAttribute( color, 3, true ) );
|
|
146
|
+
material.vertexColors = true;
|
|
147
|
+
|
|
148
|
+
} else if ( CONSTANT_RGBA !== null ) {
|
|
149
|
+
|
|
150
|
+
const color = new Color( CONSTANT_RGBA[ 0 ], CONSTANT_RGBA[ 1 ], CONSTANT_RGBA[ 2 ] );
|
|
151
|
+
material.color = color;
|
|
152
|
+
const opacity = CONSTANT_RGBA[ 3 ] / 255;
|
|
153
|
+
if ( opacity < 1 ) {
|
|
154
|
+
|
|
155
|
+
material.opacity = opacity;
|
|
156
|
+
material.transparent = true;
|
|
157
|
+
material.depthWrite = false;
|
|
158
|
+
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
[
|
|
166
|
+
'BATCH_LENGTH',
|
|
167
|
+
'NORMAL',
|
|
168
|
+
'NORMAL_OCT16P',
|
|
169
|
+
].forEach( ( feature ) => {
|
|
170
|
+
|
|
171
|
+
if ( feature in featureTable.header ) {
|
|
172
|
+
|
|
173
|
+
console.warn(
|
|
174
|
+
`PNTSLoader: Unsupported FeatureTable feature "${feature}" detected.`
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
} );
|
|
180
|
+
|
|
181
|
+
const object = new Points( geometry, material );
|
|
182
|
+
object.position.copy( translationOffset );
|
|
183
|
+
result.scene = object;
|
|
184
|
+
result.scene.featureTable = featureTable;
|
|
185
|
+
result.scene.batchTable = batchTable;
|
|
186
|
+
|
|
187
|
+
const rtcCenter = featureTable.getData( 'RTC_CENTER' );
|
|
188
|
+
if ( rtcCenter ) {
|
|
189
|
+
|
|
190
|
+
result.scene.position.x += rtcCenter[ 0 ];
|
|
191
|
+
result.scene.position.y += rtcCenter[ 1 ];
|
|
192
|
+
result.scene.position.z += rtcCenter[ 2 ];
|
|
193
|
+
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return result;
|
|
197
|
+
|
|
198
|
+
} );
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { GLTFCesiumRTCExtension as GLTFCesiumRTCExtensionImpl } from '../../../plugins/index.js';
|
|
2
|
+
|
|
3
|
+
export class GLTFCesiumRTCExtension extends GLTFCesiumRTCExtensionImpl {
|
|
4
|
+
|
|
5
|
+
constructor( ...args ) {
|
|
6
|
+
|
|
7
|
+
super( ...args );
|
|
8
|
+
console.warn( 'GLTFCesiumRTCExtension: Plugins should now be imported from "3d-tiles-renderer/plugins" path.' );
|
|
9
|
+
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { GLTFMeshFeaturesExtension as GLTFMeshFeaturesExtensionImpl } from '../../../plugins/index.js';
|
|
2
|
+
|
|
3
|
+
export class GLTFMeshFeaturesExtension extends GLTFMeshFeaturesExtensionImpl {
|
|
4
|
+
|
|
5
|
+
constructor( ...args ) {
|
|
6
|
+
|
|
7
|
+
super( ...args );
|
|
8
|
+
console.warn( 'GLTFMeshFeaturesExtension: Plugins should now be imported from "3d-tiles-renderer/plugins" path.' );
|
|
9
|
+
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { GLTFStructuralMetadataExtension as GLTFStructuralMetadataExtensionImpl } from '../../../plugins/index.js';
|
|
2
|
+
|
|
3
|
+
export class GLTFStructuralMetadataExtension extends GLTFStructuralMetadataExtensionImpl {
|
|
4
|
+
|
|
5
|
+
constructor( ...args ) {
|
|
6
|
+
|
|
7
|
+
super( ...args );
|
|
8
|
+
console.warn( 'GLTFStructuralMetadataExtension: Plugins should now be imported from "3d-tiles-renderer/plugins" path.' );
|
|
9
|
+
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Vector3, Matrix4 } from 'three';
|
|
2
|
+
|
|
3
|
+
export enum Frames {}
|
|
4
|
+
export const ENU_FRAME: Frames;
|
|
5
|
+
export const CAMERA_FRAME: Frames;
|
|
6
|
+
export const OBJECT_FRAME: Frames;
|
|
7
|
+
|
|
8
|
+
export class Ellipsoid {
|
|
9
|
+
|
|
10
|
+
radius: Vector3;
|
|
11
|
+
|
|
12
|
+
constructor( x: Number, y: Number, z: Number );
|
|
13
|
+
getCartographicToPosition( lat: Number, lon: Number, height: Number, target: Vector3 ): Vector3;
|
|
14
|
+
getPositionToCartographic( pos: Vector3, target: Object ): { lat: Number, lon: Number, height: Number };
|
|
15
|
+
getCartographicToNormal( lat: Number, lon: Number, target: Vector3 ): Vector3;
|
|
16
|
+
getPositionToNormal( pos: Vector3, target: Vector3 ): Vector3;
|
|
17
|
+
getPositionToSurfacePoint( pos: Vector3, target: Vector3 ): Vector3;
|
|
18
|
+
|
|
19
|
+
getAzElRollFromRotationMatrix(
|
|
20
|
+
lat: Number, lon: Number, rotationMatrix: Matrix4,
|
|
21
|
+
target: Object, frame: Frames,
|
|
22
|
+
): { azimuth: Number, elevation: Number, roll: Number };
|
|
23
|
+
getRotationMatrixFromAzElRoll(
|
|
24
|
+
lat: Number, lon: Number, az: Number, el: Number, roll: Number,
|
|
25
|
+
target: Matrix4, frame: Frames,
|
|
26
|
+
): Matrix4;
|
|
27
|
+
|
|
28
|
+
getEastNorthUpFrame( lat: Number, lon: Number, target: Matrix4 ): Matrix4;
|
|
29
|
+
getEastNorthUpAxes( lat: Number, lon: Number, vecEast: Vector3, vecNorth: Vector3, vecUp: Vector3, point?: Vector3 );
|
|
30
|
+
|
|
31
|
+
}
|