@zephyr3d/scene 0.9.26 → 0.10.0

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 (506) hide show
  1. package/README.md +60 -27
  2. package/dist/animation/animation_bank.js +634 -0
  3. package/dist/animation/animation_bank.js.map +1 -0
  4. package/dist/animation/animation_bank_gpu.js +256 -0
  5. package/dist/animation/animation_bank_gpu.js.map +1 -0
  6. package/dist/animation/animationset.js +146 -30
  7. package/dist/animation/animationset.js.map +1 -1
  8. package/dist/animation/cloth/gpu_cloth_component.js +406 -0
  9. package/dist/animation/cloth/gpu_cloth_component.js.map +1 -0
  10. package/dist/animation/cloth/gpu_cloth_system.js +332 -202
  11. package/dist/animation/cloth/gpu_cloth_system.js.map +1 -1
  12. package/dist/animation/gpu_animation_driver.js +289 -0
  13. package/dist/animation/gpu_animation_driver.js.map +1 -0
  14. package/dist/animation/joint_dynamics/collision.js +112 -1
  15. package/dist/animation/joint_dynamics/collision.js.map +1 -1
  16. package/dist/animation/joint_dynamics/controller.js +6 -0
  17. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  18. package/dist/animation/joint_dynamics/joint_dynamics_system.js +11 -0
  19. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  20. package/dist/animation/joint_dynamics/solver.js +50 -12
  21. package/dist/animation/joint_dynamics/solver.js.map +1 -1
  22. package/dist/animation/joint_dynamics/types.js.map +1 -1
  23. package/dist/animation/skeleton.js +300 -56
  24. package/dist/animation/skeleton.js.map +1 -1
  25. package/dist/animation/skin_palette_atlas.js +252 -0
  26. package/dist/animation/skin_palette_atlas.js.map +1 -0
  27. package/dist/animation/spring/multi_chain_spring_system.js +298 -38
  28. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  29. package/dist/animation/spring/spring_chain.js +2 -0
  30. package/dist/animation/spring/spring_chain.js.map +1 -1
  31. package/dist/animation/spring/spring_collider.js +159 -21
  32. package/dist/animation/spring/spring_collider.js.map +1 -1
  33. package/dist/animation/spring/spring_particle.js +1 -0
  34. package/dist/animation/spring/spring_particle.js.map +1 -1
  35. package/dist/animation/spring/spring_solver.js +173 -0
  36. package/dist/animation/spring/spring_solver.js.map +1 -0
  37. package/dist/animation/spring/spring_system.js +249 -24
  38. package/dist/animation/spring/spring_system.js.map +1 -1
  39. package/dist/animation/spring_modifier.js +32 -1
  40. package/dist/animation/spring_modifier.js.map +1 -1
  41. package/dist/app/app.js +26 -0
  42. package/dist/app/app.js.map +1 -1
  43. package/dist/app/engine.js +86 -15
  44. package/dist/app/engine.js.map +1 -1
  45. package/dist/app/gamepad.js +191 -0
  46. package/dist/app/gamepad.js.map +1 -0
  47. package/dist/app/inputactions.js +271 -0
  48. package/dist/app/inputactions.js.map +1 -0
  49. package/dist/app/inputmgr.js +331 -22
  50. package/dist/app/inputmgr.js.map +1 -1
  51. package/dist/app/loading.js +138 -0
  52. package/dist/app/loading.js.map +1 -0
  53. package/dist/app/pipelinecache.js +209 -0
  54. package/dist/app/pipelinecache.js.map +1 -0
  55. package/dist/app/runtimescript.js +25 -0
  56. package/dist/app/runtimescript.js.map +1 -1
  57. package/dist/app/scriptingsystem.js +54 -0
  58. package/dist/app/scriptingsystem.js.map +1 -1
  59. package/dist/app/scriptregistry.js +7 -2
  60. package/dist/app/scriptregistry.js.map +1 -1
  61. package/dist/asset/asset_manifest.js +59 -0
  62. package/dist/asset/asset_manifest.js.map +1 -0
  63. package/dist/asset/asset_preload.js +258 -0
  64. package/dist/asset/asset_preload.js.map +1 -0
  65. package/dist/asset/assetmanager.js +117 -65
  66. package/dist/asset/assetmanager.js.map +1 -1
  67. package/dist/asset/loaders/ktx2/basis/LICENSE +201 -0
  68. package/dist/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  69. package/dist/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  70. package/dist/asset/loaders/ktx2/basis_location.js +17 -0
  71. package/dist/asset/loaders/ktx2/basis_location.js.map +1 -0
  72. package/dist/asset/loaders/ktx2/ktx2_loader.js +88 -0
  73. package/dist/asset/loaders/ktx2/ktx2_loader.js.map +1 -0
  74. package/dist/asset/loaders/ktx2/ktx2_targets.js +118 -0
  75. package/dist/asset/loaders/ktx2/ktx2_targets.js.map +1 -0
  76. package/dist/asset/loaders/ktx2/transcoder_pool.js +259 -0
  77. package/dist/asset/loaders/ktx2/transcoder_pool.js.map +1 -0
  78. package/dist/asset/mesh_lod_builder.js +104 -0
  79. package/dist/asset/mesh_lod_builder.js.map +1 -0
  80. package/dist/asset/mesh_settings.js +111 -0
  81. package/dist/asset/mesh_settings.js.map +1 -0
  82. package/dist/asset/meshopt_decoder.js +18 -0
  83. package/dist/asset/meshopt_decoder.js.map +1 -0
  84. package/dist/asset/meshopt_simplifier.js +26 -0
  85. package/dist/asset/meshopt_simplifier.js.map +1 -0
  86. package/dist/asset/model.js +177 -3
  87. package/dist/asset/model.js.map +1 -1
  88. package/dist/asset/texture_settings.js +231 -0
  89. package/dist/asset/texture_settings.js.map +1 -0
  90. package/dist/asset/zmsh_binary.js +131 -0
  91. package/dist/asset/zmsh_binary.js.map +1 -0
  92. package/dist/asset/zsdf_binary.js +111 -0
  93. package/dist/asset/zsdf_binary.js.map +1 -0
  94. package/dist/blitter/bilateralblur.js +1 -2
  95. package/dist/blitter/bilateralblur.js.map +1 -1
  96. package/dist/blitter/gaussianblur.js +1 -6
  97. package/dist/blitter/gaussianblur.js.map +1 -1
  98. package/dist/camera/base.js +31 -10
  99. package/dist/camera/base.js.map +1 -1
  100. package/dist/camera/camera.js +178 -200
  101. package/dist/camera/camera.js.map +1 -1
  102. package/dist/camera/follow.js +342 -0
  103. package/dist/camera/follow.js.map +1 -0
  104. package/dist/camera/fps.js +9 -7
  105. package/dist/camera/fps.js.map +1 -1
  106. package/dist/camera/orbit.js +46 -19
  107. package/dist/camera/orbit.js.map +1 -1
  108. package/dist/index.d.ts +30475 -19865
  109. package/dist/index.js +67 -12
  110. package/dist/index.js.map +1 -1
  111. package/dist/material/blinn.js +3 -0
  112. package/dist/material/blinn.js.map +1 -1
  113. package/dist/material/eye.js +1 -1
  114. package/dist/material/eye.js.map +1 -1
  115. package/dist/material/hair.js +2 -3
  116. package/dist/material/hair.js.map +1 -1
  117. package/dist/material/hairstrand.js +235 -235
  118. package/dist/material/hairstrand.js.map +1 -1
  119. package/dist/material/lambert.js +4 -1
  120. package/dist/material/lambert.js.map +1 -1
  121. package/dist/material/material.js +362 -300
  122. package/dist/material/material.js.map +1 -1
  123. package/dist/material/meshmaterial.js +118 -45
  124. package/dist/material/meshmaterial.js.map +1 -1
  125. package/dist/material/mixins/lightmodel/blinnphong.js +1 -1
  126. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  127. package/dist/material/mixins/lightmodel/lambert.js +1 -1
  128. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  129. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +34 -61
  130. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  131. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +16 -2
  132. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  133. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +2 -1
  134. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  135. package/dist/material/mixins/lit.js +223 -83
  136. package/dist/material/mixins/lit.js.map +1 -1
  137. package/dist/material/mixins/pbr/common.js +31 -206
  138. package/dist/material/mixins/pbr/common.js.map +1 -1
  139. package/dist/material/mtoon.js +1 -1
  140. package/dist/material/mtoon.js.map +1 -1
  141. package/dist/material/pbrmr.js +3 -0
  142. package/dist/material/pbrmr.js.map +1 -1
  143. package/dist/material/pbrsg.js +3 -0
  144. package/dist/material/pbrsg.js.map +1 -1
  145. package/dist/material/sdf_debug.js +78 -0
  146. package/dist/material/sdf_debug.js.map +1 -0
  147. package/dist/material/shader/helper.js +733 -190
  148. package/dist/material/shader/helper.js.map +1 -1
  149. package/dist/material/shader/terrain_blend.js +204 -43
  150. package/dist/material/shader/terrain_blend.js.map +1 -1
  151. package/dist/material/skin.js +331 -297
  152. package/dist/material/skin.js.map +1 -1
  153. package/dist/material/skinprofile.js +1058 -0
  154. package/dist/material/skinprofile.js.map +1 -0
  155. package/dist/material/sss.js +353 -0
  156. package/dist/material/sss.js.map +1 -0
  157. package/dist/material/sss_kernel.js +265 -0
  158. package/dist/material/sss_kernel.js.map +1 -0
  159. package/dist/material/sssprofile.js +879 -0
  160. package/dist/material/sssprofile.js.map +1 -0
  161. package/dist/material/subsurfaceprofile.js +4 -8
  162. package/dist/material/subsurfaceprofile.js.map +1 -1
  163. package/dist/material/terrain-cm.js +464 -188
  164. package/dist/material/terrain-cm.js.map +1 -1
  165. package/dist/material/unlit.js +3 -0
  166. package/dist/material/unlit.js.map +1 -1
  167. package/dist/material/water.js +2009 -201
  168. package/dist/material/water.js.map +1 -1
  169. package/dist/node_modules/meshoptimizer/LICENSE +21 -0
  170. package/dist/node_modules/meshoptimizer/meshopt_decoder.js +197 -0
  171. package/dist/node_modules/meshoptimizer/meshopt_decoder.js.map +1 -0
  172. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js +677 -0
  173. package/dist/node_modules/meshoptimizer/meshopt_simplifier.js.map +1 -0
  174. package/dist/physics/character.js +226 -0
  175. package/dist/physics/character.js.map +1 -0
  176. package/dist/physics/collider.js +209 -0
  177. package/dist/physics/collider.js.map +1 -0
  178. package/dist/physics/events.js +79 -0
  179. package/dist/physics/events.js.map +1 -0
  180. package/dist/physics/joint.js +272 -0
  181. package/dist/physics/joint.js.map +1 -0
  182. package/dist/physics/node_physics.js +234 -0
  183. package/dist/physics/node_physics.js.map +1 -0
  184. package/dist/physics/part.js +91 -0
  185. package/dist/physics/part.js.map +1 -0
  186. package/dist/physics/rigid_body.js +379 -0
  187. package/dist/physics/rigid_body.js.map +1 -0
  188. package/dist/physics/vehicle.js +335 -0
  189. package/dist/physics/vehicle.js.map +1 -0
  190. package/dist/physics/world.js +25 -0
  191. package/dist/physics/world.js.map +1 -0
  192. package/dist/posteffect/bloom.js +49 -14
  193. package/dist/posteffect/bloom.js.map +1 -1
  194. package/dist/posteffect/motionblur.js +668 -63
  195. package/dist/posteffect/motionblur.js.map +1 -1
  196. package/dist/posteffect/posteffect.js +12 -1
  197. package/dist/posteffect/posteffect.js.map +1 -1
  198. package/dist/posteffect/postsss.js +572 -0
  199. package/dist/posteffect/postsss.js.map +1 -0
  200. package/dist/posteffect/sao.js +48 -50
  201. package/dist/posteffect/sao.js.map +1 -1
  202. package/dist/posteffect/skinsss.js +605 -355
  203. package/dist/posteffect/skinsss.js.map +1 -1
  204. package/dist/posteffect/ssgi.js +91 -162
  205. package/dist/posteffect/ssgi.js.map +1 -1
  206. package/dist/posteffect/ssr.js +3 -11
  207. package/dist/posteffect/ssr.js.map +1 -1
  208. package/dist/posteffect/sss.js +34 -15
  209. package/dist/posteffect/sss.js.map +1 -1
  210. package/dist/posteffect/taa.js +1 -0
  211. package/dist/posteffect/taa.js.map +1 -1
  212. package/dist/render/abuffer_oit.js +40 -39
  213. package/dist/render/abuffer_oit.js.map +1 -1
  214. package/dist/render/clipmap.js +328 -62
  215. package/dist/render/clipmap.js.map +1 -1
  216. package/dist/render/cluster_light.js +958 -224
  217. package/dist/render/cluster_light.js.map +1 -1
  218. package/dist/render/cull_visitor.js +26 -5
  219. package/dist/render/cull_visitor.js.map +1 -1
  220. package/dist/render/debug_views.js +37 -0
  221. package/dist/render/debug_views.js.map +1 -0
  222. package/dist/render/depthpass.js +5 -1
  223. package/dist/render/depthpass.js.map +1 -1
  224. package/dist/render/drawable_mixin.js +53 -6
  225. package/dist/render/drawable_mixin.js.map +1 -1
  226. package/dist/render/dualdepthpeeling_oit.js +53 -53
  227. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  228. package/dist/render/envlight.js +196 -113
  229. package/dist/render/envlight.js.map +1 -1
  230. package/dist/render/fbm_wavegenerator.js +8 -13
  231. package/dist/render/fbm_wavegenerator.js.map +1 -1
  232. package/dist/render/fft_wavegenerator.js +268 -136
  233. package/dist/render/fft_wavegenerator.js.map +1 -1
  234. package/dist/render/gerstner_wavegenerator.js +113 -28
  235. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  236. package/dist/render/gi/probe_volume.js +1334 -0
  237. package/dist/render/gi/probe_volume.js.map +1 -0
  238. package/dist/render/gi/scene_gi.js +282 -0
  239. package/dist/render/gi/scene_gi.js.map +1 -0
  240. package/dist/render/gi/voxel_atlas.js +198 -0
  241. package/dist/render/gi/voxel_atlas.js.map +1 -0
  242. package/dist/render/gi/voxel_lighting.js +652 -0
  243. package/dist/render/gi/voxel_lighting.js.map +1 -0
  244. package/dist/render/gi/voxel_scene.js +642 -0
  245. package/dist/render/gi/voxel_scene.js.map +1 -0
  246. package/dist/render/gi/voxelize_pass.js +223 -0
  247. package/dist/render/gi/voxelize_pass.js.map +1 -0
  248. package/dist/render/globalbindgroup_allocator.js +3 -2
  249. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  250. package/dist/render/gpu_picking.js +9 -36
  251. package/dist/render/gpu_picking.js.map +1 -1
  252. package/dist/render/hzb.js +80 -22
  253. package/dist/render/hzb.js.map +1 -1
  254. package/dist/render/instance_culling.js +499 -0
  255. package/dist/render/instance_culling.js.map +1 -0
  256. package/dist/render/lightpass.js +23 -9
  257. package/dist/render/lightpass.js.map +1 -1
  258. package/dist/render/lod.js +46 -0
  259. package/dist/render/lod.js.map +1 -0
  260. package/dist/render/oit.js +11 -11
  261. package/dist/render/oit.js.map +1 -1
  262. package/dist/render/primitive.js +301 -9
  263. package/dist/render/primitive.js.map +1 -1
  264. package/dist/render/primitive_readback.js +209 -0
  265. package/dist/render/primitive_readback.js.map +1 -0
  266. package/dist/render/render_queue.js +198 -11
  267. package/dist/render/render_queue.js.map +1 -1
  268. package/dist/render/renderer.js +14 -7
  269. package/dist/render/renderer.js.map +1 -1
  270. package/dist/render/rendergraph/blackboard.js +15 -1
  271. package/dist/render/rendergraph/blackboard.js.map +1 -1
  272. package/dist/render/rendergraph/executor.js +136 -0
  273. package/dist/render/rendergraph/executor.js.map +1 -1
  274. package/dist/render/rendergraph/forward_plus_builder.js +585 -59
  275. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  276. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  277. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  278. package/dist/render/rendergraph/history_resources.js +8 -1
  279. package/dist/render/rendergraph/history_resources.js.map +1 -1
  280. package/dist/render/rendergraph/scene_render_context.js +31 -2
  281. package/dist/render/rendergraph/scene_render_context.js.map +1 -1
  282. package/dist/render/rendergraph/types.js.map +1 -1
  283. package/dist/render/renderpass.js +28 -5
  284. package/dist/render/renderpass.js.map +1 -1
  285. package/dist/render/sdf/box_allocator.js +98 -0
  286. package/dist/render/sdf/box_allocator.js.map +1 -0
  287. package/dist/render/sdf/global_sdf.js +865 -0
  288. package/dist/render/sdf/global_sdf.js.map +1 -0
  289. package/dist/render/sdf/scene_sdf.js +562 -0
  290. package/dist/render/sdf/scene_sdf.js.map +1 -0
  291. package/dist/render/sdf/sdf_atlas.js +227 -0
  292. package/dist/render/sdf/sdf_atlas.js.map +1 -0
  293. package/dist/render/sdf/sdf_programs.js +42 -0
  294. package/dist/render/sdf/sdf_programs.js.map +1 -0
  295. package/dist/render/sdf/sdf_view.js +199 -0
  296. package/dist/render/sdf/sdf_view.js.map +1 -0
  297. package/dist/render/sdf/waterline.js +610 -0
  298. package/dist/render/sdf/waterline.js.map +1 -0
  299. package/dist/render/shadow_mask_pass.js +142 -25
  300. package/dist/render/shadow_mask_pass.js.map +1 -1
  301. package/dist/render/shore_wave_generator.js +1193 -0
  302. package/dist/render/shore_wave_generator.js.map +1 -0
  303. package/dist/render/sky.js +516 -86
  304. package/dist/render/sky.js.map +1 -1
  305. package/dist/render/transmission_thickness_pass.js +477 -0
  306. package/dist/render/transmission_thickness_pass.js.map +1 -0
  307. package/dist/render/underwater.js +524 -0
  308. package/dist/render/underwater.js.map +1 -0
  309. package/dist/render/virtualtexture/virtual_texture.js +1214 -0
  310. package/dist/render/virtualtexture/virtual_texture.js.map +1 -0
  311. package/dist/render/volumetric_cloud/cloud_common.js +472 -0
  312. package/dist/render/volumetric_cloud/cloud_common.js.map +1 -0
  313. package/dist/render/volumetric_cloud/cloud_noise.js +189 -0
  314. package/dist/render/volumetric_cloud/cloud_noise.js.map +1 -0
  315. package/dist/render/volumetric_cloud/debug_view.js +131 -0
  316. package/dist/render/volumetric_cloud/debug_view.js.map +1 -0
  317. package/dist/render/volumetric_cloud/resources.js +380 -0
  318. package/dist/render/volumetric_cloud/resources.js.map +1 -0
  319. package/dist/render/volumetric_cloud/sky_cache.js +380 -0
  320. package/dist/render/volumetric_cloud/sky_cache.js.map +1 -0
  321. package/dist/render/volumetric_cloud/volumetric_cloud.js +318 -0
  322. package/dist/render/volumetric_cloud/volumetric_cloud.js.map +1 -0
  323. package/dist/render/water_caustics.js +1195 -0
  324. package/dist/render/water_caustics.js.map +1 -0
  325. package/dist/render/water_foam.js +627 -0
  326. package/dist/render/water_foam.js.map +1 -0
  327. package/dist/render/water_interaction.js +1795 -0
  328. package/dist/render/water_interaction.js.map +1 -0
  329. package/dist/render/weightedblended_oit.js +36 -36
  330. package/dist/render/weightedblended_oit.js.map +1 -1
  331. package/dist/scene/basesprite.js +9 -4
  332. package/dist/scene/basesprite.js.map +1 -1
  333. package/dist/scene/batchgroup.js +108 -12
  334. package/dist/scene/batchgroup.js.map +1 -1
  335. package/dist/scene/environment.js +28 -7
  336. package/dist/scene/environment.js.map +1 -1
  337. package/dist/scene/foliage.js +1020 -0
  338. package/dist/scene/foliage.js.map +1 -0
  339. package/dist/scene/foliage_buckets.js +147 -0
  340. package/dist/scene/foliage_buckets.js.map +1 -0
  341. package/dist/scene/foliage_mask.js +358 -0
  342. package/dist/scene/foliage_mask.js.map +1 -0
  343. package/dist/scene/hair.js +15 -4
  344. package/dist/scene/hair.js.map +1 -1
  345. package/dist/scene/light.js +179 -13
  346. package/dist/scene/light.js.map +1 -1
  347. package/dist/scene/mesh.js +327 -45
  348. package/dist/scene/mesh.js.map +1 -1
  349. package/dist/scene/meshdrawable.js +6 -0
  350. package/dist/scene/meshdrawable.js.map +1 -1
  351. package/dist/scene/msdftext.js +9 -3
  352. package/dist/scene/msdftext.js.map +1 -1
  353. package/dist/scene/msdftextsprite.js +9 -3
  354. package/dist/scene/msdftextsprite.js.map +1 -1
  355. package/dist/scene/particlesys.js +8 -2
  356. package/dist/scene/particlesys.js.map +1 -1
  357. package/dist/scene/physics_settings.js +157 -0
  358. package/dist/scene/physics_settings.js.map +1 -0
  359. package/dist/scene/scene.js +190 -44
  360. package/dist/scene/scene.js.map +1 -1
  361. package/dist/scene/scene_node.js +147 -6
  362. package/dist/scene/scene_node.js.map +1 -1
  363. package/dist/scene/terrain-cm/bladegrassmaterial.js +735 -0
  364. package/dist/scene/terrain-cm/bladegrassmaterial.js.map +1 -0
  365. package/dist/scene/terrain-cm/grass.js +881 -42
  366. package/dist/scene/terrain-cm/grass.js.map +1 -1
  367. package/dist/scene/terrain-cm/grass_gpu.js +929 -0
  368. package/dist/scene/terrain-cm/grass_gpu.js.map +1 -0
  369. package/dist/scene/terrain-cm/grassmaterial.js +180 -9
  370. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  371. package/dist/scene/terrain-cm/terrain-cm.js +465 -36
  372. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  373. package/dist/scene/terrain-cm/terrain_gi_albedo.js +257 -0
  374. package/dist/scene/terrain-cm/terrain_gi_albedo.js.map +1 -0
  375. package/dist/scene/terrain-cm/terrain_rvt.js +395 -0
  376. package/dist/scene/terrain-cm/terrain_rvt.js.map +1 -0
  377. package/dist/scene/update_queue.js +54 -0
  378. package/dist/scene/update_queue.js.map +1 -0
  379. package/dist/scene/water.js +997 -96
  380. package/dist/scene/water.js.map +1 -1
  381. package/dist/scene/water_surface_sampler.js +324 -0
  382. package/dist/scene/water_surface_sampler.js.map +1 -0
  383. package/dist/scene/wind.js +317 -0
  384. package/dist/scene/wind.js.map +1 -0
  385. package/dist/shaders/atmosphere.js +388 -166
  386. package/dist/shaders/atmosphere.js.map +1 -1
  387. package/dist/shaders/fog.js +100 -32
  388. package/dist/shaders/fog.js.map +1 -1
  389. package/dist/shaders/gi.js +365 -0
  390. package/dist/shaders/gi.js.map +1 -0
  391. package/dist/shaders/ltc_rect.js +202 -0
  392. package/dist/shaders/ltc_rect.js.map +1 -0
  393. package/dist/shaders/misc.js +1 -10
  394. package/dist/shaders/misc.js.map +1 -1
  395. package/dist/shaders/noise.js +5 -1
  396. package/dist/shaders/noise.js.map +1 -1
  397. package/dist/shaders/probes.js +309 -0
  398. package/dist/shaders/probes.js.map +1 -0
  399. package/dist/shaders/sdf.js +537 -0
  400. package/dist/shaders/sdf.js.map +1 -0
  401. package/dist/shaders/shadow.js +104 -70
  402. package/dist/shaders/shadow.js.map +1 -1
  403. package/dist/shaders/skin_brdf.js +243 -0
  404. package/dist/shaders/skin_brdf.js.map +1 -0
  405. package/dist/shaders/ssr.js +6 -159
  406. package/dist/shaders/ssr.js.map +1 -1
  407. package/dist/shaders/temporal.js +38 -27
  408. package/dist/shaders/temporal.js.map +1 -1
  409. package/dist/shaders/water.js +40 -87
  410. package/dist/shaders/water.js.map +1 -1
  411. package/dist/shaders/water_medium.js +42 -0
  412. package/dist/shaders/water_medium.js.map +1 -0
  413. package/dist/shadow/dom.js +110 -19
  414. package/dist/shadow/dom.js.map +1 -1
  415. package/dist/shadow/esm.js +3 -3
  416. package/dist/shadow/esm.js.map +1 -1
  417. package/dist/shadow/pcf_opt.js +15 -48
  418. package/dist/shadow/pcf_opt.js.map +1 -1
  419. package/dist/shadow/pcf_pd.js +15 -53
  420. package/dist/shadow/pcf_pd.js.map +1 -1
  421. package/dist/shadow/pcss.js +34 -9
  422. package/dist/shadow/pcss.js.map +1 -1
  423. package/dist/shadow/shadow_impl.js +3 -8
  424. package/dist/shadow/shadow_impl.js.map +1 -1
  425. package/dist/shadow/shadow_region.js +87 -49
  426. package/dist/shadow/shadow_region.js.map +1 -1
  427. package/dist/shadow/shadowmapper.js +93 -53
  428. package/dist/shadow/shadowmapper.js.map +1 -1
  429. package/dist/shadow/ssm.js +18 -72
  430. package/dist/shadow/ssm.js.map +1 -1
  431. package/dist/shadow/vsm.js +3 -3
  432. package/dist/shadow/vsm.js.map +1 -1
  433. package/dist/shapes/shape.js +44 -1
  434. package/dist/shapes/shape.js.map +1 -1
  435. package/dist/utility/buoyancy.js +287 -0
  436. package/dist/utility/buoyancy.js.map +1 -0
  437. package/dist/utility/physical.js +10 -1
  438. package/dist/utility/physical.js.map +1 -1
  439. package/dist/utility/pmrem.js +17 -43
  440. package/dist/utility/pmrem.js.map +1 -1
  441. package/dist/utility/sdf/bake.js +435 -0
  442. package/dist/utility/sdf/bake.js.map +1 -0
  443. package/dist/utility/sdf/bvh.js +576 -0
  444. package/dist/utility/sdf/bvh.js.map +1 -0
  445. package/dist/utility/serialization/manager.js +36 -6
  446. package/dist/utility/serialization/manager.js.map +1 -1
  447. package/dist/utility/serialization/scene/animation.js +77 -7
  448. package/dist/utility/serialization/scene/animation.js.map +1 -1
  449. package/dist/utility/serialization/scene/batch.js +11 -4
  450. package/dist/utility/serialization/scene/batch.js.map +1 -1
  451. package/dist/utility/serialization/scene/camera.js +140 -279
  452. package/dist/utility/serialization/scene/camera.js.map +1 -1
  453. package/dist/utility/serialization/scene/cloth.js +25 -0
  454. package/dist/utility/serialization/scene/cloth.js.map +1 -0
  455. package/dist/utility/serialization/scene/common.js +14 -6
  456. package/dist/utility/serialization/scene/common.js.map +1 -1
  457. package/dist/utility/serialization/scene/foliage.js +821 -0
  458. package/dist/utility/serialization/scene/foliage.js.map +1 -0
  459. package/dist/utility/serialization/scene/hair.js +11 -4
  460. package/dist/utility/serialization/scene/hair.js.map +1 -1
  461. package/dist/utility/serialization/scene/light.js +115 -7
  462. package/dist/utility/serialization/scene/light.js.map +1 -1
  463. package/dist/utility/serialization/scene/material.js +388 -220
  464. package/dist/utility/serialization/scene/material.js.map +1 -1
  465. package/dist/utility/serialization/scene/mesh.js +69 -4
  466. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  467. package/dist/utility/serialization/scene/node.js +140 -5
  468. package/dist/utility/serialization/scene/node.js.map +1 -1
  469. package/dist/utility/serialization/scene/node_physics.js +1318 -0
  470. package/dist/utility/serialization/scene/node_physics.js.map +1 -0
  471. package/dist/utility/serialization/scene/particle.js +11 -4
  472. package/dist/utility/serialization/scene/particle.js.map +1 -1
  473. package/dist/utility/serialization/scene/physics.js +120 -0
  474. package/dist/utility/serialization/scene/physics.js.map +1 -0
  475. package/dist/utility/serialization/scene/primitive.js +124 -10
  476. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  477. package/dist/utility/serialization/scene/scene.js +1687 -51
  478. package/dist/utility/serialization/scene/scene.js.map +1 -1
  479. package/dist/utility/serialization/scene/sprite.js +11 -4
  480. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  481. package/dist/utility/serialization/scene/terrain.js +163 -33
  482. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  483. package/dist/utility/serialization/scene/text.js +11 -4
  484. package/dist/utility/serialization/scene/text.js.map +1 -1
  485. package/dist/utility/serialization/scene/water.js +2473 -114
  486. package/dist/utility/serialization/scene/water.js.map +1 -1
  487. package/dist/utility/serialization/types.js.map +1 -1
  488. package/dist/utility/shprojector.js +97 -109
  489. package/dist/utility/shprojector.js.map +1 -1
  490. package/dist/utility/textures/foam.js +170 -0
  491. package/dist/utility/textures/foam.js.map +1 -0
  492. package/dist/utility/textures/ggxlut.js +17 -43
  493. package/dist/utility/textures/ggxlut.js.map +1 -1
  494. package/dist/utility/textures/ltcdata.js +4 -4
  495. package/dist/utility/textures/ltcdata.js.map +1 -1
  496. package/dist/utility/textures/ltclut.js +16 -6
  497. package/dist/utility/textures/ltclut.js.map +1 -1
  498. package/dist/utility/unsupported.js +24 -0
  499. package/dist/utility/unsupported.js.map +1 -0
  500. package/dist/values.js +13 -1
  501. package/dist/values.js.map +1 -1
  502. package/package.json +25 -12
  503. package/src/asset/loaders/ktx2/basis/LICENSE +201 -0
  504. package/src/asset/loaders/ktx2/basis/basis_transcoder.js +2 -0
  505. package/src/asset/loaders/ktx2/basis/basis_transcoder.wasm +0 -0
  506. package/src/asset/meshoptimizer/LICENSE +21 -0
@@ -1,3 +1,5 @@
1
+ import { GamepadState } from './gamepad.js';
2
+
1
3
  /**
2
4
  * Input manager
3
5
  *
@@ -7,6 +9,14 @@
7
9
  * - Supports a middleware chain (`use`) to intercept and optionally consume events
8
10
  * before they are dispatched to the Application's observable event map.
9
11
  * - Manages pointer capture for mouse interactions to ensure consistent up/move delivery.
12
+ * - Tracks which keys and mouse buttons are held, polls gamepads, and evaluates
13
+ * {@link InputActionMap}s, once per frame at the start of `Application.frame()`.
14
+ *
15
+ * Held state and middlewares: a key or button only counts as held if no
16
+ * middleware consumed its down event, so a UI that consumes keyboard input while
17
+ * focused keeps it from gameplay. Releases are always recorded. When the canvas
18
+ * or the window loses focus, every held key is released and a synthesized `keyup`
19
+ * is sent through the middlewares, so nothing stays stuck.
10
20
  *
11
21
  * Lifecycle:
12
22
  * - Call `start()` to attach all event listeners; `stop()` to remove them.
@@ -33,6 +43,27 @@
33
43
  _captureId;
34
44
  _middlewares;
35
45
  _lastEventDatas;
46
+ _blurHandler;
47
+ _visibilityHandler;
48
+ _keysDown;
49
+ _keysPressedPending;
50
+ _keysReleasedPending;
51
+ _keysPressed;
52
+ _keysReleased;
53
+ /** Held buttons per pointer id, as a mask of `1 << MouseEvent.button` */ _pointerButtons;
54
+ _buttons;
55
+ _buttonsPressedPending;
56
+ _buttonsReleasedPending;
57
+ _buttonsPressed;
58
+ _buttonsReleased;
59
+ _pointerDeltaPending;
60
+ _pointerDelta;
61
+ _wheelDeltaPending;
62
+ _wheelDelta;
63
+ _gamepads;
64
+ _activeGamepad;
65
+ _lastDevice;
66
+ _actionMaps;
36
67
  /**
37
68
  * Creates an instance of InputManager bound to the given application/canvas.
38
69
  *
@@ -58,6 +89,43 @@
58
89
  this._compositionHandler = this._getCompositionHandler();
59
90
  this._captureId = -1;
60
91
  this._middlewares = [];
92
+ this._blurHandler = ()=>this._releaseAll();
93
+ this._visibilityHandler = ()=>{
94
+ if (document.visibilityState === 'hidden') {
95
+ this._releaseAll();
96
+ }
97
+ };
98
+ this._keysDown = new Map();
99
+ this._keysPressedPending = new Set();
100
+ this._keysReleasedPending = new Set();
101
+ this._keysPressed = new Set();
102
+ this._keysReleased = new Set();
103
+ this._pointerButtons = new Map();
104
+ this._buttons = 0;
105
+ this._buttonsPressedPending = 0;
106
+ this._buttonsReleasedPending = 0;
107
+ this._buttonsPressed = 0;
108
+ this._buttonsReleased = 0;
109
+ this._pointerDeltaPending = {
110
+ x: 0,
111
+ y: 0
112
+ };
113
+ this._pointerDelta = {
114
+ x: 0,
115
+ y: 0
116
+ };
117
+ this._wheelDeltaPending = {
118
+ x: 0,
119
+ y: 0
120
+ };
121
+ this._wheelDelta = {
122
+ x: 0,
123
+ y: 0
124
+ };
125
+ this._gamepads = [];
126
+ this._activeGamepad = null;
127
+ this._lastDevice = null;
128
+ this._actionMaps = [];
61
129
  }
62
130
  /**
63
131
  * Begin listening to DOM events on the target element.
@@ -87,6 +155,9 @@
87
155
  this._target.addEventListener('compositionstart', this._compositionHandler);
88
156
  this._target.addEventListener('compositionupdate', this._compositionHandler);
89
157
  this._target.addEventListener('compositionend', this._compositionHandler);
158
+ this._target.addEventListener('blur', this._blurHandler);
159
+ window.addEventListener('blur', this._blurHandler);
160
+ document.addEventListener('visibilitychange', this._visibilityHandler);
90
161
  }
91
162
  }
92
163
  /**
@@ -117,38 +188,247 @@
117
188
  this._target.removeEventListener('compositionstart', this._compositionHandler);
118
189
  this._target.removeEventListener('compositionupdate', this._compositionHandler);
119
190
  this._target.removeEventListener('compositionend', this._compositionHandler);
191
+ this._target.removeEventListener('blur', this._blurHandler);
192
+ window.removeEventListener('blur', this._blurHandler);
193
+ document.removeEventListener('visibilitychange', this._visibilityHandler);
194
+ this._releaseAll();
120
195
  this._lastEventDatas = [];
121
196
  }
122
197
  }
123
198
  /**
124
- * Register a middleware (interceptor) for input events.
199
+ * Whether a key is held, by `KeyboardEvent.code` (e.g. `'KeyW'`, `'Space'`).
125
200
  *
126
- * Order matters: middlewares are invoked in the order they were added until one returns true.
127
- * If a middleware returns true, the event is considered handled and will not be dispatched
128
- * to the Application's observers.
201
+ * @param code - Key code.
202
+ */ isKeyDown(code) {
203
+ return this._keysDown.has(code);
204
+ }
205
+ /**
206
+ * Whether a key went down during the last frame. True for a tap that went
207
+ * down and up between two frames, even though `isKeyDown` is false.
129
208
  *
130
- * @param handler - Middleware function to add.
131
- * @param ctx - `this` object for handler
209
+ * @param code - Key code.
210
+ */ keyPressed(code) {
211
+ return this._keysPressed.has(code);
212
+ }
213
+ /**
214
+ * Whether a key went up during the last frame.
215
+ *
216
+ * @param code - Key code.
217
+ */ keyReleased(code) {
218
+ return this._keysReleased.has(code);
219
+ }
220
+ /**
221
+ * Whether a mouse button is held, by `MouseEvent.button` (0 left, 1 middle,
222
+ * 2 right). A touch or pen contact counts as button 0.
223
+ *
224
+ * @param button - Button index.
225
+ */ isMouseDown(button) {
226
+ return !!(this._buttons & 1 << button);
227
+ }
228
+ /**
229
+ * Whether a mouse button went down during the last frame.
230
+ *
231
+ * @param button - Button index.
232
+ */ mousePressed(button) {
233
+ return !!(this._buttonsPressed & 1 << button);
234
+ }
235
+ /**
236
+ * Whether a mouse button went up during the last frame.
237
+ *
238
+ * @param button - Button index.
239
+ */ mouseReleased(button) {
240
+ return !!(this._buttonsReleased & 1 << button);
241
+ }
242
+ /**
243
+ * Pointer movement during the last frame in CSS pixels, +y down. Keeps
244
+ * reporting movement while the pointer is locked.
245
+ */ get pointerDelta() {
246
+ return this._pointerDelta;
247
+ }
248
+ /** Wheel movement during the last frame in pixels. */ get wheelDelta() {
249
+ return this._wheelDelta;
250
+ }
251
+ /**
252
+ * The active gamepad: the one operated most recently, or the first connected
253
+ * one. Null if no gamepad with the standard layout has been used yet - browsers
254
+ * only expose a gamepad after one of its buttons has been pressed.
255
+ */ get gamepad() {
256
+ return this._activeGamepad;
257
+ }
258
+ /** All connected gamepads with the standard layout. */ get gamepads() {
259
+ return this._gamepads.filter((pad)=>pad?.connected);
260
+ }
261
+ /**
262
+ * Device that was operated most recently, e.g. to show matching button
263
+ * prompts; null before any input.
264
+ */ get lastDevice() {
265
+ return this._lastDevice;
266
+ }
267
+ /**
268
+ * Adds an action map on top of the existing ones. Its values are evaluated
269
+ * from the next frame on.
270
+ *
271
+ * @param map - Map to add.
272
+ * @returns The InputManager instance for chaining.
273
+ */ addActionMap(map) {
274
+ if (!this._actionMaps.includes(map)) {
275
+ this._actionMaps.push(map);
276
+ }
277
+ return this;
278
+ }
279
+ /**
280
+ * Removes an action map; it then reads as idle.
281
+ *
282
+ * @param map - Map to remove.
132
283
  * @returns The InputManager instance for chaining.
133
- */ use(handler, ctx) {
284
+ */ removeActionMap(map) {
285
+ const index = this._actionMaps.indexOf(map);
286
+ if (index >= 0) {
287
+ this._actionMaps.splice(index, 1);
288
+ map._evaluate(null, 0);
289
+ }
290
+ return this;
291
+ }
292
+ /** Action maps, from bottom to top. */ get actionMaps() {
293
+ return this._actionMaps;
294
+ }
295
+ /** Whether the pointer is locked to the canvas. */ get pointerLocked() {
296
+ return document.pointerLockElement === this._target;
297
+ }
298
+ /**
299
+ * Locks the pointer to the canvas and hides it, for mouse look. Must be called
300
+ * from a user gesture such as a click. Asks for raw, unaccelerated movement
301
+ * where supported.
302
+ */ async requestPointerLock() {
303
+ const target = this._target;
304
+ try {
305
+ await target.requestPointerLock({
306
+ unadjustedMovement: true
307
+ });
308
+ } catch {
309
+ await target.requestPointerLock();
310
+ }
311
+ }
312
+ /** Releases a pointer lock taken with {@link InputManager.requestPointerLock}. */ exitPointerLock() {
313
+ if (this.pointerLocked) {
314
+ document.exitPointerLock();
315
+ }
316
+ }
317
+ /**
318
+ * Starts a new input frame: publishes the edges, movement and wheel collected
319
+ * since the last call, polls gamepads and evaluates the action maps. Called by
320
+ * `Application.frame()` before `tick`.
321
+ *
322
+ * @param deltaTime - Frame time in seconds, used by `perSecond` bindings.
323
+ * @internal
324
+ */ _beginFrame(deltaTime) {
325
+ [this._keysPressed, this._keysPressedPending] = [
326
+ this._keysPressedPending,
327
+ this._keysPressed
328
+ ];
329
+ [this._keysReleased, this._keysReleasedPending] = [
330
+ this._keysReleasedPending,
331
+ this._keysReleased
332
+ ];
333
+ this._keysPressedPending.clear();
334
+ this._keysReleasedPending.clear();
335
+ this._buttonsPressed = this._buttonsPressedPending;
336
+ this._buttonsReleased = this._buttonsReleasedPending;
337
+ this._buttonsPressedPending = 0;
338
+ this._buttonsReleasedPending = 0;
339
+ this._pointerDelta.x = this._pointerDeltaPending.x;
340
+ this._pointerDelta.y = this._pointerDeltaPending.y;
341
+ this._pointerDeltaPending.x = this._pointerDeltaPending.y = 0;
342
+ this._wheelDelta.x = this._wheelDeltaPending.x;
343
+ this._wheelDelta.y = this._wheelDeltaPending.y;
344
+ this._wheelDeltaPending.x = this._wheelDeltaPending.y = 0;
345
+ if (this._keysPressed.size > 0 || this._buttonsPressed || this._wheelDelta.x || this._wheelDelta.y) {
346
+ this._lastDevice = 'keyboardMouse';
347
+ }
348
+ this._pollGamepads();
349
+ let blocked = false;
350
+ for(let i = this._actionMaps.length - 1; i >= 0; i--){
351
+ const map = this._actionMaps[i];
352
+ map._evaluate(blocked ? null : this, deltaTime);
353
+ blocked ||= map.enabled && map.blocking;
354
+ }
355
+ }
356
+ _pollGamepads() {
357
+ const pads = typeof navigator !== 'undefined' && navigator.getGamepads ? navigator.getGamepads() : [];
358
+ for(let i = 0; i < Math.max(pads.length, this._gamepads.length); i++){
359
+ const raw = pads[i];
360
+ const pad = raw && raw.mapping === 'standard' ? raw : null;
361
+ if (!pad && !this._gamepads[i]) {
362
+ continue;
363
+ }
364
+ const state = this._gamepads[i] ??= new GamepadState(i);
365
+ state._update(pad);
366
+ if (state.connected && state.active) {
367
+ this._activeGamepad = state;
368
+ this._lastDevice = 'gamepad';
369
+ }
370
+ }
371
+ if (!this._activeGamepad?.connected) {
372
+ this._activeGamepad = this._gamepads.find((pad)=>pad?.connected) ?? null;
373
+ }
374
+ }
375
+ _releaseAll() {
376
+ for (const ev of [
377
+ ...this._keysDown.values()
378
+ ]){
379
+ const up = new KeyboardEvent('keyup', {
380
+ code: ev.code,
381
+ key: ev.key,
382
+ location: ev.location
383
+ });
384
+ this._keyboardHandler.call(this._target, up);
385
+ }
386
+ for (const pointerId of [
387
+ ...this._pointerButtons.keys()
388
+ ]){
389
+ this._setPointerButtons(pointerId, 0, false);
390
+ }
391
+ for (const pad of this._gamepads){
392
+ pad?._reset();
393
+ }
394
+ }
395
+ _setPointerButtons(pointerId, mask, consumed) {
396
+ const old = this._pointerButtons.get(pointerId) ?? 0;
397
+ // A press consumed by a middleware is not recorded; a release always is
398
+ const next = old & mask | (consumed ? 0 : mask & ~old);
399
+ if (next) {
400
+ this._pointerButtons.set(pointerId, next);
401
+ } else {
402
+ this._pointerButtons.delete(pointerId);
403
+ }
404
+ let buttons = 0;
405
+ for (const m of this._pointerButtons.values()){
406
+ buttons |= m;
407
+ }
408
+ this._buttonsPressedPending |= buttons & ~this._buttons;
409
+ this._buttonsReleasedPending |= this._buttons & ~buttons;
410
+ this._buttons = buttons;
411
+ }
412
+ _updatePointerState(ev, consumed) {
413
+ // PointerEvent.buttons has right and middle swapped relative to
414
+ // MouseEvent.button; convert to a mask of 1 << button
415
+ const b = ev.type === 'pointerup' || ev.type === 'pointercancel' ? 0 : ev.buttons;
416
+ const mask = b & 1 | (b & 4) >> 1 | (b & 2) << 1 | b & 24;
417
+ this._setPointerButtons(ev.pointerId, mask, consumed);
418
+ }
419
+ use(handler, ctx) {
134
420
  if (handler) {
135
421
  this._middlewares.push({
136
- handler,
422
+ handler: handler,
137
423
  ctx
138
424
  });
139
425
  }
140
426
  return this;
141
427
  }
142
- /**
143
- * Register a middleware (interceptor) for input events at the first order.
144
- *
145
- * @param handler - Middleware function to add.
146
- * @param ctx - `this` object for handler
147
- * @returns The InputManager instance for chaining.
148
- */ useFirst(handler, ctx) {
428
+ useFirst(handler, ctx) {
149
429
  if (handler) {
150
430
  this._middlewares.unshift({
151
- handler,
431
+ handler: handler,
152
432
  ctx
153
433
  });
154
434
  }
@@ -190,8 +470,12 @@
190
470
  return false;
191
471
  }
192
472
  _callMiddlewares(ev, type) {
473
+ const args = [
474
+ ev,
475
+ type ?? ev.type
476
+ ];
193
477
  for (const mw of this._middlewares){
194
- if (mw.handler.call(mw.ctx, ev, type ?? ev.type)) {
478
+ if (mw.handler.call(mw.ctx, ...args)) {
195
479
  return true;
196
480
  }
197
481
  }
@@ -206,6 +490,7 @@
206
490
  if (!that._callMiddlewares(ev)) {
207
491
  that._app.dispatchEvent(ev.type, ev);
208
492
  }
493
+ that._updatePointerState(ev, false);
209
494
  };
210
495
  }
211
496
  _getContextMenuHandler() {
@@ -225,9 +510,14 @@
225
510
  const eventData = that._getPointerEventData(ev.pointerId);
226
511
  eventData.lastMoveX = ev.offsetX;
227
512
  eventData.lastMoveY = ev.offsetY;
228
- if (!that._callMiddlewares(ev)) {
513
+ const consumed = that._callMiddlewares(ev);
514
+ if (!consumed) {
229
515
  that._app.dispatchEvent(ev.type, ev);
516
+ that._pointerDeltaPending.x += ev.movementX ?? 0;
517
+ that._pointerDeltaPending.y += ev.movementY ?? 0;
230
518
  }
519
+ // A button pressed or released while another is held arrives as pointermove
520
+ that._updatePointerState(ev, consumed);
231
521
  };
232
522
  }
233
523
  _getPointerDownHandler() {
@@ -243,9 +533,11 @@
243
533
  eventData.lastDownY = ev.offsetY;
244
534
  eventData.lastDownTime = Date.now();
245
535
  that._app.focus();
246
- if (!that._callMiddlewares(ev)) {
536
+ const consumed = that._callMiddlewares(ev);
537
+ if (!consumed) {
247
538
  that._app.dispatchEvent(ev.type, ev);
248
539
  }
540
+ that._updatePointerState(ev, consumed);
249
541
  };
250
542
  }
251
543
  _getPointerUpHandler() {
@@ -277,6 +569,7 @@
277
569
  if (!that._callMiddlewares(ev)) {
278
570
  that._app.dispatchEvent(ev.type, ev);
279
571
  }
572
+ that._updatePointerState(ev, false);
280
573
  if (emitClickEvent) {
281
574
  if (!that._callMiddlewares(ev, 'click')) {
282
575
  that._app.dispatchEvent('click', ev);
@@ -302,9 +595,21 @@
302
595
  _getKeyboardHandler() {
303
596
  const that = this;
304
597
  return function(ev) {
305
- if (!that._callMiddlewares(ev)) {
598
+ const consumed = that._callMiddlewares(ev);
599
+ if (!consumed) {
306
600
  that._app.dispatchEvent(ev.type, ev);
307
601
  }
602
+ if (ev.code) {
603
+ if (ev.type === 'keydown') {
604
+ // A press consumed by a middleware is not recorded; a release always is
605
+ if (!consumed && !that._keysDown.has(ev.code)) {
606
+ that._keysDown.set(ev.code, ev);
607
+ that._keysPressedPending.add(ev.code);
608
+ }
609
+ } else if (ev.type === 'keyup' && that._keysDown.delete(ev.code)) {
610
+ that._keysReleasedPending.add(ev.code);
611
+ }
612
+ }
308
613
  };
309
614
  }
310
615
  _getDragHandler() {
@@ -319,7 +624,11 @@
319
624
  const that = this;
320
625
  return function(ev) {
321
626
  if (!that._callMiddlewares(ev)) {
322
- that._app.dispatchEvent(ev.type);
627
+ that._app.dispatchEvent(ev.type, ev);
628
+ // Normalize line and page modes to pixels
629
+ const scale = ev.deltaMode === WheelEvent.DOM_DELTA_LINE ? 16 : ev.deltaMode === WheelEvent.DOM_DELTA_PAGE ? that._target.clientHeight : 1;
630
+ that._wheelDeltaPending.x += ev.deltaX * scale;
631
+ that._wheelDeltaPending.y += ev.deltaY * scale;
323
632
  }
324
633
  };
325
634
  }
@@ -327,7 +636,7 @@
327
636
  const that = this;
328
637
  return function(ev) {
329
638
  if (!that._callMiddlewares(ev)) {
330
- that._app.dispatchEvent(ev.type);
639
+ that._app.dispatchEvent(ev.type, ev);
331
640
  }
332
641
  };
333
642
  }