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,26 @@
|
|
|
1
|
+
import { CSS2DRenderer } from 'three/examples/jsm/renderers/CSS2DRenderer.js'
|
|
2
|
+
|
|
3
|
+
export type TLabelRenderer = {
|
|
4
|
+
position: string;
|
|
5
|
+
top: string;
|
|
6
|
+
size: {
|
|
7
|
+
width: number;
|
|
8
|
+
height: number;
|
|
9
|
+
};
|
|
10
|
+
element: HTMLElement;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const createLabelRenderer = (options: TLabelRenderer) => {
|
|
14
|
+
const labelRenderer = new CSS2DRenderer();
|
|
15
|
+
labelRenderer!.domElement.style.position = options.position;
|
|
16
|
+
labelRenderer!.domElement.style.top = options.top;
|
|
17
|
+
labelRenderer!.domElement.style.pointerEvents = 'none';
|
|
18
|
+
labelRenderer.setSize(options.size.width, options.size.height)
|
|
19
|
+
options.element.appendChild(labelRenderer.domElement)
|
|
20
|
+
|
|
21
|
+
return labelRenderer
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
createLabelRenderer
|
|
26
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
|
|
3
|
+
export type TAmbientLight = {
|
|
4
|
+
color: string | number;
|
|
5
|
+
opacity: number;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export type TDirectionalLight = {
|
|
9
|
+
color: string | number;
|
|
10
|
+
opacity: number;
|
|
11
|
+
shadow: {
|
|
12
|
+
mapSize: number;
|
|
13
|
+
pos: {
|
|
14
|
+
x: number;
|
|
15
|
+
y: number;
|
|
16
|
+
z: number;
|
|
17
|
+
}
|
|
18
|
+
castShadow: boolean;
|
|
19
|
+
camera: {
|
|
20
|
+
top: number;
|
|
21
|
+
right: number;
|
|
22
|
+
bottom: number;
|
|
23
|
+
left: number;
|
|
24
|
+
near: number;
|
|
25
|
+
far: number;
|
|
26
|
+
}
|
|
27
|
+
showDirectionalLightHelper: boolean;
|
|
28
|
+
showShadowCameraHelper: boolean;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const createAmbientLight = (options: TAmbientLight) => {
|
|
33
|
+
const light = new THREE.AmbientLight(options.color, options.opacity)
|
|
34
|
+
return light
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const createDirectionalLight = (options: TDirectionalLight) => {
|
|
38
|
+
const light = new THREE.DirectionalLight(options.color, options.opacity)
|
|
39
|
+
light.shadow.mapSize.set(options.shadow.mapSize, options.shadow.mapSize)
|
|
40
|
+
light.position.set(options.shadow.pos.x, options.shadow.pos.y, options.shadow.pos.z)
|
|
41
|
+
light.castShadow = options.shadow.castShadow;
|
|
42
|
+
light.shadow.camera.top = options.shadow.camera.top;
|
|
43
|
+
light.shadow.camera.right = options.shadow.camera.right;
|
|
44
|
+
light.shadow.camera.bottom = options.shadow.camera.bottom;
|
|
45
|
+
light.shadow.camera.left = options.shadow.camera.left;
|
|
46
|
+
light.shadow.camera.near = options.shadow.camera.near;
|
|
47
|
+
light.shadow.camera.far = options.shadow.camera.far;
|
|
48
|
+
const directionalLightHelper = new THREE.DirectionalLightHelper(light, 10000);
|
|
49
|
+
const shadowCameraHelper = new THREE.CameraHelper(light.shadow.camera)
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
light,
|
|
53
|
+
directionalLightHelper,
|
|
54
|
+
shadowCameraHelper,
|
|
55
|
+
showDirectionalLightHelper: options.shadow.showDirectionalLightHelper,
|
|
56
|
+
showShadowCameraHelper: options.shadow.showShadowCameraHelper
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export {
|
|
61
|
+
createAmbientLight,
|
|
62
|
+
createDirectionalLight
|
|
63
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
|
|
3
|
+
export type TRenderer = {
|
|
4
|
+
element: HTMLElement;
|
|
5
|
+
antialias: boolean;
|
|
6
|
+
alpha: boolean;
|
|
7
|
+
size: {
|
|
8
|
+
width: number;
|
|
9
|
+
height: number;
|
|
10
|
+
},
|
|
11
|
+
pixelRatio: number;
|
|
12
|
+
shadowMap: boolean;
|
|
13
|
+
clear: {
|
|
14
|
+
color: string;
|
|
15
|
+
alpha: number;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const createRenderer = (options: TRenderer) => {
|
|
20
|
+
const renderer = new THREE.WebGLRenderer({
|
|
21
|
+
antialias: options.antialias,
|
|
22
|
+
alpha: options.alpha
|
|
23
|
+
});
|
|
24
|
+
renderer.setClearColor(options.clear.color);
|
|
25
|
+
renderer.setClearAlpha(options.clear.alpha);
|
|
26
|
+
renderer.setSize(options.size.width, options.size.height);
|
|
27
|
+
renderer.setPixelRatio(options.pixelRatio);
|
|
28
|
+
renderer.shadowMap.enabled = options.shadowMap;
|
|
29
|
+
renderer.shadowMap.type = THREE.PCFShadowMap;
|
|
30
|
+
options.element.appendChild(renderer.domElement)
|
|
31
|
+
|
|
32
|
+
return renderer
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export {
|
|
36
|
+
createRenderer
|
|
37
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import Stats from 'three/examples/jsm/libs/stats.module.js'
|
|
2
|
+
|
|
3
|
+
export type TStats = {
|
|
4
|
+
element: HTMLElement;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const createStats = (options: TStats) => {
|
|
8
|
+
const stats = new Stats();
|
|
9
|
+
options.element.appendChild(stats.dom)
|
|
10
|
+
|
|
11
|
+
return stats
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export {
|
|
15
|
+
createStats
|
|
16
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
|
|
3
|
+
enum EDefaultEvent {
|
|
4
|
+
GETRAYPOSONMOUSECLICK = 'getRayPosOnMouseClick',
|
|
5
|
+
GETRAYPOSONMOUSEMOVE = 'getRayPosOnMouseMove',
|
|
6
|
+
INSERTANIMATIONS = 'insertAnimations',
|
|
7
|
+
DEFAULT = 'default'
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type TConfigType = {
|
|
11
|
+
getRayPosOnMouseClick: {
|
|
12
|
+
cb: (pos: THREE.Vector3, object: THREE.Object3D) => void
|
|
13
|
+
}
|
|
14
|
+
getRayPosOnMouseMove: {
|
|
15
|
+
cb: (pos: THREE.Vector3, object: THREE.Object3D) => void
|
|
16
|
+
},
|
|
17
|
+
insertAnimations: {
|
|
18
|
+
cb: () => void
|
|
19
|
+
},
|
|
20
|
+
default: never
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const defaultEvent = <T extends EDefaultEvent>(type: T, config: TConfigType[T] & { threeConfiguration: ITHREEConfiguration }) => {
|
|
24
|
+
const mouseclick = (e: MouseEvent, selected: THREE.Intersection) => {
|
|
25
|
+
switch (type) {
|
|
26
|
+
case EDefaultEvent.GETRAYPOSONMOUSECLICK:
|
|
27
|
+
(config as TConfigType[EDefaultEvent.GETRAYPOSONMOUSECLICK]).cb(selected.point, selected.object)
|
|
28
|
+
break;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const mousemove = (e: MouseEvent, selected: THREE.Intersection) => {
|
|
33
|
+
switch (type) {
|
|
34
|
+
case EDefaultEvent.GETRAYPOSONMOUSEMOVE:
|
|
35
|
+
(config as TConfigType[EDefaultEvent.GETRAYPOSONMOUSEMOVE]).cb(selected.point, selected.object)
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const mouseup = (e: MouseEvent, selected: THREE.Intersection) => {
|
|
41
|
+
switch (type) {
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const mousedown = (e: MouseEvent, selected: THREE.Intersection) => {
|
|
46
|
+
switch (type) {
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const animation = () => {
|
|
51
|
+
switch (type) {
|
|
52
|
+
case EDefaultEvent.INSERTANIMATIONS:
|
|
53
|
+
(config as TConfigType[EDefaultEvent.INSERTANIMATIONS]).cb()
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return {
|
|
59
|
+
mouseclick,
|
|
60
|
+
mousemove,
|
|
61
|
+
mousedown,
|
|
62
|
+
mouseup,
|
|
63
|
+
animation
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export {
|
|
68
|
+
defaultEvent,
|
|
69
|
+
EDefaultEvent
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export type {
|
|
73
|
+
TConfigType
|
|
74
|
+
}
|
package/src/core/main.ts
ADDED
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import * as THREE from 'three'
|
|
2
|
+
// import { AxesHelper, GridHelper, Line } from 'three'
|
|
3
|
+
// import { TransformControlsGizmo, TransformControlsPlane } from 'three/examples/jsm/controls/TransformControls'
|
|
4
|
+
import {
|
|
5
|
+
createScene,
|
|
6
|
+
createCamera,
|
|
7
|
+
createControl,
|
|
8
|
+
createRenderer,
|
|
9
|
+
createLabelRenderer,
|
|
10
|
+
createStats,
|
|
11
|
+
createClock,
|
|
12
|
+
createAmbientLight,
|
|
13
|
+
createDirectionalLight
|
|
14
|
+
} from './basic'
|
|
15
|
+
import { defaultEvent, EDefaultEvent } from './event'
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
TControl,
|
|
19
|
+
TLabelRenderer,
|
|
20
|
+
TAmbientLight,
|
|
21
|
+
TDirectionalLight,
|
|
22
|
+
TRenderer,
|
|
23
|
+
TCamera
|
|
24
|
+
} from './basic'
|
|
25
|
+
import type { TConfigType } from './event'
|
|
26
|
+
|
|
27
|
+
interface ILight {
|
|
28
|
+
ambientLight: TAmbientLight;
|
|
29
|
+
directionalLight: TDirectionalLight;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface ITHREEOptions {
|
|
33
|
+
element: HTMLElement;
|
|
34
|
+
control: Omit<TControl, 'element' | 'camera'>;
|
|
35
|
+
labelRenderer: Omit<TLabelRenderer, 'element'>;
|
|
36
|
+
light: ILight;
|
|
37
|
+
renderer: Omit<TRenderer, 'element'>;
|
|
38
|
+
camera: TCamera;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
interface ITHREEAction {
|
|
42
|
+
animation: (() => void) | null;
|
|
43
|
+
clickHandler: ((e: MouseEvent, selected: THREE.Intersection) => void) | null;
|
|
44
|
+
movementHandler: ((e: MouseEvent, selected: THREE.Intersection) => void) | null;
|
|
45
|
+
mousedown: ((e: MouseEvent, selected: THREE.Intersection) => void) | null;
|
|
46
|
+
mouseup: ((e: MouseEvent, selected: THREE.Intersection) => void) | null;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
type TNeedlessParamskeys<T> = {
|
|
50
|
+
[K in keyof T]: T[K] extends never ? K : never
|
|
51
|
+
}[keyof T]
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* todo
|
|
55
|
+
* 1.雾气设置
|
|
56
|
+
* 2.设置是否开启动画
|
|
57
|
+
* 3.提高帧数(移动时释放部分模型细节,切片加载,着色器)
|
|
58
|
+
* 4.是否加载hepler
|
|
59
|
+
* 5.设置帧数(30帧)
|
|
60
|
+
* 6.图层优化
|
|
61
|
+
* 7.监视内存
|
|
62
|
+
* 8.hdr
|
|
63
|
+
* 9.关闭阴影
|
|
64
|
+
* 10.lod
|
|
65
|
+
* 11.修改模型细节
|
|
66
|
+
* 12.indexDB缓存
|
|
67
|
+
* 13.resize添加节流
|
|
68
|
+
*/
|
|
69
|
+
const useThree = () => {
|
|
70
|
+
const threeConfiguration: ITHREEConfiguration = {
|
|
71
|
+
scene: null,
|
|
72
|
+
camera: null,
|
|
73
|
+
control: null,
|
|
74
|
+
renderer: null,
|
|
75
|
+
labelRenderer: null,
|
|
76
|
+
stats: null,
|
|
77
|
+
clock: null,
|
|
78
|
+
light: {
|
|
79
|
+
ambient: null,
|
|
80
|
+
directional: {
|
|
81
|
+
light: null,
|
|
82
|
+
directionalLightHelper: null,
|
|
83
|
+
shadowCameraHelper: null,
|
|
84
|
+
showDirectionalLightHelper: false,
|
|
85
|
+
showShadowCameraHelper: false
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const loadThree = (options: ITHREEOptions, succeededCallback: (config: ITHREEConfiguration) => void) => {
|
|
91
|
+
threeConfiguration.scene = createScene()
|
|
92
|
+
threeConfiguration.camera = createCamera(Object.assign({}, options.camera, {
|
|
93
|
+
lookAt: !options.camera.lookAt ? threeConfiguration.scene.position : options.camera.lookAt
|
|
94
|
+
}))
|
|
95
|
+
threeConfiguration.renderer = createRenderer(Object.assign({}, options.renderer, {
|
|
96
|
+
element: options.element
|
|
97
|
+
}))
|
|
98
|
+
threeConfiguration.control = createControl(Object.assign({}, options.control, {
|
|
99
|
+
camera: threeConfiguration.camera,
|
|
100
|
+
element: threeConfiguration.renderer.domElement
|
|
101
|
+
}))
|
|
102
|
+
threeConfiguration.labelRenderer = createLabelRenderer(Object.assign({}, options.labelRenderer, {
|
|
103
|
+
element: options.element
|
|
104
|
+
}))
|
|
105
|
+
threeConfiguration.stats = createStats({
|
|
106
|
+
element: options.element
|
|
107
|
+
})
|
|
108
|
+
threeConfiguration.clock = createClock()
|
|
109
|
+
threeConfiguration.light.ambient = createAmbientLight(options.light.ambientLight)
|
|
110
|
+
threeConfiguration.light.directional = createDirectionalLight(options.light.directionalLight)
|
|
111
|
+
|
|
112
|
+
setScene(options)
|
|
113
|
+
render()
|
|
114
|
+
|
|
115
|
+
window.onresize = () => {
|
|
116
|
+
threeConfiguration.camera!.aspect = window.innerWidth / window.innerHeight
|
|
117
|
+
threeConfiguration.camera!.updateProjectionMatrix()
|
|
118
|
+
threeConfiguration.renderer!.setSize(window.innerWidth, window.innerHeight)
|
|
119
|
+
threeConfiguration.labelRenderer!.setSize(window.innerWidth, window.innerHeight)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
succeededCallback && succeededCallback(threeConfiguration)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
//todo 设置参数 光源辅助线
|
|
126
|
+
const setScene = (options: ITHREEOptions) => {
|
|
127
|
+
threeConfiguration.scene?.add(threeConfiguration.light.ambient!)
|
|
128
|
+
threeConfiguration.scene?.add(threeConfiguration.light.directional.light!)
|
|
129
|
+
// threeConfiguration.scene?.add(threeConfiguration.light.directional.directionalLightHelper!)
|
|
130
|
+
// if (options.showShadowCameraHelper) {
|
|
131
|
+
|
|
132
|
+
// }
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const threeAction: ITHREEAction = {
|
|
136
|
+
animation: null,
|
|
137
|
+
clickHandler: null,
|
|
138
|
+
movementHandler: null,
|
|
139
|
+
mousedown: null,
|
|
140
|
+
mouseup: null
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
document.addEventListener('visibilitychange', () => {
|
|
144
|
+
if (!document.hidden) {
|
|
145
|
+
render()
|
|
146
|
+
} else {
|
|
147
|
+
cancelAnimationFrame(animationId);
|
|
148
|
+
}
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
let animationId: number;
|
|
152
|
+
const render = () => {
|
|
153
|
+
animationId = requestAnimationFrame(render)
|
|
154
|
+
animation()
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
const animation = () => {
|
|
158
|
+
if (!threeConfiguration.renderer) {
|
|
159
|
+
return
|
|
160
|
+
}
|
|
161
|
+
threeConfiguration.renderer!.clear()
|
|
162
|
+
threeConfiguration.renderer!.clearDepth()
|
|
163
|
+
|
|
164
|
+
threeAction.animation && threeAction.animation()
|
|
165
|
+
threeConfiguration.control!.update();
|
|
166
|
+
threeConfiguration.stats!.update();
|
|
167
|
+
threeConfiguration.renderer!.setViewport(0, 0, window.innerWidth, window.innerHeight);
|
|
168
|
+
threeConfiguration.renderer!.autoClear = false;
|
|
169
|
+
threeConfiguration.renderer!.render(threeConfiguration.scene!, threeConfiguration.camera!)
|
|
170
|
+
threeConfiguration.labelRenderer!.render(threeConfiguration.scene!, threeConfiguration.camera!)
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
type TMouseEvent = (e: MouseEvent, selected: THREE.Intersection) => void
|
|
174
|
+
|
|
175
|
+
let defaultMouseClickEvent: TMouseEvent = () => { };
|
|
176
|
+
let defaultMouseMoveEvent: TMouseEvent = () => { };
|
|
177
|
+
let defaultMouseMoveDownEvent: TMouseEvent = () => { };
|
|
178
|
+
let defaultMouseMoveUpEvent: TMouseEvent = () => { };
|
|
179
|
+
let defaultAnimationEvent: () => void = () => { };
|
|
180
|
+
|
|
181
|
+
let mouseclickEvents: (TMouseEvent)[] = []
|
|
182
|
+
let mousemoveEvents: (TMouseEvent)[] = []
|
|
183
|
+
let mousedownEvents: (TMouseEvent)[] = []
|
|
184
|
+
let mouseupEvents: (TMouseEvent)[] = []
|
|
185
|
+
let animationEvents: (() => void)[] = []
|
|
186
|
+
const enableCustomEvent = (
|
|
187
|
+
mouseEvent?: {
|
|
188
|
+
clickEvents?: (TMouseEvent)[],
|
|
189
|
+
moveEvents?: (TMouseEvent)[],
|
|
190
|
+
downEvents?: (TMouseEvent)[],
|
|
191
|
+
upEvents?: (TMouseEvent)[],
|
|
192
|
+
},
|
|
193
|
+
animation?: (() => void)[],
|
|
194
|
+
) => {
|
|
195
|
+
if (mouseEvent) {
|
|
196
|
+
const { clickEvents, moveEvents, downEvents, upEvents } = mouseEvent
|
|
197
|
+
if (clickEvents) {
|
|
198
|
+
mouseclickEvents = clickEvents
|
|
199
|
+
}
|
|
200
|
+
if (moveEvents) {
|
|
201
|
+
mousemoveEvents = moveEvents
|
|
202
|
+
}
|
|
203
|
+
if (downEvents) {
|
|
204
|
+
mousedownEvents = downEvents
|
|
205
|
+
}
|
|
206
|
+
if (upEvents) {
|
|
207
|
+
mouseupEvents = upEvents
|
|
208
|
+
}
|
|
209
|
+
if (animation) {
|
|
210
|
+
animationEvents = animation
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
registrationEvent()
|
|
214
|
+
threeAction.animation = () => {
|
|
215
|
+
for (const event of [...animationEvents, defaultAnimationEvent]) {
|
|
216
|
+
event()
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const enableDefaultEvent: {
|
|
222
|
+
(eventName: TNeedlessParamskeys<TConfigType>): void;
|
|
223
|
+
<T extends EDefaultEvent>(eventName: Exclude<`${EDefaultEvent}`, TNeedlessParamskeys<TConfigType>>, config: TConfigType[T]): void;
|
|
224
|
+
} = <T extends EDefaultEvent>(eventName: T, config?: TConfigType[T]) => {
|
|
225
|
+
const event = defaultEvent(eventName, Object.assign({}, { threeConfiguration }, config))
|
|
226
|
+
defaultMouseClickEvent = event.mouseclick
|
|
227
|
+
defaultMouseMoveEvent = event.mousemove
|
|
228
|
+
defaultMouseMoveDownEvent = event.mousedown
|
|
229
|
+
defaultMouseMoveUpEvent = event.mouseup
|
|
230
|
+
defaultAnimationEvent = event.animation
|
|
231
|
+
|
|
232
|
+
registrationEvent()
|
|
233
|
+
threeAction.animation = () => {
|
|
234
|
+
for (const event of [...animationEvents, defaultAnimationEvent]) {
|
|
235
|
+
event()
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const registrationEvent = () => {
|
|
241
|
+
window.removeEventListener('click', clickHandler, false);
|
|
242
|
+
window.removeEventListener('mousemove', moveHandler, false);
|
|
243
|
+
window.removeEventListener('mousedown', mousedownHandler, false);
|
|
244
|
+
window.removeEventListener('mouseup', mouseupHandler, false);
|
|
245
|
+
|
|
246
|
+
threeAction.clickHandler = addMouseAction([...mouseclickEvents, defaultMouseClickEvent])
|
|
247
|
+
window.addEventListener('click', clickHandler, false);
|
|
248
|
+
|
|
249
|
+
threeAction.movementHandler = addMouseAction([...mousemoveEvents, defaultMouseMoveEvent])
|
|
250
|
+
window.addEventListener('mousemove', moveHandler, false);
|
|
251
|
+
|
|
252
|
+
threeAction.mousedown = addMouseAction([...mousedownEvents, defaultMouseMoveDownEvent])
|
|
253
|
+
window.addEventListener('mousedown', mousedownHandler, false);
|
|
254
|
+
|
|
255
|
+
threeAction.mouseup = addMouseAction([...mouseupEvents, defaultMouseMoveUpEvent])
|
|
256
|
+
window.addEventListener('mouseup', mouseupHandler, false);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
const addMouseAction = (cbArr: ((e: MouseEvent, selected: THREE.Intersection) => void)[]) => {
|
|
260
|
+
return (e: MouseEvent, selected: THREE.Intersection) => {
|
|
261
|
+
if (selected.object instanceof THREE.LineSegments || selected.object instanceof THREE.Mesh || selected.object instanceof THREE.Points || selected.object instanceof THREE.SkinnedMesh) {
|
|
262
|
+
for (const cb of cbArr) {
|
|
263
|
+
cb(e, selected)
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const clickHandler = (e: MouseEvent) => {
|
|
270
|
+
if (!(e.target instanceof HTMLCanvasElement)) {
|
|
271
|
+
return;
|
|
272
|
+
}
|
|
273
|
+
e.stopPropagation()
|
|
274
|
+
mouseEvent(e, threeAction.clickHandler!)
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const moveHandler = (e: MouseEvent) => {
|
|
278
|
+
e.stopPropagation()
|
|
279
|
+
mouseEvent(e, threeAction.movementHandler!)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const mousedownHandler = (e: MouseEvent) => {
|
|
283
|
+
e.stopPropagation()
|
|
284
|
+
mouseEvent(e, threeAction.mousedown!)
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const mouseupHandler = (e: MouseEvent) => {
|
|
288
|
+
e.stopPropagation()
|
|
289
|
+
mouseEvent(e, threeAction.mouseup!)
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const basicType = ['Scene', 'AmbientLight', 'DirectionalLight', 'Line2']
|
|
293
|
+
const mouseEvent = (e: MouseEvent, handler: (e: MouseEvent, selected: THREE.Intersection) => void) => {
|
|
294
|
+
const vector = new THREE.Vector3();
|
|
295
|
+
vector.set(
|
|
296
|
+
(e.clientX / window.innerWidth) * 2 - 1,
|
|
297
|
+
-(e.clientY / window.innerHeight) * 2 + 1,
|
|
298
|
+
0.5
|
|
299
|
+
);
|
|
300
|
+
if (!threeConfiguration.camera) {
|
|
301
|
+
return
|
|
302
|
+
}
|
|
303
|
+
vector.unproject(threeConfiguration.camera!);
|
|
304
|
+
const raycaster = new THREE.Raycaster(threeConfiguration.camera!.position, vector.sub(threeConfiguration.camera!.position).normalize());
|
|
305
|
+
try {
|
|
306
|
+
const group: THREE.Object3D[] = []
|
|
307
|
+
threeConfiguration.scene!.traverse(child => {
|
|
308
|
+
if (child.userData && child.userData.ray && child.userData.ray.filterable) {
|
|
309
|
+
return
|
|
310
|
+
}
|
|
311
|
+
if (basicType.includes(child.type)) {
|
|
312
|
+
return
|
|
313
|
+
}
|
|
314
|
+
if (child.type === 'Group') {
|
|
315
|
+
child.traverse(item => {
|
|
316
|
+
if (basicType.includes(item.type) || item.type === 'Group') {
|
|
317
|
+
return
|
|
318
|
+
}
|
|
319
|
+
group.push(item)
|
|
320
|
+
})
|
|
321
|
+
} else {
|
|
322
|
+
group.push(child)
|
|
323
|
+
}
|
|
324
|
+
})
|
|
325
|
+
|
|
326
|
+
const intersects = raycaster.intersectObjects(group, true);
|
|
327
|
+
const targetIntersection = intersects
|
|
328
|
+
if (targetIntersection.length) {
|
|
329
|
+
const index = targetIntersection.findIndex(item => item.object.userData.locked)
|
|
330
|
+
let selected: THREE.Intersection<THREE.Object3D<THREE.Object3DEventMap>>
|
|
331
|
+
if (index !== -1) {
|
|
332
|
+
selected = targetIntersection[index]
|
|
333
|
+
} else {
|
|
334
|
+
selected = targetIntersection[0]
|
|
335
|
+
}
|
|
336
|
+
if (selected && (selected.object instanceof THREE.LineSegments || selected.object instanceof THREE.Mesh || selected.object instanceof THREE.Points || selected.object instanceof THREE.SkinnedMesh)) {
|
|
337
|
+
handler(e, selected)
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
} catch (error) {
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
const clearThree = () => {
|
|
345
|
+
cancelAnimationFrame(animationId);
|
|
346
|
+
threeConfiguration.scene!.traverse((child: THREE.Object3D) => {
|
|
347
|
+
if (child instanceof THREE.Mesh) {
|
|
348
|
+
if (child.material) {
|
|
349
|
+
child.material.dispose();
|
|
350
|
+
}
|
|
351
|
+
if (child.geometry) {
|
|
352
|
+
child.geometry.dispose();
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
child.clear()
|
|
356
|
+
});
|
|
357
|
+
window.onclick = null
|
|
358
|
+
window.onresize = null
|
|
359
|
+
threeConfiguration.renderer!.forceContextLoss();
|
|
360
|
+
threeConfiguration.renderer!.dispose();
|
|
361
|
+
threeConfiguration.scene!.clear();
|
|
362
|
+
threeConfiguration.renderer!.clear()
|
|
363
|
+
threeConfiguration.labelRenderer = null;
|
|
364
|
+
threeConfiguration.scene = null;
|
|
365
|
+
threeConfiguration.camera = null;
|
|
366
|
+
threeConfiguration.control = null;
|
|
367
|
+
threeConfiguration.renderer = null;
|
|
368
|
+
threeConfiguration.stats = null;
|
|
369
|
+
window.removeEventListener('click', clickHandler, false)
|
|
370
|
+
window.removeEventListener('mousemove', moveHandler, false)
|
|
371
|
+
threeAction.animation = null
|
|
372
|
+
threeAction.clickHandler = null
|
|
373
|
+
threeAction.movementHandler = null
|
|
374
|
+
threeAction.mousedown = null
|
|
375
|
+
threeAction.mouseup = null
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
return {
|
|
379
|
+
loadThree,
|
|
380
|
+
enableCustomEvent,
|
|
381
|
+
EDefaultEvent,
|
|
382
|
+
enableDefaultEvent,
|
|
383
|
+
clearThree
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
export {
|
|
388
|
+
useThree
|
|
389
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Draco 3D Data Compression
|
|
2
|
+
|
|
3
|
+
Draco is an open-source library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.
|
|
4
|
+
|
|
5
|
+
[Website](https://google.github.io/draco/) | [GitHub](https://github.com/google/draco)
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
This folder contains three utilities:
|
|
10
|
+
|
|
11
|
+
* `draco_decoder.js` — Emscripten-compiled decoder, compatible with any modern browser.
|
|
12
|
+
* `draco_decoder.wasm` — WebAssembly decoder, compatible with newer browsers and devices.
|
|
13
|
+
* `draco_wasm_wrapper.js` — JavaScript wrapper for the WASM decoder.
|
|
14
|
+
|
|
15
|
+
Each file is provided in two variations:
|
|
16
|
+
|
|
17
|
+
* **Default:** Latest stable builds, tracking the project's [master branch](https://github.com/google/draco).
|
|
18
|
+
* **glTF:** Builds targeted by the [glTF mesh compression extension](https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression), tracking the [corresponding Draco branch](https://github.com/google/draco/tree/gltf_2.0_draco_extension).
|
|
19
|
+
|
|
20
|
+
Either variation may be used with `DRACOLoader`:
|
|
21
|
+
|
|
22
|
+
```js
|
|
23
|
+
var dracoLoader = new DRACOLoader();
|
|
24
|
+
dracoLoader.setDecoderPath('path/to/decoders/');
|
|
25
|
+
dracoLoader.setDecoderConfig({type: 'js'}); // (Optional) Override detection of WASM support.
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Further [documentation on GitHub](https://github.com/google/draco/tree/master/javascript/example#static-loading-javascript-decoder).
|
|
29
|
+
|
|
30
|
+
## License
|
|
31
|
+
|
|
32
|
+
[Apache License 2.0](https://github.com/google/draco/blob/master/LICENSE)
|