easy-three-utils 0.0.1

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