@woosh/meep-engine 2.169.1 → 2.169.2

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 (680) hide show
  1. package/editor/ecs/component/editors/NumericIntervalEditor.js +18 -35
  2. package/editor/ecs/component/editors/ObservedIntegerEditor.js +22 -43
  3. package/editor/ecs/component/editors/ObservedStringEditor.js +34 -51
  4. package/editor/ecs/component/editors/common/makeV3_editor.js +12 -30
  5. package/editor/ecs/component/editors/common/two_way_sync.js +50 -0
  6. package/editor/ecs/component/editors/geom/QuaternionEditor.js +20 -35
  7. package/editor/ecs/component/editors/geom/Vector1Editor.js +5 -28
  8. package/editor/ecs/component/editors/primitive/NumberEditor.js +15 -31
  9. package/editor/tools/paint/TerrainHeightPaintTool.js +22 -31
  10. package/editor/tools/paint/TerrainPaintTool.js +85 -13
  11. package/editor/tools/paint/TerrainTexturePaintTool.js +18 -29
  12. package/editor/view/ecs/components/TerrainController.js +1 -4
  13. package/package.json +1 -1
  14. package/src/DUPLICATION_AUDIT_2026_08_07/00_core_reuse_surface.md +738 -0
  15. package/src/DUPLICATION_AUDIT_2026_08_07/A_core_math_geom.md +79 -0
  16. package/src/DUPLICATION_AUDIT_2026_08_07/B_core_data.md +93 -0
  17. package/src/DUPLICATION_AUDIT_2026_08_07/C_gfx_render.md +80 -0
  18. package/src/DUPLICATION_AUDIT_2026_08_07/D_gfx_features.md +164 -0
  19. package/src/DUPLICATION_AUDIT_2026_08_07/E_physics.md +69 -0
  20. package/src/DUPLICATION_AUDIT_2026_08_07/F_sound.md +102 -0
  21. package/src/DUPLICATION_AUDIT_2026_08_07/G_net_save.md +129 -0
  22. package/src/DUPLICATION_AUDIT_2026_08_07/H_engine_misc.md +72 -0
  23. package/src/DUPLICATION_AUDIT_2026_08_07/I_generation_view.md +74 -0
  24. package/src/DUPLICATION_AUDIT_2026_08_07/K_crosscutting.md +169 -0
  25. package/src/DUPLICATION_AUDIT_2026_08_07.md +254 -0
  26. package/src/DUPLICATION_AUDIT_REMEDIATION.md +250 -0
  27. package/src/core/bvh2/bvh3/query/bvh_collect_user_data.js +2 -2
  28. package/src/core/bvh2/bvh3/query/bvh_query_leaves_generic.js +77 -77
  29. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray.js +90 -90
  30. package/src/core/bvh2/bvh3/query/bvh_query_leaves_ray_segment.js +94 -94
  31. package/src/core/bvh2/bvh3/query/bvh_query_user_data_generic.js +86 -86
  32. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_aabb.js +2 -2
  33. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_capsule.js +2 -2
  34. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_frustum.js +2 -2
  35. package/src/core/bvh2/bvh3/query/bvh_query_user_data_intersects_sphere.js +2 -2
  36. package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray.js +96 -96
  37. package/src/core/bvh2/bvh3/query/bvh_query_user_data_ray_segment.js +100 -100
  38. package/src/core/bvh2/bvh3/query/compute_tight_near_far_clipping_planes.js +2 -2
  39. package/src/core/bvh8/aabb3_round_to_float32.d.ts +16 -0
  40. package/src/core/bvh8/aabb3_round_to_float32.d.ts.map +1 -0
  41. package/src/core/bvh8/aabb3_round_to_float32.js +22 -0
  42. package/src/core/bvh8/bvh8_geometry_validate.d.ts.map +1 -1
  43. package/src/core/bvh8/bvh8_geometry_validate.js +1 -12
  44. package/src/core/bvh8/bvh8_geometry_validate_indirect.d.ts.map +1 -1
  45. package/src/core/bvh8/bvh8_geometry_validate_indirect.js +1 -12
  46. package/src/core/cache/Cache.d.ts +13 -0
  47. package/src/core/cache/Cache.d.ts.map +1 -1
  48. package/src/core/cache/Cache.js +13 -0
  49. package/src/core/color/operations/color_darken.d.ts +5 -2
  50. package/src/core/color/operations/color_darken.d.ts.map +1 -1
  51. package/src/core/color/operations/color_darken.js +24 -33
  52. package/src/core/color/operations/color_desaturate.d.ts +5 -2
  53. package/src/core/color/operations/color_desaturate.d.ts.map +1 -1
  54. package/src/core/color/operations/color_desaturate.js +24 -33
  55. package/src/core/color/operations/color_lighten.d.ts +5 -2
  56. package/src/core/color/operations/color_lighten.d.ts.map +1 -1
  57. package/src/core/color/operations/color_lighten.js +24 -33
  58. package/src/core/color/operations/color_saturate.d.ts +5 -2
  59. package/src/core/color/operations/color_saturate.d.ts.map +1 -1
  60. package/src/core/color/operations/color_saturate.js +24 -33
  61. package/src/core/color/operations/color_scale_okhsv_channel.d.ts +28 -0
  62. package/src/core/color/operations/color_scale_okhsv_channel.d.ts.map +1 -0
  63. package/src/core/color/operations/color_scale_okhsv_channel.js +45 -0
  64. package/src/core/geom/2d/hash-grid/SpatialHashGrid.d.ts.map +1 -1
  65. package/src/core/geom/2d/hash-grid/SpatialHashGrid.js +12 -0
  66. package/src/core/geom/2d/line/segment2_intersects_segment2_2d.d.ts.map +1 -1
  67. package/src/core/geom/2d/line/segment2_intersects_segment2_2d.js +25 -29
  68. package/src/core/geom/2d/line/segment2_segment_compute_intersection_array_2d.d.ts.map +1 -1
  69. package/src/core/geom/2d/line/segment2_segment_compute_intersection_array_2d.js +46 -51
  70. package/src/core/geom/2d/line/segment2_segment_intersection_fractions.d.ts +31 -0
  71. package/src/core/geom/2d/line/segment2_segment_intersection_fractions.d.ts.map +1 -0
  72. package/src/core/geom/2d/line/segment2_segment_intersection_fractions.js +52 -0
  73. package/src/core/geom/2d/quad-tree/qt_collect_by_circle.d.ts +6 -1
  74. package/src/core/geom/2d/quad-tree/qt_collect_by_circle.d.ts.map +1 -1
  75. package/src/core/geom/2d/quad-tree/qt_collect_by_circle.js +39 -65
  76. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.d.ts +15 -5
  77. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.d.ts.map +1 -1
  78. package/src/core/geom/2d/quad-tree/qt_match_data_by_circle.js +101 -70
  79. package/src/core/geom/2d/r-tree/StaticR2Tree.d.ts.map +1 -1
  80. package/src/core/geom/2d/r-tree/StaticR2Tree.js +7 -3
  81. package/src/core/geom/3d/aabb/aabb3_intersects_ray_segment.d.ts +7 -8
  82. package/src/core/geom/3d/aabb/aabb3_intersects_ray_segment.d.ts.map +1 -1
  83. package/src/core/geom/3d/aabb/aabb3_intersects_ray_segment.js +15 -51
  84. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.d.ts.map +1 -1
  85. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_bff.js +13 -14
  86. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.d.ts.map +1 -1
  87. package/src/core/geom/3d/atlas/param/atlas_chart_parameterize_lscm.js +2 -17
  88. package/src/core/geom/3d/atlas/segment/atlas_chart_roundness_delta.d.ts +22 -0
  89. package/src/core/geom/3d/atlas/segment/atlas_chart_roundness_delta.d.ts.map +1 -0
  90. package/src/core/geom/3d/atlas/segment/atlas_chart_roundness_delta.js +30 -0
  91. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.d.ts +19 -0
  92. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.d.ts.map +1 -1
  93. package/src/core/geom/3d/atlas/segment/atlas_segment_charts.js +5 -9
  94. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.d.ts.map +1 -1
  95. package/src/core/geom/3d/atlas/segment/atlas_segment_charts_atomic.js +4 -12
  96. package/src/core/geom/3d/frustum/read_frustum_corner.d.ts +5 -0
  97. package/src/core/geom/3d/frustum/read_frustum_corner.d.ts.map +1 -1
  98. package/src/core/geom/3d/frustum/read_frustum_corner.js +8 -5
  99. package/src/core/geom/3d/line/line3_segment_segment_closest_point_pair.d.ts +33 -0
  100. package/src/core/geom/3d/line/line3_segment_segment_closest_point_pair.d.ts.map +1 -0
  101. package/src/core/geom/3d/line/line3_segment_segment_closest_point_pair.js +71 -0
  102. package/src/core/geom/3d/mat4/m4_compose.d.ts +5 -0
  103. package/src/core/geom/3d/mat4/m4_compose.d.ts.map +1 -1
  104. package/src/core/geom/3d/mat4/m4_compose.js +22 -53
  105. package/src/core/geom/3d/mat4/m4_decompose.d.ts +8 -0
  106. package/src/core/geom/3d/mat4/m4_decompose.d.ts.map +1 -1
  107. package/src/core/geom/3d/mat4/m4_decompose.js +84 -76
  108. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.d.ts +2 -0
  109. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.d.ts.map +1 -1
  110. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale.js +10 -44
  111. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.d.ts +27 -0
  112. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.d.ts.map +1 -0
  113. package/src/core/geom/3d/mat4/m4_from_rotation_translation_scale_scalar.js +67 -0
  114. package/src/core/geom/3d/plane/orient3d_fast.d.ts.map +1 -1
  115. package/src/core/geom/3d/plane/orient3d_fast.js +2 -22
  116. package/src/core/geom/3d/plane/orient3d_fast_point.d.ts +28 -0
  117. package/src/core/geom/3d/plane/orient3d_fast_point.d.ts.map +1 -0
  118. package/src/core/geom/3d/plane/orient3d_fast_point.js +47 -0
  119. package/src/core/geom/3d/quaternion/quat3_nlerp.d.ts +48 -0
  120. package/src/core/geom/3d/quaternion/quat3_nlerp.d.ts.map +1 -0
  121. package/src/core/geom/3d/quaternion/quat3_nlerp.js +72 -0
  122. package/src/core/geom/3d/shape/AbstractShape3D.d.ts +9 -0
  123. package/src/core/geom/3d/shape/AbstractShape3D.d.ts.map +1 -1
  124. package/src/core/geom/3d/shape/AbstractShape3D.js +44 -1
  125. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -1
  126. package/src/core/geom/3d/shape/BoxShape3D.js +2 -1
  127. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  128. package/src/core/geom/3d/shape/CapsuleShape3D.js +2 -1
  129. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts +0 -1
  130. package/src/core/geom/3d/shape/ConvexHullShape3D.d.ts.map +1 -1
  131. package/src/core/geom/3d/shape/ConvexHullShape3D.js +25 -56
  132. package/src/core/geom/3d/shape/CylinderShape3D.d.ts.map +1 -1
  133. package/src/core/geom/3d/shape/CylinderShape3D.js +2 -1
  134. package/src/core/geom/3d/shape/HeightMapShape3D.d.ts.map +1 -1
  135. package/src/core/geom/3d/shape/HeightMapShape3D.js +3 -5
  136. package/src/core/geom/3d/shape/MeshShape3D.d.ts +0 -11
  137. package/src/core/geom/3d/shape/MeshShape3D.d.ts.map +1 -1
  138. package/src/core/geom/3d/shape/MeshShape3D.js +27 -106
  139. package/src/core/geom/3d/shape/Triangle3D.d.ts +1 -1
  140. package/src/core/geom/3d/shape/Triangle3D.d.ts.map +1 -1
  141. package/src/core/geom/3d/shape/Triangle3D.js +10 -31
  142. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -1
  143. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +8 -57
  144. package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.d.ts +8 -1
  145. package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.d.ts.map +1 -1
  146. package/src/core/geom/3d/topology/simplify/decimate_edge_collapse_snap.js +281 -272
  147. package/src/core/geom/3d/topology/simplify/quadratic/build_vertex_quadrics.d.ts.map +1 -1
  148. package/src/core/geom/3d/topology/simplify/quadratic/build_vertex_quadrics.js +3 -4
  149. package/src/core/geom/3d/topology/simplify/quadratic/quadric3_set_from_plane_through_point.d.ts +22 -0
  150. package/src/core/geom/3d/topology/simplify/quadratic/quadric3_set_from_plane_through_point.d.ts.map +1 -0
  151. package/src/core/geom/3d/topology/simplify/quadratic/quadric3_set_from_plane_through_point.js +27 -0
  152. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts +24 -0
  153. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.d.ts.map +1 -0
  154. package/src/core/geom/3d/topology/struct/binary/io/bt_boundary_loop.js +73 -0
  155. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -1
  156. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +2 -53
  157. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.d.ts.map +1 -1
  158. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compute_vertex_quadrics.js +3 -4
  159. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.d.ts.map +1 -1
  160. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_fill_small_holes.js +3 -33
  161. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.d.ts.map +1 -1
  162. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_from_indexed_geometry.js +4 -37
  163. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.d.ts.map +1 -1
  164. package/src/core/geom/3d/topology/struct/binary/io/face/bt_face_poke.js +3 -32
  165. package/src/core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.d.ts +32 -0
  166. package/src/core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.d.ts.map +1 -0
  167. package/src/core/geom/3d/topology/struct/binary/query/bt_face_read_triangle.js +66 -0
  168. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.d.ts.map +1 -1
  169. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path.js +703 -728
  170. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.d.ts.map +1 -1
  171. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_face_find_path_polyanya.js +13 -24
  172. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -1
  173. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +8 -54
  174. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts +35 -0
  175. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.d.ts.map +1 -0
  176. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_surface_ray_parity.js +82 -0
  177. package/src/core/geom/3d/triangle/tri3_closest_point.d.ts +29 -0
  178. package/src/core/geom/3d/triangle/tri3_closest_point.d.ts.map +1 -0
  179. package/src/core/geom/3d/triangle/tri3_closest_point.js +65 -0
  180. package/src/core/geom/3d/triangle/tri3_flatten_isometric.d.ts +42 -0
  181. package/src/core/geom/3d/triangle/tri3_flatten_isometric.d.ts.map +1 -0
  182. package/src/core/geom/3d/triangle/tri3_flatten_isometric.js +79 -0
  183. package/src/core/geom/Vector2.d.ts.map +1 -1
  184. package/src/core/geom/Vector2.js +2 -1
  185. package/src/core/geom/random/random_orthonormal_basis.d.ts +21 -0
  186. package/src/core/geom/random/random_orthonormal_basis.d.ts.map +1 -0
  187. package/src/core/geom/random/random_orthonormal_basis.js +31 -0
  188. package/src/core/geom/vec2/v2_rotate.d.ts +18 -0
  189. package/src/core/geom/vec2/v2_rotate.d.ts.map +1 -0
  190. package/src/core/geom/vec2/v2_rotate.js +21 -0
  191. package/src/core/geom/vec2/v2_rotate_cos_sin.d.ts +19 -0
  192. package/src/core/geom/vec2/v2_rotate_cos_sin.d.ts.map +1 -0
  193. package/src/core/geom/vec2/v2_rotate_cos_sin.js +21 -0
  194. package/src/core/graph/csr/csr_graph_from_undirected_edge_list.d.ts +30 -0
  195. package/src/core/graph/csr/csr_graph_from_undirected_edge_list.d.ts.map +1 -0
  196. package/src/core/graph/csr/csr_graph_from_undirected_edge_list.js +94 -0
  197. package/src/core/graph/layout/CircleLayout.d.ts.map +1 -1
  198. package/src/core/graph/layout/CircleLayout.js +6 -29
  199. package/src/core/graph/layout/box/BoxLayouter.d.ts.map +1 -1
  200. package/src/core/graph/layout/box/BoxLayouter.js +2 -26
  201. package/src/core/graph/layout/box/position_box_next_to_box.d.ts.map +1 -1
  202. package/src/core/graph/layout/box/position_box_next_to_box.js +2 -1
  203. package/src/core/graph/layout/computeDisconnectedSubGraphs.d.ts.map +1 -1
  204. package/src/core/graph/layout/computeDisconnectedSubGraphs.js +14 -3
  205. package/src/core/graph/layout/graph_peel_topological_layer.d.ts +25 -0
  206. package/src/core/graph/layout/graph_peel_topological_layer.d.ts.map +1 -0
  207. package/src/core/graph/layout/graph_peel_topological_layer.js +45 -0
  208. package/src/core/math/hash/hash_mix2.d.ts +21 -0
  209. package/src/core/math/hash/hash_mix2.d.ts.map +1 -0
  210. package/src/core/math/hash/hash_mix2.js +22 -0
  211. package/src/core/math/hash/hash_mix3.d.ts +16 -0
  212. package/src/core/math/hash/hash_mix3.d.ts.map +1 -0
  213. package/src/core/math/hash/hash_mix3.js +19 -0
  214. package/src/core/math/lookup/LUT_HEATMAP.d.ts +17 -0
  215. package/src/core/math/lookup/LUT_HEATMAP.d.ts.map +1 -0
  216. package/src/core/math/lookup/LUT_HEATMAP.js +30 -0
  217. package/src/core/math/noise/curl_noise_3d.d.ts +6 -0
  218. package/src/core/math/noise/curl_noise_3d.d.ts.map +1 -1
  219. package/src/core/math/noise/curl_noise_3d.js +18 -27
  220. package/src/core/math/statistics/hammersley_sequence.d.ts +28 -16
  221. package/src/core/math/statistics/hammersley_sequence.d.ts.map +1 -1
  222. package/src/core/math/statistics/hammersley_sequence.js +53 -34
  223. package/src/core/science/units/MEASUREMENT_UNITS_SI.d.ts +3 -0
  224. package/src/core/science/units/MEASUREMENT_UNITS_SI.d.ts.map +1 -1
  225. package/src/core/science/units/MEASUREMENT_UNITS_SI.js +5 -16
  226. package/src/engine/animation/TransitionFunctions.d.ts +31 -0
  227. package/src/engine/animation/TransitionFunctions.d.ts.map +1 -1
  228. package/src/engine/animation/TransitionFunctions.js +44 -0
  229. package/src/engine/animation/curve/animation_curve_binary_codec.d.ts +29 -0
  230. package/src/engine/animation/curve/animation_curve_binary_codec.d.ts.map +1 -0
  231. package/src/engine/animation/curve/animation_curve_binary_codec.js +60 -0
  232. package/src/engine/animation/curve/draw/canvas_point_to_curve.d.ts +16 -0
  233. package/src/engine/animation/curve/draw/canvas_point_to_curve.d.ts.map +1 -0
  234. package/src/engine/animation/curve/draw/canvas_point_to_curve.js +22 -0
  235. package/src/engine/animation/curve/draw/curve_point_to_canvas.d.ts +27 -0
  236. package/src/engine/animation/curve/draw/curve_point_to_canvas.d.ts.map +1 -0
  237. package/src/engine/animation/curve/draw/curve_point_to_canvas.js +38 -0
  238. package/src/engine/animation/curve/draw/position_canvas_to_curve.d.ts +2 -0
  239. package/src/engine/animation/curve/draw/position_canvas_to_curve.d.ts.map +1 -1
  240. package/src/engine/animation/curve/draw/position_canvas_to_curve.js +22 -24
  241. package/src/engine/animation/curve/draw/position_curve_to_canvas.d.ts +2 -0
  242. package/src/engine/animation/curve/draw/position_curve_to_canvas.d.ts.map +1 -1
  243. package/src/engine/animation/curve/draw/position_curve_to_canvas.js +22 -25
  244. package/src/engine/animation/curve/editor/canvas2dDrawWorldAxisLabels.d.ts.map +1 -1
  245. package/src/engine/animation/curve/editor/canvas2dDrawWorldAxisLabels.js +3 -2
  246. package/src/engine/animation/curve/editor/canvas2dPlotCurvePoints.d.ts.map +1 -1
  247. package/src/engine/animation/curve/editor/canvas2dPlotCurvePoints.js +14 -14
  248. package/src/engine/animation/removeEntityWithMeshParticlesEffect.d.ts.map +1 -1
  249. package/src/engine/animation/removeEntityWithMeshParticlesEffect.js +5 -0
  250. package/src/engine/asset/loaders/GLTFAssetLoader.d.ts.map +1 -1
  251. package/src/engine/asset/loaders/GLTFAssetLoader.js +25 -51
  252. package/src/engine/asset/loaders/material/StaticMaterialCache.d.ts +3 -2
  253. package/src/engine/asset/loaders/material/StaticMaterialCache.d.ts.map +1 -1
  254. package/src/engine/asset/loaders/material/StaticMaterialCache.js +16 -55
  255. package/src/engine/asset/loaders/material/TextureCoalescer.d.ts +32 -0
  256. package/src/engine/asset/loaders/material/TextureCoalescer.d.ts.map +1 -0
  257. package/src/engine/asset/loaders/material/TextureCoalescer.js +68 -0
  258. package/src/engine/asset/loaders/material/traverseMaterialTextures.d.ts +10 -2
  259. package/src/engine/asset/loaders/material/traverseMaterialTextures.d.ts.map +1 -1
  260. package/src/engine/asset/loaders/material/traverseMaterialTextures.js +10 -2
  261. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -1
  262. package/src/engine/control/first-person/abilities/Mantle.js +10 -26
  263. package/src/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.d.ts.map +1 -1
  264. package/src/engine/ecs/dynamic_actions/actions/definition/WeightedRandomActionDescription.js +5 -0
  265. package/src/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.d.ts +22 -2
  266. package/src/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.d.ts.map +1 -1
  267. package/src/engine/ecs/evaluation/complex/PointFitnessGaussianBlur.js +92 -41
  268. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts +3 -1
  269. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.d.ts.map +1 -1
  270. package/src/engine/ecs/gui/hud/HeadsUpDisplaySystem.js +14 -16
  271. package/src/engine/ecs/gui/parallax/GuiElementParallaxSystem.d.ts.map +1 -1
  272. package/src/engine/ecs/gui/parallax/GuiElementParallaxSystem.js +16 -29
  273. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.d.ts.map +1 -1
  274. package/src/engine/ecs/ik/OneBoneSurfaceAlignmentSolver.js +12 -74
  275. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.d.ts.map +1 -1
  276. package/src/engine/ecs/ik/TwoBoneInverseKinematicsSolver.js +10 -73
  277. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts +38 -0
  278. package/src/engine/ecs/ik/ik_probe_terrain_contact.d.ts.map +1 -0
  279. package/src/engine/ecs/ik/ik_probe_terrain_contact.js +119 -0
  280. package/src/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.d.ts +0 -1
  281. package/src/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.d.ts.map +1 -1
  282. package/src/engine/ecs/terrain/util/paintTerrainOverlayViaLookupTable.js +2 -14
  283. package/src/engine/graphics/FULL_SCREEN_QUAD_VERTEX_SHADER.d.ts +12 -1
  284. package/src/engine/graphics/FULL_SCREEN_QUAD_VERTEX_SHADER.d.ts.map +1 -1
  285. package/src/engine/graphics/FULL_SCREEN_QUAD_VERTEX_SHADER.js +14 -10
  286. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.d.ts.map +1 -1
  287. package/src/engine/graphics/ecs/camera/auto_set_camera_clipping_planes.js +7 -28
  288. package/src/engine/graphics/ecs/highlight/renderer/HighlightDecodeShader.d.ts +1 -2
  289. package/src/engine/graphics/ecs/highlight/renderer/HighlightDecodeShader.d.ts.map +1 -1
  290. package/src/engine/graphics/ecs/highlight/renderer/HighlightDecodeShader.js +4 -12
  291. package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.d.ts.map +1 -1
  292. package/src/engine/graphics/ecs/highlight/renderer/OutlineRenderer.js +2 -11
  293. package/src/engine/graphics/ecs/highlight/renderer/makeBlurShader_9.d.ts +1 -2
  294. package/src/engine/graphics/ecs/highlight/renderer/makeBlurShader_9.d.ts.map +1 -1
  295. package/src/engine/graphics/ecs/highlight/renderer/makeBlurShader_9.js +3 -11
  296. package/src/engine/graphics/ecs/highlight/renderer/makeDilationShader.d.ts +1 -2
  297. package/src/engine/graphics/ecs/highlight/renderer/makeDilationShader.d.ts.map +1 -1
  298. package/src/engine/graphics/ecs/highlight/renderer/makeDilationShader.js +3 -11
  299. package/src/engine/graphics/ecs/highlight/renderer/make_screen_space_quad_material.d.ts +33 -0
  300. package/src/engine/graphics/ecs/highlight/renderer/make_screen_space_quad_material.d.ts.map +1 -0
  301. package/src/engine/graphics/ecs/highlight/renderer/make_screen_space_quad_material.js +44 -0
  302. package/src/engine/graphics/ecs/highlight/system/HighlightSystemBase.d.ts +55 -0
  303. package/src/engine/graphics/ecs/highlight/system/HighlightSystemBase.d.ts.map +1 -0
  304. package/src/engine/graphics/ecs/highlight/system/HighlightSystemBase.js +205 -0
  305. package/src/engine/graphics/ecs/highlight/system/MeshHighlightSystem.d.ts +4 -45
  306. package/src/engine/graphics/ecs/highlight/system/MeshHighlightSystem.d.ts.map +1 -1
  307. package/src/engine/graphics/ecs/highlight/system/MeshHighlightSystem.js +39 -162
  308. package/src/engine/graphics/ecs/highlight/system/RenderableHighlightSystem.d.ts +4 -51
  309. package/src/engine/graphics/ecs/highlight/system/RenderableHighlightSystem.d.ts.map +1 -1
  310. package/src/engine/graphics/ecs/highlight/system/RenderableHighlightSystem.js +34 -164
  311. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts +5 -57
  312. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.d.ts.map +1 -1
  313. package/src/engine/graphics/ecs/highlight/system/ShadedGeometryHighlightSystem.js +48 -175
  314. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.d.ts.map +1 -1
  315. package/src/engine/graphics/ecs/light/shadow/extend_shadow_camera_near_for_casters.js +7 -25
  316. package/src/engine/graphics/ecs/make_bvh_depth_range_computer.d.ts +26 -0
  317. package/src/engine/graphics/ecs/make_bvh_depth_range_computer.d.ts.map +1 -0
  318. package/src/engine/graphics/ecs/make_bvh_depth_range_computer.js +33 -0
  319. package/src/engine/graphics/ecs/mesh/MeshSystem.d.ts.map +1 -1
  320. package/src/engine/graphics/ecs/mesh/MeshSystem.js +2 -5
  321. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.d.ts.map +1 -1
  322. package/src/engine/graphics/ecs/mesh-v2/ShadedGeometrySystem.js +2 -5
  323. package/src/engine/graphics/ecs/render_layers_compute_depth_range.d.ts +35 -0
  324. package/src/engine/graphics/ecs/render_layers_compute_depth_range.d.ts.map +1 -0
  325. package/src/engine/graphics/ecs/render_layers_compute_depth_range.js +64 -0
  326. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.d.ts.map +1 -1
  327. package/src/engine/graphics/ecs/trail2d/Trail2DSystem.js +2 -5
  328. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.d.ts.map +1 -1
  329. package/src/engine/graphics/ecs/trail3d/Trail3DSystem.js +2 -5
  330. package/src/engine/graphics/ecs/water/WaterSystem.d.ts.map +1 -1
  331. package/src/engine/graphics/ecs/water/WaterSystem.js +2 -5
  332. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_nearest.d.ts.map +1 -1
  333. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_nearest.js +22 -94
  334. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_overlap_clipping_volume.d.ts.map +1 -1
  335. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_overlap_clipping_volume.js +17 -57
  336. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.d.ts.map +1 -1
  337. package/src/engine/graphics/geometry/buffered/query/bvh32_geometry_raycast.js +17 -57
  338. package/src/engine/graphics/geometry/buffered/query/nearest_point_on_triangle_record.d.ts +30 -0
  339. package/src/engine/graphics/geometry/buffered/query/nearest_point_on_triangle_record.d.ts.map +1 -0
  340. package/src/engine/graphics/geometry/buffered/query/nearest_point_on_triangle_record.js +87 -0
  341. package/src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.d.ts.map +1 -1
  342. package/src/engine/graphics/geometry/buffered/query/query_bvh_geometry_nearest.js +11 -55
  343. package/src/engine/graphics/geometry/buffered/read_triangle_vertices.d.ts +29 -0
  344. package/src/engine/graphics/geometry/buffered/read_triangle_vertices.d.ts.map +1 -0
  345. package/src/engine/graphics/geometry/buffered/read_triangle_vertices.js +102 -0
  346. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.d.ts.map +1 -1
  347. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderDepthV0.js +17 -122
  348. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.d.ts.map +1 -1
  349. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderLitV0.js +15 -194
  350. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.d.ts.map +1 -1
  351. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderNormalsV0.js +12 -108
  352. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.d.ts.map +1 -1
  353. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderPerPixelV0.js +14 -183
  354. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.d.ts.map +1 -1
  355. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderV0.js +12 -154
  356. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.d.ts.map +1 -1
  357. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderViewportDepthV0.js +10 -94
  358. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.d.ts.map +1 -1
  359. package/src/engine/graphics/impostors/octahedral/shader/ImpostorShaderWireframeV0.js +8 -72
  360. package/src/engine/graphics/impostors/octahedral/shader/glsl/common.glsl +10 -0
  361. package/src/engine/graphics/impostors/voxel/bake/read_atlas_to_samples.d.ts.map +1 -1
  362. package/src/engine/graphics/impostors/voxel/bake/read_atlas_to_samples.js +79 -58
  363. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderDepthV0.d.ts.map +1 -1
  364. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderDepthV0.js +11 -22
  365. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderLitV0.d.ts.map +1 -1
  366. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderLitV0.js +7 -16
  367. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderNormalsV0.d.ts.map +1 -1
  368. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderNormalsV0.js +5 -9
  369. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderV0.d.ts.map +1 -1
  370. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderV0.js +4 -19
  371. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderViewportDepthV0.d.ts.map +1 -1
  372. package/src/engine/graphics/impostors/voxel/shader/VoxelImpostorShaderViewportDepthV0.js +5 -9
  373. package/src/engine/graphics/material/SplatMaterial.d.ts.map +1 -1
  374. package/src/engine/graphics/material/SplatMaterial.js +2 -17
  375. package/src/engine/graphics/material/WaterMaterial.d.ts.map +1 -1
  376. package/src/engine/graphics/material/WaterMaterial.js +3 -18
  377. package/src/engine/graphics/material/manager/compilers/CoalesceTextures.d.ts +4 -4
  378. package/src/engine/graphics/material/manager/compilers/CoalesceTextures.d.ts.map +1 -1
  379. package/src/engine/graphics/material/manager/compilers/CoalesceTextures.js +25 -70
  380. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.d.ts.map +1 -1
  381. package/src/engine/graphics/particles/ecs/ParticleEmitterSystem.js +2 -5
  382. package/src/engine/graphics/particles/node-based/codegen/glsl/getTypeByteSize.d.ts +8 -11
  383. package/src/engine/graphics/particles/node-based/codegen/glsl/getTypeByteSize.d.ts.map +1 -1
  384. package/src/engine/graphics/particles/node-based/codegen/glsl/getTypeByteSize.js +20 -21
  385. package/src/engine/graphics/particles/node-based/nodes/particle_data_type_component_count.d.ts +39 -0
  386. package/src/engine/graphics/particles/node-based/nodes/particle_data_type_component_count.d.ts.map +1 -0
  387. package/src/engine/graphics/particles/node-based/nodes/particle_data_type_component_count.js +45 -0
  388. package/src/engine/graphics/particles/node-based/particle/ParticleAttributeSpecification.d.ts +6 -8
  389. package/src/engine/graphics/particles/node-based/particle/ParticleAttributeSpecification.d.ts.map +1 -1
  390. package/src/engine/graphics/particles/node-based/particle/ParticleAttributeSpecification.js +2 -13
  391. package/src/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.d.ts.map +1 -1
  392. package/src/engine/graphics/particles/particular/engine/utils/distributeParticlesOnObject3D.js +16 -78
  393. package/src/engine/graphics/particles/particular/engine/utils/distribute_points_on_indexed_triangles.d.ts +45 -0
  394. package/src/engine/graphics/particles/particular/engine/utils/distribute_points_on_indexed_triangles.d.ts.map +1 -0
  395. package/src/engine/graphics/particles/particular/engine/utils/distribute_points_on_indexed_triangles.js +168 -0
  396. package/src/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.d.ts.map +1 -1
  397. package/src/engine/graphics/particles/particular/engine/utils/distrubuteParticlesOnMesh.js +11 -115
  398. package/src/engine/graphics/postprocess/threejs/shaders/CopyShader.d.ts +24 -16
  399. package/src/engine/graphics/postprocess/threejs/shaders/CopyShader.d.ts.map +1 -1
  400. package/src/engine/graphics/postprocess/threejs/shaders/CopyShader.js +15 -47
  401. package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.d.ts +4 -0
  402. package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.d.ts.map +1 -1
  403. package/src/engine/graphics/render/buffer/simple-fx/ao/AmbientOcclusionPostProcessEffect.js +4 -0
  404. package/src/engine/graphics/sh3/build_injected_shader.d.ts +51 -0
  405. package/src/engine/graphics/sh3/build_injected_shader.d.ts.map +1 -0
  406. package/src/engine/graphics/sh3/build_injected_shader.js +56 -0
  407. package/src/engine/graphics/sh3/gi/material/MaterialTransformer.d.ts.map +1 -1
  408. package/src/engine/graphics/sh3/gi/material/MaterialTransformer.js +10 -1
  409. package/src/engine/graphics/sh3/gi/material/chunk_lpv_get_irradiance_at.d.ts.map +1 -1
  410. package/src/engine/graphics/sh3/gi/material/chunk_lpv_get_irradiance_at.js +17 -0
  411. package/src/engine/graphics/sh3/gi/material/common.d.ts +1 -1
  412. package/src/engine/graphics/sh3/gi/material/common.js +6 -222
  413. package/src/engine/graphics/sh3/gi/material/space_fragment/build_fragment_shader.d.ts.map +1 -1
  414. package/src/engine/graphics/sh3/gi/material/space_fragment/build_fragment_shader.js +7 -11
  415. package/src/engine/graphics/sh3/gi/material/space_fragment/build_vertex_shader.d.ts.map +1 -1
  416. package/src/engine/graphics/sh3/gi/material/space_fragment/build_vertex_shader.js +27 -29
  417. package/src/engine/graphics/sh3/gi/material/space_vertex/build_fragment_shader.d.ts.map +1 -1
  418. package/src/engine/graphics/sh3/gi/material/space_vertex/build_fragment_shader.js +7 -11
  419. package/src/engine/graphics/sh3/gi/material/space_vertex/build_vertex_shader.d.ts.map +1 -1
  420. package/src/engine/graphics/sh3/gi/material/space_vertex/build_vertex_shader.js +7 -12
  421. package/src/engine/graphics/sh3/grid_dilate_average.d.ts +38 -0
  422. package/src/engine/graphics/sh3/grid_dilate_average.d.ts.map +1 -0
  423. package/src/engine/graphics/sh3/grid_dilate_average.js +175 -0
  424. package/src/engine/graphics/sh3/lightmap/lightmap_dilate.d.ts +4 -0
  425. package/src/engine/graphics/sh3/lightmap/lightmap_dilate.d.ts.map +1 -1
  426. package/src/engine/graphics/sh3/lightmap/lightmap_dilate.js +7 -70
  427. package/src/engine/graphics/sh3/lpg/light_probe_grid_dilate.d.ts +6 -0
  428. package/src/engine/graphics/sh3/lpg/light_probe_grid_dilate.d.ts.map +1 -1
  429. package/src/engine/graphics/sh3/lpg/light_probe_grid_dilate.js +14 -113
  430. package/src/engine/graphics/sh3/lpg/material/chunk_lpg_get_irradiance_at.d.ts.map +1 -1
  431. package/src/engine/graphics/sh3/lpg/material/chunk_lpg_get_irradiance_at.js +7 -0
  432. package/src/engine/graphics/sh3/lpg/material/space_fragment/build_fragment_shader.d.ts.map +1 -1
  433. package/src/engine/graphics/sh3/lpg/material/space_fragment/build_fragment_shader.js +5 -8
  434. package/src/engine/graphics/sh3/lpg/material/space_fragment/build_vertex_shader.d.ts.map +1 -1
  435. package/src/engine/graphics/sh3/lpg/material/space_fragment/build_vertex_shader.js +5 -8
  436. package/src/engine/graphics/sh3/lpg/material/space_vertex/build_fragment_shader.d.ts.map +1 -1
  437. package/src/engine/graphics/sh3/lpg/material/space_vertex/build_fragment_shader.js +5 -8
  438. package/src/engine/graphics/sh3/lpg/material/space_vertex/build_vertex_shader.d.ts.map +1 -1
  439. package/src/engine/graphics/sh3/lpg/material/space_vertex/build_vertex_shader.js +5 -8
  440. package/src/engine/graphics/sh3/lpv/depth/chunk_probe_depth_sampling.d.ts +38 -0
  441. package/src/engine/graphics/sh3/lpv/depth/chunk_probe_depth_sampling.d.ts.map +1 -0
  442. package/src/engine/graphics/sh3/lpv/depth/chunk_probe_depth_sampling.js +265 -0
  443. package/src/engine/graphics/sh3/lpv/depth/octahedral/shader/visualize.frag.glsl +11 -0
  444. package/src/engine/graphics/sh3/lpv/depth/octahedral/v2/VLPDepthMapVisualisation.d.ts.map +1 -1
  445. package/src/engine/graphics/sh3/lpv/depth/octahedral/v2/VLPDepthMapVisualisation.js +5 -1
  446. package/src/engine/graphics/sh3/lpv/depth/octahedral/v2/visualise.frag.glsl +189 -419
  447. package/src/engine/graphics/sh3/shader/visualize.frag.d.ts +1 -1
  448. package/src/engine/graphics/sh3/shader/visualize.frag.js +7 -0
  449. package/src/engine/graphics/shaders/chunks/glsl_octahedral_impostor.d.ts +102 -0
  450. package/src/engine/graphics/shaders/chunks/glsl_octahedral_impostor.d.ts.map +1 -0
  451. package/src/engine/graphics/shaders/chunks/glsl_octahedral_impostor.js +277 -0
  452. package/src/engine/graphics/shaders/chunks/glsl_packing.d.ts +29 -0
  453. package/src/engine/graphics/shaders/chunks/glsl_packing.d.ts.map +1 -0
  454. package/src/engine/graphics/shaders/chunks/glsl_packing.js +30 -0
  455. package/src/engine/graphics/shaders/chunks/glsl_voxel_impostor_splat.d.ts +40 -0
  456. package/src/engine/graphics/shaders/chunks/glsl_voxel_impostor_splat.d.ts.map +1 -0
  457. package/src/engine/graphics/shaders/chunks/glsl_voxel_impostor_splat.js +57 -0
  458. package/src/engine/graphics/shaders/lib/make_clouds_uniforms.d.ts +22 -0
  459. package/src/engine/graphics/shaders/lib/make_clouds_uniforms.d.ts.map +1 -0
  460. package/src/engine/graphics/shaders/lib/make_clouds_uniforms.js +39 -0
  461. package/src/engine/graphics/texture/attribute_spec_to_three_format.d.ts +6 -0
  462. package/src/engine/graphics/texture/attribute_spec_to_three_format.d.ts.map +1 -1
  463. package/src/engine/graphics/texture/attribute_spec_to_three_format.js +9 -9
  464. package/src/engine/graphics/texture/channel_count_to_format_prefix.d.ts +14 -0
  465. package/src/engine/graphics/texture/channel_count_to_format_prefix.d.ts.map +1 -0
  466. package/src/engine/graphics/texture/channel_count_to_format_prefix.js +26 -0
  467. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.d.ts.map +1 -1
  468. package/src/engine/graphics/texture/computeThreeTextureInternalFormatFromDataType.js +2 -20
  469. package/src/engine/graphics/texture/normalized_internal_format.d.ts.map +1 -1
  470. package/src/engine/graphics/texture/normalized_internal_format.js +2 -20
  471. package/src/engine/graphics/texture/sampler/convertTexture2Sampler2D.d.ts.map +1 -1
  472. package/src/engine/graphics/texture/sampler/convertTexture2Sampler2D.js +9 -3
  473. package/src/engine/input/devices/gamepad/GamepadDeviceLayout.d.ts +54 -0
  474. package/src/engine/input/devices/gamepad/GamepadDeviceLayout.d.ts.map +1 -0
  475. package/src/engine/input/devices/gamepad/GamepadDeviceLayout.js +323 -0
  476. package/src/engine/input/devices/gamepad/GamepadHandle.d.ts +21 -2
  477. package/src/engine/input/devices/gamepad/GamepadHandle.d.ts.map +1 -1
  478. package/src/engine/input/devices/gamepad/GamepadHandle.js +39 -11
  479. package/src/engine/input/devices/gamepad/GamepadLayout.d.ts +128 -0
  480. package/src/engine/input/devices/gamepad/GamepadLayout.d.ts.map +1 -0
  481. package/src/engine/input/devices/gamepad/GamepadLayout.js +160 -0
  482. package/src/engine/input/devices/gamepad/GamepadStandardMapping.d.ts +10 -0
  483. package/src/engine/input/devices/gamepad/GamepadStandardMapping.d.ts.map +1 -1
  484. package/src/engine/input/devices/gamepad/GamepadStandardMapping.js +11 -0
  485. package/src/engine/input/devices/gamepad/GamepadStick.d.ts +5 -1
  486. package/src/engine/input/devices/gamepad/GamepadStick.d.ts.map +1 -1
  487. package/src/engine/input/devices/gamepad/GamepadStick.js +5 -1
  488. package/src/engine/input/devices/gamepad/gamepad_layout_database.d.ts +27 -0
  489. package/src/engine/input/devices/gamepad/gamepad_layout_database.d.ts.map +1 -0
  490. package/src/engine/input/devices/gamepad/gamepad_layout_database.js +144 -0
  491. package/src/engine/input/devices/gamepad/gamepad_read_hat_axis.d.ts +25 -0
  492. package/src/engine/input/devices/gamepad/gamepad_read_hat_axis.d.ts.map +1 -0
  493. package/src/engine/input/devices/gamepad/gamepad_read_hat_axis.js +61 -0
  494. package/src/engine/input/devices/gamepad/prototypeGamepadTester.d.ts +2 -0
  495. package/src/engine/input/devices/gamepad/prototypeGamepadTester.d.ts.map +1 -0
  496. package/src/engine/input/devices/gamepad/prototypeGamepadTester.js +2124 -0
  497. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.d.ts.map +1 -1
  498. package/src/engine/input/ecs/util/TopDownCameraControllerHelper.js +3 -33
  499. package/src/engine/intelligence/behavior/util/RandomDelayBehavior.d.ts.map +1 -1
  500. package/src/engine/intelligence/behavior/util/RandomDelayBehavior.js +5 -0
  501. package/src/engine/network/adapters/QuaternionInterpolationAdapter.d.ts.map +1 -1
  502. package/src/engine/network/adapters/QuaternionInterpolationAdapter.js +18 -19
  503. package/src/engine/network/adapters/TransformInterpolationAdapter.d.ts.map +1 -1
  504. package/src/engine/network/adapters/TransformInterpolationAdapter.js +18 -13
  505. package/src/engine/network/orchestrator/NetworkPeer.d.ts.map +1 -1
  506. package/src/engine/network/orchestrator/NetworkPeer.js +2 -1
  507. package/src/engine/network/sim/ActionLog.d.ts +9 -6
  508. package/src/engine/network/sim/ActionLog.d.ts.map +1 -1
  509. package/src/engine/network/sim/ActionLog.js +43 -80
  510. package/src/engine/network/sim/SmoothingState.d.ts.map +1 -1
  511. package/src/engine/network/sim/SmoothingState.js +27 -28
  512. package/src/engine/network/state/FrameBufferRing.d.ts +84 -0
  513. package/src/engine/network/state/FrameBufferRing.d.ts.map +1 -0
  514. package/src/engine/network/state/FrameBufferRing.js +168 -0
  515. package/src/engine/network/state/InputRing.d.ts +14 -12
  516. package/src/engine/network/state/InputRing.d.ts.map +1 -1
  517. package/src/engine/network/state/InputRing.js +37 -76
  518. package/src/engine/network/transport/LoopbackTransport.d.ts.map +1 -1
  519. package/src/engine/network/transport/LoopbackTransport.js +10 -31
  520. package/src/engine/network/transport/Transport.d.ts +42 -2
  521. package/src/engine/network/transport/Transport.d.ts.map +1 -1
  522. package/src/engine/network/transport/Transport.js +87 -3
  523. package/src/engine/network/transport/adapters/NodeUDPTransport.d.ts.map +1 -1
  524. package/src/engine/network/transport/adapters/NodeUDPTransport.js +7 -33
  525. package/src/engine/network/transport/adapters/SimulatedTransport.d.ts.map +1 -1
  526. package/src/engine/network/transport/adapters/SimulatedTransport.js +17 -28
  527. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.d.ts.map +1 -1
  528. package/src/engine/network/transport/adapters/WebRTCDataChannelTransport.js +6 -32
  529. package/src/engine/network/transport/adapters/WebSocketTransport.d.ts.map +1 -1
  530. package/src/engine/network/transport/adapters/WebSocketTransport.js +6 -32
  531. package/src/engine/network/transport/adapters/WebTransportTransport.d.ts.map +1 -1
  532. package/src/engine/network/transport/adapters/WebTransportTransport.js +11 -22
  533. package/src/engine/physics/constraint/solve_constraints.d.ts.map +1 -1
  534. package/src/engine/physics/constraint/solve_constraints.js +18 -48
  535. package/src/engine/physics/fluid/ecs/FluidObstacleSystem.d.ts +4 -4
  536. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +3 -3
  537. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.d.ts.map +1 -1
  538. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_scalar.js +7 -0
  539. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.d.ts.map +1 -1
  540. package/src/engine/physics/fluid/solver/v3_grid_advect_maccormack_velocity.js +11 -18
  541. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.d.ts.map +1 -1
  542. package/src/engine/physics/fluid/solver/v3_grid_advect_sl_velocity.js +7 -0
  543. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  544. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +15 -57
  545. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -1
  546. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +7 -0
  547. package/src/engine/physics/fluid/solver/v3_grid_limit8_at_indices.d.ts +28 -0
  548. package/src/engine/physics/fluid/solver/v3_grid_limit8_at_indices.d.ts.map +1 -0
  549. package/src/engine/physics/fluid/solver/v3_grid_limit8_at_indices.js +38 -0
  550. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.d.ts.map +1 -1
  551. package/src/engine/physics/fluid/solver/v3_mac_advect_maccormack_velocity.js +12 -14
  552. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.d.ts.map +1 -1
  553. package/src/engine/physics/fluid/solver/v3_mac_apply_vorticity_confinement.js +9 -0
  554. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts +13 -1
  555. package/src/engine/physics/mls-mpm/MLS_MPM.d.ts.map +1 -1
  556. package/src/engine/physics/mls-mpm/MLS_MPM.js +15 -4
  557. package/src/engine/physics/narrowphase/box_triangle_contact.d.ts.map +1 -1
  558. package/src/engine/physics/narrowphase/box_triangle_contact.js +9 -0
  559. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -1
  560. package/src/engine/physics/narrowphase/capsule_contacts.js +10 -11
  561. package/src/engine/physics/narrowphase/sphere_triangle_contact.d.ts.map +1 -1
  562. package/src/engine/physics/narrowphase/sphere_triangle_contact.js +7 -12
  563. package/src/engine/physics/solver/apply_impulse_to_body.d.ts +36 -0
  564. package/src/engine/physics/solver/apply_impulse_to_body.d.ts.map +1 -0
  565. package/src/engine/physics/solver/apply_impulse_to_body.js +86 -0
  566. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -1
  567. package/src/engine/physics/solver/solve_contacts.js +1 -53
  568. package/src/engine/plugin/EnginePlugin.d.ts +3 -0
  569. package/src/engine/plugin/EnginePlugin.d.ts.map +1 -1
  570. package/src/engine/plugin/EnginePlugin.js +3 -0
  571. package/src/engine/save/storage/IndexedDBStorage.d.ts +1 -0
  572. package/src/engine/save/storage/IndexedDBStorage.d.ts.map +1 -1
  573. package/src/engine/save/storage/IndexedDBStorage.js +50 -50
  574. package/src/engine/sound/ecs/SoundControllerSystem.d.ts.map +1 -1
  575. package/src/engine/sound/ecs/SoundControllerSystem.js +2 -10
  576. package/src/engine/sound/simulation/AcousticSimulator.d.ts.map +1 -1
  577. package/src/engine/sound/simulation/AcousticSimulator.js +2 -1
  578. package/src/engine/sound/simulation/core/AcousticOccluderIndex.d.ts.map +1 -1
  579. package/src/engine/sound/simulation/core/AcousticOccluderIndex.js +4 -6
  580. package/src/engine/sound/simulation/core/OcclusionSolver.d.ts.map +1 -1
  581. package/src/engine/sound/simulation/core/OcclusionSolver.js +2 -9
  582. package/src/engine/sound/simulation/probe/ProbeVisibilityRecheck.d.ts.map +1 -1
  583. package/src/engine/sound/simulation/probe/ProbeVisibilityRecheck.js +9 -14
  584. package/src/engine/sound/simulation/probe/bakeReverbBands.d.ts.map +1 -1
  585. package/src/engine/sound/simulation/probe/bakeReverbBands.js +2 -6
  586. package/src/engine/sound/simulation/probe/bakeVisibility.d.ts.map +1 -1
  587. package/src/engine/sound/simulation/probe/bakeVisibility.js +4 -34
  588. package/src/engine/sound/simulation/probe/probe_densify_portals.d.ts.map +1 -1
  589. package/src/engine/sound/simulation/probe/probe_densify_portals.js +3 -6
  590. package/src/engine/sound/simulation/probe/probe_edge_key.d.ts +31 -0
  591. package/src/engine/sound/simulation/probe/probe_edge_key.d.ts.map +1 -0
  592. package/src/engine/sound/simulation/probe/probe_edge_key.js +38 -0
  593. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts +10 -3
  594. package/src/engine/sound/simulation/probe/probe_sdf_grid.d.ts.map +1 -1
  595. package/src/engine/sound/simulation/probe/probe_sdf_grid.js +10 -22
  596. package/src/engine/sound/simulation/probe/probe_visibility_augment.d.ts.map +1 -1
  597. package/src/engine/sound/simulation/probe/probe_visibility_augment.js +12 -48
  598. package/src/engine/sound/simulation/probe/probe_visibility_bridge_components.d.ts.map +1 -1
  599. package/src/engine/sound/simulation/probe/probe_visibility_bridge_components.js +4 -3
  600. package/src/engine/sound/simulation/render/foaReverbImpulseResponse.d.ts +5 -4
  601. package/src/engine/sound/simulation/render/foaReverbImpulseResponse.d.ts.map +1 -1
  602. package/src/engine/sound/simulation/render/foaReverbImpulseResponse.js +23 -31
  603. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts +1 -8
  604. package/src/engine/sound/simulation/render/reverbImpulseResponse.d.ts.map +1 -1
  605. package/src/engine/sound/simulation/render/reverbImpulseResponse.js +21 -31
  606. package/src/engine/sound/simulation/render/reverb_band_tails.d.ts +55 -0
  607. package/src/engine/sound/simulation/render/reverb_band_tails.d.ts.map +1 -0
  608. package/src/engine/sound/simulation/render/reverb_band_tails.js +93 -0
  609. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.d.ts.map +1 -1
  610. package/src/engine/sound/sopra/definition/EventDescriptionSerializationAdapter.js +6 -22
  611. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.d.ts.map +1 -1
  612. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClip.js +7 -3
  613. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.d.ts.map +1 -1
  614. package/src/engine/sound/sopra/definition/clip/BlendContainerAudioClipSerializationAdapter.js +7 -22
  615. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.d.ts.map +1 -1
  616. package/src/engine/sound/sopra/definition/clip/ContainerAudioClip.js +28 -0
  617. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.d.ts.map +1 -1
  618. package/src/engine/sound/sopra/definition/clip/RandomContainerAudioClip.js +1 -5
  619. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.d.ts.map +1 -1
  620. package/src/engine/sound/sopra/definition/clip/SequenceContainerAudioClip.js +1 -13
  621. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.d.ts.map +1 -1
  622. package/src/engine/sound/sopra/definition/clip/SwitchContainerAudioClip.js +2 -8
  623. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts +3 -0
  624. package/src/engine/sound/sopra/definition/effect/ReverbEffect.d.ts.map +1 -1
  625. package/src/engine/sound/sopra/definition/effect/ReverbEffect.js +26 -14
  626. package/src/engine/sound/sopra/runtime/BusGraph.d.ts.map +1 -1
  627. package/src/engine/sound/sopra/runtime/BusGraph.js +21 -33
  628. package/src/engine/sound/sopra/runtime/EventInstance.js +1 -1
  629. package/src/engine/ui/apply_pointer_tilt_3d.d.ts +25 -0
  630. package/src/engine/ui/apply_pointer_tilt_3d.d.ts.map +1 -0
  631. package/src/engine/ui/apply_pointer_tilt_3d.js +50 -0
  632. package/src/engine/ui/bindings/processors/DomElementProcessorTilt3D.d.ts.map +1 -1
  633. package/src/engine/ui/bindings/processors/DomElementProcessorTilt3D.js +9 -26
  634. package/src/generation/filtering/numeric/CellFilterCache.d.ts.map +1 -1
  635. package/src/generation/filtering/numeric/CellFilterCache.js +4 -21
  636. package/src/generation/filtering/numeric/complex/CellFilterSobel.d.ts.map +1 -1
  637. package/src/generation/filtering/numeric/complex/CellFilterSobel.js +11 -20
  638. package/src/generation/filtering/numeric/math/CellFilterPower.d.ts +1 -1
  639. package/src/generation/filtering/numeric/math/CellFilterPower.d.ts.map +1 -1
  640. package/src/generation/filtering/numeric/math/CellFilterPower.js +1 -5
  641. package/src/generation/filtering/numeric/process/computeCellFilterGradient.d.ts.map +1 -1
  642. package/src/generation/filtering/numeric/process/computeCellFilterGradient.js +13 -15
  643. package/src/generation/filtering/numeric/process/computeCellFilterSobel.d.ts +20 -0
  644. package/src/generation/filtering/numeric/process/computeCellFilterSobel.d.ts.map +1 -0
  645. package/src/generation/filtering/numeric/process/computeCellFilterSobel.js +36 -0
  646. package/src/generation/filtering/numeric/util/CellFilterDisplaced.d.ts.map +1 -1
  647. package/src/generation/filtering/numeric/util/CellFilterDisplaced.js +11 -6
  648. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.d.ts.map +1 -1
  649. package/src/generation/filtering/numeric/util/populateSampler2DFromCellFilter.js +18 -36
  650. package/src/generation/filtering/numeric/util/write_cell_filter_to_sampler2d.d.ts +21 -0
  651. package/src/generation/filtering/numeric/util/write_cell_filter_to_sampler2d.d.ts.map +1 -0
  652. package/src/generation/filtering/numeric/util/write_cell_filter_to_sampler2d.js +47 -0
  653. package/src/generation/filtering/util/cell_filter_weights_pick.d.ts +25 -0
  654. package/src/generation/filtering/util/cell_filter_weights_pick.d.ts.map +1 -0
  655. package/src/generation/filtering/util/cell_filter_weights_pick.js +54 -0
  656. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.d.ts.map +1 -1
  657. package/src/generation/grid/generation/discrete/GridTaskConnectRooms.js +14 -1
  658. package/src/generation/markers/GridActionRuleSet.d.ts.map +1 -1
  659. package/src/generation/markers/GridActionRuleSet.js +10 -7
  660. package/src/generation/markers/GridCellActionPlaceMarker.d.ts.map +1 -1
  661. package/src/generation/markers/GridCellActionPlaceMarker.js +10 -12
  662. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.d.ts.map +1 -1
  663. package/src/generation/markers/actions/probability/MarkerNodeActionSelectWeighted.js +7 -42
  664. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.d.ts.map +1 -1
  665. package/src/generation/markers/transform/MarkerNodeTransformerOffsetPosition.js +11 -6
  666. package/src/generation/placement/GridCellPlacementRule.d.ts.map +1 -1
  667. package/src/generation/placement/GridCellPlacementRule.js +10 -7
  668. package/src/generation/placement/action/GridCellActionPlaceTags.d.ts.map +1 -1
  669. package/src/generation/placement/action/GridCellActionPlaceTags.js +10 -4
  670. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.d.ts.map +1 -1
  671. package/src/generation/placement/action/random/weighted/CellActionSelectWeightedRandom.js +2 -38
  672. package/src/generation/placement/action/util/GridCellDisplacedAction.d.ts.map +1 -1
  673. package/src/generation/placement/action/util/GridCellDisplacedAction.js +11 -6
  674. package/src/generation/rules/cell/CellMatcherGridPattern.d.ts.map +1 -1
  675. package/src/generation/rules/cell/CellMatcherGridPattern.js +11 -4
  676. package/src/generation/theme/ThemeEngine.d.ts.map +1 -1
  677. package/src/generation/theme/ThemeEngine.js +7 -12
  678. package/src/view/elements/Group.d.ts +24 -3
  679. package/src/view/elements/Group.d.ts.map +1 -1
  680. package/src/view/elements/Group.js +56 -34
@@ -1,6 +1,8 @@
1
1
  import Signal from "../../../../core/events/signal/Signal.js";
2
2
  import { InputDeviceSwitch } from "../InputDeviceSwitch.js";
3
3
  import { GamepadAxes } from "./GamepadAxes.js";
4
+ import { gamepad_layout_for_device } from "./gamepad_layout_database.js";
5
+ import { GAMEPAD_STANDARD_LAYOUT } from "./GamepadLayout.js";
4
6
  import { GamepadStick } from "./GamepadStick.js";
5
7
  import { GAMEPAD_STANDARD_AXIS_COUNT, GAMEPAD_STANDARD_BUTTON_COUNT } from "./GamepadStandardMapping.js";
6
8
 
@@ -9,6 +11,10 @@ import { GAMEPAD_STANDARD_AXIS_COUNT, GAMEPAD_STANDARD_BUTTON_COUNT } from "./Ga
9
11
  * Native {@link Gamepad} objects are immutable snapshots in most browsers, this class provides a stable, observable
10
12
  * representation that is refreshed from those snapshots via {@link GamepadHandle#update}.
11
13
  *
14
+ * State is always presented in the standard mapping, so {@link GamepadButtons} and {@link GamepadAxes} are
15
+ * valid indices whatever the hardware is. A pad the browser declined to map reports its inputs in its own
16
+ * order, and {@link layout} is the translation back to the standard one - see {@link GamepadLayout}.
17
+ *
12
18
  * @author Alex Goldring
13
19
  * @copyright Company Named Limited (c) 2026
14
20
  */
@@ -33,6 +39,19 @@ export class GamepadHandle {
33
39
  */
34
40
  mapping = "";
35
41
 
42
+ /**
43
+ * How this handle reaches the device's inputs.
44
+ *
45
+ * Resolved from the hardware whenever {@link id} changes, and only ever anything other than a passthrough
46
+ * for a device the browser declined to map that is also known to {@link gamepad_layout_for_device}. Read
47
+ * it to find out how a pad is being interpreted, for a settings screen or when a pad misbehaves.
48
+ *
49
+ * Do not modify directly
50
+ *
51
+ * @type {GamepadLayout}
52
+ */
53
+ layout = GAMEPAD_STANDARD_LAYOUT;
54
+
36
55
  /**
37
56
  * Whether the gamepad is currently connected
38
57
  * Do not modify directly
@@ -94,8 +113,11 @@ export class GamepadHandle {
94
113
  buttonValues = [];
95
114
 
96
115
  /**
97
- * Axis values in the range [-1,1], exactly as reported by the hardware.
98
- * For the standard mapping, see {@link GamepadAxes} for valid indices.
116
+ * Axis values in the range [-1,1], indexed as {@link GamepadAxes}.
117
+ *
118
+ * Values are exactly as the hardware reported them, placed in the slot the standard mapping puts them in.
119
+ * On a pad the browser mapped itself those are the same thing; on one it did not, {@link layout} says
120
+ * which device axis each slot came from, and slots the device has no axis for read 0.
99
121
  *
100
122
  * Uncorrected: a resting stick rarely reads 0 here. Read {@link stickLeft}/{@link stickRight} for values
101
123
  * with the learned rest position removed.
@@ -156,22 +178,29 @@ export class GamepadHandle {
156
178
  */
157
179
  update(source) {
158
180
 
181
+ /*
182
+ Which device an id names cannot change without the id changing, so the layout is resolved on that edge
183
+ rather than on every poll
184
+ */
185
+ if (source.id !== this.id) {
186
+ this.layout = gamepad_layout_for_device(source);
187
+ }
188
+
159
189
  this.index = source.index;
160
190
  this.id = source.id;
161
191
  this.mapping = source.mapping;
162
192
 
193
+ const layout = this.layout;
194
+
163
195
  // buttons
164
- const sourceButtons = source.buttons;
165
- const buttonCount = sourceButtons.length;
196
+ const buttonCount = layout.presentedButtonCount(source);
166
197
 
167
198
  for (let i = 0; i < buttonCount; i++) {
168
- const sourceButton = sourceButtons[i];
169
-
170
199
  const button = this.getButton(i);
171
200
 
172
- this.buttonValues[i] = sourceButton.value;
201
+ this.buttonValues[i] = layout.readButtonValue(i, source);
173
202
 
174
- if (sourceButton.pressed) {
203
+ if (layout.isButtonPressed(i, source)) {
175
204
 
176
205
  if (button.is_up) {
177
206
  button.press();
@@ -187,11 +216,10 @@ export class GamepadHandle {
187
216
  }
188
217
 
189
218
  // axes
190
- const sourceAxes = source.axes;
191
- const axisCount = sourceAxes.length;
219
+ const axisCount = layout.presentedAxisCount(source);
192
220
 
193
221
  for (let i = 0; i < axisCount; i++) {
194
- const value = sourceAxes[i];
222
+ const value = layout.readAxis(i, source);
195
223
 
196
224
  // hardware beyond the standard mapping has not been seen before and reads as neutral
197
225
  const oldValue = this.axes[i] !== undefined ? this.axes[i] : 0;
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Where each input of the standard mapping is found on a specific piece of hardware.
3
+ *
4
+ * The Gamepad API only promises the standard layout when {@link Gamepad#mapping} is `"standard"`. When it is
5
+ * anything else the browser is telling us it did not recognise the device, and the indices in `axes` and
6
+ * `buttons` mean whatever the device's HID report happens to say - a stick where the standard mapping expects a
7
+ * trigger, a trigger resting at -1 where it expects a released button. Reading such a device as though it were
8
+ * standard is not a small inaccuracy: a trigger axis read as an axis of the right stick pins that stick to full
9
+ * deflection forever.
10
+ *
11
+ * A layout is the translation, and it sits in the device layer for the same reason
12
+ * {@link GamepadStickCalibration} does - it describes what the hardware is, not what the game wants. It is the
13
+ * work the browser would have done had it recognised the pad.
14
+ *
15
+ * This class is that translation for a pad the browser already put in the standard layout: identity, a
16
+ * bit-exact passthrough. Opting out of translation is therefore not a mode, it is this layout - the same shape
17
+ * as an identity calibration. {@link GamepadDeviceLayout} is the translating one.
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ export class GamepadLayout {
23
+ /**
24
+ * Human-readable name, for a settings screen that wants to say how a pad is being read
25
+ * @readonly
26
+ * @type {string}
27
+ */
28
+ readonly name: string;
29
+ /**
30
+ * How many standard buttons this layout presents for the given device.
31
+ *
32
+ * Passthrough presents every button the device reports, including any beyond the standard mapping - a pad
33
+ * the browser mapped to standard is free to report more, and dropping them would lose hardware that works.
34
+ *
35
+ * @param {Gamepad} source native gamepad snapshot
36
+ * @returns {number}
37
+ */
38
+ presentedButtonCount(source: Gamepad): number;
39
+ /**
40
+ *
41
+ * @param {Gamepad} source native gamepad snapshot
42
+ * @returns {number}
43
+ */
44
+ presentedAxisCount(source: Gamepad): number;
45
+ /**
46
+ * Analog travel of a standard button, in [0,1]
47
+ *
48
+ * @param {number} index standard button index, see {@link GamepadButtons}
49
+ * @param {Gamepad} source native gamepad snapshot
50
+ * @returns {number}
51
+ */
52
+ readButtonValue(index: number, source: Gamepad): number;
53
+ /**
54
+ *
55
+ * @param {number} index standard button index, see {@link GamepadButtons}
56
+ * @param {Gamepad} source native gamepad snapshot
57
+ * @returns {boolean}
58
+ */
59
+ isButtonPressed(index: number, source: Gamepad): boolean;
60
+ /**
61
+ * Value of a standard axis, in [-1,1]
62
+ *
63
+ * @param {number} index standard axis index, see {@link GamepadAxes}
64
+ * @param {Gamepad} source native gamepad snapshot
65
+ * @returns {number}
66
+ */
67
+ readAxis(index: number, source: Gamepad): number;
68
+ /**
69
+ * Index of the device axis read as a standard axis, or {@link GAMEPAD_LAYOUT_ABSENT}.
70
+ * For diagnostics and layout UI - reading values goes through {@link readAxis}.
71
+ *
72
+ * @param {number} index standard axis index, see {@link GamepadAxes}
73
+ * @returns {number}
74
+ */
75
+ axisSource(index: number): number;
76
+ /**
77
+ * Index of the device button read as a standard button, or {@link GAMEPAD_LAYOUT_ABSENT}
78
+ *
79
+ * @param {number} index standard button index, see {@link GamepadButtons}
80
+ * @returns {number}
81
+ */
82
+ buttonSource(index: number): number;
83
+ /**
84
+ * Index of the device axis whose travel drives a standard button, or {@link GAMEPAD_LAYOUT_ABSENT}.
85
+ * This is how a non-standard pad reports its triggers.
86
+ *
87
+ * @param {number} index standard button index, see {@link GamepadButtons}
88
+ * @returns {number}
89
+ */
90
+ buttonAxisSource(index: number): number;
91
+ /**
92
+ * Index of the device axis carrying a D-pad hat, or {@link GAMEPAD_LAYOUT_ABSENT}
93
+ * @returns {number}
94
+ */
95
+ get hatAxis(): number;
96
+ /**
97
+ * Whether this layout can be applied to the given device.
98
+ *
99
+ * Checked once when a pad connects rather than on every read. The same vendor and product can ship report
100
+ * descriptors that differ between firmware revisions - the browsers carry several layouts for the Xbox
101
+ * wireless pad alone for exactly this reason - and a layout that reaches past the end of what a device
102
+ * reports would otherwise write undefined into an axis and poison a stick with NaN.
103
+ *
104
+ * @param {Gamepad} source native gamepad snapshot
105
+ * @returns {boolean}
106
+ */
107
+ describes(source: Gamepad): boolean;
108
+ }
109
+ /**
110
+ * No device input drives this standard input, so it reads as neutral and never fires.
111
+ *
112
+ * That is the same answer the standard mapping already gives for hardware that lacks a button, see
113
+ * {@link GamepadHandle#buttons} - absence is uniform rather than expressive.
114
+ *
115
+ * @readonly
116
+ * @type {number}
117
+ */
118
+ export const GAMEPAD_LAYOUT_ABSENT: number;
119
+ /**
120
+ * The layout of a pad the browser has already put in the standard mapping: a bit-exact passthrough.
121
+ *
122
+ * Shared by every handle reading such a pad, and carries no state, so it must not be modified.
123
+ *
124
+ * @readonly
125
+ * @type {GamepadLayout}
126
+ */
127
+ export const GAMEPAD_STANDARD_LAYOUT: GamepadLayout;
128
+ //# sourceMappingURL=GamepadLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GamepadLayout.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/GamepadLayout.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;IAEI;;;;OAIG;IACH,eAFU,MAAM,CAEE;IAElB;;;;;;;;OAQG;IACH,6BAHW,OAAO,GACL,MAAM,CAIlB;IAED;;;;OAIG;IACH,2BAHW,OAAO,GACL,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,uBAJW,MAAM,UACN,OAAO,GACL,MAAM,CAIlB;IAED;;;;;OAKG;IACH,uBAJW,MAAM,UACN,OAAO,GACL,OAAO,CAInB;IAED;;;;;;OAMG;IACH,gBAJW,MAAM,UACN,OAAO,GACL,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,kBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;OAKG;IACH,oBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;;;;OAMG;IACH,wBAHW,MAAM,GACJ,MAAM,CAIlB;IAED;;;OAGG;IACH,sBAEC;IAED;;;;;;;;;;OAUG;IACH,kBAHW,OAAO,GACL,OAAO,CAInB;CACJ;AAED;;;;;;;;GAQG;AACH,oCAFU,MAAM,CAEwB;AAExC;;;;;;;GAOG;AACH,sCAFU,aAAa,CAEoC"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Where each input of the standard mapping is found on a specific piece of hardware.
3
+ *
4
+ * The Gamepad API only promises the standard layout when {@link Gamepad#mapping} is `"standard"`. When it is
5
+ * anything else the browser is telling us it did not recognise the device, and the indices in `axes` and
6
+ * `buttons` mean whatever the device's HID report happens to say - a stick where the standard mapping expects a
7
+ * trigger, a trigger resting at -1 where it expects a released button. Reading such a device as though it were
8
+ * standard is not a small inaccuracy: a trigger axis read as an axis of the right stick pins that stick to full
9
+ * deflection forever.
10
+ *
11
+ * A layout is the translation, and it sits in the device layer for the same reason
12
+ * {@link GamepadStickCalibration} does - it describes what the hardware is, not what the game wants. It is the
13
+ * work the browser would have done had it recognised the pad.
14
+ *
15
+ * This class is that translation for a pad the browser already put in the standard layout: identity, a
16
+ * bit-exact passthrough. Opting out of translation is therefore not a mode, it is this layout - the same shape
17
+ * as an identity calibration. {@link GamepadDeviceLayout} is the translating one.
18
+ *
19
+ * @author Alex Goldring
20
+ * @copyright Company Named Limited (c) 2026
21
+ */
22
+ export class GamepadLayout {
23
+
24
+ /**
25
+ * Human-readable name, for a settings screen that wants to say how a pad is being read
26
+ * @readonly
27
+ * @type {string}
28
+ */
29
+ name = "standard";
30
+
31
+ /**
32
+ * How many standard buttons this layout presents for the given device.
33
+ *
34
+ * Passthrough presents every button the device reports, including any beyond the standard mapping - a pad
35
+ * the browser mapped to standard is free to report more, and dropping them would lose hardware that works.
36
+ *
37
+ * @param {Gamepad} source native gamepad snapshot
38
+ * @returns {number}
39
+ */
40
+ presentedButtonCount(source) {
41
+ return source.buttons.length;
42
+ }
43
+
44
+ /**
45
+ *
46
+ * @param {Gamepad} source native gamepad snapshot
47
+ * @returns {number}
48
+ */
49
+ presentedAxisCount(source) {
50
+ return source.axes.length;
51
+ }
52
+
53
+ /**
54
+ * Analog travel of a standard button, in [0,1]
55
+ *
56
+ * @param {number} index standard button index, see {@link GamepadButtons}
57
+ * @param {Gamepad} source native gamepad snapshot
58
+ * @returns {number}
59
+ */
60
+ readButtonValue(index, source) {
61
+ return source.buttons[index].value;
62
+ }
63
+
64
+ /**
65
+ *
66
+ * @param {number} index standard button index, see {@link GamepadButtons}
67
+ * @param {Gamepad} source native gamepad snapshot
68
+ * @returns {boolean}
69
+ */
70
+ isButtonPressed(index, source) {
71
+ return source.buttons[index].pressed;
72
+ }
73
+
74
+ /**
75
+ * Value of a standard axis, in [-1,1]
76
+ *
77
+ * @param {number} index standard axis index, see {@link GamepadAxes}
78
+ * @param {Gamepad} source native gamepad snapshot
79
+ * @returns {number}
80
+ */
81
+ readAxis(index, source) {
82
+ return source.axes[index];
83
+ }
84
+
85
+ /**
86
+ * Index of the device axis read as a standard axis, or {@link GAMEPAD_LAYOUT_ABSENT}.
87
+ * For diagnostics and layout UI - reading values goes through {@link readAxis}.
88
+ *
89
+ * @param {number} index standard axis index, see {@link GamepadAxes}
90
+ * @returns {number}
91
+ */
92
+ axisSource(index) {
93
+ return index;
94
+ }
95
+
96
+ /**
97
+ * Index of the device button read as a standard button, or {@link GAMEPAD_LAYOUT_ABSENT}
98
+ *
99
+ * @param {number} index standard button index, see {@link GamepadButtons}
100
+ * @returns {number}
101
+ */
102
+ buttonSource(index) {
103
+ return index;
104
+ }
105
+
106
+ /**
107
+ * Index of the device axis whose travel drives a standard button, or {@link GAMEPAD_LAYOUT_ABSENT}.
108
+ * This is how a non-standard pad reports its triggers.
109
+ *
110
+ * @param {number} index standard button index, see {@link GamepadButtons}
111
+ * @returns {number}
112
+ */
113
+ buttonAxisSource(index) {
114
+ return GAMEPAD_LAYOUT_ABSENT;
115
+ }
116
+
117
+ /**
118
+ * Index of the device axis carrying a D-pad hat, or {@link GAMEPAD_LAYOUT_ABSENT}
119
+ * @returns {number}
120
+ */
121
+ get hatAxis() {
122
+ return GAMEPAD_LAYOUT_ABSENT;
123
+ }
124
+
125
+ /**
126
+ * Whether this layout can be applied to the given device.
127
+ *
128
+ * Checked once when a pad connects rather than on every read. The same vendor and product can ship report
129
+ * descriptors that differ between firmware revisions - the browsers carry several layouts for the Xbox
130
+ * wireless pad alone for exactly this reason - and a layout that reaches past the end of what a device
131
+ * reports would otherwise write undefined into an axis and poison a stick with NaN.
132
+ *
133
+ * @param {Gamepad} source native gamepad snapshot
134
+ * @returns {boolean}
135
+ */
136
+ describes(source) {
137
+ return true;
138
+ }
139
+ }
140
+
141
+ /**
142
+ * No device input drives this standard input, so it reads as neutral and never fires.
143
+ *
144
+ * That is the same answer the standard mapping already gives for hardware that lacks a button, see
145
+ * {@link GamepadHandle#buttons} - absence is uniform rather than expressive.
146
+ *
147
+ * @readonly
148
+ * @type {number}
149
+ */
150
+ export const GAMEPAD_LAYOUT_ABSENT = -1;
151
+
152
+ /**
153
+ * The layout of a pad the browser has already put in the standard mapping: a bit-exact passthrough.
154
+ *
155
+ * Shared by every handle reading such a pad, and carries no state, so it must not be modified.
156
+ *
157
+ * @readonly
158
+ * @type {GamepadLayout}
159
+ */
160
+ export const GAMEPAD_STANDARD_LAYOUT = new GamepadLayout();
@@ -1,3 +1,13 @@
1
+ /**
2
+ * Value of {@link Gamepad#mapping} when the browser has already put the device in the standard layout.
3
+ *
4
+ * Any other value means it did not recognise the device and the indices mean whatever the device's HID report
5
+ * says, see {@link GamepadLayout}.
6
+ *
7
+ * @readonly
8
+ * @type {string}
9
+ */
10
+ export const GAMEPAD_MAPPING_STANDARD: string;
1
11
  /**
2
12
  * Number of buttons defined by the "standard" gamepad mapping
3
13
  * see https://w3c.github.io/gamepad/#remapping
@@ -1 +1 @@
1
- {"version":3,"file":"GamepadStandardMapping.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/GamepadStandardMapping.js"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,4CAFU,MAAM,CAEgC;AAEhD;;;;;;GAMG;AACH,0CAFU,MAAM,CAE6B"}
1
+ {"version":3,"file":"GamepadStandardMapping.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/GamepadStandardMapping.js"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,uCAFU,MAAM,CAEmC;AAEnD;;;;;;;;;GASG;AACH,4CAFU,MAAM,CAEgC;AAEhD;;;;;;GAMG;AACH,0CAFU,MAAM,CAE6B"}
@@ -1,3 +1,14 @@
1
+ /**
2
+ * Value of {@link Gamepad#mapping} when the browser has already put the device in the standard layout.
3
+ *
4
+ * Any other value means it did not recognise the device and the indices mean whatever the device's HID report
5
+ * says, see {@link GamepadLayout}.
6
+ *
7
+ * @readonly
8
+ * @type {string}
9
+ */
10
+ export const GAMEPAD_MAPPING_STANDARD = "standard";
11
+
1
12
  /**
2
13
  * Number of buttons defined by the "standard" gamepad mapping
3
14
  * see https://w3c.github.io/gamepad/#remapping
@@ -26,9 +26,13 @@ export class GamepadStick {
26
26
  */
27
27
  axisY: number;
28
28
  /**
29
- * Hardware value, exactly as reported.
29
+ * The hardware's own value for this stick, uncorrected.
30
30
  * A resting stick rarely reads (0,0) here, that is what {@link calibration} is for.
31
31
  *
32
+ * Uncorrected means the calibration has not been applied. Finding the stick is a separate question, and on
33
+ * a pad the browser did not recognise it is {@link GamepadHandle#layout} that answers it - the value here
34
+ * is still the hardware's, taken from whichever axes are actually this stick's.
35
+ *
32
36
  * @readonly
33
37
  * @type {Vector2}
34
38
  */
@@ -1 +1 @@
1
- {"version":3,"file":"GamepadStick.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/GamepadStick.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH;IAyDI;;;;OAIG;IACH,mBAHW,MAAM,SACN,MAAM,EAKhB;IA/DD;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;OAMG;IACH,cAFU,OAAO,CAEG;IAEpB;;;;;;;;;OASG;IACH,gBAFU,OAAO,CAEK;IAEtB;;;OAGG;IACH,sBAFU,uBAAuB,CAEW;IAE5C;;OAEG;IACH;QACI;;;WAGG;;MAEL;IAiBF;;;;;OAKG;IACH,aAHW,MAAM,EAAE,GACN,IAAI,CA0BhB;IAED;;;;;OAKG;IACH,SAFa,IAAI,CAMhB;IAED;;;;;;;;;;;OAWG;IACH,qBAFa,IAAI,CAUhB;;CAkBJ;oBAnKmB,kCAAkC;wCACd,8BAA8B"}
1
+ {"version":3,"file":"GamepadStick.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/GamepadStick.js"],"names":[],"mappings":"AAKA;;;;;;;;;GASG;AACH;IA6DI;;;;OAIG;IACH,mBAHW,MAAM,SACN,MAAM,EAKhB;IAnED;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;OAGG;IACH,OAFU,MAAM,CAEN;IAEV;;;;;;;;;;OAUG;IACH,cAFU,OAAO,CAEG;IAEpB;;;;;;;;;OASG;IACH,gBAFU,OAAO,CAEK;IAEtB;;;OAGG;IACH,sBAFU,uBAAuB,CAEW;IAE5C;;OAEG;IACH;QACI;;;WAGG;;MAEL;IAiBF;;;;;OAKG;IACH,aAHW,MAAM,EAAE,GACN,IAAI,CA0BhB;IAED;;;;;OAKG;IACH,SAFa,IAAI,CAMhB;IAED;;;;;;;;;;;OAWG;IACH,qBAFa,IAAI,CAUhB;;CAkBJ;oBAvKmB,kCAAkC;wCACd,8BAA8B"}
@@ -28,9 +28,13 @@ export class GamepadStick {
28
28
  axisY = 1;
29
29
 
30
30
  /**
31
- * Hardware value, exactly as reported.
31
+ * The hardware's own value for this stick, uncorrected.
32
32
  * A resting stick rarely reads (0,0) here, that is what {@link calibration} is for.
33
33
  *
34
+ * Uncorrected means the calibration has not been applied. Finding the stick is a separate question, and on
35
+ * a pad the browser did not recognise it is {@link GamepadHandle#layout} that answers it - the value here
36
+ * is still the hardware's, taken from whichever axes are actually this stick's.
37
+ *
34
38
  * @readonly
35
39
  * @type {Vector2}
36
40
  */
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Vendor and product of a device, as `vendor:product` in lower case, or an empty string when the id does not
3
+ * carry them.
4
+ *
5
+ * {@link Gamepad#id} is the only identity the Gamepad API exposes and its contents are explicitly
6
+ * browser-specific, so this reads the two formats that carry USB identifiers. Matching on hardware
7
+ * identifiers rather than on the whole string is what keeps an entry working when a browser changes the
8
+ * prose around them, and it is how the rest of the field does it - SDL's controller database is keyed on the
9
+ * same numbers.
10
+ *
11
+ * @param {string} id
12
+ * @returns {string}
13
+ */
14
+ export function gamepad_device_key(id: string): string;
15
+ /**
16
+ * The layout to read a device through.
17
+ *
18
+ * A pad the browser already mapped is passed through untouched, whatever the table says - it is the same
19
+ * hardware over a connection that was recognised, and translating it twice would break it. An unknown pad is
20
+ * also passed through: it is the only guess available, it is what this code has always done, and for the
21
+ * majority of pads that report a nearly standard order it is right.
22
+ *
23
+ * @param {Gamepad} source native gamepad snapshot
24
+ * @returns {GamepadLayout}
25
+ */
26
+ export function gamepad_layout_for_device(source: Gamepad): GamepadLayout;
27
+ //# sourceMappingURL=gamepad_layout_database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamepad_layout_database.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/gamepad_layout_database.js"],"names":[],"mappings":"AAkBA;;;;;;;;;;;;GAYG;AACH,uCAHW,MAAM,GACJ,MAAM,CAgBlB;AAkED;;;;;;;;;;GAUG;AACH,kDAHW,OAAO,iBAwBjB"}
@@ -0,0 +1,144 @@
1
+ import { GamepadAxes } from "./GamepadAxes.js";
2
+ import { GamepadButtons } from "./GamepadButtons.js";
3
+ import { GamepadDeviceLayout } from "./GamepadDeviceLayout.js";
4
+ import { GAMEPAD_STANDARD_LAYOUT } from "./GamepadLayout.js";
5
+ import { GAMEPAD_MAPPING_STANDARD } from "./GamepadStandardMapping.js";
6
+
7
+ /**
8
+ * Chrome names an unrecognised pad "Unknown Gamepad (Vendor: 045e Product: 0b13)"
9
+ * @type {RegExp}
10
+ */
11
+ const CHROME_IDENTITY = /vendor:\s*([0-9a-f]{4})\s+product:\s*([0-9a-f]{4})/i;
12
+
13
+ /**
14
+ * Firefox puts the same numbers first, as in "045e-0b13-Xbox Wireless Controller"
15
+ * @type {RegExp}
16
+ */
17
+ const FIREFOX_IDENTITY = /^([0-9a-f]{4})-([0-9a-f]{4})-/i;
18
+
19
+ /**
20
+ * Vendor and product of a device, as `vendor:product` in lower case, or an empty string when the id does not
21
+ * carry them.
22
+ *
23
+ * {@link Gamepad#id} is the only identity the Gamepad API exposes and its contents are explicitly
24
+ * browser-specific, so this reads the two formats that carry USB identifiers. Matching on hardware
25
+ * identifiers rather than on the whole string is what keeps an entry working when a browser changes the
26
+ * prose around them, and it is how the rest of the field does it - SDL's controller database is keyed on the
27
+ * same numbers.
28
+ *
29
+ * @param {string} id
30
+ * @returns {string}
31
+ */
32
+ export function gamepad_device_key(id) {
33
+ const chrome = CHROME_IDENTITY.exec(id);
34
+
35
+ if (chrome !== null) {
36
+ return `${chrome[1]}:${chrome[2]}`.toLowerCase();
37
+ }
38
+
39
+ const firefox = FIREFOX_IDENTITY.exec(id);
40
+
41
+ if (firefox !== null) {
42
+ return `${firefox[1]}:${firefox[2]}`.toLowerCase();
43
+ }
44
+
45
+ return "";
46
+ }
47
+
48
+ /**
49
+ * Xbox Wireless Controller, model 1914, connected over Bluetooth.
50
+ *
51
+ * The same pad over USB or the Xbox wireless adapter arrives already in the standard mapping and never reaches
52
+ * this layout. Over Bluetooth the browser reports the HID report's own order instead:
53
+ *
54
+ * axes 0 left stick x, 1 left stick y, 2 right stick x, 3 left trigger, 4 right trigger,
55
+ * 5 right stick y, 9 D-pad hat
56
+ * buttons 0 A, 1 B, 3 X, 4 Y, 6 LB, 7 RB, 10 view, 11 menu, 13 left stick, 14 right stick
57
+ *
58
+ * The triggers are the damaging part: they rest at -1, and axes 3 and 4 are where the standard mapping expects
59
+ * the right stick, so a game reading the right stick sees permanent full deflection until this layout is
60
+ * applied.
61
+ *
62
+ * Provenance, because these tables are only as good as the evidence behind them. The axis assignments and both
63
+ * trigger axes were established on the reporting device - the four stick axes are the only ones that carry
64
+ * sensor noise at rest, and the trigger axes are the only ones resting at exactly -1. The face and shoulder
65
+ * button indices were observed firing on that device, with 2 and 5 never firing, which is the blank-button
66
+ * pattern this report descriptor is known for. The remaining button indices and the hat follow the layout the
67
+ * browsers themselves carry for this family of pad.
68
+ *
69
+ * Buttons 2, 5, 8, 9 and 12 are reported by the device and are deliberately left unsourced: nothing here
70
+ * established what they are, and an unsourced button reads as released rather than as a guess.
71
+ *
72
+ * @returns {GamepadDeviceLayout}
73
+ */
74
+ function make_xbox_wireless_bluetooth_layout() {
75
+ return new GamepadDeviceLayout("Xbox Wireless Controller (Bluetooth)")
76
+ .readsAxisFrom(GamepadAxes.left_stick_x, 0)
77
+ .readsAxisFrom(GamepadAxes.left_stick_y, 1)
78
+ .readsAxisFrom(GamepadAxes.right_stick_x, 2)
79
+ .readsAxisFrom(GamepadAxes.right_stick_y, 5)
80
+
81
+ .readsButtonFrom(GamepadButtons.a, 0)
82
+ .readsButtonFrom(GamepadButtons.b, 1)
83
+ .readsButtonFrom(GamepadButtons.x, 3)
84
+ .readsButtonFrom(GamepadButtons.y, 4)
85
+ .readsButtonFrom(GamepadButtons.left_bumper, 6)
86
+ .readsButtonFrom(GamepadButtons.right_bumper, 7)
87
+ .readsButtonFrom(GamepadButtons.back, 10)
88
+ .readsButtonFrom(GamepadButtons.start, 11)
89
+ .readsButtonFrom(GamepadButtons.left_stick, 13)
90
+ .readsButtonFrom(GamepadButtons.right_stick, 14)
91
+
92
+ .readsButtonFromAxis(GamepadButtons.left_trigger, 3)
93
+ .readsButtonFromAxis(GamepadButtons.right_trigger, 4)
94
+
95
+ .readsDpadFromHatAxis(9);
96
+ }
97
+
98
+ /**
99
+ * Layouts for devices the browsers do not put in the standard mapping, keyed by {@link gamepad_device_key}.
100
+ *
101
+ * Small on purpose. Every stack that talks to gamepads ends up carrying a table like this - the browsers carry
102
+ * one per platform, SDL ships thousands of lines of it - because there is no way to derive a device's layout
103
+ * from what the Gamepad API exposes. Entries are added when a device has been observed, not in anticipation.
104
+ *
105
+ * @readonly
106
+ * @type {Map<string, GamepadDeviceLayout>}
107
+ */
108
+ const LAYOUTS = new Map([
109
+ ["045e:0b13", make_xbox_wireless_bluetooth_layout()]
110
+ ]);
111
+
112
+ /**
113
+ * The layout to read a device through.
114
+ *
115
+ * A pad the browser already mapped is passed through untouched, whatever the table says - it is the same
116
+ * hardware over a connection that was recognised, and translating it twice would break it. An unknown pad is
117
+ * also passed through: it is the only guess available, it is what this code has always done, and for the
118
+ * majority of pads that report a nearly standard order it is right.
119
+ *
120
+ * @param {Gamepad} source native gamepad snapshot
121
+ * @returns {GamepadLayout}
122
+ */
123
+ export function gamepad_layout_for_device(source) {
124
+ if (source.mapping === GAMEPAD_MAPPING_STANDARD) {
125
+ return GAMEPAD_STANDARD_LAYOUT;
126
+ }
127
+
128
+ const layout = LAYOUTS.get(gamepad_device_key(source.id));
129
+
130
+ if (layout === undefined) {
131
+ return GAMEPAD_STANDARD_LAYOUT;
132
+ }
133
+
134
+ /*
135
+ Vendor and product do not pin down a report descriptor - firmware revisions of this very pad differ, which
136
+ is why the browsers carry several layouts for it - so an entry that reaches past what the device reports
137
+ is the wrong entry rather than a usable one
138
+ */
139
+ if (!layout.describes(source)) {
140
+ return GAMEPAD_STANDARD_LAYOUT;
141
+ }
142
+
143
+ return layout;
144
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Decode a D-pad reported as a HID hat switch on an axis.
3
+ *
4
+ * A hat is a single control with eight positions and a null state, so a browser that has not recognised the
5
+ * pad normalizes those eight positions evenly over [-1,1] - `-1` is up and the value increases clockwise to
6
+ * `+1` at up-and-left. The null state sits outside the switch's logical range, so a centred hat normalizes
7
+ * outside [-1,1] entirely; devices have been seen reporting values in the billions for it. Some report exactly
8
+ * `0` before their first real report, which is unambiguous because no hat position lands on zero.
9
+ *
10
+ * @param {number} value raw axis value
11
+ * @returns {number} bit field of {@link GamepadHatDirection}
12
+ */
13
+ export function gamepad_read_hat_axis(value: number): number;
14
+ /**
15
+ * D-pad directions, as a bit field so one value can carry the diagonals
16
+ */
17
+ export type GamepadHatDirection = number;
18
+ export namespace GamepadHatDirection {
19
+ let none: number;
20
+ let up: number;
21
+ let right: number;
22
+ let down: number;
23
+ let left: number;
24
+ }
25
+ //# sourceMappingURL=gamepad_read_hat_axis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamepad_read_hat_axis.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/input/devices/gamepad/gamepad_read_hat_axis.js"],"names":[],"mappings":"AAwCA;;;;;;;;;;;GAWG;AACH,6CAHW,MAAM,GACJ,MAAM,CAUlB;;;;kCAzDS,MAAM"}