@babylonjs/core 5.0.0-beta.5 → 5.0.0-beta.9

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 (394) hide show
  1. package/Actions/actionManager.d.ts +1 -1
  2. package/Actions/actionManager.js +5 -1
  3. package/Actions/actionManager.js.map +1 -1
  4. package/Animations/animation.d.ts +2 -2
  5. package/Animations/animation.js +5 -1
  6. package/Animations/animation.js.map +1 -1
  7. package/Audio/analyser.d.ts +2 -1
  8. package/Audio/analyser.js +5 -0
  9. package/Audio/analyser.js.map +1 -1
  10. package/Audio/audioSceneComponent.d.ts +1 -1
  11. package/Audio/audioSceneComponent.js +5 -0
  12. package/Audio/audioSceneComponent.js.map +1 -1
  13. package/Audio/sound.d.ts +1 -1
  14. package/Audio/sound.js +5 -0
  15. package/Audio/sound.js.map +1 -1
  16. package/Audio/soundTrack.d.ts +2 -1
  17. package/Audio/soundTrack.js +5 -0
  18. package/Audio/soundTrack.js.map +1 -1
  19. package/BakedVertexAnimation/bakedVertexAnimationManager.d.ts +1 -1
  20. package/BakedVertexAnimation/bakedVertexAnimationManager.js +5 -0
  21. package/BakedVertexAnimation/bakedVertexAnimationManager.js.map +1 -1
  22. package/Bones/skeleton.d.ts +0 -6
  23. package/Bones/skeleton.js +2 -14
  24. package/Bones/skeleton.js.map +1 -1
  25. package/Buffers/buffer.d.ts +4 -0
  26. package/Buffers/buffer.js +11 -1
  27. package/Buffers/buffer.js.map +1 -1
  28. package/Cameras/Inputs/freeCameraMouseInput.d.ts +1 -0
  29. package/Cameras/Inputs/freeCameraMouseInput.js +6 -3
  30. package/Cameras/Inputs/freeCameraMouseInput.js.map +1 -1
  31. package/Cameras/Stereoscopic/anaglyphArcRotateCamera.d.ts +1 -1
  32. package/Cameras/Stereoscopic/anaglyphArcRotateCamera.js.map +1 -1
  33. package/Cameras/Stereoscopic/anaglyphFreeCamera.d.ts +1 -1
  34. package/Cameras/Stereoscopic/anaglyphFreeCamera.js.map +1 -1
  35. package/Cameras/Stereoscopic/anaglyphGamepadCamera.d.ts +1 -1
  36. package/Cameras/Stereoscopic/anaglyphGamepadCamera.js.map +1 -1
  37. package/Cameras/Stereoscopic/anaglyphUniversalCamera.d.ts +1 -1
  38. package/Cameras/Stereoscopic/anaglyphUniversalCamera.js.map +1 -1
  39. package/Cameras/Stereoscopic/stereoscopicArcRotateCamera.d.ts +1 -1
  40. package/Cameras/Stereoscopic/stereoscopicArcRotateCamera.js.map +1 -1
  41. package/Cameras/Stereoscopic/stereoscopicFreeCamera.d.ts +1 -1
  42. package/Cameras/Stereoscopic/stereoscopicFreeCamera.js.map +1 -1
  43. package/Cameras/Stereoscopic/stereoscopicGamepadCamera.d.ts +1 -1
  44. package/Cameras/Stereoscopic/stereoscopicGamepadCamera.js.map +1 -1
  45. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.d.ts +1 -1
  46. package/Cameras/Stereoscopic/stereoscopicScreenUniversalCamera.js.map +1 -1
  47. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.d.ts +1 -1
  48. package/Cameras/Stereoscopic/stereoscopicUniversalCamera.js.map +1 -1
  49. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.d.ts +1 -1
  50. package/Cameras/VR/vrDeviceOrientationArcRotateCamera.js.map +1 -1
  51. package/Cameras/VR/vrDeviceOrientationFreeCamera.d.ts +1 -1
  52. package/Cameras/VR/vrDeviceOrientationFreeCamera.js.map +1 -1
  53. package/Cameras/VR/vrDeviceOrientationGamepadCamera.d.ts +1 -1
  54. package/Cameras/VR/vrDeviceOrientationGamepadCamera.js.map +1 -1
  55. package/Cameras/VR/vrExperienceHelper.d.ts +1 -0
  56. package/Cameras/VR/vrExperienceHelper.js +1 -0
  57. package/Cameras/VR/vrExperienceHelper.js.map +1 -1
  58. package/Cameras/VR/webVRCamera.d.ts +2 -1
  59. package/Cameras/VR/webVRCamera.js +3 -2
  60. package/Cameras/VR/webVRCamera.js.map +1 -1
  61. package/Cameras/arcRotateCamera.d.ts +1 -1
  62. package/Cameras/arcRotateCamera.js.map +1 -1
  63. package/Cameras/camera.d.ts +1 -1
  64. package/Cameras/camera.js.map +1 -1
  65. package/Cameras/deviceOrientationCamera.d.ts +1 -1
  66. package/Cameras/deviceOrientationCamera.js.map +1 -1
  67. package/Cameras/flyCamera.d.ts +1 -1
  68. package/Cameras/flyCamera.js.map +1 -1
  69. package/Cameras/followCamera.d.ts +1 -1
  70. package/Cameras/followCamera.js.map +1 -1
  71. package/Cameras/freeCamera.d.ts +1 -1
  72. package/Cameras/freeCamera.js.map +1 -1
  73. package/Cameras/gamepadCamera.d.ts +1 -1
  74. package/Cameras/gamepadCamera.js.map +1 -1
  75. package/Cameras/targetCamera.d.ts +1 -1
  76. package/Cameras/targetCamera.js.map +1 -1
  77. package/Cameras/touchCamera.d.ts +1 -1
  78. package/Cameras/touchCamera.js.map +1 -1
  79. package/Cameras/universalCamera.d.ts +1 -1
  80. package/Cameras/universalCamera.js.map +1 -1
  81. package/Cameras/virtualJoysticksCamera.d.ts +1 -1
  82. package/Cameras/virtualJoysticksCamera.js.map +1 -1
  83. package/Collisions/collider.d.ts +1 -1
  84. package/Collisions/collider.js +48 -2
  85. package/Collisions/collider.js.map +1 -1
  86. package/Compat/compatibilityOptions.d.ts +9 -0
  87. package/Compat/compatibilityOptions.js +14 -0
  88. package/Compat/compatibilityOptions.js.map +1 -0
  89. package/Compat/index.d.ts +1 -0
  90. package/Compat/index.js +2 -0
  91. package/Compat/index.js.map +1 -0
  92. package/Culling/Octrees/octreeSceneComponent.d.ts +1 -1
  93. package/Culling/Octrees/octreeSceneComponent.js +5 -0
  94. package/Culling/Octrees/octreeSceneComponent.js.map +1 -1
  95. package/Culling/ray.js +2 -2
  96. package/Culling/ray.js.map +1 -1
  97. package/Debug/axesViewer.d.ts +1 -1
  98. package/Debug/axesViewer.js +5 -0
  99. package/Debug/axesViewer.js.map +1 -1
  100. package/Debug/debugLayer.d.ts +1 -1
  101. package/Debug/debugLayer.js +5 -1
  102. package/Debug/debugLayer.js.map +1 -1
  103. package/Debug/physicsViewer.d.ts +1 -1
  104. package/Debug/physicsViewer.js +3 -0
  105. package/Debug/physicsViewer.js.map +1 -1
  106. package/Debug/skeletonViewer.js +3 -4
  107. package/Debug/skeletonViewer.js.map +1 -1
  108. package/DeviceInput/Helpers/eventFactory.js +1 -4
  109. package/DeviceInput/Helpers/eventFactory.js.map +1 -1
  110. package/DeviceInput/InputDevices/deviceEnums.d.ts +4 -2
  111. package/DeviceInput/InputDevices/deviceEnums.js +3 -1
  112. package/DeviceInput/InputDevices/deviceEnums.js.map +1 -1
  113. package/DeviceInput/InputDevices/deviceSourceManager.d.ts +20 -5
  114. package/DeviceInput/InputDevices/deviceSourceManager.js +68 -7
  115. package/DeviceInput/InputDevices/deviceSourceManager.js.map +1 -1
  116. package/DeviceInput/InputDevices/internalDeviceSourceManager.d.ts +15 -10
  117. package/DeviceInput/InputDevices/internalDeviceSourceManager.js +25 -31
  118. package/DeviceInput/InputDevices/internalDeviceSourceManager.js.map +1 -1
  119. package/DeviceInput/InputDevices/nativeDeviceInputSystem.js +3 -2
  120. package/DeviceInput/InputDevices/nativeDeviceInputSystem.js.map +1 -1
  121. package/DeviceInput/InputDevices/webDeviceInputSystem.d.ts +7 -6
  122. package/DeviceInput/InputDevices/webDeviceInputSystem.js +71 -90
  123. package/DeviceInput/InputDevices/webDeviceInputSystem.js.map +1 -1
  124. package/Engines/Extensions/engine.cubeTexture.d.ts +1 -1
  125. package/Engines/Extensions/engine.cubeTexture.js +5 -1
  126. package/Engines/Extensions/engine.cubeTexture.js.map +1 -1
  127. package/Engines/Extensions/engine.multiview.js +0 -1
  128. package/Engines/Extensions/engine.multiview.js.map +1 -1
  129. package/Engines/Extensions/engine.views.d.ts +7 -0
  130. package/Engines/Extensions/engine.views.js +12 -0
  131. package/Engines/Extensions/engine.views.js.map +1 -1
  132. package/Engines/Native/nativeInterfaces.d.ts +1 -1
  133. package/Engines/Native/nativeInterfaces.js.map +1 -1
  134. package/Engines/WebGPU/Extensions/engine.computeShader.js +1 -1
  135. package/Engines/WebGPU/Extensions/engine.computeShader.js.map +1 -1
  136. package/Engines/WebGPU/Extensions/engine.cubeTexture.js +4 -1
  137. package/Engines/WebGPU/Extensions/engine.cubeTexture.js.map +1 -1
  138. package/Engines/WebGPU/webgpuConstants.d.ts +2 -1
  139. package/Engines/WebGPU/webgpuConstants.js +1 -0
  140. package/Engines/WebGPU/webgpuConstants.js.map +1 -1
  141. package/Engines/WebGPU/webgpuTextureHelper.js +14 -7
  142. package/Engines/WebGPU/webgpuTextureHelper.js.map +1 -1
  143. package/Engines/engine.d.ts +46 -26
  144. package/Engines/engineCapabilities.d.ts +2 -0
  145. package/Engines/engineCapabilities.js.map +1 -1
  146. package/Engines/nativeEngine.js +5 -3
  147. package/Engines/nativeEngine.js.map +1 -1
  148. package/Engines/nullEngine.js +2 -1
  149. package/Engines/nullEngine.js.map +1 -1
  150. package/Engines/renderTargetWrapper.d.ts +8 -0
  151. package/Engines/renderTargetWrapper.js +20 -0
  152. package/Engines/renderTargetWrapper.js.map +1 -1
  153. package/Engines/thinEngine.d.ts +7 -0
  154. package/Engines/thinEngine.js +21 -3
  155. package/Engines/thinEngine.js.map +1 -1
  156. package/Engines/webgpuEngine.js +33 -21
  157. package/Engines/webgpuEngine.js.map +1 -1
  158. package/Events/keyboardEvents.d.ts +7 -1
  159. package/Events/keyboardEvents.js +11 -1
  160. package/Events/keyboardEvents.js.map +1 -1
  161. package/Gamepads/Controllers/oculusTouchController.js +2 -2
  162. package/Gamepads/Controllers/oculusTouchController.js.map +1 -1
  163. package/Gamepads/Controllers/webVRController.d.ts +1 -0
  164. package/Gamepads/Controllers/webVRController.js +1 -0
  165. package/Gamepads/Controllers/webVRController.js.map +1 -1
  166. package/Gizmos/boundingBoxGizmo.js +0 -10
  167. package/Gizmos/boundingBoxGizmo.js.map +1 -1
  168. package/Gizmos/gizmo.js +1 -1
  169. package/Gizmos/gizmo.js.map +1 -1
  170. package/Helpers/sceneHelpers.d.ts +1 -0
  171. package/Helpers/sceneHelpers.js.map +1 -1
  172. package/Inputs/scene.inputManager.d.ts +1 -2
  173. package/Inputs/scene.inputManager.js +13 -12
  174. package/Inputs/scene.inputManager.js.map +1 -1
  175. package/Layers/effectLayer.d.ts +1 -1
  176. package/Layers/effectLayer.js +1 -1
  177. package/Layers/effectLayer.js.map +1 -1
  178. package/Layers/effectLayerSceneComponent.d.ts +1 -1
  179. package/Layers/effectLayerSceneComponent.js +7 -3
  180. package/Layers/effectLayerSceneComponent.js.map +1 -1
  181. package/Layers/glowLayer.d.ts +1 -1
  182. package/Layers/glowLayer.js.map +1 -1
  183. package/Layers/highlightLayer.d.ts +1 -1
  184. package/Layers/highlightLayer.js +2 -1
  185. package/Layers/highlightLayer.js.map +1 -1
  186. package/Layers/layerSceneComponent.d.ts +1 -1
  187. package/Layers/layerSceneComponent.js +7 -3
  188. package/Layers/layerSceneComponent.js.map +1 -1
  189. package/Lights/Shadows/shadowGenerator.js +5 -5
  190. package/Lights/Shadows/shadowGenerator.js.map +1 -1
  191. package/Loading/Plugins/babylonFileLoader.js +1 -9
  192. package/Loading/Plugins/babylonFileLoader.js.map +1 -1
  193. package/Loading/sceneLoader.js +4 -3
  194. package/Loading/sceneLoader.js.map +1 -1
  195. package/Materials/Background/backgroundMaterial.d.ts +1 -1
  196. package/Materials/Background/backgroundMaterial.js.map +1 -1
  197. package/Materials/Node/Blocks/Dual/imageSourceBlock.js +2 -2
  198. package/Materials/Node/Blocks/Dual/imageSourceBlock.js.map +1 -1
  199. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js +2 -2
  200. package/Materials/Node/Blocks/Dual/reflectionTextureBaseBlock.js.map +1 -1
  201. package/Materials/Node/Blocks/Dual/textureBlock.js +2 -2
  202. package/Materials/Node/Blocks/Dual/textureBlock.js.map +1 -1
  203. package/Materials/Node/nodeMaterial.js +2 -1
  204. package/Materials/Node/nodeMaterial.js.map +1 -1
  205. package/Materials/PBR/pbrBaseMaterial.d.ts +2 -1
  206. package/Materials/PBR/pbrBaseMaterial.js +2 -1
  207. package/Materials/PBR/pbrBaseMaterial.js.map +1 -1
  208. package/Materials/PBR/pbrBaseSimpleMaterial.d.ts +1 -1
  209. package/Materials/PBR/pbrBaseSimpleMaterial.js.map +1 -1
  210. package/Materials/PBR/pbrMaterial.d.ts +1 -1
  211. package/Materials/PBR/pbrMaterial.js +1 -1
  212. package/Materials/PBR/pbrMaterial.js.map +1 -1
  213. package/Materials/PBR/pbrMetallicRoughnessMaterial.d.ts +1 -1
  214. package/Materials/PBR/pbrMetallicRoughnessMaterial.js.map +1 -1
  215. package/Materials/PBR/pbrSpecularGlossinessMaterial.d.ts +1 -1
  216. package/Materials/PBR/pbrSpecularGlossinessMaterial.js.map +1 -1
  217. package/Materials/Textures/Loaders/ddsTextureLoader.js +8 -1
  218. package/Materials/Textures/Loaders/ddsTextureLoader.js.map +1 -1
  219. package/Materials/Textures/Loaders/ktxTextureLoader.js +1 -1
  220. package/Materials/Textures/Loaders/ktxTextureLoader.js.map +1 -1
  221. package/Materials/Textures/MultiviewRenderTarget.d.ts +1 -1
  222. package/Materials/Textures/MultiviewRenderTarget.js +1 -1
  223. package/Materials/Textures/MultiviewRenderTarget.js.map +1 -1
  224. package/Materials/Textures/baseTexture.d.ts +1 -1
  225. package/Materials/Textures/baseTexture.js.map +1 -1
  226. package/Materials/Textures/internalTexture.d.ts +2 -0
  227. package/Materials/Textures/internalTexture.js +2 -0
  228. package/Materials/Textures/internalTexture.js.map +1 -1
  229. package/Materials/Textures/mirrorTexture.d.ts +2 -2
  230. package/Materials/Textures/mirrorTexture.js +5 -1
  231. package/Materials/Textures/mirrorTexture.js.map +1 -1
  232. package/Materials/Textures/multiRenderTarget.d.ts +1 -1
  233. package/Materials/Textures/multiRenderTarget.js.map +1 -1
  234. package/Materials/Textures/prePassRenderTarget.d.ts +1 -1
  235. package/Materials/Textures/prePassRenderTarget.js.map +1 -1
  236. package/Materials/Textures/refractionTexture.d.ts +1 -1
  237. package/Materials/Textures/refractionTexture.js +2 -2
  238. package/Materials/Textures/refractionTexture.js.map +1 -1
  239. package/Materials/Textures/renderTargetTexture.d.ts +1 -1
  240. package/Materials/Textures/renderTargetTexture.js.map +1 -1
  241. package/Materials/Textures/texture.d.ts +1 -1
  242. package/Materials/Textures/texture.js +5 -5
  243. package/Materials/Textures/texture.js.map +1 -1
  244. package/Materials/material.d.ts +1 -1
  245. package/Materials/material.js +7 -2
  246. package/Materials/material.js.map +1 -1
  247. package/Materials/materialHelper.js +8 -0
  248. package/Materials/materialHelper.js.map +1 -1
  249. package/Materials/multiMaterial.d.ts +1 -1
  250. package/Materials/multiMaterial.js +1 -1
  251. package/Materials/multiMaterial.js.map +1 -1
  252. package/Materials/pushMaterial.d.ts +1 -1
  253. package/Materials/pushMaterial.js.map +1 -1
  254. package/Materials/shaderMaterial.js +7 -3
  255. package/Materials/shaderMaterial.js.map +1 -1
  256. package/Materials/shadowDepthWrapper.d.ts +1 -1
  257. package/Materials/shadowDepthWrapper.js +2 -2
  258. package/Materials/shadowDepthWrapper.js.map +1 -1
  259. package/Materials/standardMaterial.d.ts +2 -1
  260. package/Materials/standardMaterial.js +4 -0
  261. package/Materials/standardMaterial.js.map +1 -1
  262. package/Maths/math.vector.d.ts +4 -2
  263. package/Maths/math.vector.js +30 -28
  264. package/Maths/math.vector.js.map +1 -1
  265. package/Meshes/Builders/boxBuilder.js +5 -4
  266. package/Meshes/Builders/boxBuilder.js.map +1 -1
  267. package/Meshes/Builders/capsuleBuilder.js +4 -3
  268. package/Meshes/Builders/capsuleBuilder.js.map +1 -1
  269. package/Meshes/Builders/cylinderBuilder.js +10 -7
  270. package/Meshes/Builders/cylinderBuilder.js.map +1 -1
  271. package/Meshes/Builders/decalBuilder.js +5 -2
  272. package/Meshes/Builders/decalBuilder.js.map +1 -1
  273. package/Meshes/Builders/discBuilder.js +3 -2
  274. package/Meshes/Builders/discBuilder.js.map +1 -1
  275. package/Meshes/Builders/goldbergBuilder.js +10 -1
  276. package/Meshes/Builders/goldbergBuilder.js.map +1 -1
  277. package/Meshes/Builders/groundBuilder.js +2 -1
  278. package/Meshes/Builders/groundBuilder.js.map +1 -1
  279. package/Meshes/Builders/icoSphereBuilder.js +2 -1
  280. package/Meshes/Builders/icoSphereBuilder.js.map +1 -1
  281. package/Meshes/Builders/planeBuilder.js +5 -4
  282. package/Meshes/Builders/planeBuilder.js.map +1 -1
  283. package/Meshes/Builders/polygonBuilder.js +6 -2
  284. package/Meshes/Builders/polygonBuilder.js.map +1 -1
  285. package/Meshes/Builders/polyhedronBuilder.js +3 -2
  286. package/Meshes/Builders/polyhedronBuilder.js.map +1 -1
  287. package/Meshes/Builders/ribbonBuilder.js +4 -3
  288. package/Meshes/Builders/ribbonBuilder.js.map +1 -1
  289. package/Meshes/Builders/sphereBuilder.js +2 -1
  290. package/Meshes/Builders/sphereBuilder.js.map +1 -1
  291. package/Meshes/Builders/tiledBoxBuilder.js +4 -0
  292. package/Meshes/Builders/tiledBoxBuilder.js.map +1 -1
  293. package/Meshes/Builders/torusBuilder.js +2 -1
  294. package/Meshes/Builders/torusBuilder.js.map +1 -1
  295. package/Meshes/Builders/torusKnotBuilder.js +2 -1
  296. package/Meshes/Builders/torusKnotBuilder.js.map +1 -1
  297. package/Meshes/abstractMesh.d.ts +8 -2
  298. package/Meshes/abstractMesh.js +37 -33
  299. package/Meshes/abstractMesh.js.map +1 -1
  300. package/Meshes/geometry.d.ts +1 -1
  301. package/Meshes/geometry.js +38 -3
  302. package/Meshes/geometry.js.map +1 -1
  303. package/Meshes/groundMesh.d.ts +1 -1
  304. package/Meshes/groundMesh.js.map +1 -1
  305. package/Meshes/instancedMesh.js +5 -6
  306. package/Meshes/instancedMesh.js.map +1 -1
  307. package/Meshes/mesh.d.ts +1 -1
  308. package/Meshes/mesh.js +31 -29
  309. package/Meshes/mesh.js.map +1 -1
  310. package/Meshes/mesh.vertexData.d.ts +1 -1
  311. package/Meshes/mesh.vertexData.js +2 -1
  312. package/Meshes/mesh.vertexData.js.map +1 -1
  313. package/Meshes/polygonMesh.js +2 -2
  314. package/Meshes/polygonMesh.js.map +1 -1
  315. package/Meshes/subMesh.js +1 -2
  316. package/Meshes/subMesh.js.map +1 -1
  317. package/Meshes/subMesh.project.js +1 -2
  318. package/Meshes/subMesh.project.js.map +1 -1
  319. package/Meshes/thinInstanceMesh.js +5 -0
  320. package/Meshes/thinInstanceMesh.js.map +1 -1
  321. package/Meshes/trailMesh.d.ts +1 -1
  322. package/Meshes/trailMesh.js.map +1 -1
  323. package/Meshes/transformNode.js +40 -13
  324. package/Meshes/transformNode.js.map +1 -1
  325. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.d.ts +5 -0
  326. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js +13 -2
  327. package/Misc/HighDynamicRange/cubemapToSphericalPolynomial.js.map +1 -1
  328. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js +6 -12
  329. package/Misc/PerformanceViewer/performanceViewerCollectionStrategies.js.map +1 -1
  330. package/Misc/assetsManager.d.ts +1 -1
  331. package/Misc/assetsManager.js +2 -1
  332. package/Misc/assetsManager.js.map +1 -1
  333. package/Misc/brdfTextureTools.js +4 -1
  334. package/Misc/brdfTextureTools.js.map +1 -1
  335. package/Misc/dds.js +7 -0
  336. package/Misc/dds.js.map +1 -1
  337. package/Misc/decorators.js +7 -0
  338. package/Misc/decorators.js.map +1 -1
  339. package/Misc/deepCopier.js +3 -3
  340. package/Misc/deepCopier.js.map +1 -1
  341. package/Misc/error.d.ts +51 -0
  342. package/Misc/error.js +66 -0
  343. package/Misc/error.js.map +1 -0
  344. package/Misc/fileTools.d.ts +4 -4
  345. package/Misc/fileTools.js +7 -7
  346. package/Misc/fileTools.js.map +1 -1
  347. package/Misc/index.d.ts +1 -0
  348. package/Misc/index.js +1 -0
  349. package/Misc/index.js.map +1 -1
  350. package/Particles/particleSystem.js +7 -1
  351. package/Particles/particleSystem.js.map +1 -1
  352. package/Shaders/ShadersInclude/instancesDeclaration.js +1 -1
  353. package/Shaders/ShadersInclude/instancesDeclaration.js.map +1 -1
  354. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js +1 -1
  355. package/Shaders/ShadersInclude/pbrBlockAlbedoOpacity.js.map +1 -1
  356. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js +1 -1
  357. package/Shaders/ShadersInclude/pbrFragmentExtraDeclaration.js.map +1 -1
  358. package/Shaders/color.fragment.js +1 -1
  359. package/Shaders/color.fragment.js.map +1 -1
  360. package/Shaders/color.vertex.js +1 -1
  361. package/Shaders/color.vertex.js.map +1 -1
  362. package/Shaders/default.fragment.js +1 -1
  363. package/Shaders/default.fragment.js.map +1 -1
  364. package/Shaders/default.vertex.js +1 -1
  365. package/Shaders/default.vertex.js.map +1 -1
  366. package/Shaders/geometry.vertex.js +1 -1
  367. package/Shaders/geometry.vertex.js.map +1 -1
  368. package/Shaders/pbr.vertex.js +1 -1
  369. package/Shaders/pbr.vertex.js.map +1 -1
  370. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js +1 -1
  371. package/ShadersWGSL/ShadersInclude/instancesDeclaration.js.map +1 -1
  372. package/Sprites/spriteManager.js +4 -4
  373. package/Sprites/spriteManager.js.map +1 -1
  374. package/XR/features/WebXRHandTracking.js +3 -3
  375. package/XR/features/WebXRHandTracking.js.map +1 -1
  376. package/XR/webXRDefaultExperience.js +3 -0
  377. package/XR/webXRDefaultExperience.js.map +1 -1
  378. package/XR/webXRExperienceHelper.js +3 -2
  379. package/XR/webXRExperienceHelper.js.map +1 -1
  380. package/XR/webXRSessionManager.d.ts +1 -0
  381. package/XR/webXRSessionManager.js +6 -1
  382. package/XR/webXRSessionManager.js.map +1 -1
  383. package/assetContainer.d.ts +1 -1
  384. package/assetContainer.js +5 -4
  385. package/assetContainer.js.map +1 -1
  386. package/index.d.ts +1 -0
  387. package/index.js +1 -0
  388. package/index.js.map +1 -1
  389. package/package.json +10 -4
  390. package/scene.js +11 -10
  391. package/scene.js.map +1 -1
  392. package/Misc/baseError.d.ts +0 -7
  393. package/Misc/baseError.js +0 -18
  394. package/Misc/baseError.js.map +0 -1
@@ -7,6 +7,7 @@ var MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;
7
7
  /** @hidden */
8
8
  var WebDeviceInputSystem = /** @class */ (function () {
9
9
  function WebDeviceInputSystem(engine) {
10
+ var _this = this;
10
11
  // Private Members
11
12
  this._inputs = [];
12
13
  this._keyboardActive = false;
@@ -20,6 +21,7 @@ var WebDeviceInputSystem = /** @class */ (function () {
20
21
  this._pointerUpEvent = function (evt) { };
21
22
  this._pointerWheelEvent = function (evt) { };
22
23
  this._pointerBlurEvent = function (evt) { };
24
+ this._eventsAttached = false;
23
25
  this._mouseId = -1;
24
26
  this._isUsingFirefox = DomManagement.IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf("Firefox") !== -1;
25
27
  this._maxTouchPoints = 0;
@@ -31,7 +33,13 @@ var WebDeviceInputSystem = /** @class */ (function () {
31
33
  this.onDeviceConnected = function (deviceType, deviceSlot) { };
32
34
  this.onDeviceDisconnected = function (deviceType, deviceSlot) { };
33
35
  this.onInputChanged = function (deviceEvent) { };
34
- this._configureEvents();
36
+ this._enableEvents();
37
+ // Set callback to enable event handler switching when inputElement changes
38
+ if (!this._engine._onEngineViewChanged) {
39
+ this._engine._onEngineViewChanged = function () {
40
+ _this._enableEvents();
41
+ };
42
+ }
35
43
  }
36
44
  Object.defineProperty(WebDeviceInputSystem.prototype, "onDeviceConnected", {
37
45
  get: function () {
@@ -90,26 +98,39 @@ var WebDeviceInputSystem = /** @class */ (function () {
90
98
  * Dispose of all the eventlisteners
91
99
  */
92
100
  WebDeviceInputSystem.prototype.dispose = function () {
93
- // Observables
101
+ // Callbacks
94
102
  this.onDeviceConnected = function () { };
95
103
  this.onDeviceDisconnected = function () { };
96
104
  this.onInputChanged = function () { };
105
+ delete this._engine._onEngineViewChanged;
97
106
  if (this._elementToAttachTo) {
98
- this._removeEvents();
99
- // Gamepad Events
100
- window.removeEventListener("gamepadconnected", this._gamepadConnectedEvent);
101
- window.removeEventListener("gamepaddisconnected", this._gamepadDisconnectedEvent);
107
+ this._disableEvents();
102
108
  }
103
109
  };
104
110
  /**
105
- * Configures events to work with an engine's active element
111
+ * Enable listening for user input events
106
112
  */
107
- WebDeviceInputSystem.prototype._configureEvents = function () {
108
- var inputElement = this._engine.getInputElement();
109
- if (inputElement && this._elementToAttachTo !== inputElement) {
110
- // If the engine's input element has changed, unregister events from previous element
111
- if (this._elementToAttachTo) {
112
- this._removeEvents();
113
+ WebDeviceInputSystem.prototype._enableEvents = function () {
114
+ var inputElement = this === null || this === void 0 ? void 0 : this._engine.getInputElement();
115
+ if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) {
116
+ // Remove events before adding to avoid double events or simultaneous events on multiple canvases
117
+ this._disableEvents();
118
+ // If the inputs array has already been created, zero it out to before setting up events
119
+ if (this._inputs) {
120
+ for (var _i = 0, _a = this._inputs; _i < _a.length; _i++) {
121
+ var inputs = _a[_i];
122
+ if (inputs) {
123
+ for (var deviceSlotKey in inputs) {
124
+ var deviceSlot = +deviceSlotKey;
125
+ var device = inputs[deviceSlot];
126
+ if (device) {
127
+ for (var inputIndex = 0; inputIndex < device.length; inputIndex++) {
128
+ device[inputIndex] = 0;
129
+ }
130
+ }
131
+ }
132
+ }
133
+ }
113
134
  }
114
135
  this._elementToAttachTo = inputElement;
115
136
  // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1
@@ -117,10 +138,36 @@ var WebDeviceInputSystem = /** @class */ (function () {
117
138
  this._handleKeyActions();
118
139
  this._handlePointerActions();
119
140
  this._handleGamepadActions();
141
+ this._eventsAttached = true;
120
142
  // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse
121
143
  this._checkForConnectedDevices();
122
144
  }
123
145
  };
146
+ /**
147
+ * Disable listening for user input events
148
+ */
149
+ WebDeviceInputSystem.prototype._disableEvents = function () {
150
+ if (this._elementToAttachTo) {
151
+ // Blur Events
152
+ this._elementToAttachTo.removeEventListener("blur", this._keyboardBlurEvent);
153
+ this._elementToAttachTo.removeEventListener("blur", this._pointerBlurEvent);
154
+ // Keyboard Events
155
+ this._elementToAttachTo.removeEventListener("keydown", this._keyboardDownEvent);
156
+ this._elementToAttachTo.removeEventListener("keyup", this._keyboardUpEvent);
157
+ // Pointer Events
158
+ this._elementToAttachTo.removeEventListener(this._eventPrefix + "move", this._pointerMoveEvent);
159
+ this._elementToAttachTo.removeEventListener(this._eventPrefix + "down", this._pointerDownEvent);
160
+ this._elementToAttachTo.removeEventListener(this._eventPrefix + "up", this._pointerUpEvent);
161
+ this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);
162
+ // Gamepad Events
163
+ window.removeEventListener("gamepadconnected", this._gamepadConnectedEvent);
164
+ window.removeEventListener("gamepaddisconnected", this._gamepadDisconnectedEvent);
165
+ }
166
+ if (this._pointerInputClearObserver) {
167
+ this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);
168
+ }
169
+ this._eventsAttached = false;
170
+ };
124
171
  /**
125
172
  * Checks for existing connections to devices and register them, if necessary
126
173
  * Currently handles gamepads and mouse
@@ -162,7 +209,9 @@ var WebDeviceInputSystem = /** @class */ (function () {
162
209
  * @param currentY Current Y at point of adding
163
210
  */
164
211
  WebDeviceInputSystem.prototype._addPointerDevice = function (deviceType, deviceSlot, currentX, currentY) {
165
- this._pointerActive = true;
212
+ if (!this._pointerActive) {
213
+ this._pointerActive = true;
214
+ }
166
215
  this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);
167
216
  var pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */
168
217
  pointer[0] = currentX;
@@ -267,7 +316,8 @@ var WebDeviceInputSystem = /** @class */ (function () {
267
316
  */
268
317
  WebDeviceInputSystem.prototype._handlePointerActions = function () {
269
318
  var _this = this;
270
- this._maxTouchPoints = (DomManagement.IsNavigatorAvailable() && navigator.maxTouchPoints) || 0;
319
+ // If maxTouchPoints is defined, use that value. Otherwise, allow for a minimum for supported gestures like pinch
320
+ this._maxTouchPoints = (DomManagement.IsNavigatorAvailable() && navigator.maxTouchPoints) || 2;
271
321
  if (!this._activeTouchIds) {
272
322
  this._activeTouchIds = new Array(this._maxTouchPoints);
273
323
  }
@@ -285,11 +335,6 @@ var WebDeviceInputSystem = /** @class */ (function () {
285
335
  }
286
336
  var pointer = _this._inputs[deviceType][deviceSlot];
287
337
  if (pointer) {
288
- // Store previous values for event
289
- var previousHorizontal = pointer[PointerInput.Horizontal];
290
- var previousVertical = pointer[PointerInput.Vertical];
291
- var previousDeltaHorizontal = pointer[PointerInput.DeltaHorizontal];
292
- var previousDeltaVertical = pointer[PointerInput.DeltaVertical];
293
338
  pointer[PointerInput.Horizontal] = evt.clientX;
294
339
  pointer[PointerInput.Vertical] = evt.clientY;
295
340
  pointer[PointerInput.DeltaHorizontal] = evt.movementX;
@@ -297,33 +342,8 @@ var WebDeviceInputSystem = /** @class */ (function () {
297
342
  var deviceEvent = evt;
298
343
  deviceEvent.deviceType = deviceType;
299
344
  deviceEvent.deviceSlot = deviceSlot;
300
- // The browser might use a move event in case
301
- // of simultaneous mouse buttons click for instance. So
302
- // in this case we stil need to propagate it.
303
- if (previousHorizontal !== evt.clientX) {
304
- deviceEvent.inputIndex = PointerInput.Horizontal;
305
- deviceEvent.previousState = previousHorizontal;
306
- deviceEvent.currentState = pointer[PointerInput.Horizontal];
307
- _this.onInputChanged(deviceEvent);
308
- }
309
- if (previousVertical !== evt.clientY) {
310
- deviceEvent.inputIndex = PointerInput.Vertical;
311
- deviceEvent.previousState = previousVertical;
312
- deviceEvent.currentState = pointer[PointerInput.Vertical];
313
- _this.onInputChanged(deviceEvent);
314
- }
315
- if (pointer[PointerInput.DeltaHorizontal] !== 0) {
316
- deviceEvent.inputIndex = PointerInput.DeltaHorizontal;
317
- deviceEvent.previousState = previousDeltaHorizontal;
318
- deviceEvent.currentState = pointer[PointerInput.DeltaHorizontal];
319
- _this.onInputChanged(deviceEvent);
320
- }
321
- if (pointer[PointerInput.DeltaVertical] !== 0) {
322
- deviceEvent.inputIndex = PointerInput.DeltaVertical;
323
- deviceEvent.previousState = previousDeltaVertical;
324
- deviceEvent.currentState = pointer[PointerInput.DeltaVertical];
325
- _this.onInputChanged(deviceEvent);
326
- }
345
+ deviceEvent.inputIndex = PointerInput.Move;
346
+ _this.onInputChanged(deviceEvent);
327
347
  // Lets Propagate the event for move with same position.
328
348
  if (!_this._usingSafari && evt.button !== -1) {
329
349
  deviceEvent.inputIndex = evt.button + 2;
@@ -404,16 +424,8 @@ var WebDeviceInputSystem = /** @class */ (function () {
404
424
  deviceEvent.previousState = previousButton;
405
425
  deviceEvent.currentState = pointer[deviceEvent.inputIndex];
406
426
  _this.onInputChanged(deviceEvent);
407
- if (previousHorizontal !== evt.clientX) {
408
- deviceEvent.inputIndex = PointerInput.Horizontal;
409
- deviceEvent.previousState = previousHorizontal;
410
- deviceEvent.currentState = pointer[PointerInput.Horizontal];
411
- _this.onInputChanged(deviceEvent);
412
- }
413
- if (previousVertical !== evt.clientY) {
414
- deviceEvent.inputIndex = PointerInput.Vertical;
415
- deviceEvent.previousState = previousVertical;
416
- deviceEvent.currentState = pointer[PointerInput.Vertical];
427
+ if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {
428
+ deviceEvent.inputIndex = PointerInput.Move;
417
429
  _this.onInputChanged(deviceEvent);
418
430
  }
419
431
  }
@@ -441,16 +453,8 @@ var WebDeviceInputSystem = /** @class */ (function () {
441
453
  var deviceEvent = evt;
442
454
  deviceEvent.deviceType = deviceType;
443
455
  deviceEvent.deviceSlot = deviceSlot;
444
- if (previousHorizontal !== evt.clientX) {
445
- deviceEvent.inputIndex = PointerInput.Horizontal;
446
- deviceEvent.previousState = previousHorizontal;
447
- deviceEvent.currentState = pointer[PointerInput.Horizontal];
448
- _this.onInputChanged(deviceEvent);
449
- }
450
- if (previousVertical !== evt.clientY) {
451
- deviceEvent.inputIndex = PointerInput.Vertical;
452
- deviceEvent.previousState = previousVertical;
453
- deviceEvent.currentState = pointer[PointerInput.Vertical];
456
+ if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {
457
+ deviceEvent.inputIndex = PointerInput.Move;
454
458
  _this.onInputChanged(deviceEvent);
455
459
  }
456
460
  // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button
@@ -667,29 +671,6 @@ var WebDeviceInputSystem = /** @class */ (function () {
667
671
  }
668
672
  return deviceType;
669
673
  };
670
- /**
671
- * Remove events from active input element
672
- */
673
- WebDeviceInputSystem.prototype._removeEvents = function () {
674
- // Blur Events
675
- this._elementToAttachTo.removeEventListener("blur", this._keyboardBlurEvent);
676
- this._elementToAttachTo.removeEventListener("blur", this._pointerBlurEvent);
677
- // Keyboard Events
678
- if (this._keyboardActive) {
679
- this._elementToAttachTo.removeEventListener("keydown", this._keyboardDownEvent);
680
- this._elementToAttachTo.removeEventListener("keyup", this._keyboardUpEvent);
681
- }
682
- // Pointer Events
683
- if (this._pointerActive) {
684
- this._elementToAttachTo.removeEventListener(this._eventPrefix + "move", this._pointerMoveEvent);
685
- this._elementToAttachTo.removeEventListener(this._eventPrefix + "down", this._pointerDownEvent);
686
- this._elementToAttachTo.removeEventListener(this._eventPrefix + "up", this._pointerUpEvent);
687
- this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);
688
- if (this._pointerInputClearObserver) {
689
- this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);
690
- }
691
- }
692
- };
693
674
  return WebDeviceInputSystem;
694
675
  }());
695
676
  export { WebDeviceInputSystem };
@@ -1 +1 @@
1
- {"version":3,"file":"webDeviceInputSystem.js","sourceRoot":"","sources":["../../../../sourceES6/core/DeviceInput/InputDevices/webDeviceInputSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"../../Engines/engine\";\r\nimport { IEvent } from \"../../Events/deviceInputEvents\";\r\nimport { DomManagement } from \"../../Misc/domManagement\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Nullable } from \"../../types\";\r\nimport { DeviceEventFactory } from \"../Helpers/eventFactory\";\r\nimport { DeviceType, PointerInput } from \"./deviceEnums\";\r\nimport { IDeviceEvent, IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\nconst MAX_KEYCODES = 255;\r\nconst MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;\r\n\r\n/** @hidden */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\r\n /** onDeviceConnected property */\r\n public set onDeviceConnected(callback: (deviceType: DeviceType, deviceSlot: number) => void) {\r\n this._onDeviceConnected = callback;\r\n\r\n // Iterate through each active device and rerun new callback\r\n for (let deviceType = 0; deviceType < this._inputs.length; deviceType++) {\r\n const inputs = this._inputs[deviceType];\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public get onDeviceConnected(): (deviceType: DeviceType, deviceSlot: number) => void {\r\n return this._onDeviceConnected;\r\n }\r\n\r\n public onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n public onInputChanged: (deviceEvent: IDeviceEvent) => void;\r\n\r\n // Private Members\r\n private _inputs: Array<{ [deviceSlot: number]: Array<number> }> = [];\r\n private _gamepads: Array<DeviceType>;\r\n private _keyboardActive: boolean = false;\r\n private _pointerActive: boolean = false;\r\n private _elementToAttachTo: HTMLElement;\r\n private readonly _engine: Engine;\r\n private readonly _usingSafari: boolean = Tools.IsSafari();\r\n\r\n private _onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n\r\n private _keyboardDownEvent = (evt: any) => { };\r\n private _keyboardUpEvent = (evt: any) => { };\r\n private _keyboardBlurEvent = (evt: any) => { };\r\n\r\n private _pointerMoveEvent = (evt: any) => { };\r\n private _pointerDownEvent = (evt: any) => { };\r\n private _pointerUpEvent = (evt: any) => { };\r\n private _pointerWheelEvent = (evt: any) => { };\r\n private _pointerBlurEvent = (evt: any) => { };\r\n private _wheelEventName: string;\r\n\r\n private _mouseId = -1;\r\n private readonly _isUsingFirefox = DomManagement.IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n\r\n // Array to store active Pointer ID values; prevents issues with negative pointerIds\r\n private _activeTouchIds: Array<number>;\r\n private _maxTouchPoints: number = 0;\r\n\r\n private _pointerInputClearObserver: Nullable<Observer<Engine>> = null;\r\n\r\n private _gamepadConnectedEvent = (evt: any) => { };\r\n private _gamepadDisconnectedEvent = (evt: any) => { };\r\n\r\n private _eventPrefix: string;\r\n\r\n constructor(engine: Engine) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this.onDeviceConnected = (deviceType: DeviceType, deviceSlot: number) => { };\r\n this.onDeviceDisconnected = (deviceType: DeviceType, deviceSlot: number) => { };\r\n this.onInputChanged = (deviceEvent: IDeviceEvent) => { };\r\n\r\n this._configureEvents();\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (!device) {\r\n throw `Unable to find device ${DeviceType[deviceType]}`;\r\n }\r\n\r\n if (deviceType >= DeviceType.DualShock && deviceType <= DeviceType.DualSense && navigator.getGamepads) {\r\n this._updateDevice(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n const currentValue = device[inputIndex];\r\n if (currentValue === undefined) {\r\n throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`;\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType): boolean {\r\n return (this._inputs[deviceType] !== undefined);\r\n }\r\n\r\n /**\r\n * Dispose of all the eventlisteners\r\n */\r\n public dispose(): void {\r\n // Observables\r\n this.onDeviceConnected = () => { };\r\n this.onDeviceDisconnected = () => { };\r\n this.onInputChanged = () => { };\r\n\r\n if (this._elementToAttachTo) {\r\n this._removeEvents();\r\n\r\n // Gamepad Events\r\n window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n }\r\n\r\n /**\r\n * Configures events to work with an engine's active element\r\n */\r\n private _configureEvents(): void {\r\n const inputElement = this._engine.getInputElement();\r\n if (inputElement && this._elementToAttachTo !== inputElement) {\r\n // If the engine's input element has changed, unregister events from previous element\r\n if (this._elementToAttachTo) {\r\n this._removeEvents();\r\n }\r\n\r\n this._elementToAttachTo = inputElement;\r\n // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1\r\n this._elementToAttachTo.tabIndex = (this._elementToAttachTo.tabIndex !== -1) ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex;\r\n this._handleKeyActions();\r\n this._handlePointerActions();\r\n this._handleGamepadActions();\r\n\r\n // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse\r\n this._checkForConnectedDevices();\r\n }\r\n }\r\n\r\n /**\r\n * Checks for existing connections to devices and register them, if necessary\r\n * Currently handles gamepads and mouse\r\n */\r\n private _checkForConnectedDevices(): void {\r\n if (navigator.getGamepads) {\r\n const gamepads = navigator.getGamepads();\r\n\r\n for (const gamepad of gamepads) {\r\n if (gamepad) {\r\n this._addGamePad(gamepad);\r\n }\r\n }\r\n }\r\n\r\n // If the device in use has mouse capabilities, pre-register mouse\r\n if (matchMedia('(pointer:fine)').matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overriden when the first mouse event happens.\r\n // There isn't any good way to get the current position outside of a pointer event so that's why this was done.\r\n this._addPointerDevice(DeviceType.Mouse, 0, 0, 0);\r\n }\r\n }\r\n\r\n // Private functions\r\n /**\r\n * Add a gamepad to the DeviceInputSystem\r\n * @param gamepad A single DOM Gamepad object\r\n */\r\n private _addGamePad(gamepad: any): void {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._gamepads = this._gamepads || new Array<DeviceType>(gamepad.index + 1);\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n\r\n this._gamepads[deviceSlot] = deviceType;\r\n }\r\n\r\n /**\r\n * Add pointer device to DeviceInputSystem\r\n * @param deviceType Type of Pointer to add\r\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\r\n * @param currentX Current X at point of adding\r\n * @param currentY Current Y at point of adding\r\n */\r\n private _addPointerDevice(deviceType: DeviceType, deviceSlot: number, currentX: number, currentY: number): void {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n const pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */\r\n pointer[0] = currentX;\r\n pointer[1] = currentY;\r\n }\r\n\r\n /**\r\n * Add device and inputs to device array\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param numberOfInputs Number of input entries to create for given device\r\n */\r\n private _registerDevice(deviceType: DeviceType, deviceSlot: number, numberOfInputs: number): void {\r\n if (deviceSlot === undefined) {\r\n throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n const device = new Array<number>(numberOfInputs);\r\n\r\n for (let i = 0; i < numberOfInputs; i++) {\r\n device[i] = 0; /* set device input as unpressed */\r\n }\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this.onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Given a specific device name, remove that device from the device map\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this.onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Handle all actions that come from keyboard interaction\r\n */\r\n private _handleKeyActions(): void {\r\n this._keyboardDownEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 0;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardUpEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 1;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardBlurEvent = ((evt) => {\r\n if (this._keyboardActive) {\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n\r\n for (let i = 0; i < kbKey.length; i++) {\r\n if (kbKey[i] !== 0) {\r\n kbKey[i] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i;\r\n deviceEvent.currentState = 0;\r\n deviceEvent.previousState = 1;\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\r\n }\r\n\r\n /**\r\n * Handle all actions that come from pointer interaction\r\n */\r\n private _handlePointerActions(): void {\r\n this._maxTouchPoints = (DomManagement.IsNavigatorAvailable() && navigator.maxTouchPoints) || 0;\r\n if (!this._activeTouchIds) {\r\n this._activeTouchIds = new Array<number>(this._maxTouchPoints);\r\n }\r\n\r\n for (let i = 0; i < this._maxTouchPoints; i++) {\r\n this._activeTouchIds[i] = -1;\r\n }\r\n\r\n this._pointerMoveEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousDeltaHorizontal = pointer[PointerInput.DeltaHorizontal];\r\n const previousDeltaVertical = pointer[PointerInput.DeltaVertical];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[PointerInput.DeltaHorizontal] = evt.movementX;\r\n pointer[PointerInput.DeltaVertical] = evt.movementY;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n // The browser might use a move event in case\r\n // of simultaneous mouse buttons click for instance. So\r\n // in this case we stil need to propagate it.\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (pointer[PointerInput.DeltaHorizontal] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.DeltaHorizontal;\r\n deviceEvent.previousState = previousDeltaHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.DeltaHorizontal];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (pointer[PointerInput.DeltaVertical] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.DeltaVertical;\r\n deviceEvent.previousState = previousDeltaVertical;\r\n deviceEvent.currentState = pointer[PointerInput.DeltaVertical];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n // Lets Propagate the event for move with same position.\r\n if (!this._usingSafari && evt.button !== -1) {\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = pointer[evt.button + 2];\r\n pointer[evt.button + 2] = (pointer[evt.button + 2] ? 0 : 1); // Reverse state of button if evt.button has value\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._pointerDownEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : evt.pointerId;\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n }\r\n else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n else if (deviceType === DeviceType.Touch) {\r\n this.onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n if (deviceType === DeviceType.Mouse) { // Mouse; Among supported browsers, value is either 1 or 0 for mouse\r\n if (this._mouseId === -1) {\r\n if (evt.pointerId === undefined) { // If there is no pointerId (eg. manually dispatched MouseEvent)\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n }\r\n else {\r\n this._mouseId = evt.pointerId;\r\n }\r\n }\r\n\r\n if (!document.pointerLockElement && this._elementToAttachTo.hasPointerCapture) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n else { // Touch; Since touches are dynamically assigned, only set capture if we have an id\r\n if (evt.pointerId && !document.pointerLockElement && this._elementToAttachTo.hasPointerCapture) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(evt.pointerId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[deviceEvent.inputIndex];\r\n this.onInputChanged(deviceEvent);\r\n\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._pointerUpEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n if (deviceSlot === -1) {\r\n return;\r\n }\r\n else {\r\n this._activeTouchIds[deviceSlot] = -1;\r\n }\r\n }\r\n\r\n const pointer = this._inputs[deviceType]?.[deviceSlot];\r\n if (pointer && pointer[evt.button + 2] !== 0) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (previousHorizontal !== evt.clientX) {\r\n deviceEvent.inputIndex = PointerInput.Horizontal;\r\n deviceEvent.previousState = previousHorizontal;\r\n deviceEvent.currentState = pointer[PointerInput.Horizontal];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Vertical;\r\n deviceEvent.previousState = previousVertical;\r\n deviceEvent.currentState = pointer[PointerInput.Vertical];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[deviceEvent.inputIndex];\r\n\r\n if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this.onInputChanged(deviceEvent);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n this.onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n });\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\r\n (<any>document).onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\r\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\r\n\r\n // Code originally in scene.inputManager.ts\r\n // Chrome reports warning in console if wheel listener doesn't set an explicit passive option.\r\n // IE11 only supports captureEvent:boolean, not options:object, and it defaults to false.\r\n // Feature detection technique copied from: https://github.com/github/eventlistener-polyfill (MIT license)\r\n let passiveSupported = false;\r\n const noop = function () { };\r\n\r\n try {\r\n const options: object = {\r\n passive: {\r\n get: function () {\r\n passiveSupported = true;\r\n }\r\n }\r\n };\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n }\r\n catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = ((evt) => {\r\n // Handle mouse buttons\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let i = 0; i <= PointerInput.BrowserForward; i++) {\r\n if (pointer[i + 2] === 1) {\r\n pointer[i + 2] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, i + 2, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Mouse;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i + 2;\r\n deviceEvent.currentState = pointer[i + 2];\r\n deviceEvent.previousState = 1;\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n }\r\n\r\n // Handle Active Touches\r\n if (this.isDeviceAvailable(DeviceType.Touch)) {\r\n const pointer = this._inputs[DeviceType.Touch];\r\n\r\n for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) {\r\n const pointerId = this._activeTouchIds[deviceSlot];\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(pointerId);\r\n }\r\n\r\n if (pointerId !== -1 && pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, deviceSlot, PointerInput.LeftClick, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Touch;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n deviceEvent.inputIndex = PointerInput.LeftClick;\r\n deviceEvent.currentState = pointer[deviceSlot][PointerInput.LeftClick];\r\n deviceEvent.previousState = 1;\r\n this.onInputChanged(deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this.onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._pointerWheelEvent = ((evt) => {\r\n const deviceType = DeviceType.Mouse;\r\n const deviceSlot = 0;\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = [];\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n let previousWheelScrollX = pointer[PointerInput.MouseWheelX];\r\n let previousWheelScrollY = pointer[PointerInput.MouseWheelY];\r\n let previousWheelScrollZ = pointer[PointerInput.MouseWheelZ];\r\n\r\n pointer[PointerInput.MouseWheelX] = evt.deltaX || 0;\r\n pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0;\r\n pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n deviceEvent.previousState = previousWheelScrollX;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelX];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n deviceEvent.previousState = previousWheelScrollY;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelY];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n deviceEvent.previousState = previousWheelScrollZ;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelZ];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent);\r\n this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false);\r\n\r\n // Since there's no up or down event for mouse wheel or delta x/y, clear mouse values at end of frame\r\n this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n pointer[PointerInput.MouseWheelX] = 0;\r\n pointer[PointerInput.MouseWheelY] = 0;\r\n pointer[PointerInput.MouseWheelZ] = 0;\r\n pointer[PointerInput.DeltaHorizontal] = 0;\r\n pointer[PointerInput.DeltaVertical] = 0;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions(): void {\r\n this._gamepadConnectedEvent = ((evt: any) => {\r\n this._addGamePad(evt.gamepad);\r\n });\r\n\r\n this._gamepadDisconnectedEvent = ((evt: any) => {\r\n if (this._gamepads) {\r\n const deviceType = this._getGamepadDeviceType(evt.gamepad.id);\r\n const deviceSlot = evt.gamepad.index;\r\n\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n delete this._gamepads[deviceSlot];\r\n }\r\n });\r\n\r\n window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n /**\r\n * Update all non-event based devices with each frame\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n */\r\n private _updateDevice(deviceType: DeviceType, deviceSlot: number, inputIndex: number): void {\r\n // Gamepads\r\n const gp = navigator.getGamepads()[deviceSlot];\r\n\r\n if (gp && deviceType === this._gamepads[deviceSlot]) {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (inputIndex >= gp.buttons.length) {\r\n device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf();\r\n }\r\n else {\r\n device[inputIndex] = gp.buttons[inputIndex].value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets DeviceType from the device name\r\n * @param deviceName Name of Device from DeviceInputSystem\r\n * @returns DeviceType enum value\r\n */\r\n private _getGamepadDeviceType(deviceName: string): DeviceType {\r\n if (deviceName.indexOf(\"054c\") !== -1) { // DualShock 4 Gamepad\r\n return (deviceName.indexOf(\"0ce6\") !== -1 ? DeviceType.DualSense : DeviceType.DualShock);\r\n }\r\n else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) { // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n }\r\n else if (deviceName.indexOf(\"057e\") !== -1) { // Switch Gamepad\r\n return DeviceType.Switch;\r\n }\r\n\r\n return DeviceType.Generic;\r\n }\r\n\r\n /**\r\n * Get DeviceType from a given pointer/mouse/touch event.\r\n * @param evt PointerEvent to evaluate\r\n * @returns DeviceType interpreted from event\r\n */\r\n private _getPointerType(evt: any): DeviceType {\r\n let deviceType = DeviceType.Mouse;\r\n\r\n if (evt.pointerType === \"touch\" || evt.pointerType === \"pen\" || evt.touches) {\r\n deviceType = DeviceType.Touch;\r\n }\r\n\r\n return deviceType;\r\n }\r\n\r\n /**\r\n * Remove events from active input element\r\n */\r\n private _removeEvents(): void {\r\n // Blur Events\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent);\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent);\r\n\r\n // Keyboard Events\r\n if (this._keyboardActive) {\r\n this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n }\r\n\r\n // Pointer Events\r\n if (this._pointerActive) {\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n\r\n if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"webDeviceInputSystem.js","sourceRoot":"","sources":["../../../../sourceES6/core/DeviceInput/InputDevices/webDeviceInputSystem.ts"],"names":[],"mappings":"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","sourcesContent":["import { Engine } from \"../../Engines/engine\";\r\nimport { IEvent } from \"../../Events/deviceInputEvents\";\r\nimport { DomManagement } from \"../../Misc/domManagement\";\r\nimport { Observer } from \"../../Misc/observable\";\r\nimport { Tools } from \"../../Misc/tools\";\r\nimport { Nullable } from \"../../types\";\r\nimport { DeviceEventFactory } from \"../Helpers/eventFactory\";\r\nimport { DeviceType, PointerInput } from \"./deviceEnums\";\r\nimport { IDeviceEvent, IDeviceInputSystem } from \"./inputInterfaces\";\r\n\r\nconst MAX_KEYCODES = 255;\r\nconst MAX_POINTER_INPUTS = Object.keys(PointerInput).length / 2;\r\n\r\n/** @hidden */\r\nexport class WebDeviceInputSystem implements IDeviceInputSystem {\r\n /** onDeviceConnected property */\r\n public set onDeviceConnected(callback: (deviceType: DeviceType, deviceSlot: number) => void) {\r\n this._onDeviceConnected = callback;\r\n\r\n // Iterate through each active device and rerun new callback\r\n for (let deviceType = 0; deviceType < this._inputs.length; deviceType++) {\r\n const inputs = this._inputs[deviceType];\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n this._onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n public get onDeviceConnected(): (deviceType: DeviceType, deviceSlot: number) => void {\r\n return this._onDeviceConnected;\r\n }\r\n\r\n public onDeviceDisconnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n public onInputChanged: (deviceEvent: IDeviceEvent) => void;\r\n\r\n // Private Members\r\n private _inputs: Array<{ [deviceSlot: number]: Array<number> }> = [];\r\n private _gamepads: Array<DeviceType>;\r\n private _keyboardActive: boolean = false;\r\n private _pointerActive: boolean = false;\r\n private _elementToAttachTo: HTMLElement;\r\n private readonly _engine: Engine;\r\n private readonly _usingSafari: boolean = Tools.IsSafari();\r\n\r\n private _onDeviceConnected: (deviceType: DeviceType, deviceSlot: number) => void;\r\n\r\n private _keyboardDownEvent = (evt: any) => { };\r\n private _keyboardUpEvent = (evt: any) => { };\r\n private _keyboardBlurEvent = (evt: any) => { };\r\n\r\n private _pointerMoveEvent = (evt: any) => { };\r\n private _pointerDownEvent = (evt: any) => { };\r\n private _pointerUpEvent = (evt: any) => { };\r\n private _pointerWheelEvent = (evt: any) => { };\r\n private _pointerBlurEvent = (evt: any) => { };\r\n private _wheelEventName: string;\r\n private _eventsAttached: boolean = false;\r\n\r\n private _mouseId = -1;\r\n private readonly _isUsingFirefox = DomManagement.IsNavigatorAvailable() && navigator.userAgent && navigator.userAgent.indexOf(\"Firefox\") !== -1;\r\n\r\n // Array to store active Pointer ID values; prevents issues with negative pointerIds\r\n private _activeTouchIds: Array<number>;\r\n private _maxTouchPoints: number = 0;\r\n\r\n private _pointerInputClearObserver: Nullable<Observer<Engine>> = null;\r\n\r\n private _gamepadConnectedEvent = (evt: any) => { };\r\n private _gamepadDisconnectedEvent = (evt: any) => { };\r\n\r\n private _eventPrefix: string;\r\n\r\n constructor(engine: Engine) {\r\n this._eventPrefix = Tools.GetPointerPrefix(engine);\r\n this._engine = engine;\r\n\r\n this.onDeviceConnected = (deviceType: DeviceType, deviceSlot: number) => { };\r\n this.onDeviceDisconnected = (deviceType: DeviceType, deviceSlot: number) => { };\r\n this.onInputChanged = (deviceEvent: IDeviceEvent) => { };\r\n\r\n this._enableEvents();\r\n\r\n // Set callback to enable event handler switching when inputElement changes\r\n if (!this._engine._onEngineViewChanged) {\r\n this._engine._onEngineViewChanged = () => {\r\n this._enableEvents();\r\n };\r\n }\r\n }\r\n\r\n // Public functions\r\n /**\r\n * Checks for current device input value, given an id and input index. Throws exception if requested device not initialized.\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n * @returns Current value of input\r\n */\r\n public pollInput(deviceType: DeviceType, deviceSlot: number, inputIndex: number): number {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (!device) {\r\n throw `Unable to find device ${DeviceType[deviceType]}`;\r\n }\r\n\r\n if (deviceType >= DeviceType.DualShock && deviceType <= DeviceType.DualSense && navigator.getGamepads) {\r\n this._updateDevice(deviceType, deviceSlot, inputIndex);\r\n }\r\n\r\n const currentValue = device[inputIndex];\r\n if (currentValue === undefined) {\r\n throw `Unable to find input ${inputIndex} for device ${DeviceType[deviceType]} in slot ${deviceSlot}`;\r\n }\r\n\r\n return currentValue;\r\n }\r\n\r\n /**\r\n * Check for a specific device in the DeviceInputSystem\r\n * @param deviceType Type of device to check for\r\n * @returns bool with status of device's existence\r\n */\r\n public isDeviceAvailable(deviceType: DeviceType): boolean {\r\n return (this._inputs[deviceType] !== undefined);\r\n }\r\n\r\n /**\r\n * Dispose of all the eventlisteners\r\n */\r\n public dispose(): void {\r\n // Callbacks\r\n this.onDeviceConnected = () => { };\r\n this.onDeviceDisconnected = () => { };\r\n this.onInputChanged = () => { };\r\n delete this._engine._onEngineViewChanged;\r\n\r\n if (this._elementToAttachTo) {\r\n this._disableEvents();\r\n }\r\n }\r\n\r\n /**\r\n * Enable listening for user input events\r\n */\r\n private _enableEvents(): void {\r\n const inputElement = this?._engine.getInputElement();\r\n if (inputElement && (!this._eventsAttached || this._elementToAttachTo !== inputElement)) {\r\n // Remove events before adding to avoid double events or simultaneous events on multiple canvases\r\n this._disableEvents();\r\n\r\n // If the inputs array has already been created, zero it out to before setting up events\r\n if (this._inputs) {\r\n for (const inputs of this._inputs) {\r\n if (inputs) {\r\n for (const deviceSlotKey in inputs) {\r\n const deviceSlot = +deviceSlotKey;\r\n const device = inputs[deviceSlot];\r\n if (device) {\r\n for (let inputIndex = 0; inputIndex < device.length; inputIndex++) {\r\n device[inputIndex] = 0;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n this._elementToAttachTo = inputElement;\r\n // Set tab index for the inputElement to the engine's canvasTabIndex, if and only if the element's tab index is -1\r\n this._elementToAttachTo.tabIndex = (this._elementToAttachTo.tabIndex !== -1) ? this._elementToAttachTo.tabIndex : this._engine.canvasTabIndex;\r\n this._handleKeyActions();\r\n this._handlePointerActions();\r\n this._handleGamepadActions();\r\n this._eventsAttached = true;\r\n\r\n // Check for devices that are already connected but aren't registered. Currently, only checks for gamepads and mouse\r\n this._checkForConnectedDevices();\r\n }\r\n }\r\n\r\n /**\r\n * Disable listening for user input events\r\n */\r\n private _disableEvents(): void {\r\n if (this._elementToAttachTo) {\r\n // Blur Events\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._keyboardBlurEvent);\r\n this._elementToAttachTo.removeEventListener(\"blur\", this._pointerBlurEvent);\r\n\r\n // Keyboard Events\r\n this._elementToAttachTo.removeEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.removeEventListener(\"keyup\", this._keyboardUpEvent);\r\n\r\n // Pointer Events\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.removeEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.removeEventListener(this._wheelEventName, this._pointerWheelEvent);\r\n\r\n // Gamepad Events\r\n window.removeEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.removeEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n if (this._pointerInputClearObserver) {\r\n this._engine.onEndFrameObservable.remove(this._pointerInputClearObserver);\r\n }\r\n\r\n this._eventsAttached = false;\r\n }\r\n\r\n /**\r\n * Checks for existing connections to devices and register them, if necessary\r\n * Currently handles gamepads and mouse\r\n */\r\n private _checkForConnectedDevices(): void {\r\n if (navigator.getGamepads) {\r\n const gamepads = navigator.getGamepads();\r\n\r\n for (const gamepad of gamepads) {\r\n if (gamepad) {\r\n this._addGamePad(gamepad);\r\n }\r\n }\r\n }\r\n\r\n // If the device in use has mouse capabilities, pre-register mouse\r\n if (matchMedia('(pointer:fine)').matches) {\r\n // This will provide a dummy value for the cursor position and is expected to be overriden when the first mouse event happens.\r\n // There isn't any good way to get the current position outside of a pointer event so that's why this was done.\r\n this._addPointerDevice(DeviceType.Mouse, 0, 0, 0);\r\n }\r\n }\r\n\r\n // Private functions\r\n /**\r\n * Add a gamepad to the DeviceInputSystem\r\n * @param gamepad A single DOM Gamepad object\r\n */\r\n private _addGamePad(gamepad: any): void {\r\n const deviceType = this._getGamepadDeviceType(gamepad.id);\r\n const deviceSlot = gamepad.index;\r\n\r\n this._gamepads = this._gamepads || new Array<DeviceType>(gamepad.index + 1);\r\n this._registerDevice(deviceType, deviceSlot, gamepad.buttons.length + gamepad.axes.length);\r\n\r\n this._gamepads[deviceSlot] = deviceType;\r\n }\r\n\r\n /**\r\n * Add pointer device to DeviceInputSystem\r\n * @param deviceType Type of Pointer to add\r\n * @param deviceSlot Pointer ID (0 for mouse, pointerId for Touch)\r\n * @param currentX Current X at point of adding\r\n * @param currentY Current Y at point of adding\r\n */\r\n private _addPointerDevice(deviceType: DeviceType, deviceSlot: number, currentX: number, currentY: number): void {\r\n if (!this._pointerActive) {\r\n this._pointerActive = true;\r\n }\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n const pointer = this._inputs[deviceType][deviceSlot]; /* initialize our pointer position immediately after registration */\r\n pointer[0] = currentX;\r\n pointer[1] = currentY;\r\n }\r\n\r\n /**\r\n * Add device and inputs to device array\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param numberOfInputs Number of input entries to create for given device\r\n */\r\n private _registerDevice(deviceType: DeviceType, deviceSlot: number, numberOfInputs: number): void {\r\n if (deviceSlot === undefined) {\r\n throw `Unable to register device ${DeviceType[deviceType]} to undefined slot.`;\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n const device = new Array<number>(numberOfInputs);\r\n\r\n for (let i = 0; i < numberOfInputs; i++) {\r\n device[i] = 0; /* set device input as unpressed */\r\n }\r\n\r\n this._inputs[deviceType][deviceSlot] = device;\r\n this.onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Given a specific device name, remove that device from the device map\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n */\r\n private _unregisterDevice(deviceType: DeviceType, deviceSlot: number): void {\r\n if (this._inputs[deviceType][deviceSlot]) {\r\n delete this._inputs[deviceType][deviceSlot];\r\n this.onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n\r\n /**\r\n * Handle all actions that come from keyboard interaction\r\n */\r\n private _handleKeyActions(): void {\r\n this._keyboardDownEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 0;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardUpEvent = ((evt) => {\r\n if (!this._keyboardActive) {\r\n this._keyboardActive = true;\r\n this._registerDevice(DeviceType.Keyboard, 0, MAX_KEYCODES);\r\n }\r\n\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n if (kbKey) {\r\n kbKey[evt.keyCode] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = evt.keyCode;\r\n deviceEvent.previousState = 1;\r\n deviceEvent.currentState = kbKey[evt.keyCode];\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n });\r\n\r\n this._keyboardBlurEvent = ((evt) => {\r\n if (this._keyboardActive) {\r\n const kbKey = this._inputs[DeviceType.Keyboard][0];\r\n\r\n for (let i = 0; i < kbKey.length; i++) {\r\n if (kbKey[i] !== 0) {\r\n kbKey[i] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Keyboard, 0, i, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Keyboard;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i;\r\n deviceEvent.currentState = 0;\r\n deviceEvent.previousState = 1;\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(\"keydown\", this._keyboardDownEvent);\r\n this._elementToAttachTo.addEventListener(\"keyup\", this._keyboardUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._keyboardBlurEvent);\r\n }\r\n\r\n /**\r\n * Handle all actions that come from pointer interaction\r\n */\r\n private _handlePointerActions(): void {\r\n // If maxTouchPoints is defined, use that value. Otherwise, allow for a minimum for supported gestures like pinch\r\n this._maxTouchPoints = (DomManagement.IsNavigatorAvailable() && navigator.maxTouchPoints) || 2;\r\n if (!this._activeTouchIds) {\r\n this._activeTouchIds = new Array<number>(this._maxTouchPoints);\r\n }\r\n\r\n for (let i = 0; i < this._maxTouchPoints; i++) {\r\n this._activeTouchIds[i] = -1;\r\n }\r\n\r\n this._pointerMoveEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[PointerInput.DeltaHorizontal] = evt.movementX;\r\n pointer[PointerInput.DeltaVertical] = evt.movementY;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n this.onInputChanged(deviceEvent);\r\n\r\n // Lets Propagate the event for move with same position.\r\n if (!this._usingSafari && evt.button !== -1) {\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = pointer[evt.button + 2];\r\n pointer[evt.button + 2] = (pointer[evt.button + 2] ? 0 : 1); // Reverse state of button if evt.button has value\r\n deviceEvent.currentState = pointer[evt.button + 2];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._pointerDownEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n let deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : evt.pointerId;\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n const idx = this._activeTouchIds.indexOf(-1);\r\n\r\n if (idx >= 0) {\r\n deviceSlot = idx;\r\n this._activeTouchIds[idx] = evt.pointerId;\r\n }\r\n else {\r\n // We can't find an open slot to store new pointer so just return (can only support max number of touches)\r\n Tools.Warn(`Max number of touches exceeded. Ignoring touches in excess of ${this._maxTouchPoints}`);\r\n return;\r\n }\r\n }\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = {};\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._addPointerDevice(deviceType, deviceSlot, evt.clientX, evt.clientY);\r\n }\r\n else if (deviceType === DeviceType.Touch) {\r\n this.onDeviceConnected(deviceType, deviceSlot);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n if (deviceType === DeviceType.Mouse) { // Mouse; Among supported browsers, value is either 1 or 0 for mouse\r\n if (this._mouseId === -1) {\r\n if (evt.pointerId === undefined) { // If there is no pointerId (eg. manually dispatched MouseEvent)\r\n this._mouseId = this._isUsingFirefox ? 0 : 1;\r\n }\r\n else {\r\n this._mouseId = evt.pointerId;\r\n }\r\n }\r\n\r\n if (!document.pointerLockElement && this._elementToAttachTo.hasPointerCapture) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(this._mouseId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n else { // Touch; Since touches are dynamically assigned, only set capture if we have an id\r\n if (evt.pointerId && !document.pointerLockElement && this._elementToAttachTo.hasPointerCapture) {\r\n try {\r\n this._elementToAttachTo.setPointerCapture(evt.pointerId);\r\n }\r\n catch (e) {\r\n // DO NOTHING\r\n }\r\n }\r\n }\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 1;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[deviceEvent.inputIndex];\r\n this.onInputChanged(deviceEvent);\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._pointerUpEvent = ((evt) => {\r\n const deviceType = this._getPointerType(evt);\r\n const deviceSlot = (deviceType === DeviceType.Mouse) ? 0 : this._activeTouchIds.indexOf(evt.pointerId);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n if (deviceSlot === -1) {\r\n return;\r\n }\r\n else {\r\n this._activeTouchIds[deviceSlot] = -1;\r\n }\r\n }\r\n\r\n const pointer = this._inputs[deviceType]?.[deviceSlot];\r\n if (pointer && pointer[evt.button + 2] !== 0) {\r\n const previousHorizontal = pointer[PointerInput.Horizontal];\r\n const previousVertical = pointer[PointerInput.Vertical];\r\n const previousButton = pointer[evt.button + 2];\r\n\r\n pointer[PointerInput.Horizontal] = evt.clientX;\r\n pointer[PointerInput.Vertical] = evt.clientY;\r\n pointer[evt.button + 2] = 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (previousHorizontal !== evt.clientX || previousVertical !== evt.clientY) {\r\n deviceEvent.inputIndex = PointerInput.Move;\r\n\r\n this.onInputChanged(deviceEvent);\r\n }\r\n\r\n // NOTE: The +2 used here to is because PointerInput has the same value progression for its mouse buttons as PointerEvent.button\r\n // However, we have our X and Y values front-loaded to group together the touch inputs but not break this progression\r\n // EG. ([X, Y, Left-click], Middle-click, etc...)\r\n deviceEvent.inputIndex = evt.button + 2;\r\n deviceEvent.previousState = previousButton;\r\n deviceEvent.currentState = pointer[deviceEvent.inputIndex];\r\n\r\n if (deviceType === DeviceType.Mouse && this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n else if (evt.pointerId && this._elementToAttachTo.hasPointerCapture?.(evt.pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(evt.pointerId);\r\n }\r\n\r\n this.onInputChanged(deviceEvent);\r\n\r\n if (deviceType === DeviceType.Touch) {\r\n this.onDeviceDisconnected(deviceType, deviceSlot);\r\n }\r\n }\r\n });\r\n\r\n // Set Wheel Event Name, code originally from scene.inputManager\r\n this._wheelEventName = \"onwheel\" in document.createElement(\"div\") ? \"wheel\" : // Modern browsers support \"wheel\"\r\n (<any>document).onmousewheel !== undefined ? \"mousewheel\" : // Webkit and IE support at least \"mousewheel\"\r\n \"DOMMouseScroll\"; // let's assume that remaining browsers are older Firefox\r\n\r\n // Code originally in scene.inputManager.ts\r\n // Chrome reports warning in console if wheel listener doesn't set an explicit passive option.\r\n // IE11 only supports captureEvent:boolean, not options:object, and it defaults to false.\r\n // Feature detection technique copied from: https://github.com/github/eventlistener-polyfill (MIT license)\r\n let passiveSupported = false;\r\n const noop = function () { };\r\n\r\n try {\r\n const options: object = {\r\n passive: {\r\n get: function () {\r\n passiveSupported = true;\r\n }\r\n }\r\n };\r\n\r\n this._elementToAttachTo.addEventListener(\"test\", noop, options);\r\n this._elementToAttachTo.removeEventListener(\"test\", noop, options);\r\n }\r\n catch (e) {\r\n /* */\r\n }\r\n\r\n this._pointerBlurEvent = ((evt) => {\r\n // Handle mouse buttons\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n\r\n if (this._mouseId >= 0 && this._elementToAttachTo.hasPointerCapture?.(this._mouseId)) {\r\n this._elementToAttachTo.releasePointerCapture(this._mouseId);\r\n }\r\n\r\n for (let i = 0; i <= PointerInput.BrowserForward; i++) {\r\n if (pointer[i + 2] === 1) {\r\n pointer[i + 2] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Mouse, 0, i + 2, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Mouse;\r\n deviceEvent.deviceSlot = 0;\r\n deviceEvent.inputIndex = i + 2;\r\n deviceEvent.currentState = pointer[i + 2];\r\n deviceEvent.previousState = 1;\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n }\r\n\r\n // Handle Active Touches\r\n if (this.isDeviceAvailable(DeviceType.Touch)) {\r\n const pointer = this._inputs[DeviceType.Touch];\r\n\r\n for (let deviceSlot = 0; deviceSlot < this._activeTouchIds.length; deviceSlot++) {\r\n const pointerId = this._activeTouchIds[deviceSlot];\r\n\r\n if (this._elementToAttachTo.hasPointerCapture?.(pointerId)) {\r\n this._elementToAttachTo.releasePointerCapture(pointerId);\r\n }\r\n\r\n if (pointerId !== -1 && pointer[deviceSlot]?.[PointerInput.LeftClick] === 1) {\r\n pointer[deviceSlot][PointerInput.LeftClick] = 0;\r\n\r\n const evt: IEvent = DeviceEventFactory.CreateDeviceEvent(DeviceType.Touch, deviceSlot, PointerInput.LeftClick, 1, this, this._elementToAttachTo);\r\n const deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = DeviceType.Touch;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n deviceEvent.inputIndex = PointerInput.LeftClick;\r\n deviceEvent.currentState = pointer[deviceSlot][PointerInput.LeftClick];\r\n deviceEvent.previousState = 1;\r\n this.onInputChanged(deviceEvent);\r\n\r\n this._activeTouchIds[deviceSlot] = -1;\r\n this.onDeviceDisconnected(DeviceType.Touch, deviceSlot);\r\n }\r\n }\r\n }\r\n });\r\n\r\n this._pointerWheelEvent = ((evt) => {\r\n const deviceType = DeviceType.Mouse;\r\n const deviceSlot = 0;\r\n\r\n if (!this._inputs[deviceType]) {\r\n this._inputs[deviceType] = [];\r\n }\r\n\r\n if (!this._inputs[deviceType][deviceSlot]) {\r\n this._pointerActive = true;\r\n this._registerDevice(deviceType, deviceSlot, MAX_POINTER_INPUTS);\r\n }\r\n\r\n const pointer = this._inputs[deviceType][deviceSlot];\r\n if (pointer) {\r\n // Store previous values for event\r\n let previousWheelScrollX = pointer[PointerInput.MouseWheelX];\r\n let previousWheelScrollY = pointer[PointerInput.MouseWheelY];\r\n let previousWheelScrollZ = pointer[PointerInput.MouseWheelZ];\r\n\r\n pointer[PointerInput.MouseWheelX] = evt.deltaX || 0;\r\n pointer[PointerInput.MouseWheelY] = evt.deltaY || evt.wheelDelta || 0;\r\n pointer[PointerInput.MouseWheelZ] = evt.deltaZ || 0;\r\n\r\n let deviceEvent = evt as IDeviceEvent;\r\n deviceEvent.deviceType = deviceType;\r\n deviceEvent.deviceSlot = deviceSlot;\r\n\r\n if (pointer[PointerInput.MouseWheelX] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelX;\r\n deviceEvent.previousState = previousWheelScrollX;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelX];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelY] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelY;\r\n deviceEvent.previousState = previousWheelScrollY;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelY];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n if (pointer[PointerInput.MouseWheelZ] !== 0) {\r\n deviceEvent.inputIndex = PointerInput.MouseWheelZ;\r\n deviceEvent.previousState = previousWheelScrollZ;\r\n deviceEvent.currentState = pointer[PointerInput.MouseWheelZ];\r\n this.onInputChanged(deviceEvent);\r\n }\r\n }\r\n });\r\n\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"move\", this._pointerMoveEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"down\", this._pointerDownEvent);\r\n this._elementToAttachTo.addEventListener(this._eventPrefix + \"up\", this._pointerUpEvent);\r\n this._elementToAttachTo.addEventListener(\"blur\", this._pointerBlurEvent);\r\n this._elementToAttachTo.addEventListener(this._wheelEventName, this._pointerWheelEvent, passiveSupported ? { passive: false } : false);\r\n\r\n // Since there's no up or down event for mouse wheel or delta x/y, clear mouse values at end of frame\r\n this._pointerInputClearObserver = this._engine.onEndFrameObservable.add(() => {\r\n if (this.isDeviceAvailable(DeviceType.Mouse)) {\r\n const pointer = this._inputs[DeviceType.Mouse][0];\r\n pointer[PointerInput.MouseWheelX] = 0;\r\n pointer[PointerInput.MouseWheelY] = 0;\r\n pointer[PointerInput.MouseWheelZ] = 0;\r\n pointer[PointerInput.DeltaHorizontal] = 0;\r\n pointer[PointerInput.DeltaVertical] = 0;\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Handle all actions that come from gamepad interaction\r\n */\r\n private _handleGamepadActions(): void {\r\n this._gamepadConnectedEvent = ((evt: any) => {\r\n this._addGamePad(evt.gamepad);\r\n });\r\n\r\n this._gamepadDisconnectedEvent = ((evt: any) => {\r\n if (this._gamepads) {\r\n const deviceType = this._getGamepadDeviceType(evt.gamepad.id);\r\n const deviceSlot = evt.gamepad.index;\r\n\r\n this._unregisterDevice(deviceType, deviceSlot);\r\n delete this._gamepads[deviceSlot];\r\n }\r\n });\r\n\r\n window.addEventListener(\"gamepadconnected\", this._gamepadConnectedEvent);\r\n window.addEventListener(\"gamepaddisconnected\", this._gamepadDisconnectedEvent);\r\n }\r\n\r\n /**\r\n * Update all non-event based devices with each frame\r\n * @param deviceType Enum specifiying device type\r\n * @param deviceSlot \"Slot\" or index that device is referenced in\r\n * @param inputIndex Id of input to be checked\r\n */\r\n private _updateDevice(deviceType: DeviceType, deviceSlot: number, inputIndex: number): void {\r\n // Gamepads\r\n const gp = navigator.getGamepads()[deviceSlot];\r\n\r\n if (gp && deviceType === this._gamepads[deviceSlot]) {\r\n const device = this._inputs[deviceType][deviceSlot];\r\n\r\n if (inputIndex >= gp.buttons.length) {\r\n device[inputIndex] = gp.axes[inputIndex - gp.buttons.length].valueOf();\r\n }\r\n else {\r\n device[inputIndex] = gp.buttons[inputIndex].value;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Gets DeviceType from the device name\r\n * @param deviceName Name of Device from DeviceInputSystem\r\n * @returns DeviceType enum value\r\n */\r\n private _getGamepadDeviceType(deviceName: string): DeviceType {\r\n if (deviceName.indexOf(\"054c\") !== -1) { // DualShock 4 Gamepad\r\n return (deviceName.indexOf(\"0ce6\") !== -1 ? DeviceType.DualSense : DeviceType.DualShock);\r\n }\r\n else if (deviceName.indexOf(\"Xbox One\") !== -1 || deviceName.search(\"Xbox 360\") !== -1 || deviceName.search(\"xinput\") !== -1) { // Xbox Gamepad\r\n return DeviceType.Xbox;\r\n }\r\n else if (deviceName.indexOf(\"057e\") !== -1) { // Switch Gamepad\r\n return DeviceType.Switch;\r\n }\r\n\r\n return DeviceType.Generic;\r\n }\r\n\r\n /**\r\n * Get DeviceType from a given pointer/mouse/touch event.\r\n * @param evt PointerEvent to evaluate\r\n * @returns DeviceType interpreted from event\r\n */\r\n private _getPointerType(evt: any): DeviceType {\r\n let deviceType = DeviceType.Mouse;\r\n\r\n if (evt.pointerType === \"touch\" || evt.pointerType === \"pen\" || evt.touches) {\r\n deviceType = DeviceType.Touch;\r\n }\r\n\r\n return deviceType;\r\n }\r\n}\r\n"]}
@@ -75,6 +75,6 @@ declare module "../../Engines/thinEngine" {
75
75
  /**
76
76
  * @hidden
77
77
  */
78
- _setCubeMapTextureParams(texture: InternalTexture, loadMipmap: boolean): void;
78
+ _setCubeMapTextureParams(texture: InternalTexture, loadMipmap: boolean, maxLevel?: number): void;
79
79
  }
80
80
  }
@@ -88,13 +88,17 @@ ThinEngine.prototype._partialLoadImg = function (url, index, loadedImages, scene
88
88
  scene._addPendingData(tokenPendingData);
89
89
  }
90
90
  };
91
- ThinEngine.prototype._setCubeMapTextureParams = function (texture, loadMipmap) {
91
+ ThinEngine.prototype._setCubeMapTextureParams = function (texture, loadMipmap, maxLevel) {
92
92
  var gl = this._gl;
93
93
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
94
94
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, loadMipmap ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR);
95
95
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
96
96
  gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
97
97
  texture.samplingMode = loadMipmap ? 3 : 2;
98
+ if (loadMipmap && this.getCaps().textureMaxLevel && maxLevel !== undefined && maxLevel > 0) {
99
+ gl.texParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAX_LEVEL, maxLevel);
100
+ texture._maxLodLevel = maxLevel;
101
+ }
98
102
  this._bindTextureDirectly(gl.TEXTURE_CUBE_MAP, null);
99
103
  };
100
104
  ThinEngine.prototype.createCubeTextureBase = function (rootUrl, scene, files, noMipmap, onLoad, onError, format, forcedExtension, createPolynomials, lodScale, lodOffset, fallback, beforeLoadCubeDataCallback, imageHandler, useSRGBBuffer) {