@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamepad.js","sources":["../../src/app/gamepad.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\n\r\n/**\r\n * Buttons of the W3C \"standard\" gamepad layout, named after the Xbox controller.\r\n * The value is the button's index in `Gamepad.buttons`.\r\n *\r\n * @public\r\n */\r\nexport const GamepadButtons = {\r\n A: 0,\r\n B: 1,\r\n X: 2,\r\n Y: 3,\r\n LB: 4,\r\n RB: 5,\r\n LT: 6,\r\n RT: 7,\r\n Back: 8,\r\n Start: 9,\r\n LS: 10,\r\n RS: 11,\r\n DPadUp: 12,\r\n DPadDown: 13,\r\n DPadLeft: 14,\r\n DPadRight: 15,\r\n Home: 16\r\n} as const;\r\n\r\n/**\r\n * Name of a button of the standard gamepad layout.\r\n *\r\n * @public\r\n */\r\nexport type GamepadButtonName = keyof typeof GamepadButtons;\r\n\r\n/**\r\n * Name of a thumbstick of the standard gamepad layout.\r\n *\r\n * @public\r\n */\r\nexport type GamepadStickName = 'LS' | 'RS';\r\n\r\nconst BUTTON_COUNT = 17;\r\n/** Analog buttons (triggers) count as pressed above this value. */\r\nconst PRESS_THRESHOLD = 0.5;\r\n\r\n/**\r\n * Per-frame state of one gamepad with the standard layout.\r\n *\r\n * Owned and polled by {@link InputManager} at the start of every frame, so all\r\n * reads within a frame see the same values. Stick axes are reported with +y up,\r\n * the opposite of the raw Gamepad API, and with a radial dead zone applied.\r\n *\r\n * @public\r\n */\r\nexport class GamepadState {\r\n /** Radial dead zone of both sticks, as a fraction of full deflection. */\r\n stickDeadZone = 0.15;\r\n /** Analog buttons below this value read as 0. */\r\n triggerDeadZone = 0.05;\r\n private readonly _index: number;\r\n private _id: string;\r\n private _connected: boolean;\r\n private readonly _values: Float32Array;\r\n private readonly _down: Uint8Array;\r\n private readonly _prevDown: Uint8Array;\r\n private readonly _sticks: Float32Array;\r\n private _raw: Nullable<Gamepad>;\r\n /** @internal */\r\n constructor(index: number) {\r\n this._index = index;\r\n this._id = '';\r\n this._connected = false;\r\n this._values = new Float32Array(BUTTON_COUNT);\r\n this._down = new Uint8Array(BUTTON_COUNT);\r\n this._prevDown = new Uint8Array(BUTTON_COUNT);\r\n this._sticks = new Float32Array(4);\r\n this._raw = null;\r\n }\r\n /** Index of the gamepad as reported by `navigator.getGamepads()`. */\r\n get index() {\r\n return this._index;\r\n }\r\n /** Device id string reported by the browser. */\r\n get id() {\r\n return this._id;\r\n }\r\n /** Whether the gamepad was connected when last polled. */\r\n get connected() {\r\n return this._connected;\r\n }\r\n /**\r\n * Analog value of a button in [0, 1]; digital buttons read 0 or 1.\r\n *\r\n * @param button - Button name.\r\n */\r\n value(button: GamepadButtonName) {\r\n return this._values[GamepadButtons[button]];\r\n }\r\n /**\r\n * Whether a button is held this frame.\r\n *\r\n * @param button - Button name.\r\n */\r\n isDown(button: GamepadButtonName) {\r\n return !!this._down[GamepadButtons[button]];\r\n }\r\n /**\r\n * Whether a button went down this frame.\r\n *\r\n * @param button - Button name.\r\n */\r\n pressed(button: GamepadButtonName) {\r\n const i = GamepadButtons[button];\r\n return !!this._down[i] && !this._prevDown[i];\r\n }\r\n /**\r\n * Whether a button went up this frame.\r\n *\r\n * @param button - Button name.\r\n */\r\n released(button: GamepadButtonName) {\r\n const i = GamepadButtons[button];\r\n return !this._down[i] && !!this._prevDown[i];\r\n }\r\n /**\r\n * Deflection of a stick, each component in [-1, 1] and the length at most 1.\r\n * +x is right and +y is up.\r\n *\r\n * @param stick - Stick name.\r\n * @param out - Optional output object.\r\n * @returns The deflection.\r\n */\r\n stick(stick: GamepadStickName, out?: { x: number; y: number }) {\r\n const i = stick === 'LS' ? 0 : 2;\r\n out = out ?? { x: 0, y: 0 };\r\n out.x = this._sticks[i];\r\n out.y = this._sticks[i + 1];\r\n return out;\r\n }\r\n /**\r\n * Plays a rumble effect if the browser and the gamepad support it; otherwise\r\n * does nothing.\r\n *\r\n * @param strong - Strength of the low-frequency motor in [0, 1].\r\n * @param weak - Strength of the high-frequency motor in [0, 1].\r\n * @param durationMs - Duration in milliseconds.\r\n */\r\n rumble(strong: number, weak: number, durationMs: number) {\r\n const actuator = (this._raw as any)?.vibrationActuator;\r\n if (actuator?.playEffect) {\r\n actuator\r\n .playEffect('dual-rumble', {\r\n duration: durationMs,\r\n strongMagnitude: Math.min(Math.max(strong, 0), 1),\r\n weakMagnitude: Math.min(Math.max(weak, 0), 1)\r\n })\r\n .catch(() => {});\r\n }\r\n }\r\n /**\r\n * Whether anything was operated this frame: a button went down or a stick left\r\n * its dead zone.\r\n *\r\n * @internal\r\n */\r\n get active() {\r\n for (let i = 0; i < BUTTON_COUNT; i++) {\r\n if (this._down[i] && !this._prevDown[i]) {\r\n return true;\r\n }\r\n }\r\n for (let i = 0; i < 4; i++) {\r\n if (this._sticks[i] !== 0) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n }\r\n /** @internal */\r\n _update(pad: Nullable<Gamepad>) {\r\n this._prevDown.set(this._down);\r\n this._raw = pad;\r\n this._connected = !!pad?.connected;\r\n if (!pad || !this._connected) {\r\n this._values.fill(0);\r\n this._down.fill(0);\r\n this._sticks.fill(0);\r\n return;\r\n }\r\n this._id = pad.id;\r\n for (let i = 0; i < BUTTON_COUNT; i++) {\r\n const b = pad.buttons[i];\r\n const v = b ? b.value : 0;\r\n this._values[i] = v < this.triggerDeadZone ? (b?.pressed ? 1 : 0) : v;\r\n this._down[i] = b && (b.pressed || v > PRESS_THRESHOLD) ? 1 : 0;\r\n }\r\n this._readStick(pad, 0);\r\n this._readStick(pad, 2);\r\n }\r\n /** @internal */\r\n _reset() {\r\n this._prevDown.set(this._down);\r\n this._values.fill(0);\r\n this._down.fill(0);\r\n this._sticks.fill(0);\r\n }\r\n private _readStick(pad: Gamepad, axis: number) {\r\n const x = pad.axes[axis] ?? 0;\r\n const y = -(pad.axes[axis + 1] ?? 0);\r\n const len = Math.hypot(x, y);\r\n const dz = this.stickDeadZone;\r\n if (len <= dz) {\r\n this._sticks[axis] = 0;\r\n this._sticks[axis + 1] = 0;\r\n } else {\r\n // Rescale so that output starts at 0 just outside the dead zone\r\n const scale = Math.min((len - dz) / (1 - dz), 1) / len;\r\n this._sticks[axis] = x * scale;\r\n this._sticks[axis + 1] = y * scale;\r\n }\r\n }\r\n}\r\n"],"names":["GamepadButtons","A","B","X","Y","LB","RB","LT","RT","Back","Start","LS","RS","DPadUp","DPadDown","DPadLeft","DPadRight","Home","BUTTON_COUNT","PRESS_THRESHOLD","GamepadState","stickDeadZone","triggerDeadZone","_index","_id","_connected","_values","_down","_prevDown","_sticks","_raw","index","Float32Array","Uint8Array","id","connected","value","button","isDown","pressed","i","released","stick","out","x","y","rumble","strong","weak","durationMs","actuator","vibrationActuator","playEffect","duration","strongMagnitude","Math","min","max","weakMagnitude","catch","active","_update","pad","set","fill","b","buttons","v","_readStick","_reset","axis","axes","len","hypot","dz","scale"],"mappings":"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"}
@@ -0,0 +1,271 @@
1
+ import { GamepadButtons } from './gamepad.js';
2
+
3
+ const tmpStick = {
4
+ x: 0,
5
+ y: 0
6
+ };
7
+ /**
8
+ * A named set of actions, e.g. `driving` or `onfoot`, evaluated once per frame
9
+ * from keyboard, mouse and gamepad.
10
+ *
11
+ * Add maps to {@link InputManager.addActionMap}; maps added later sit on top. A
12
+ * map with `blocking` set hides everything below it while enabled, which is how
13
+ * a pause menu silences gameplay without each map checking for it.
14
+ *
15
+ * Values are evaluated at the start of every frame before `tick`, so every read
16
+ * in a frame - `onUpdate`, `onFixedUpdate`, `onLateUpdate` - sees the same values.
17
+ * A frame may run several fixed steps or none: to act on a press exactly once in
18
+ * `onFixedUpdate`, use {@link InputActionMap.consumePressed} rather than
19
+ * {@link InputActionMap.pressed}.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const driving = new InputActionMap('driving', {
24
+ * throttle: { type: 'axis', bindings: [{ key: 'KeyW' }, { pad: 'RT' }] },
25
+ * steer: { type: 'axis', bindings: [{ keys: ['KeyD', 'KeyA'] }, { pad: 'LS.x' }] },
26
+ * look: {
27
+ * type: 'vector2',
28
+ * unbounded: true,
29
+ * bindings: [{ pointer: 'delta', scale: 0.003 }, { pad: 'RS', scale: 3, perSecond: true }]
30
+ * },
31
+ * exit: { type: 'button', bindings: [{ key: 'KeyF' }, { pad: 'Y' }] }
32
+ * });
33
+ * getInput().addActionMap(driving);
34
+ * // per frame
35
+ * vehicle.throttle = driving.value('throttle');
36
+ * if (driving.pressed('exit')) leaveVehicle();
37
+ * ```
38
+ *
39
+ * @public
40
+ */ class InputActionMap {
41
+ /** Name of the map, for diagnostics. */ name;
42
+ /** While enabled, a blocking map hides all maps below it. */ blocking;
43
+ _enabled;
44
+ /** Whether the map was evaluated with input last frame: enabled and not blocked */ _active;
45
+ _actions;
46
+ /**
47
+ * @param name - Name of the map.
48
+ * @param actions - Action definitions by action name.
49
+ * @param options - `blocking`: see {@link InputActionMap.blocking}.
50
+ */ constructor(name, actions, options){
51
+ this.name = name;
52
+ this.blocking = !!options?.blocking;
53
+ this._enabled = true;
54
+ this._active = false;
55
+ this._actions = new Map();
56
+ for (const key of Object.keys(actions)){
57
+ this._actions.set(key, {
58
+ def: {
59
+ ...actions[key],
60
+ bindings: [
61
+ ...actions[key].bindings
62
+ ]
63
+ },
64
+ x: 0,
65
+ y: 0,
66
+ down: false,
67
+ prevDown: false,
68
+ pressed: false,
69
+ released: false,
70
+ latched: false
71
+ });
72
+ }
73
+ }
74
+ /**
75
+ * Whether the map is evaluated. A disabled map reads as idle; disabling it
76
+ * while a button is held reports the release on the next frame. Enabling it
77
+ * while a button is held does not report a press: the button must be pressed
78
+ * again, so the key that switched maps does not also act in the new one.
79
+ */ get enabled() {
80
+ return this._enabled;
81
+ }
82
+ set enabled(val) {
83
+ this._enabled = !!val;
84
+ }
85
+ /**
86
+ * Value of an action: an axis value, 1/0 for a button, x for a vector2.
87
+ *
88
+ * @param action - Action name.
89
+ */ value(action) {
90
+ return this._get(action).x;
91
+ }
92
+ /**
93
+ * Value of a vector2 action. For other action types y is 0.
94
+ *
95
+ * @param action - Action name.
96
+ * @param out - Optional output object.
97
+ */ vector2(action, out) {
98
+ const s = this._get(action);
99
+ out = out ?? {
100
+ x: 0,
101
+ y: 0
102
+ };
103
+ out.x = s.x;
104
+ out.y = s.y;
105
+ return out;
106
+ }
107
+ /**
108
+ * Whether an action is active this frame: a button held, or an axis/vector2 off zero.
109
+ *
110
+ * @param action - Action name.
111
+ */ isDown(action) {
112
+ return this._get(action).down;
113
+ }
114
+ /**
115
+ * Whether an action became active this frame. A tap that went down and up
116
+ * between two frames also counts.
117
+ *
118
+ * @param action - Action name.
119
+ */ pressed(action) {
120
+ return this._get(action).pressed;
121
+ }
122
+ /**
123
+ * Whether an action became inactive this frame.
124
+ *
125
+ * @param action - Action name.
126
+ */ released(action) {
127
+ return this._get(action).released;
128
+ }
129
+ /**
130
+ * Returns true once per press: true if the action was pressed since the last
131
+ * call that returned true. Use it in `onFixedUpdate`, which may run several
132
+ * times per frame or not at all.
133
+ *
134
+ * @param action - Action name.
135
+ */ consumePressed(action) {
136
+ const s = this._get(action);
137
+ const latched = s.latched;
138
+ s.latched = false;
139
+ return latched;
140
+ }
141
+ /**
142
+ * Bindings of an action, e.g. to save them after the player rebinds.
143
+ *
144
+ * @param action - Action name.
145
+ */ getBindings(action) {
146
+ return this._get(action).def.bindings.map((b)=>({
147
+ ...b
148
+ }));
149
+ }
150
+ /**
151
+ * Replaces the bindings of an action, e.g. to apply the player's rebinding.
152
+ *
153
+ * @param action - Action name.
154
+ * @param bindings - New bindings.
155
+ */ setBindings(action, bindings) {
156
+ this._get(action).def.bindings = bindings.map((b)=>({
157
+ ...b
158
+ }));
159
+ }
160
+ /** @internal */ _evaluate(src, dt) {
161
+ const active = !!src && this._enabled;
162
+ // A key held while the map was inactive - such as the one that switched to
163
+ // it - is no new press: only a press made this frame counts on activation
164
+ const activated = active && !this._active;
165
+ this._active = active;
166
+ for (const s of this._actions.values()){
167
+ s.prevDown = s.down;
168
+ s.x = 0;
169
+ s.y = 0;
170
+ let tapped = false;
171
+ if (active) {
172
+ for (const b of s.def.bindings){
173
+ const r = evaluateBinding(b, src, dt);
174
+ s.x += r.x;
175
+ s.y += r.y;
176
+ tapped ||= r.tapped;
177
+ }
178
+ }
179
+ if (!s.def.unbounded) {
180
+ if (s.def.type === 'vector2') {
181
+ const len = Math.hypot(s.x, s.y);
182
+ if (len > 1) {
183
+ s.x /= len;
184
+ s.y /= len;
185
+ }
186
+ } else {
187
+ s.x = Math.min(Math.max(s.x, -1), 1);
188
+ }
189
+ }
190
+ if (s.def.type === 'button') {
191
+ s.down = Math.abs(s.x) > 0.5;
192
+ s.x = s.down ? 1 : 0;
193
+ } else {
194
+ s.down = s.x !== 0 || s.y !== 0;
195
+ }
196
+ s.pressed = activated ? tapped : s.down && !s.prevDown || tapped && !s.prevDown;
197
+ s.released = !s.down && s.prevDown || tapped && !s.down && !s.prevDown;
198
+ if (s.pressed) {
199
+ s.latched = true;
200
+ }
201
+ if (!active) {
202
+ s.latched = false;
203
+ }
204
+ }
205
+ }
206
+ _get(action) {
207
+ const s = this._actions.get(action);
208
+ if (!s) {
209
+ throw new Error(`InputActionMap '${this.name}': unknown action '${String(action)}'`);
210
+ }
211
+ return s;
212
+ }
213
+ }
214
+ const result = {
215
+ x: 0,
216
+ y: 0,
217
+ tapped: false
218
+ };
219
+ function evaluateBinding(b, src, dt) {
220
+ result.x = 0;
221
+ result.y = 0;
222
+ result.tapped = false;
223
+ if ('key' in b) {
224
+ result.x = src.isKeyDown(b.key) ? 1 : 0;
225
+ result.tapped = src.keyPressed(b.key);
226
+ } else if ('keys' in b) {
227
+ result.x = (src.isKeyDown(b.keys[0]) ? 1 : 0) - (src.isKeyDown(b.keys[1]) ? 1 : 0);
228
+ result.tapped = src.keyPressed(b.keys[0]) || src.keyPressed(b.keys[1]);
229
+ } else if ('keys2d' in b) {
230
+ const k = b.keys2d;
231
+ result.x = (src.isKeyDown(k.right) ? 1 : 0) - (src.isKeyDown(k.left) ? 1 : 0);
232
+ result.y = (src.isKeyDown(k.up) ? 1 : 0) - (src.isKeyDown(k.down) ? 1 : 0);
233
+ result.tapped = src.keyPressed(k.up) || src.keyPressed(k.down) || src.keyPressed(k.left) || src.keyPressed(k.right);
234
+ } else if ('mouse' in b) {
235
+ result.x = src.isMouseDown(b.mouse) ? 1 : 0;
236
+ result.tapped = src.mousePressed(b.mouse);
237
+ } else if ('pointer' in b) {
238
+ const d = src.pointerDelta;
239
+ if (b.pointer === 'delta') {
240
+ result.x = d.x;
241
+ result.y = -d.y;
242
+ } else {
243
+ result.x = b.pointer === 'deltaX' ? d.x : -d.y;
244
+ }
245
+ } else if ('wheel' in b) {
246
+ result.x = b.wheel === 'x' ? src.wheelDelta.x : src.wheelDelta.y;
247
+ } else if ('pad' in b) {
248
+ const pad = src.gamepad;
249
+ if (pad?.connected) {
250
+ const name = b.pad;
251
+ if (name === 'LS' || name === 'RS') {
252
+ pad.stick(name, tmpStick);
253
+ result.x = tmpStick.x;
254
+ result.y = tmpStick.y;
255
+ } else if (name.length === 4 && name[2] === '.') {
256
+ pad.stick(name.slice(0, 2), tmpStick);
257
+ result.x = name[3] === 'x' ? tmpStick.x : tmpStick.y;
258
+ } else if (name in GamepadButtons) {
259
+ result.x = pad.value(name);
260
+ result.tapped = pad.pressed(name);
261
+ }
262
+ }
263
+ }
264
+ const scale = (b.scale ?? 1) * (b.invert ? -1 : 1) * (b.perSecond ? dt : 1);
265
+ result.x *= scale;
266
+ result.y *= scale;
267
+ return result;
268
+ }
269
+
270
+ export { InputActionMap };
271
+ //# sourceMappingURL=inputactions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inputactions.js","sources":["../../src/app/inputactions.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport type { GamepadButtonName, GamepadStickName, GamepadState } from './gamepad';\r\nimport { GamepadButtons } from './gamepad';\r\n\r\n/**\r\n * Input device last used to operate an action, e.g. to show matching button prompts.\r\n *\r\n * @public\r\n */\r\nexport type InputDeviceKind = 'keyboardMouse' | 'gamepad';\r\n\r\n/**\r\n * One source of an action's value.\r\n *\r\n * - `key`: a key by `KeyboardEvent.code`, e.g. `'KeyW'`; reads 1 while held.\r\n * - `keys`: a pair of keys `[positive, negative]` forming one axis.\r\n * - `keys2d`: four keys forming a 2D axis; `up` is +y.\r\n * - `mouse`: a mouse button by `MouseEvent.button` (0 left, 1 middle, 2 right).\r\n * - `pointer`: pointer movement this frame in CSS pixels, also while pointer-locked.\r\n * `'delta'` is 2D with +y up.\r\n * - `wheel`: wheel movement this frame, in pixels.\r\n * - `pad`: a button, a stick (`'LS'`, `'RS'`, 2D, +y up) or one axis of a stick\r\n * (`'LS.x'`, `'RS.y'` ...) of the active gamepad.\r\n *\r\n * `scale` multiplies the value (default 1), `invert` negates it. With\r\n * `perSecond`, the value is also multiplied by the frame time, turning a rate\r\n * such as stick deflection into an amount for this frame; use it to mix a stick\r\n * with pointer movement in one look action.\r\n *\r\n * @public\r\n */\r\nexport type InputBinding = (\r\n | { key: string }\r\n | { keys: [positive: string, negative: string] }\r\n | { keys2d: { up: string; down: string; left: string; right: string } }\r\n | { mouse: number }\r\n | { pointer: 'delta' | 'deltaX' | 'deltaY' }\r\n | { wheel: 'x' | 'y' }\r\n | { pad: GamepadButtonName | GamepadStickName | `${GamepadStickName}.${'x' | 'y'}` }\r\n) & {\r\n scale?: number;\r\n invert?: boolean;\r\n perSecond?: boolean;\r\n};\r\n\r\n/**\r\n * Definition of an action.\r\n *\r\n * - `button`: on or off. Analog sources count as on beyond 0.5.\r\n * - `axis`: a number; the sum of all bindings, clamped to [-1, 1] unless `unbounded`.\r\n * - `vector2`: a 2D value; the sum of all bindings, its length clamped to 1 unless\r\n * `unbounded`. One-dimensional bindings feed x.\r\n *\r\n * Make an action `unbounded` when it accumulates movement, such as a look action\r\n * fed by pointer deltas.\r\n *\r\n * @public\r\n */\r\nexport interface InputActionDef {\r\n type: 'button' | 'axis' | 'vector2';\r\n bindings: InputBinding[];\r\n unbounded?: boolean;\r\n}\r\n\r\n/**\r\n * Read-only view of the raw input state that actions are evaluated from.\r\n * Implemented by {@link InputManager}.\r\n *\r\n * @public\r\n */\r\nexport interface InputStateSource {\r\n isKeyDown(code: string): boolean;\r\n keyPressed(code: string): boolean;\r\n keyReleased(code: string): boolean;\r\n isMouseDown(button: number): boolean;\r\n mousePressed(button: number): boolean;\r\n mouseReleased(button: number): boolean;\r\n readonly pointerDelta: Readonly<{ x: number; y: number }>;\r\n readonly wheelDelta: Readonly<{ x: number; y: number }>;\r\n readonly gamepad: Nullable<GamepadState>;\r\n}\r\n\r\ntype ActionState = {\r\n def: InputActionDef;\r\n x: number;\r\n y: number;\r\n down: boolean;\r\n prevDown: boolean;\r\n /** Went down during this frame, possibly also back up */\r\n pressed: boolean;\r\n released: boolean;\r\n /** Went down since last consumePressed() */\r\n latched: boolean;\r\n};\r\n\r\nconst tmpStick = { x: 0, y: 0 };\r\n\r\n/**\r\n * A named set of actions, e.g. `driving` or `onfoot`, evaluated once per frame\r\n * from keyboard, mouse and gamepad.\r\n *\r\n * Add maps to {@link InputManager.addActionMap}; maps added later sit on top. A\r\n * map with `blocking` set hides everything below it while enabled, which is how\r\n * a pause menu silences gameplay without each map checking for it.\r\n *\r\n * Values are evaluated at the start of every frame before `tick`, so every read\r\n * in a frame - `onUpdate`, `onFixedUpdate`, `onLateUpdate` - sees the same values.\r\n * A frame may run several fixed steps or none: to act on a press exactly once in\r\n * `onFixedUpdate`, use {@link InputActionMap.consumePressed} rather than\r\n * {@link InputActionMap.pressed}.\r\n *\r\n * @example\r\n * ```ts\r\n * const driving = new InputActionMap('driving', {\r\n * throttle: { type: 'axis', bindings: [{ key: 'KeyW' }, { pad: 'RT' }] },\r\n * steer: { type: 'axis', bindings: [{ keys: ['KeyD', 'KeyA'] }, { pad: 'LS.x' }] },\r\n * look: {\r\n * type: 'vector2',\r\n * unbounded: true,\r\n * bindings: [{ pointer: 'delta', scale: 0.003 }, { pad: 'RS', scale: 3, perSecond: true }]\r\n * },\r\n * exit: { type: 'button', bindings: [{ key: 'KeyF' }, { pad: 'Y' }] }\r\n * });\r\n * getInput().addActionMap(driving);\r\n * // per frame\r\n * vehicle.throttle = driving.value('throttle');\r\n * if (driving.pressed('exit')) leaveVehicle();\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class InputActionMap<A extends Record<string, InputActionDef> = Record<string, InputActionDef>> {\r\n /** Name of the map, for diagnostics. */\r\n readonly name: string;\r\n /** While enabled, a blocking map hides all maps below it. */\r\n blocking: boolean;\r\n private _enabled: boolean;\r\n /** Whether the map was evaluated with input last frame: enabled and not blocked */\r\n private _active: boolean;\r\n private readonly _actions: Map<keyof A, ActionState>;\r\n /**\r\n * @param name - Name of the map.\r\n * @param actions - Action definitions by action name.\r\n * @param options - `blocking`: see {@link InputActionMap.blocking}.\r\n */\r\n constructor(name: string, actions: A, options?: { blocking?: boolean }) {\r\n this.name = name;\r\n this.blocking = !!options?.blocking;\r\n this._enabled = true;\r\n this._active = false;\r\n this._actions = new Map();\r\n for (const key of Object.keys(actions) as (keyof A)[]) {\r\n this._actions.set(key, {\r\n def: { ...actions[key], bindings: [...actions[key].bindings] },\r\n x: 0,\r\n y: 0,\r\n down: false,\r\n prevDown: false,\r\n pressed: false,\r\n released: false,\r\n latched: false\r\n });\r\n }\r\n }\r\n /**\r\n * Whether the map is evaluated. A disabled map reads as idle; disabling it\r\n * while a button is held reports the release on the next frame. Enabling it\r\n * while a button is held does not report a press: the button must be pressed\r\n * again, so the key that switched maps does not also act in the new one.\r\n */\r\n get enabled() {\r\n return this._enabled;\r\n }\r\n set enabled(val: boolean) {\r\n this._enabled = !!val;\r\n }\r\n /**\r\n * Value of an action: an axis value, 1/0 for a button, x for a vector2.\r\n *\r\n * @param action - Action name.\r\n */\r\n value(action: keyof A) {\r\n return this._get(action).x;\r\n }\r\n /**\r\n * Value of a vector2 action. For other action types y is 0.\r\n *\r\n * @param action - Action name.\r\n * @param out - Optional output object.\r\n */\r\n vector2(action: keyof A, out?: { x: number; y: number }) {\r\n const s = this._get(action);\r\n out = out ?? { x: 0, y: 0 };\r\n out.x = s.x;\r\n out.y = s.y;\r\n return out;\r\n }\r\n /**\r\n * Whether an action is active this frame: a button held, or an axis/vector2 off zero.\r\n *\r\n * @param action - Action name.\r\n */\r\n isDown(action: keyof A) {\r\n return this._get(action).down;\r\n }\r\n /**\r\n * Whether an action became active this frame. A tap that went down and up\r\n * between two frames also counts.\r\n *\r\n * @param action - Action name.\r\n */\r\n pressed(action: keyof A) {\r\n return this._get(action).pressed;\r\n }\r\n /**\r\n * Whether an action became inactive this frame.\r\n *\r\n * @param action - Action name.\r\n */\r\n released(action: keyof A) {\r\n return this._get(action).released;\r\n }\r\n /**\r\n * Returns true once per press: true if the action was pressed since the last\r\n * call that returned true. Use it in `onFixedUpdate`, which may run several\r\n * times per frame or not at all.\r\n *\r\n * @param action - Action name.\r\n */\r\n consumePressed(action: keyof A) {\r\n const s = this._get(action);\r\n const latched = s.latched;\r\n s.latched = false;\r\n return latched;\r\n }\r\n /**\r\n * Bindings of an action, e.g. to save them after the player rebinds.\r\n *\r\n * @param action - Action name.\r\n */\r\n getBindings(action: keyof A): InputBinding[] {\r\n return this._get(action).def.bindings.map((b) => ({ ...b }));\r\n }\r\n /**\r\n * Replaces the bindings of an action, e.g. to apply the player's rebinding.\r\n *\r\n * @param action - Action name.\r\n * @param bindings - New bindings.\r\n */\r\n setBindings(action: keyof A, bindings: InputBinding[]) {\r\n this._get(action).def.bindings = bindings.map((b) => ({ ...b }));\r\n }\r\n /** @internal */\r\n _evaluate(src: Nullable<InputStateSource>, dt: number) {\r\n const active = !!src && this._enabled;\r\n // A key held while the map was inactive - such as the one that switched to\r\n // it - is no new press: only a press made this frame counts on activation\r\n const activated = active && !this._active;\r\n this._active = active;\r\n for (const s of this._actions.values()) {\r\n s.prevDown = s.down;\r\n s.x = 0;\r\n s.y = 0;\r\n let tapped = false;\r\n if (active) {\r\n for (const b of s.def.bindings) {\r\n const r = evaluateBinding(b, src!, dt);\r\n s.x += r.x;\r\n s.y += r.y;\r\n tapped ||= r.tapped;\r\n }\r\n }\r\n if (!s.def.unbounded) {\r\n if (s.def.type === 'vector2') {\r\n const len = Math.hypot(s.x, s.y);\r\n if (len > 1) {\r\n s.x /= len;\r\n s.y /= len;\r\n }\r\n } else {\r\n s.x = Math.min(Math.max(s.x, -1), 1);\r\n }\r\n }\r\n if (s.def.type === 'button') {\r\n s.down = Math.abs(s.x) > 0.5;\r\n s.x = s.down ? 1 : 0;\r\n } else {\r\n s.down = s.x !== 0 || s.y !== 0;\r\n }\r\n s.pressed = activated ? tapped : (s.down && !s.prevDown) || (tapped && !s.prevDown);\r\n s.released = (!s.down && s.prevDown) || (tapped && !s.down && !s.prevDown);\r\n if (s.pressed) {\r\n s.latched = true;\r\n }\r\n if (!active) {\r\n s.latched = false;\r\n }\r\n }\r\n }\r\n private _get(action: keyof A) {\r\n const s = this._actions.get(action);\r\n if (!s) {\r\n throw new Error(`InputActionMap '${this.name}': unknown action '${String(action)}'`);\r\n }\r\n return s;\r\n }\r\n}\r\n\r\nconst result = { x: 0, y: 0, tapped: false };\r\n\r\nfunction evaluateBinding(b: InputBinding, src: InputStateSource, dt: number) {\r\n result.x = 0;\r\n result.y = 0;\r\n result.tapped = false;\r\n if ('key' in b) {\r\n result.x = src.isKeyDown(b.key) ? 1 : 0;\r\n result.tapped = src.keyPressed(b.key);\r\n } else if ('keys' in b) {\r\n result.x = (src.isKeyDown(b.keys[0]) ? 1 : 0) - (src.isKeyDown(b.keys[1]) ? 1 : 0);\r\n result.tapped = src.keyPressed(b.keys[0]) || src.keyPressed(b.keys[1]);\r\n } else if ('keys2d' in b) {\r\n const k = b.keys2d;\r\n result.x = (src.isKeyDown(k.right) ? 1 : 0) - (src.isKeyDown(k.left) ? 1 : 0);\r\n result.y = (src.isKeyDown(k.up) ? 1 : 0) - (src.isKeyDown(k.down) ? 1 : 0);\r\n result.tapped =\r\n src.keyPressed(k.up) || src.keyPressed(k.down) || src.keyPressed(k.left) || src.keyPressed(k.right);\r\n } else if ('mouse' in b) {\r\n result.x = src.isMouseDown(b.mouse) ? 1 : 0;\r\n result.tapped = src.mousePressed(b.mouse);\r\n } else if ('pointer' in b) {\r\n const d = src.pointerDelta;\r\n if (b.pointer === 'delta') {\r\n result.x = d.x;\r\n result.y = -d.y;\r\n } else {\r\n result.x = b.pointer === 'deltaX' ? d.x : -d.y;\r\n }\r\n } else if ('wheel' in b) {\r\n result.x = b.wheel === 'x' ? src.wheelDelta.x : src.wheelDelta.y;\r\n } else if ('pad' in b) {\r\n const pad = src.gamepad;\r\n if (pad?.connected) {\r\n const name = b.pad;\r\n if (name === 'LS' || name === 'RS') {\r\n pad.stick(name, tmpStick);\r\n result.x = tmpStick.x;\r\n result.y = tmpStick.y;\r\n } else if (name.length === 4 && name[2] === '.') {\r\n pad.stick(name.slice(0, 2) as GamepadStickName, tmpStick);\r\n result.x = name[3] === 'x' ? tmpStick.x : tmpStick.y;\r\n } else if (name in GamepadButtons) {\r\n result.x = pad.value(name as GamepadButtonName);\r\n result.tapped = pad.pressed(name as GamepadButtonName);\r\n }\r\n }\r\n }\r\n const scale = (b.scale ?? 1) * (b.invert ? -1 : 1) * (b.perSecond ? dt : 1);\r\n result.x *= scale;\r\n result.y *= scale;\r\n return result;\r\n}\r\n"],"names":["tmpStick","x","y","InputActionMap","blocking","_enabled","_actions","name","actions","options","_active","Map","key","Object","keys","set","def","bindings","down","prevDown","pressed","released","latched","enabled","val","value","action","_get","vector2","out","s","isDown","consumePressed","getBindings","map","b","setBindings","_evaluate","src","dt","active","activated","values","tapped","r","evaluateBinding","unbounded","type","len","Math","hypot","min","max","abs","get","Error","String","result","isKeyDown","keyPressed","k","keys2d","right","left","up","isMouseDown","mouse","mousePressed","d","pointerDelta","pointer","wheel","wheelDelta","pad","gamepad","connected","stick","length","slice","GamepadButtons","scale","invert","perSecond"],"mappings":"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"}