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
package/package.json ADDED
@@ -0,0 +1,12 @@
1
+ {
2
+ "name": "easy-three-utils",
3
+ "version": "0.0.1",
4
+ "main": "index.js",
5
+ "scripts": {
6
+ "test": "echo \"Error: no test specified\" && exit 1"
7
+ },
8
+ "author": "",
9
+ "license": "ISC",
10
+ "types": "./index.d.ts",
11
+ "description": ""
12
+ }
@@ -0,0 +1,24 @@
1
+ import { useLoader } from './useLoader'
2
+ import { useMark, EMarkDefaultStyle } from './useMark'
3
+ import { useLine2 } from './useLine2'
4
+ import { useLocationCalculator } from './useLocationCalculator'
5
+ import { Animation } from './useTween'
6
+
7
+ import type { IPathItem } from './useTween'
8
+
9
+ export {
10
+ useLoader,
11
+
12
+ useMark,
13
+ EMarkDefaultStyle,
14
+
15
+ useLine2,
16
+
17
+ useLocationCalculator,
18
+
19
+ Animation
20
+ }
21
+
22
+ export type {
23
+ IPathItem
24
+ }
@@ -0,0 +1,87 @@
1
+ import * as THREE from 'three'
2
+ import { Line2 } from 'three/examples/jsm/lines/Line2.js'
3
+ import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry.js'
4
+ import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js'
5
+
6
+ const setLineGeometry = (start: THREE.Vector3, end: THREE.Vector3) => {
7
+ const pointArr = [start.x, start.y, start.z, end.x, end.y, end.z];
8
+ const geometry = new LineGeometry();
9
+ geometry.setPositions(pointArr);
10
+
11
+ return geometry;
12
+ }
13
+
14
+ const createLine2 = (config: {
15
+ name: string;
16
+ startPos: THREE.Vector3;
17
+ endPos: THREE.Vector3;
18
+ color?: number;
19
+ linewidth?: number;
20
+ }) => {
21
+ const color = config.color ? config.color : 0xFF9100;
22
+ const linewidth = config.linewidth ? config.linewidth : 6;
23
+
24
+ const geometry = setLineGeometry(config.startPos, config.endPos)
25
+ const centerPoint = new THREE.Vector3().copy(config.startPos).add(config.endPos).multiplyScalar(0.5)
26
+ const distance = Number(new THREE.Vector3().copy(config.startPos).distanceTo(config.endPos))
27
+
28
+ const material = new LineMaterial({
29
+ color,
30
+ linewidth
31
+ })
32
+ material.resolution.set(window.innerWidth, window.innerHeight);
33
+ const line = new Line2(geometry, material);
34
+ line.name = config.name
35
+ line.userData.startPos = config.startPos
36
+ line.userData.endPos = config.endPos
37
+
38
+ return {
39
+ centerPoint,
40
+ distance,
41
+ line
42
+ }
43
+ }
44
+
45
+ const updateLine2 = (config: {
46
+ line: Line2;
47
+ startPos?: THREE.Vector3;
48
+ endPos?: THREE.Vector3;
49
+ color?: THREE.Color;
50
+ linewidth?: number;
51
+ }) => {
52
+ if (config.color) {
53
+ config.line.material.color = config.color
54
+ }
55
+ if (config.linewidth) {
56
+ config.line.material.linewidth = config.linewidth
57
+ }
58
+ if (config.startPos) {
59
+ config.line.userData.startPos = config.startPos
60
+ }
61
+ if (config.endPos) {
62
+ config.line.userData.endPos = config.endPos
63
+ }
64
+ if (config.startPos || config.endPos) {
65
+ const geometry = setLineGeometry(config.line.userData.startPos, config.line.userData.endPos)
66
+ config.line.geometry = geometry
67
+ }
68
+
69
+ const centerPoint = new THREE.Vector3().copy(config.line.userData.startPos).add(config.line.userData.endPos).multiplyScalar(0.5)
70
+ const distance = Number(new THREE.Vector3().copy(config.line.userData.startPos).distanceTo(config.line.userData.endPos))
71
+
72
+ return {
73
+ centerPoint,
74
+ distance
75
+ }
76
+ }
77
+
78
+ const useLine2 = () => {
79
+ return {
80
+ createLine2,
81
+ updateLine2
82
+ }
83
+ }
84
+
85
+ export {
86
+ useLine2
87
+ }
@@ -0,0 +1,184 @@
1
+ import * as THREE from 'three'
2
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js"
3
+ import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader.js'
4
+ import { OBJLoader } from "three/examples/jsm/loaders/OBJLoader.js"
5
+ import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader.js'
6
+ import { FBXLoader } from 'three/examples/jsm/loaders/FBXLoader.js'
7
+ import { TGALoader } from 'three/examples/jsm/loaders/TGALoader.js'
8
+ import { TilesRenderer } from '../tileRenderer'
9
+ import { GoogleCloudAuthPlugin } from '../tileRenderer/plugins';
10
+ import { enableDefaultEvent, EDefaultEvent } from '../core'
11
+
12
+ //todo 1.曝光
13
+ interface IThreeLoaders {
14
+ GLTFLoader: GLTFLoader | null,
15
+ DRACOLoader: DRACOLoader | null,
16
+ OBJLoader: OBJLoader | null,
17
+ MTLLoader: MTLLoader | null,
18
+ FBXLoader: FBXLoader | null,
19
+ TGALoader: TGALoader | null,
20
+ TextureLoader: THREE.TextureLoader | null
21
+ }
22
+
23
+ const threeLoaders: IThreeLoaders = {
24
+ GLTFLoader: null,
25
+ DRACOLoader: null,
26
+ OBJLoader: null,
27
+ MTLLoader: null,
28
+ FBXLoader: null,
29
+ TGALoader: null,
30
+ TextureLoader: null
31
+ }
32
+
33
+ const useLoader = () => {
34
+ const useTextureLoader = (url: string, callback?: (texture: THREE.Texture) => void) => {
35
+ threeLoaders.TextureLoader = new THREE.TextureLoader()
36
+ const texture = threeLoaders.TextureLoader.load(url, (texture) => {
37
+ callback && callback(texture)
38
+ })
39
+ return texture;
40
+ }
41
+
42
+ const setFBXLoader = () => {
43
+ threeLoaders.FBXLoader = new FBXLoader()
44
+ threeLoaders.FBXLoader.setPath("/model")
45
+ }
46
+
47
+ const useFBXLoader = (url: string, callback: (object: THREE.Group & Record<'mixer', THREE.AnimationMixer>) => void, xhrCallback?: (xhr: ProgressEvent<EventTarget>) => void) => {
48
+ setFBXLoader()
49
+
50
+ threeLoaders.FBXLoader!.load(url, (object) => {
51
+ object.traverse((child) => {
52
+ if (child instanceof THREE.Mesh) {
53
+ child.castShadow = true;
54
+ child.receiveShadow = true;
55
+ child.material.fog = true;
56
+ child.material.emissive = child.material.color;
57
+ child.material.emissiveMap = child.material.map;
58
+ child.material.side = 0;
59
+ child.material.shadowSide = THREE.BackSide;
60
+ }
61
+ });
62
+ callback(object as THREE.Group & Record<'mixer', THREE.AnimationMixer>)
63
+ }, (xhr) => {
64
+ xhrCallback && xhrCallback(xhr)
65
+ })
66
+ }
67
+
68
+ const setGLTFLoader = () => {
69
+ threeLoaders.DRACOLoader = new DRACOLoader()
70
+ threeLoaders.DRACOLoader.setDecoderPath('/draco/gltf/');
71
+ threeLoaders.DRACOLoader.preload()
72
+
73
+ threeLoaders.GLTFLoader = new GLTFLoader()
74
+ threeLoaders.GLTFLoader.setDRACOLoader(threeLoaders.DRACOLoader)
75
+ }
76
+
77
+ const useGLTFLoader = (url: string, callback: (object: THREE.Group, animations: {
78
+ mixer: THREE.AnimationMixer | null,
79
+ actions: THREE.AnimationAction[]
80
+ }) => void, xhrCallback?: (xhr: ProgressEvent<EventTarget>) => void) => {
81
+ if (!threeLoaders.GLTFLoader) {
82
+ setGLTFLoader()
83
+ }
84
+
85
+ if (url.includes('http')) {
86
+ threeLoaders.GLTFLoader!.setPath('')
87
+ } else {
88
+ threeLoaders.GLTFLoader!.setPath('/model')
89
+ }
90
+
91
+ threeLoaders.GLTFLoader!.load(url, (object) => {
92
+ object.scene.updateMatrixWorld()
93
+ object.scene.traverse(child => {
94
+ if (child instanceof THREE.Mesh) {
95
+ child.material.fog = true;
96
+ child.castShadow = true;
97
+ child.receiveShadow = true;
98
+ child.material.side = 0;
99
+ child.material.shadowSide = THREE.BackSide;
100
+ }
101
+ })
102
+ object.scene.animations = object.animations
103
+
104
+ const animaion: {
105
+ mixer: THREE.AnimationMixer | null,
106
+ actions: THREE.AnimationAction[]
107
+ } = {
108
+ mixer: null,
109
+ actions: []
110
+ }
111
+ animaion.mixer = new THREE.AnimationMixer(object.scene)
112
+ animaion.actions = object.animations.map(item => animaion.mixer!.clipAction(item))
113
+
114
+ callback(object.scene, animaion)
115
+ }, (xhr) => {
116
+ xhrCallback && xhrCallback(xhr)
117
+ })
118
+ }
119
+
120
+ const useOfflineGoogleCloudTilesLoader = (config: {
121
+ url: string;
122
+ lat: number;
123
+ lon: number;
124
+ config: ITHREEConfiguration;
125
+ }, callback?: (tilesRenderer: TilesRenderer, clearFn: () => void) => void) => {
126
+ let tilesRenderer: TilesRenderer | null = new TilesRenderer();
127
+ tilesRenderer.registerPlugin(new GoogleCloudAuthPlugin({ url: config.url }));
128
+ tilesRenderer.setLatLonToYUp(config.lat * THREE.MathUtils.DEG2RAD, config.lon * THREE.MathUtils.DEG2RAD);
129
+
130
+ const dracoLoader = new DRACOLoader();
131
+ dracoLoader.setDecoderPath('../draco/gltf/');
132
+
133
+ const loader = new GLTFLoader(tilesRenderer.manager);
134
+ loader.setDRACOLoader(dracoLoader);
135
+
136
+ tilesRenderer.manager.addHandler(/\.gltf$/, loader);
137
+
138
+ enableDefaultEvent(EDefaultEvent.INSERTANIMATIONS, {
139
+ cb() {
140
+ if (tilesRenderer) {
141
+ tilesRenderer.update()
142
+ tilesRenderer.setResolutionFromRenderer(config.config.camera!, config.config.renderer!);
143
+ tilesRenderer.setCamera(config.config.camera!);
144
+ }
145
+ }
146
+ })
147
+
148
+ config.config.scene!.add(tilesRenderer.group)
149
+ tilesRenderer.setResolutionFromRenderer(config.config.camera!, config.config.renderer!);
150
+ tilesRenderer.setCamera(config.config.camera!);
151
+
152
+ const clear = () => {
153
+ if (tilesRenderer) {
154
+ config.config.scene!.remove(tilesRenderer.group)
155
+ tilesRenderer = null
156
+ }
157
+ }
158
+
159
+ callback && callback(tilesRenderer, clear)
160
+ }
161
+
162
+ //todo 1.多动画封装 2.动画库封装 3.多动画加载时间差 4.同模型克隆
163
+ const useMixer: (object: THREE.Object3D, animate: THREE.AnimationClip) => { mixer: THREE.AnimationMixer, action: THREE.AnimationAction } = (object: THREE.Object3D, animate: THREE.AnimationClip) => {
164
+ const mixer = new THREE.AnimationMixer(object)
165
+ const action = mixer.clipAction(animate);
166
+
167
+ return {
168
+ mixer,
169
+ action
170
+ }
171
+ }
172
+
173
+ return {
174
+ useTextureLoader,
175
+ useFBXLoader,
176
+ useGLTFLoader,
177
+ useOfflineGoogleCloudTilesLoader,
178
+ useMixer
179
+ }
180
+ }
181
+
182
+ export {
183
+ useLoader
184
+ }
@@ -0,0 +1,145 @@
1
+ import * as THREE from 'three'
2
+
3
+ interface IPercentages {
4
+ index: number;
5
+ percentages: number[];
6
+ }
7
+
8
+ const useLocationCalculator = () => {
9
+ const getEqualNodes = (points: THREE.Vector3[], parts: number) => {
10
+ const percentages: IPercentages[] = getPercentage(points, parts)
11
+
12
+ const node = points.reduce((pre: THREE.Vector3[], next, index) => {
13
+ if (index === 0) {
14
+ return pre
15
+ } else {
16
+ const spline = new THREE.LineCurve3(points[index - 1], next);
17
+ const node = spline.getPoints(9999)
18
+ for (const item of percentages) {
19
+ if (item.index === index) {
20
+ pre = pre.concat(item.percentages.map((ele) => {
21
+ if (Math.round(ele * 100) === 0) {
22
+ return node[Math.round(ele * 100)]
23
+ } else {
24
+ return node[Math.round(ele * 100) - 1]
25
+ }
26
+ }))
27
+ }
28
+ }
29
+ return pre
30
+ }
31
+ }, [])
32
+
33
+ return {
34
+ node
35
+ }
36
+ }
37
+
38
+ const getPercentage = (points: THREE.Vector3[], parts: number) => {
39
+ const linePercentages = points.reduce((data: {
40
+ totalLength: number;
41
+ lengths: number[];
42
+ percentages: number[];
43
+ }, next, index) => {
44
+ if (index === 0) {
45
+ return data
46
+ } else {
47
+ const length = points[index - 1].distanceTo(next)
48
+ data.lengths.push(length)
49
+ data.totalLength = data.totalLength + length
50
+ if (index === points.length - 1) {
51
+ for (const [index, item] of data.lengths.entries()) {
52
+ if (index === 0) {
53
+ data.percentages.push(Math.round(item / data.totalLength * 10000) / 100.00)
54
+ } else {
55
+ data.percentages.push(Math.round(item / data.totalLength * 10000) / 100.00 + data.percentages[index - 1])
56
+ }
57
+ }
58
+ data.percentages.unshift(0)
59
+ }
60
+ return data
61
+ }
62
+ }, {
63
+ totalLength: 0,
64
+ lengths: [],
65
+ percentages: []
66
+ }).percentages
67
+
68
+ const equalPercentage = new Array(parts - 1).fill('').reduce((percentages, next, index) => {
69
+ const percentage = (index + 1) * Math.round(Math.round(1 / (parts - 1) * 10000)) / 100.00
70
+ if (percentage >= 100) {
71
+ percentages.push(99.99)
72
+ } else {
73
+ percentages.push(percentage)
74
+ }
75
+ return percentages
76
+ }, [])
77
+
78
+ const data = linePercentages.reduce((data: {
79
+ name: number;
80
+ percentages: number[];
81
+ index: number;
82
+ }[], next: number, i: number) => {
83
+ if (i > 0) {
84
+ for (const item of equalPercentage) {
85
+ const pre = linePercentages[i - 1]
86
+ if (item > pre && item < next) {
87
+ const percentage = Math.round((item - pre) / (next - pre) * 10000) / 100.00
88
+ if (data.length === 0) {
89
+ data.push({
90
+ name: next,
91
+ percentages: [percentage],
92
+ index: i
93
+ })
94
+ } else {
95
+ const keys = data.map(ele => {
96
+ if (ele.name === next) {
97
+ ele.percentages.push(percentage)
98
+ }
99
+ return ele.name
100
+ })
101
+ if (!keys.includes(next)) {
102
+ data.push({
103
+ name: next,
104
+ percentages: [percentage],
105
+ index: i
106
+ })
107
+ }
108
+ }
109
+ }
110
+ }
111
+ if (i === linePercentages.length - 1) {
112
+ if (!data.map(ele => ele.index).includes(1)) {
113
+ data.unshift({
114
+ name: 0,
115
+ percentages: [0],
116
+ index: 1
117
+ })
118
+ } else {
119
+ for (const item of data) {
120
+ if (item.index === 1) {
121
+ item.percentages.unshift(0)
122
+ }
123
+ }
124
+ }
125
+ }
126
+ }
127
+ return data
128
+ }, []).map(item => {
129
+ return {
130
+ percentages: item.percentages,
131
+ index: item.index
132
+ }
133
+ })
134
+
135
+ return data
136
+ }
137
+
138
+ return {
139
+ getEqualNodes
140
+ }
141
+ }
142
+
143
+ export {
144
+ useLocationCalculator
145
+ }
@@ -0,0 +1,42 @@
1
+ import * as THREE from 'three'
2
+ import { CSS2DObject } from 'three/examples/jsm/renderers/CSS2DRenderer.js';
3
+
4
+ enum EMarkDefaultStyle {
5
+ NORMAL = 'three_mark',
6
+ ACTIVE = 'three_mark_active'
7
+ }
8
+
9
+ const useMark = () => {
10
+ const createMark = (pos: THREE.Vector3, className: string) => {
11
+ const div = document.createElement('div');
12
+ div.style.pointerEvents = 'auto'
13
+ div.classList.add(className)
14
+ const mark = new CSS2DObject(div)
15
+ mark.userData = {
16
+ ray: {
17
+ filterable: true
18
+ }
19
+ }
20
+ mark.position.set(pos.x, pos.y, pos.z)
21
+ return {
22
+ mark
23
+ }
24
+ }
25
+
26
+ const updateMarkStyle = (marks: CSS2DObject[], className: string) => {
27
+ marks.forEach(mark => {
28
+ mark.element.classList.remove(...mark.element.classList)
29
+ mark.element.classList.add(className)
30
+ })
31
+ }
32
+
33
+ return {
34
+ createMark,
35
+ updateMarkStyle
36
+ }
37
+ }
38
+
39
+ export {
40
+ useMark,
41
+ EMarkDefaultStyle
42
+ }
@@ -0,0 +1,86 @@
1
+ import * as THREE from 'three'
2
+ import * as TWEEN from '@tweenjs/tween.js'
3
+
4
+ export interface IPathItem {
5
+ startPos: THREE.Vector3;
6
+ endPos: THREE.Vector3;
7
+ delay: number;
8
+ speed: number;
9
+ }
10
+
11
+ type TTweenType = 'start' | 'pause' | 'stop' | 'resume'
12
+
13
+ class Animation {
14
+ tweenActionList: TWEEN.Tween<THREE.Vector3>[] = []
15
+ currentMesh: THREE.Object3D | null = null
16
+ currentIndex: number = 0
17
+ complete: boolean = false
18
+ x: number = 0
19
+ y: number = 0
20
+ z: number = 0
21
+
22
+ createTween = (pre: THREE.Vector3, next: THREE.Vector3, delay: number, speed: number, index: number, loop: boolean) => {
23
+ let currentDelay = 0
24
+ if (index === 0) {
25
+ currentDelay = delay * 1000
26
+ }
27
+
28
+ const time = new THREE.Vector3(pre.x, pre.y, pre.z).distanceTo(new THREE.Vector3(next.x, next.y, next.z)) / (speed * 0.001)
29
+ const tween = new TWEEN.Tween(pre).to(next, time).easing(TWEEN.Easing.Linear.None).delay(currentDelay).onUpdate((e) => {
30
+ this.currentIndex = index
31
+ if (this.x) {
32
+ this.currentMesh!.position.set(this.x, this.y, this.z)
33
+ }
34
+ this.currentMesh!.lookAt(e.x, e.y, e.z)
35
+ this.x = e.x
36
+ this.y = e.y
37
+ this.z = e.z
38
+ }).onComplete((e) => {
39
+ if (index === this.tweenActionList.length - 1) {
40
+ if (!loop) {
41
+ this.complete = true
42
+ }
43
+ this.currentMesh!.position.set(e.x, e.y, e.z)
44
+ this.currentIndex = 0
45
+ this.x = 0
46
+ this.y = 0
47
+ this.z = 0
48
+ }
49
+ })
50
+ return tween;
51
+ }
52
+
53
+ setTweenList = (path: IPathItem[], loop: boolean) => {
54
+ this.tweenActionList = []
55
+ path.forEach((item, i) => {
56
+ const startVector3 = new THREE.Vector3(item.startPos.x, item.startPos.y, item.startPos.z)
57
+ const endVector3 = new THREE.Vector3(item.endPos.x, item.endPos.y, item.endPos.z)
58
+ const tweenAction = this.createTween(startVector3, endVector3, item.delay, item.speed, i, loop)
59
+ if (i > 0) {
60
+ this.tweenActionList[i - 1].chain(tweenAction)
61
+ }
62
+ this.tweenActionList.push(tweenAction)
63
+ })
64
+ if (this.tweenActionList.length > 1 && loop) {
65
+ this.tweenActionList[this.tweenActionList.length - 1].chain(this.tweenActionList[0])
66
+ }
67
+ if (path.length === 1 && loop) {
68
+ this.tweenActionList[this.tweenActionList.length - 1].repeat(Infinity)
69
+ }
70
+ }
71
+
72
+ handleAnimation = (mesh: THREE.Object3D, type: TTweenType) => {
73
+ if (!this.tweenActionList.length) return
74
+ if (type === 'start') {
75
+ this.complete = false
76
+ } else if (type === 'stop') {
77
+ this.complete = true
78
+ }
79
+ this.currentMesh = mesh
80
+ this.tweenActionList[this.currentIndex][type]()
81
+ }
82
+ }
83
+
84
+ export {
85
+ Animation
86
+ }
@@ -0,0 +1,28 @@
1
+ import * as THREE from 'three'
2
+
3
+ export type TCamera = {
4
+ fov: number;
5
+ aspect: number;
6
+ near: number;
7
+ far: number;
8
+ pos: {
9
+ x: number;
10
+ y: number;
11
+ z: number;
12
+ },
13
+ up: number;
14
+ lookAt?: THREE.Vector3;
15
+ }
16
+
17
+ const createCamera = (options: TCamera) => {
18
+ const camera = new THREE.PerspectiveCamera(options.fov, options.aspect, options.near, options.far)
19
+ camera.position.set(options.pos.x, options.pos.y, options.pos.z)
20
+ camera.up.y = options.up;
21
+ camera.lookAt(options.lookAt!)
22
+
23
+ return camera
24
+ }
25
+
26
+ export {
27
+ createCamera
28
+ }
@@ -0,0 +1,11 @@
1
+ import * as THREE from 'three'
2
+
3
+ const createClock = () => {
4
+ const clock = new THREE.Clock()
5
+
6
+ return clock
7
+ }
8
+
9
+ export {
10
+ createClock
11
+ }
@@ -0,0 +1,32 @@
1
+ import * as THREE from 'three'
2
+ import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'
3
+
4
+ export type TControl = {
5
+ camera: THREE.PerspectiveCamera;
6
+ element: HTMLElement;
7
+ pos: {
8
+ x: number;
9
+ y: number;
10
+ z: number;
11
+ },
12
+ minDistance: number;
13
+ maxDistance: number;
14
+ minPolarAngle?: number;
15
+ maxPolarAngle?: number;
16
+ }
17
+
18
+ const createControl = (options: TControl) => {
19
+ const control = new OrbitControls(options.camera!, options.element)
20
+ control.target.set(options.pos.x, options.pos.y, options.pos.z)
21
+ control.minDistance = options.minDistance
22
+ control.maxDistance = options.maxDistance
23
+ control.enableDamping = true
24
+ control.maxPolarAngle = options.maxPolarAngle ? options.maxPolarAngle : 3 * Math.PI / 8
25
+ control.minPolarAngle = options.minPolarAngle ? options.minPolarAngle : 0
26
+
27
+ return control
28
+ }
29
+
30
+ export {
31
+ createControl
32
+ }
@@ -0,0 +1,35 @@
1
+ import { createScene } from './scene'
2
+ import { createCamera } from './camera'
3
+ import { createControl } from './control'
4
+ import { createLabelRenderer } from './labelRenderer'
5
+ import { createRenderer } from './renderer'
6
+ import { createStats } from './stats'
7
+ import { createClock } from './clock'
8
+ import { createAmbientLight, createDirectionalLight } from './light'
9
+
10
+ import type { TControl } from './control'
11
+ import type { TLabelRenderer } from './labelRenderer'
12
+ import type { TAmbientLight, TDirectionalLight } from './light'
13
+ import type { TRenderer } from './renderer'
14
+ import type { TCamera } from './camera'
15
+
16
+ export {
17
+ createScene,
18
+ createCamera,
19
+ createControl,
20
+ createLabelRenderer,
21
+ createRenderer,
22
+ createStats,
23
+ createClock,
24
+ createAmbientLight,
25
+ createDirectionalLight
26
+ }
27
+
28
+ export type {
29
+ TControl,
30
+ TLabelRenderer,
31
+ TAmbientLight,
32
+ TDirectionalLight,
33
+ TRenderer,
34
+ TCamera
35
+ }