three-base 2.0.137 → 2.0.145

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 (273) hide show
  1. package/DirectionalLight.d.ts +2 -2
  2. package/DirectionalLight.js +1 -1
  3. package/DirectionalLight.ts +70 -0
  4. package/EventMap.d.ts +103 -0
  5. package/EventMap.js +17 -0
  6. package/EventMap.ts +139 -0
  7. package/EventMesh.ts +60 -0
  8. package/ExtrudeMesh.js +1 -25
  9. package/ExtrudeMesh.ts +553 -0
  10. package/FPScontrol.d.ts +448 -15
  11. package/FPScontrol.js +1448 -266
  12. package/FPScontrol.ts +1855 -0
  13. package/Fire/Fire.d.ts +4 -4
  14. package/Fire/Fire.js +8 -7
  15. package/Fire/Fire.ts +89 -0
  16. package/Fire/{FireGromtry.d.ts → FireGeometry.d.ts} +2 -2
  17. package/Fire/{FireGromtry.js → FireGeometry.js} +1 -1
  18. package/Fire/FireGeometry.ts +40 -0
  19. package/Fire/FireMaterial.d.ts +3 -3
  20. package/Fire/FireMaterial.js +1 -1
  21. package/Fire/FireMaterial.ts +89 -0
  22. package/Fire/index.d.ts +1 -0
  23. package/Fire/index.js +1 -0
  24. package/Fire/index.ts +2 -0
  25. package/GLTFDracoLoader.d.ts +71 -0
  26. package/GLTFDracoLoader.js +266 -0
  27. package/GLTFDracoLoader.ts +430 -0
  28. package/Grass/Grass.d.ts +2 -2
  29. package/Grass/Grass.ts +38 -0
  30. package/Grass/index.d.ts +1 -0
  31. package/Grass/index.js +1 -0
  32. package/Grass/index.ts +2 -0
  33. package/Ground1/Ground1.d.ts +2 -3
  34. package/Ground1/Ground1.js +64 -60
  35. package/Ground1/Ground1.ts +114 -0
  36. package/Ground1/index.ts +1 -0
  37. package/MeshBase.d.ts +1 -0
  38. package/MeshBase.js +37 -13
  39. package/MeshBase.ts +253 -0
  40. package/Mirror.d.ts +3 -3
  41. package/Mirror.js +7 -3
  42. package/Mirror.ts +203 -0
  43. package/MktMesh/MktMesh.d.ts +301 -0
  44. package/MktMesh/MktMesh.js +1064 -0
  45. package/MktMesh/MktMesh.ts +1096 -0
  46. package/MktMesh/assetUrl.d.ts +59 -0
  47. package/MktMesh/assetUrl.js +154 -0
  48. package/MktMesh/assetUrl.ts +155 -0
  49. package/MktMesh/mktMappingShader.d.ts +12 -0
  50. package/MktMesh/mktMappingShader.js +139 -0
  51. package/MktMesh/mktMappingShader.ts +139 -0
  52. package/MktMesh/mktShader.d.ts +263 -0
  53. package/MktMesh/mktShader.js +1248 -0
  54. package/MktMesh/mktShader.ts +1344 -0
  55. package/MktMesh/panoBitmapTexture.d.ts +25 -0
  56. package/MktMesh/panoBitmapTexture.js +52 -0
  57. package/MktMesh/panoBitmapTexture.ts +54 -0
  58. package/MktMesh/panoSlotBind.d.ts +29 -0
  59. package/MktMesh/panoSlotBind.js +106 -0
  60. package/MktMesh/panoSlotBind.ts +153 -0
  61. package/MktMesh/panoSlotRoster.d.ts +22 -0
  62. package/MktMesh/panoSlotRoster.js +169 -0
  63. package/MktMesh/panoSlotRoster.ts +168 -0
  64. package/MktMesh/panoTileStitcher.d.ts +119 -0
  65. package/MktMesh/panoTileStitcher.js +533 -0
  66. package/MktMesh/panoTileStitcher.ts +616 -0
  67. package/MktMesh/types.d.ts +75 -0
  68. package/MktMesh/types.js +1 -0
  69. package/MktMesh/types.ts +87 -0
  70. package/MktMesh/wallCapTessellate.d.ts +33 -0
  71. package/MktMesh/wallCapTessellate.js +97 -0
  72. package/MktMesh/wallCapTessellate.ts +68 -0
  73. package/PipeMesh/PathGeometry.js +9 -2
  74. package/PipeMesh/PathGeometry.ts +343 -0
  75. package/PipeMesh/PathPoint.ts +36 -0
  76. package/PipeMesh/PathPointList.js +1 -0
  77. package/PipeMesh/PathPointList.ts +227 -0
  78. package/PipeMesh/PathTubeGeometry.ts +146 -0
  79. package/PipeMesh/PipeMesh.d.ts +1 -1
  80. package/PipeMesh/PipeMesh.js +1 -1
  81. package/PipeMesh/PipeMesh.ts +76 -0
  82. package/PipeMesh/index.ts +1 -0
  83. package/PlaneModal1/PlaneModal1.d.ts +16 -13
  84. package/PlaneModal1/PlaneModal1.js +4 -0
  85. package/PlaneModal1/PlaneModal1.ts +138 -0
  86. package/PlaneModal1/index.ts +1 -0
  87. package/PlaneText.d.ts +2 -14
  88. package/PlaneText.js +7 -2
  89. package/PlaneText.ts +55 -0
  90. package/PlaneWithHtml.d.ts +4 -2
  91. package/PlaneWithHtml.js +2 -1
  92. package/PlaneWithHtml.ts +70 -0
  93. package/PointLight/PointLight.d.ts +3 -4
  94. package/PointLight/PointLight.js +1 -7
  95. package/PointLight/PointLight.ts +67 -0
  96. package/PointLight/index.ts +1 -0
  97. package/README.md +110 -79
  98. package/Sky/Sky.ts +22 -0
  99. package/Sky/index.ts +1 -0
  100. package/SpotLight.d.ts +2 -2
  101. package/SpotLight.js +1 -1
  102. package/SpotLight.ts +74 -0
  103. package/SpriteModal1/SpriteModal1.d.ts +16 -13
  104. package/SpriteModal1/SpriteModal1.js +8 -2
  105. package/SpriteModal1/SpriteModal1.ts +146 -0
  106. package/SpriteModal1/index.ts +1 -0
  107. package/SpriteText.d.ts +14 -13
  108. package/SpriteText.js +22 -9
  109. package/SpriteText.ts +205 -0
  110. package/SpriteText2.d.ts +9 -8
  111. package/SpriteText2.js +57 -32
  112. package/SpriteText2.ts +258 -0
  113. package/SpriteText3.d.ts +86 -0
  114. package/SpriteText3.js +519 -0
  115. package/SpriteText3.ts +599 -0
  116. package/SpriteWithHtml.d.ts +4 -2
  117. package/SpriteWithHtml.ts +50 -0
  118. package/Text3D/Text3D.js +17 -21
  119. package/Text3D/Text3D.ts +77 -0
  120. package/Text3D/fontController.d.ts +10 -9
  121. package/Text3D/fontController.js +17 -50
  122. package/Text3D/fontController.ts +209 -0
  123. package/Text3D/index.ts +1 -0
  124. package/ThreeBase.d.ts +168 -31
  125. package/ThreeBase.js +663 -117
  126. package/ThreeBase.ts +1314 -0
  127. package/ThreeMouse.d.ts +20 -7
  128. package/ThreeMouse.js +78 -32
  129. package/ThreeMouse.ts +472 -0
  130. package/Transition.d.ts +12 -7
  131. package/Transition.js +26 -27
  132. package/Transition.ts +242 -0
  133. package/Water/Water.js +21 -3
  134. package/Water/Water.ts +45 -0
  135. package/Water/index.d.ts +2 -0
  136. package/Water/index.js +2 -0
  137. package/Water/index.ts +2 -0
  138. package/WaterFlow/FloatingDuck.d.ts +88 -0
  139. package/WaterFlow/FloatingDuck.js +307 -0
  140. package/WaterFlow/FloatingDuck.ts +445 -0
  141. package/WaterFlow/GPUFluidSimulation.d.ts +56 -0
  142. package/WaterFlow/GPUFluidSimulation.js +785 -0
  143. package/WaterFlow/GPUFluidSimulation.ts +827 -0
  144. package/WaterFlow/ReservoirSystem.d.ts +106 -0
  145. package/WaterFlow/ReservoirSystem.js +621 -0
  146. package/WaterFlow/ReservoirSystem.ts +754 -0
  147. package/WaterFlow/SPHField.d.ts +35 -0
  148. package/WaterFlow/SPHField.js +204 -0
  149. package/WaterFlow/SPHField.ts +228 -0
  150. package/WaterFlow/ScreenSpaceFluidPass.d.ts +69 -0
  151. package/WaterFlow/ScreenSpaceFluidPass.js +736 -0
  152. package/WaterFlow/ScreenSpaceFluidPass.ts +789 -0
  153. package/WaterFlow/ShallowWaterSurface.d.ts +45 -0
  154. package/WaterFlow/ShallowWaterSurface.js +441 -0
  155. package/WaterFlow/ShallowWaterSurface.ts +510 -0
  156. package/WaterFlow/WaterFlow.d.ts +87 -0
  157. package/WaterFlow/WaterFlow.js +171 -0
  158. package/WaterFlow/WaterFlow.ts +219 -0
  159. package/WaterFlow/types.d.ts +161 -0
  160. package/WaterFlow/types.js +1 -0
  161. package/WaterFlow/types.ts +189 -0
  162. package/WaterFlow/waterFlowPass.d.ts +3 -0
  163. package/WaterFlow/waterFlowPass.js +20 -0
  164. package/WaterFlow/waterFlowPass.ts +40 -0
  165. package/collisionOBB.d.ts +42 -0
  166. package/collisionOBB.js +112 -0
  167. package/collisionOBB.ts +108 -0
  168. package/declare.d.ts +25 -167
  169. package/index.js +0 -1
  170. package/index.ts +1 -0
  171. package/instanced/InstancedBatch.d.ts +57 -0
  172. package/instanced/InstancedBatch.js +348 -0
  173. package/instanced/InstancedBatch.ts +406 -0
  174. package/instanced/InstancedChild.d.ts +174 -0
  175. package/instanced/InstancedChild.js +264 -0
  176. package/instanced/InstancedChild.ts +327 -0
  177. package/instanced/InstancedGroup.d.ts +43 -0
  178. package/instanced/InstancedGroup.js +126 -0
  179. package/instanced/InstancedGroup.ts +137 -0
  180. package/{InstancedMeshBase.d.ts → instanced/InstancedMeshBase.d.ts} +6 -7
  181. package/{InstancedMeshBase.js → instanced/InstancedMeshBase.js} +36 -47
  182. package/instanced/InstancedMeshBase.ts +292 -0
  183. package/instanced/InstancedTemplate.d.ts +46 -0
  184. package/instanced/InstancedTemplate.js +125 -0
  185. package/instanced/InstancedTemplate.ts +188 -0
  186. package/keyControls.d.ts +29 -0
  187. package/{keyContorls.js → keyControls.js} +10 -7
  188. package/keyControls.ts +107 -0
  189. package/lensflare/LensFlare.d.ts +39 -0
  190. package/lensflare/LensFlare.js +373 -0
  191. package/lensflare/LensFlare.ts +448 -0
  192. package/lensflare/lensflare0.png +0 -0
  193. package/lensflare/lensflare3.png +0 -0
  194. package/lensflare/lensflare_custom.png +0 -0
  195. package/lensflare/lensflare_hex_ghost.png +0 -0
  196. package/lensflare/lensflare_hex_main.png +0 -0
  197. package/package.json +104 -25
  198. package/pass/bloom_pass.d.ts +1 -1
  199. package/pass/bloom_pass.js +127 -40
  200. package/pass/bloom_pass.ts +243 -0
  201. package/pass/cover_pass.d.ts +1 -1
  202. package/pass/cover_pass.js +55 -32
  203. package/pass/cover_pass.ts +182 -0
  204. package/pass/debugDepthState.d.ts +20 -0
  205. package/pass/debugDepthState.js +9 -0
  206. package/pass/debugDepthState.ts +22 -0
  207. package/pass/depthTestBias.d.ts +12 -0
  208. package/pass/depthTestBias.js +12 -0
  209. package/pass/depthTestBias.ts +12 -0
  210. package/pass/effectUserData.d.ts +27 -0
  211. package/pass/effectUserData.js +1 -0
  212. package/pass/effectUserData.ts +46 -0
  213. package/pass/frosted_glass_pass.d.ts +1 -1
  214. package/pass/frosted_glass_pass.js +45 -64
  215. package/pass/frosted_glass_pass.ts +288 -0
  216. package/pass/fsQuad.d.ts +2 -2
  217. package/pass/fsQuad.ts +34 -0
  218. package/pass/glow_pass.d.ts +1 -1
  219. package/pass/glow_pass.js +288 -72
  220. package/pass/glow_pass.ts +654 -0
  221. package/pass/screen_bloom_pass.d.ts +11 -0
  222. package/pass/screen_bloom_pass.js +235 -0
  223. package/pass/screen_bloom_pass.ts +263 -0
  224. package/pass/ssao_pass.d.ts +78 -3
  225. package/pass/ssao_pass.js +642 -206
  226. package/pass/ssao_pass.ts +918 -0
  227. package/pass/stroke_pass.d.ts +1 -1
  228. package/pass/stroke_pass.js +187 -116
  229. package/pass/stroke_pass.ts +638 -0
  230. package/shaders/FXAAShaderMaterial.js +5 -48
  231. package/shaders/FXAAShaderMaterial.ts +201 -0
  232. package/shaders/baseDepthVisShader.d.ts +11 -0
  233. package/shaders/baseDepthVisShader.js +36 -0
  234. package/shaders/baseDepthVisShader.ts +36 -0
  235. package/shaders/baseTextureToRenderShader.js +46 -51
  236. package/shaders/baseTextureToRenderShader.ts +232 -0
  237. package/shaders/copyShader.js +2 -3
  238. package/shaders/copyShader.ts +32 -0
  239. package/shaders/debugDepthCompareShader.d.ts +14 -0
  240. package/shaders/debugDepthCompareShader.js +49 -0
  241. package/shaders/debugDepthCompareShader.ts +50 -0
  242. package/shaders/debugDepthJudgeShader.d.ts +18 -0
  243. package/shaders/debugDepthJudgeShader.js +52 -0
  244. package/shaders/debugDepthJudgeShader.ts +54 -0
  245. package/shaders/debugExcludedShader.d.ts +13 -0
  246. package/shaders/debugExcludedShader.js +46 -0
  247. package/shaders/debugExcludedShader.ts +48 -0
  248. package/spriteTextBg.d.ts +1 -0
  249. package/spriteTextBg.js +20 -0
  250. package/spriteTextBg.ts +20 -0
  251. package/threeLoader.d.ts +8 -7
  252. package/threeLoader.js +58 -67
  253. package/threeLoader.ts +525 -0
  254. package/threeUtils.d.ts +2 -1
  255. package/threeUtils.js +24 -25
  256. package/threeUtils.ts +373 -0
  257. package/types.d.ts +2 -0
  258. package/types.js +6 -0
  259. package/types.ts +8 -0
  260. package/ApngTexture.d.ts +0 -13
  261. package/ApngTexture.js +0 -61
  262. package/ApngTextureManage.d.ts +0 -18
  263. package/ApngTextureManage.js +0 -87
  264. package/KeyFrameAnimation.d.ts +0 -25
  265. package/KeyFrameAnimation.js +0 -78
  266. package/keyContorls.d.ts +0 -25
  267. package/lib/draco/draco_decoder.js +0 -34
  268. package/lib/draco/draco_decoder.wasm +0 -0
  269. package/lib/draco/draco_wasm_wrapper.js +0 -117
  270. package/pass/emissive_ao_pass.d.ts +0 -13
  271. package/pass/emissive_ao_pass.js +0 -370
  272. package/shaders.d.ts +0 -5
  273. package/shaders.js +0 -93
package/ThreeMouse.d.ts CHANGED
@@ -1,5 +1,9 @@
1
- import { Object3D, Raycaster, Scene, Vector2, WebGLRenderer } from "three";
2
- import { Camera, Intersection } from "three";
1
+ import { Camera, Intersection, Object3D, Raycaster, Scene, Vector2, WebGLRenderer } from "three";
2
+ import { computeBoundsTree, acceleratedRaycast } from "three-mesh-bvh";
3
+ import type InstancedGroup from "./instanced/InstancedGroup";
4
+ /** Patch Mesh.raycast with BVH acceleration. Call once before using ThreeMouse. */
5
+ export declare function initBVHRaycast(): void;
6
+ export { computeBoundsTree, acceleratedRaycast };
3
7
  export interface ThreeMouseEvent extends Intersection {
4
8
  e: MouseEvent;
5
9
  renderer: WebGLRenderer;
@@ -10,6 +14,7 @@ export interface ThreeMouseEvent extends Intersection {
10
14
  x: number;
11
15
  y: number;
12
16
  }
17
+ export type MouseEventType = "leftclick" | "rightclick" | "click" | "dbclick" | "mouseenter" | "mouseleave" | "mousemove" | "mousedown" | "mouseup";
13
18
  /**
14
19
  * js 专用的鼠标拾取模型对象
15
20
  */
@@ -18,6 +23,7 @@ export default class ThreeMouse {
18
23
  _renderer: WebGLRenderer;
19
24
  _camera: Camera;
20
25
  _scene: Scene;
26
+ instancedGroup?: InstancedGroup;
21
27
  _mosePosition: Vector2;
22
28
  _mouseDownPosition: Vector2;
23
29
  _mesh_on?: Object3D;
@@ -25,16 +31,23 @@ export default class ThreeMouse {
25
31
  _raycaster: Raycaster;
26
32
  _frame: number;
27
33
  _mouseInRenderer: boolean;
28
- _mousemoveEvent?: MouseEvent;
29
- _mouseEvent?: MouseEvent;
34
+ _mousemoveEvent?: MouseEvent | PointerEvent;
35
+ _mouseEvent?: MouseEvent | PointerEvent;
30
36
  _object3ds: Object3D[];
31
37
  _click_num: number;
32
38
  _getSelected(object3ds: Object3D[]): Intersection | undefined;
33
- hasEvent(object?: Object3D, types?: Array<"leftclick" | "rightclick" | "click" | "dbclick" | "mouseenter" | "mouseleave" | "mousemove" | "mousedown" | "mouseup">): boolean;
34
- hasCursor(object?: Object3D): boolean;
39
+ hasEvent(object?: Object3D, types?: Array<MouseEventType>): boolean;
40
+ hasCursor(object?: Object3D): boolean | undefined;
41
+ private resolveTarget;
35
42
  dispatchEvent(): void;
36
43
  _mouseleave: (e: MouseEvent) => void;
37
44
  _mousemove: (e: MouseEvent) => void;
38
- _mousedown: (e: MouseEvent) => void;
45
+ _mousedown: (e: PointerEvent) => void;
39
46
  _mouseup: import("lodash").DebouncedFunc<(e: PointerEvent) => Promise<void>>;
47
+ /** 设置 Points(点云)拾取阈值(世界单位),数值越大越容易点中。
48
+ * 全景纹理标记改用 Points 后,通过它调节点击命中范围。 */
49
+ setPointsThreshold(threshold: number): void;
50
+ /** 移除 canvas 上的所有鼠标/指针事件监听(渲染器销毁时调用)。
51
+ * 注:mouseenter 为内联匿名监听,销毁时 canvas 已脱离 DOM,无需显式移除。 */
52
+ dispose(): void;
40
53
  }
package/ThreeMouse.js CHANGED
@@ -3,13 +3,22 @@
3
3
  //
4
4
  //
5
5
  //
6
- // 启动鼠标事件
7
- import { Raycaster, Vector2 } from "three";
8
- import { Mesh } from "three";
6
+ // 启动鼠标事件
7
+ import { InstancedMesh, Mesh, Raycaster, Vector2 } from "three";
9
8
  import { debounce } from "lodash";
10
9
  import { computeBoundsTree, acceleratedRaycast } from "three-mesh-bvh";
11
- // Add the extension functions
12
- Mesh.prototype.raycast = acceleratedRaycast;
10
+ /** 安全地分发事件到 Object3D 对象 */
11
+ function dispatchObjectEvent(object, event) {
12
+ // 使用双重断言来安全地传递事件对象
13
+ object.dispatchEvent(event);
14
+ }
15
+ /** Patch Mesh.raycast with BVH acceleration. Call once before using ThreeMouse. */
16
+ export function initBVHRaycast() {
17
+ if (Mesh.prototype.raycast !== acceleratedRaycast) {
18
+ Mesh.prototype.raycast = acceleratedRaycast;
19
+ }
20
+ }
21
+ export { computeBoundsTree, acceleratedRaycast };
13
22
  /**
14
23
  * js 专用的鼠标拾取模型对象
15
24
  */
@@ -31,6 +40,8 @@ export default class ThreeMouse {
31
40
  _renderer;
32
41
  _camera;
33
42
  _scene;
43
+ // 固定的实例化分组器(由 ThreeBase 注入),用于把 InstancedMesh 命中路由到 InstancedChild
44
+ instancedGroup;
34
45
  // 鼠标在渲染器上面的位置
35
46
  _mosePosition = new Vector2(0, 0);
36
47
  // 鼠标按下的位置 如果和鼠标弹起的位置相同 才算一次有效的点击事件
@@ -70,17 +81,11 @@ export default class ThreeMouse {
70
81
  if (object["userData"] && object["userData"]["enableEvent"] === false) {
71
82
  return false;
72
83
  }
84
+ // 注意:three 的 hasEventListener(type, null) 因 indexOf(null) 永远 -1 而恒返回 false,
85
+ // 无法用来判断"是否存在任意监听器"。改为直接读取私有 _listeners 表判断该类型是否有监听。
86
+ const listeners = object._listeners;
73
87
  const hasevent = types.some((type) => {
74
- //@ts-ignore
75
- if (object["_listeners"] &&
76
- object["_listeners"][type] &&
77
- object["_listeners"][type][0]) {
78
- return true;
79
- }
80
- // if (object["userData"] && object["userData"]["cursor"]) {
81
- // return true;
82
- // }
83
- return false;
88
+ return !!(listeners && listeners[type] && listeners[type].length > 0);
84
89
  });
85
90
  return hasevent;
86
91
  }
@@ -97,11 +102,26 @@ export default class ThreeMouse {
97
102
  return true;
98
103
  }
99
104
  }
105
+ // 把命中的对象解析为事件派发目标:若命中 InstancedMesh 且属于某个 batch,
106
+ // 则路由到对应的 InstancedChild(逻辑实例),使实例成为透明事件接收端。
107
+ resolveTarget(object, instanceId) {
108
+ if (object instanceof InstancedMesh && this.instancedGroup) {
109
+ const child = this.instancedGroup.resolveInstance(object, instanceId);
110
+ if (child) {
111
+ return child;
112
+ }
113
+ }
114
+ return object;
115
+ }
100
116
  // 分发鼠标拾取事件
101
117
  dispatchEvent() {
102
118
  // 提取有事件的对象
103
119
  const meshs = [];
104
120
  this._scene.traverseVisible((mesh) => {
121
+ // 逻辑实例节点(InstancedChild)自身不渲染、无几何,跳过收集(命中由 InstancedMesh 路由回来)
122
+ if (mesh.userData?.__instancedChild) {
123
+ return;
124
+ }
105
125
  // 判断对象是否有指定的事件
106
126
  if (this.hasCursor(mesh) ||
107
127
  this.hasEvent(mesh, [
@@ -115,7 +135,7 @@ export default class ThreeMouse {
115
135
  "mousedown",
116
136
  "mouseup",
117
137
  ])) {
118
- if (mesh.isMesh &&
138
+ if (mesh instanceof Mesh &&
119
139
  !mesh.geometry.boundsTree &&
120
140
  mesh.geometry.attributes.position &&
121
141
  mesh.geometry.attributes.position.count > 0) {
@@ -126,6 +146,10 @@ export default class ThreeMouse {
126
146
  }
127
147
  });
128
148
  this._object3ds = meshs;
149
+ // 收集可拾取的 InstancedMesh(仅含注册了监听的已就绪 batch)
150
+ if (this.instancedGroup) {
151
+ this.instancedGroup.collectPickable(meshs);
152
+ }
129
153
  // 没有鼠标事件就不往下执行了
130
154
  if (!this._mousemoveEvent || !this._mouseInRenderer) {
131
155
  return;
@@ -147,22 +171,26 @@ export default class ThreeMouse {
147
171
  x: this._mousemoveEvent.x,
148
172
  y: this._mousemoveEvent.y,
149
173
  });
174
+ // 命中 InstancedMesh 时,把派发目标重定向到对应的 InstancedChild
175
+ const _target = this.resolveTarget(intersection.object, intersection.instanceId);
176
+ if (_target)
177
+ MouseEvent.object = _target;
150
178
  // 触发滑动事件
151
179
  if (this._mesh_on === MouseEvent.object) {
152
180
  if (this.hasEvent(MouseEvent.object, ["mousemove"])) {
153
181
  MouseEvent.type = "mousemove";
154
- MouseEvent.object.dispatchEvent(MouseEvent);
182
+ dispatchObjectEvent(MouseEvent.object, MouseEvent);
155
183
  }
156
184
  // 鼠标划入滑出事件
157
185
  }
158
186
  else if (this._mesh_on !== MouseEvent.object) {
159
187
  if (this.hasEvent(this._mesh_on, ["mouseleave"])) {
160
188
  MouseEvent.type = "mouseleave";
161
- this._mesh_on.dispatchEvent(MouseEvent);
189
+ dispatchObjectEvent(this._mesh_on, MouseEvent);
162
190
  }
163
191
  if (this.hasEvent(MouseEvent.object, ["mouseenter"])) {
164
192
  MouseEvent.type = "mouseenter";
165
- MouseEvent.object.dispatchEvent(MouseEvent);
193
+ dispatchObjectEvent(MouseEvent.object, MouseEvent);
166
194
  }
167
195
  }
168
196
  this._mesh_on = MouseEvent.object || undefined; // 设置为当前鼠标上的对象
@@ -179,7 +207,7 @@ export default class ThreeMouse {
179
207
  else {
180
208
  if (this.hasEvent(this._mesh_on, ["mouseleave"])) {
181
209
  // 鼠标离开事件
182
- this._mesh_on.dispatchEvent({
210
+ dispatchObjectEvent(this._mesh_on, {
183
211
  e: this._mouseEvent,
184
212
  renderer: this._renderer,
185
213
  camera: this._camera,
@@ -202,7 +230,7 @@ export default class ThreeMouse {
202
230
  this._mouseInRenderer = false;
203
231
  // 鼠标离开事件
204
232
  if (this._mousemoveEvent && this.hasEvent(this._mesh_on, ["mouseleave"])) {
205
- this._mesh_on.dispatchEvent({
233
+ dispatchObjectEvent(this._mesh_on, {
206
234
  e: this._mouseEvent,
207
235
  renderer: this._renderer,
208
236
  camera: this._camera,
@@ -242,10 +270,12 @@ export default class ThreeMouse {
242
270
  if (!intersection || !this._mousemoveEvent) {
243
271
  return;
244
272
  }
245
- this._mesh_Down = this._mesh_on = intersection.object;
273
+ // 命中 InstancedMesh 时把派发目标重定向到 InstancedChild,并改写 intersection.object
274
+ this._mesh_Down = this._mesh_on = this.resolveTarget(intersection.object, intersection.instanceId);
275
+ intersection.object = this._mesh_Down;
246
276
  // 触发鼠标按下事件
247
277
  if (this.hasEvent(this._mesh_Down, ["mousedown"])) {
248
- this._mesh_Down.dispatchEvent({
278
+ dispatchObjectEvent(this._mesh_Down, {
249
279
  e: this._mouseEvent,
250
280
  ...intersection,
251
281
  renderer: this._renderer,
@@ -268,9 +298,11 @@ export default class ThreeMouse {
268
298
  if (!intersection || !this._mousemoveEvent) {
269
299
  return;
270
300
  }
271
- this._mesh_on = intersection.object;
301
+ // 命中 InstancedMesh 时把派发目标重定向到 InstancedChild,并改写 intersection.object
302
+ this._mesh_on = this.resolveTarget(intersection.object, intersection.instanceId);
303
+ intersection.object = this._mesh_on;
272
304
  if (this.hasEvent(this._mesh_on, ["mouseup"])) {
273
- this._mesh_on.dispatchEvent({
305
+ dispatchObjectEvent(this._mesh_on, {
274
306
  e: this._mouseEvent,
275
307
  ...intersection,
276
308
  renderer: this._renderer,
@@ -295,7 +327,7 @@ export default class ThreeMouse {
295
327
  // 只点击了一次
296
328
  if (this._click_num === 1) {
297
329
  if (this.hasEvent(this._mesh_Down, ["click"])) {
298
- this._mesh_Down.dispatchEvent({
330
+ dispatchObjectEvent(this._mesh_Down, {
299
331
  e: this._mouseEvent,
300
332
  ...intersection,
301
333
  renderer: this._renderer,
@@ -309,7 +341,7 @@ export default class ThreeMouse {
309
341
  });
310
342
  }
311
343
  if (this.hasEvent(this._mesh_Down, ["leftclick"]) && e.button === 0) {
312
- this._mesh_Down.dispatchEvent({
344
+ dispatchObjectEvent(this._mesh_Down, {
313
345
  e: this._mouseEvent,
314
346
  ...intersection,
315
347
  renderer: this._renderer,
@@ -324,7 +356,7 @@ export default class ThreeMouse {
324
356
  }
325
357
  if (this.hasEvent(this._mesh_Down, ["rightclick"]) &&
326
358
  e.button === 2) {
327
- this._mesh_Down.dispatchEvent({
359
+ dispatchObjectEvent(this._mesh_Down, {
328
360
  e: this._mouseEvent,
329
361
  ...intersection,
330
362
  renderer: this._renderer,
@@ -342,7 +374,7 @@ export default class ThreeMouse {
342
374
  if (this.hasEvent(this._mesh_Down, ["dbclick"]) &&
343
375
  new Date().valueOf() - this._click_num > 1 &&
344
376
  e.button === 0) {
345
- this._mesh_Down.dispatchEvent({
377
+ dispatchObjectEvent(this._mesh_Down, {
346
378
  e: this._mouseEvent,
347
379
  ...intersection,
348
380
  renderer: this._renderer,
@@ -359,7 +391,7 @@ export default class ThreeMouse {
359
391
  }
360
392
  else {
361
393
  if (this.hasEvent(this._mesh_Down, ["click"])) {
362
- this._mesh_Down.dispatchEvent({
394
+ dispatchObjectEvent(this._mesh_Down, {
363
395
  e: this._mouseEvent,
364
396
  ...intersection,
365
397
  renderer: this._renderer,
@@ -373,7 +405,7 @@ export default class ThreeMouse {
373
405
  });
374
406
  }
375
407
  if (this.hasEvent(this._mesh_Down, ["leftclick"]) && e.button === 0) {
376
- this._mesh_Down.dispatchEvent({
408
+ dispatchObjectEvent(this._mesh_Down, {
377
409
  e: this._mouseEvent,
378
410
  ...intersection,
379
411
  renderer: this._renderer,
@@ -387,7 +419,7 @@ export default class ThreeMouse {
387
419
  });
388
420
  }
389
421
  if (this.hasEvent(this._mesh_Down, ["rightclick"]) && e.button === 2) {
390
- this._mesh_Down.dispatchEvent({
422
+ dispatchObjectEvent(this._mesh_Down, {
391
423
  e: this._mouseEvent,
392
424
  ...intersection,
393
425
  renderer: this._renderer,
@@ -404,4 +436,18 @@ export default class ThreeMouse {
404
436
  this._click_num = 0;
405
437
  }
406
438
  });
439
+ /** 设置 Points(点云)拾取阈值(世界单位),数值越大越容易点中。
440
+ * 全景纹理标记改用 Points 后,通过它调节点击命中范围。 */
441
+ setPointsThreshold(threshold) {
442
+ this._raycaster.params.Points.threshold = threshold;
443
+ }
444
+ /** 移除 canvas 上的所有鼠标/指针事件监听(渲染器销毁时调用)。
445
+ * 注:mouseenter 为内联匿名监听,销毁时 canvas 已脱离 DOM,无需显式移除。 */
446
+ dispose() {
447
+ const dom = this._renderer.domElement;
448
+ dom.removeEventListener("mouseleave", this._mouseleave, true);
449
+ dom.removeEventListener("mousemove", this._mousemove, true);
450
+ dom.removeEventListener("pointerdown", this._mousedown, true);
451
+ dom.removeEventListener("pointerup", this._mouseup, true);
452
+ }
407
453
  }