@woosh/meep-engine 2.138.20 → 2.139.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 (491) hide show
  1. package/package.json +1 -1
  2. package/src/core/collection/PairUint32Map.d.ts +100 -0
  3. package/src/core/collection/PairUint32Map.d.ts.map +1 -0
  4. package/src/core/collection/PairUint32Map.js +321 -0
  5. package/src/core/collection/Uint32Map.d.ts +119 -0
  6. package/src/core/collection/Uint32Map.d.ts.map +1 -0
  7. package/src/core/collection/Uint32Map.js +345 -0
  8. package/src/core/collection/array/array_shuffle.d.ts +10 -3
  9. package/src/core/collection/array/array_shuffle.d.ts.map +1 -1
  10. package/src/core/collection/array/array_shuffle.js +27 -22
  11. package/src/core/collection/heap/FibonacciHeap.d.ts +195 -0
  12. package/src/core/collection/heap/FibonacciHeap.d.ts.map +1 -0
  13. package/src/core/collection/heap/FibonacciHeap.js +586 -0
  14. package/src/core/collection/heap/Uint32Heap.js +1 -1
  15. package/src/core/collection/heap/Uint32Heap4.d.ts +169 -0
  16. package/src/core/collection/heap/Uint32Heap4.d.ts.map +1 -0
  17. package/src/core/collection/heap/Uint32Heap4.js +490 -0
  18. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts +27 -0
  19. package/src/core/geom/3d/line/line3_closest_points_segment_segment.d.ts.map +1 -0
  20. package/src/core/geom/3d/line/line3_closest_points_segment_segment.js +88 -0
  21. package/src/core/geom/3d/shape/BoxShape3D.d.ts +61 -0
  22. package/src/core/geom/3d/shape/BoxShape3D.d.ts.map +1 -0
  23. package/src/core/geom/3d/shape/BoxShape3D.js +158 -0
  24. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts +11 -0
  25. package/src/core/geom/3d/shape/CapsuleShape3D.d.ts.map +1 -1
  26. package/src/core/geom/3d/shape/CapsuleShape3D.js +12 -0
  27. package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts +37 -9
  28. package/src/core/geom/3d/shape/UnitCubeShape3D.d.ts.map +1 -1
  29. package/src/core/geom/3d/shape/UnitCubeShape3D.js +45 -98
  30. package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts +10 -0
  31. package/src/core/geom/3d/shape/UnitSphereShape3D.d.ts.map +1 -1
  32. package/src/core/geom/3d/shape/UnitSphereShape3D.js +11 -0
  33. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts +61 -0
  34. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.d.ts.map +1 -0
  35. package/src/core/geom/3d/shape/util/shape3d_voxelize_to_grid.js +148 -0
  36. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts +39 -0
  37. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.d.ts.map +1 -0
  38. package/src/core/geom/3d/tetrahedra/compute_tetrahedral_mesh_from_surface.js +147 -0
  39. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts +15 -0
  40. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.d.ts.map +1 -0
  41. package/src/core/geom/3d/tetrahedra/compute_tetrahedron_quality.js +22 -0
  42. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts +2 -0
  43. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.d.ts.map +1 -0
  44. package/src/core/geom/3d/tetrahedra/prototype_tetrahedrize_mesh.js +673 -0
  45. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts +26 -0
  46. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.d.ts.map +1 -0
  47. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_carve_outside_surface.js +222 -0
  48. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts +34 -0
  49. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.d.ts.map +1 -0
  50. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_find_tets_around_edge.js +146 -0
  51. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts +36 -0
  52. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.d.ts.map +1 -0
  53. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_23.js +232 -0
  54. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts +33 -0
  55. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.d.ts.map +1 -0
  56. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_flip_32.js +255 -0
  57. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts +68 -0
  58. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.d.ts.map +1 -0
  59. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_improve_quality.js +365 -0
  60. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts +31 -0
  61. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.d.ts.map +1 -0
  62. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_smooth_vertex.js +112 -0
  63. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts +22 -0
  64. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.d.ts.map +1 -0
  65. package/src/core/geom/3d/tetrahedra/tetrahedral_mesh_vertex_is_boundary.js +55 -0
  66. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts +32 -0
  67. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.d.ts.map +1 -0
  68. package/src/core/geom/3d/tetrahedra/tetrahedron_compute_quality.js +66 -0
  69. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts +22 -0
  70. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.d.ts.map +1 -1
  71. package/src/core/geom/3d/topology/struct/binary/BinaryElementPool.js +49 -0
  72. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts +134 -0
  73. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.d.ts.map +1 -1
  74. package/src/core/geom/3d/topology/struct/binary/BinaryTopology.js +276 -3
  75. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts +17 -0
  76. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.d.ts.map +1 -0
  77. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_close_boundary_holes.js +135 -0
  78. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts +14 -0
  79. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.d.ts.map +1 -0
  80. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_compact.js +177 -0
  81. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.d.ts.map +1 -1
  82. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_face_decouple.js +20 -4
  83. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.d.ts.map +1 -1
  84. package/src/core/geom/3d/topology/struct/binary/io/bt_mesh_simplify.js +5 -3
  85. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.d.ts.map +1 -1
  86. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_create.js +9 -0
  87. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.d.ts.map +1 -1
  88. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_get_or_create.js +21 -45
  89. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.d.ts.map +1 -1
  90. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill.js +7 -1
  91. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts +8 -6
  92. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.d.ts.map +1 -1
  93. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_edge_kill_parallels.js +8 -6
  94. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts +22 -0
  95. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.d.ts.map +1 -0
  96. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_kill_short_edges.js +73 -0
  97. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.d.ts.map +1 -1
  98. package/src/core/geom/3d/topology/struct/binary/io/vertex/bt_vertex_replace.js +51 -1
  99. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts +10 -0
  100. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.d.ts.map +1 -0
  101. package/src/core/geom/3d/topology/struct/binary/query/bt_edge_get.js +42 -0
  102. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts +28 -0
  103. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.d.ts.map +1 -0
  104. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_sample_interior_grid_points.js +227 -0
  105. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts +13 -0
  106. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.d.ts.map +1 -0
  107. package/src/core/geom/3d/topology/struct/binary/query/bt_mesh_walk_boundary_loops.js +108 -0
  108. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts +11 -0
  109. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.d.ts.map +1 -0
  110. package/src/core/geom/3d/topology/struct/binary/query/bt_query_edge_is_boundary.js +20 -0
  111. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts +20 -0
  112. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.d.ts.map +1 -0
  113. package/src/core/geom/3d/triangle/triangle_mesh_compute_signed_volume.js +38 -0
  114. package/src/core/graph/csr/CSRGraph.d.ts +168 -0
  115. package/src/core/graph/csr/CSRGraph.d.ts.map +1 -0
  116. package/src/core/graph/csr/CSRGraph.js +319 -0
  117. package/src/core/graph/metis/cluster_mesh_metis.d.ts +12 -0
  118. package/src/core/graph/metis/cluster_mesh_metis.d.ts.map +1 -1
  119. package/src/core/graph/metis/cluster_mesh_metis.js +12 -0
  120. package/src/core/graph/metis/metis.d.ts +19 -0
  121. package/src/core/graph/metis/metis.d.ts.map +1 -1
  122. package/src/core/graph/metis/metis.js +20 -0
  123. package/src/core/graph/metis/metis_cluster_bs.d.ts +11 -0
  124. package/src/core/graph/metis/metis_cluster_bs.d.ts.map +1 -1
  125. package/src/core/graph/metis/metis_cluster_bs.js +11 -0
  126. package/src/core/graph/metis/metis_options.d.ts +17 -2
  127. package/src/core/graph/metis/metis_options.d.ts.map +1 -1
  128. package/src/core/graph/metis/metis_options.js +17 -2
  129. package/src/core/graph/metis/native/MetisGraph.d.ts +144 -0
  130. package/src/core/graph/metis/native/MetisGraph.d.ts.map +1 -0
  131. package/src/core/graph/metis/native/MetisGraph.js +212 -0
  132. package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts +72 -0
  133. package/src/core/graph/metis/native/bisection/BisectionScratch.d.ts.map +1 -0
  134. package/src/core/graph/metis/native/bisection/BisectionScratch.js +101 -0
  135. package/src/core/graph/metis/native/bisection/bisect_graph.d.ts +37 -0
  136. package/src/core/graph/metis/native/bisection/bisect_graph.d.ts.map +1 -0
  137. package/src/core/graph/metis/native/bisection/bisect_graph.js +100 -0
  138. package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts +15 -0
  139. package/src/core/graph/metis/native/bisection/compute_2way_params.d.ts.map +1 -0
  140. package/src/core/graph/metis/native/bisection/compute_2way_params.js +84 -0
  141. package/src/core/graph/metis/native/bisection/fm_2way.d.ts +30 -0
  142. package/src/core/graph/metis/native/bisection/fm_2way.d.ts.map +1 -0
  143. package/src/core/graph/metis/native/bisection/fm_2way.js +290 -0
  144. package/src/core/graph/metis/native/bisection/grow_bisection.d.ts +23 -0
  145. package/src/core/graph/metis/native/bisection/grow_bisection.d.ts.map +1 -0
  146. package/src/core/graph/metis/native/bisection/grow_bisection.js +137 -0
  147. package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts +28 -0
  148. package/src/core/graph/metis/native/bisection/split_graph_two_way.d.ts.map +1 -0
  149. package/src/core/graph/metis/native/bisection/split_graph_two_way.js +119 -0
  150. package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts +20 -0
  151. package/src/core/graph/metis/native/coarsen/coarsen_graph.d.ts.map +1 -0
  152. package/src/core/graph/metis/native/coarsen/coarsen_graph.js +94 -0
  153. package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts +24 -0
  154. package/src/core/graph/metis/native/coarsen/create_coarse_graph.d.ts.map +1 -0
  155. package/src/core/graph/metis/native/coarsen/create_coarse_graph.js +158 -0
  156. package/src/core/graph/metis/native/coarsen/match_shem.d.ts +41 -0
  157. package/src/core/graph/metis/native/coarsen/match_shem.d.ts.map +1 -0
  158. package/src/core/graph/metis/native/coarsen/match_shem.js +175 -0
  159. package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts +24 -0
  160. package/src/core/graph/metis/native/initial/initial_kway_bfs.d.ts.map +1 -0
  161. package/src/core/graph/metis/native/initial/initial_kway_bfs.js +122 -0
  162. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts +29 -0
  163. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.d.ts.map +1 -0
  164. package/src/core/graph/metis/native/initial/initial_kway_recursive_bisection.js +170 -0
  165. package/src/core/graph/metis/native/metis_partition_kway.d.ts +41 -0
  166. package/src/core/graph/metis/native/metis_partition_kway.d.ts.map +1 -0
  167. package/src/core/graph/metis/native/metis_partition_kway.js +126 -0
  168. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts +62 -0
  169. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.d.ts.map +1 -0
  170. package/src/core/graph/metis/native/refine/IndexedFloatMaxHeap.js +261 -0
  171. package/src/core/graph/metis/native/refine/RefinementScratch.d.ts +45 -0
  172. package/src/core/graph/metis/native/refine/RefinementScratch.d.ts.map +1 -0
  173. package/src/core/graph/metis/native/refine/RefinementScratch.js +53 -0
  174. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts +18 -0
  175. package/src/core/graph/metis/native/refine/compute_kway_params.d.ts.map +1 -0
  176. package/src/core/graph/metis/native/refine/compute_kway_params.js +138 -0
  177. package/src/core/graph/metis/native/refine/fm_kway.d.ts +63 -0
  178. package/src/core/graph/metis/native/refine/fm_kway.d.ts.map +1 -0
  179. package/src/core/graph/metis/native/refine/fm_kway.js +462 -0
  180. package/src/core/graph/metis/native/refine/project_kway.d.ts +22 -0
  181. package/src/core/graph/metis/native/refine/project_kway.d.ts.map +1 -0
  182. package/src/core/graph/metis/native/refine/project_kway.js +43 -0
  183. package/src/core/graph/metis/native/refine/refine_kway.d.ts +34 -0
  184. package/src/core/graph/metis/native/refine/refine_kway.d.ts.map +1 -0
  185. package/src/core/graph/metis/native/refine/refine_kway.js +43 -0
  186. package/src/core/math/linalg/eigen/matrix_householder_in_place.d.ts +2 -2
  187. package/src/core/math/linalg/eigen/matrix_householder_in_place.js +2 -2
  188. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts +6 -4
  189. package/src/core/math/linalg/eigen/matrix_qr_in_place.d.ts.map +1 -1
  190. package/src/core/math/linalg/eigen/matrix_qr_in_place.js +69 -23
  191. package/src/engine/EngineHarness.d.ts +3 -1
  192. package/src/engine/EngineHarness.d.ts.map +1 -1
  193. package/src/engine/EngineHarness.js +3 -0
  194. package/src/engine/control/first-person/DESIGN.md +30 -6
  195. package/src/engine/control/first-person/DESIGN_EXTENSIONS.md +563 -0
  196. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts +102 -9
  197. package/src/engine/control/first-person/FirstPersonPlayerController.d.ts.map +1 -1
  198. package/src/engine/control/first-person/FirstPersonPlayerController.js +38 -3
  199. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts +533 -4
  200. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.d.ts.map +1 -1
  201. package/src/engine/control/first-person/FirstPersonPlayerControllerConfig.js +315 -6
  202. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts +220 -22
  203. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.d.ts.map +1 -1
  204. package/src/engine/control/first-person/FirstPersonPlayerControllerSystem.js +858 -241
  205. package/src/engine/control/first-person/TODO.md +127 -0
  206. package/src/engine/control/first-person/abilities/Ability.d.ts +101 -0
  207. package/src/engine/control/first-person/abilities/Ability.d.ts.map +1 -0
  208. package/src/engine/control/first-person/abilities/Ability.js +119 -0
  209. package/src/engine/control/first-person/abilities/AbilitySet.d.ts +86 -0
  210. package/src/engine/control/first-person/abilities/AbilitySet.d.ts.map +1 -0
  211. package/src/engine/control/first-person/abilities/AbilitySet.js +185 -0
  212. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts +62 -0
  213. package/src/engine/control/first-person/abilities/LedgeGrab.d.ts.map +1 -0
  214. package/src/engine/control/first-person/abilities/LedgeGrab.js +199 -0
  215. package/src/engine/control/first-person/abilities/Mantle.d.ts +45 -0
  216. package/src/engine/control/first-person/abilities/Mantle.d.ts.map +1 -0
  217. package/src/engine/control/first-person/abilities/Mantle.js +188 -0
  218. package/src/engine/control/first-person/abilities/Slide.d.ts +33 -0
  219. package/src/engine/control/first-person/abilities/Slide.d.ts.map +1 -0
  220. package/src/engine/control/first-person/abilities/Slide.js +158 -0
  221. package/src/engine/control/first-person/abilities/WallJump.d.ts +45 -0
  222. package/src/engine/control/first-person/abilities/WallJump.d.ts.map +1 -0
  223. package/src/engine/control/first-person/abilities/WallJump.js +131 -0
  224. package/src/engine/control/first-person/abilities/WallRun.d.ts +44 -0
  225. package/src/engine/control/first-person/abilities/WallRun.d.ts.map +1 -0
  226. package/src/engine/control/first-person/abilities/WallRun.js +180 -0
  227. package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts +49 -0
  228. package/src/engine/control/first-person/composer/EyeOffsetStack.d.ts.map +1 -0
  229. package/src/engine/control/first-person/composer/EyeOffsetStack.js +60 -0
  230. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts +100 -0
  231. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.d.ts.map +1 -0
  232. package/src/engine/control/first-person/mastery/BreathRhythmEvaluator.js +133 -0
  233. package/src/engine/control/first-person/mastery/DecisionPoint.d.ts +10 -0
  234. package/src/engine/control/first-person/mastery/DecisionPoint.d.ts.map +1 -0
  235. package/src/engine/control/first-person/mastery/DecisionPoint.js +30 -0
  236. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts +61 -0
  237. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.d.ts.map +1 -0
  238. package/src/engine/control/first-person/mastery/FootAsymmetryTurnEvaluator.js +109 -0
  239. package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts +40 -0
  240. package/src/engine/control/first-person/mastery/MasteryEvaluator.d.ts.map +1 -0
  241. package/src/engine/control/first-person/mastery/MasteryEvaluator.js +45 -0
  242. package/src/engine/control/first-person/mastery/MasteryScore.d.ts +68 -0
  243. package/src/engine/control/first-person/mastery/MasteryScore.d.ts.map +1 -0
  244. package/src/engine/control/first-person/mastery/MasteryScore.js +100 -0
  245. package/src/engine/control/first-person/mastery/MasterySet.d.ts +60 -0
  246. package/src/engine/control/first-person/mastery/MasterySet.d.ts.map +1 -0
  247. package/src/engine/control/first-person/mastery/MasterySet.js +86 -0
  248. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts +58 -0
  249. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.d.ts.map +1 -0
  250. package/src/engine/control/first-person/mastery/SlideInitiationTimingEvaluator.js +83 -0
  251. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts +69 -0
  252. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.d.ts.map +1 -0
  253. package/src/engine/control/first-person/mastery/StrideTimingJumpEvaluator.js +109 -0
  254. package/src/engine/control/first-person/math/Spring.d.ts +56 -0
  255. package/src/engine/control/first-person/math/Spring.d.ts.map +1 -0
  256. package/src/engine/control/first-person/math/Spring.js +71 -0
  257. package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts +26 -0
  258. package/src/engine/control/first-person/math/computeLRCBreathRate.d.ts.map +1 -0
  259. package/src/engine/control/first-person/math/computeLRCBreathRate.js +41 -0
  260. package/src/engine/control/first-person/math/computeMassRatios.d.ts +35 -0
  261. package/src/engine/control/first-person/math/computeMassRatios.d.ts.map +1 -0
  262. package/src/engine/control/first-person/math/computeMassRatios.js +44 -0
  263. package/src/engine/control/first-person/pose/FirstPersonPose.d.ts +31 -1
  264. package/src/engine/control/first-person/pose/FirstPersonPose.d.ts.map +1 -1
  265. package/src/engine/control/first-person/pose/FirstPersonPose.js +49 -3
  266. package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts +7 -0
  267. package/src/engine/control/first-person/pose/FirstPersonPosture.d.ts.map +1 -0
  268. package/src/engine/control/first-person/pose/FirstPersonPosture.js +27 -0
  269. package/src/engine/control/first-person/prototype_first_person_controller.js +550 -119
  270. package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts +58 -0
  271. package/src/engine/control/first-person/sensors/FirstPersonSensors.d.ts.map +1 -0
  272. package/src/engine/control/first-person/sensors/FirstPersonSensors.js +77 -0
  273. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts +80 -0
  274. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.d.ts.map +1 -0
  275. package/src/engine/control/first-person/sensors/FirstPersonSensorsSystem.js +196 -0
  276. package/src/engine/control/first-person/test/buildTestPlayer.d.ts +20 -0
  277. package/src/engine/control/first-person/test/buildTestPlayer.d.ts.map +1 -0
  278. package/src/engine/control/first-person/test/buildTestPlayer.js +28 -0
  279. package/src/engine/graphics/camera/testClippingPlaneComputation.js +0 -2
  280. package/src/engine/graphics/ecs/light/Light.d.ts.map +1 -1
  281. package/src/engine/graphics/ecs/light/Light.js +27 -0
  282. package/src/engine/graphics/ecs/light/LightSystem.js +1 -1
  283. package/src/engine/graphics/ecs/path/PathDisplaySystem.d.ts.map +1 -1
  284. package/src/engine/graphics/ecs/path/testPathDisplaySystem.js +0 -2
  285. package/src/engine/graphics/ecs/path/tube/prototypeAnimatedPathMask.js +0 -2
  286. package/src/engine/graphics/render/buffer/buffers/prototypeNormalFrameBuffer.js +0 -2
  287. package/src/engine/graphics/render/forward_plus/plugin/ptototypeFPPlugin.js +0 -2
  288. package/src/engine/graphics/render/visibility/hiz/prototypeHiZ.js +0 -2
  289. package/src/engine/navigation/grid/find_path_on_grid_astar.d.ts.map +1 -1
  290. package/src/engine/navigation/grid/find_path_on_grid_astar.js +11 -2
  291. package/src/engine/navigation/mesh/bt_mesh_face_find_path.d.ts.map +1 -1
  292. package/src/engine/navigation/mesh/bt_mesh_face_find_path.js +11 -1
  293. package/src/engine/physics/PLAN.md +236 -0
  294. package/src/engine/physics/body/BodyStorage.d.ts +187 -0
  295. package/src/engine/physics/body/BodyStorage.d.ts.map +1 -0
  296. package/src/engine/physics/body/BodyStorage.js +427 -0
  297. package/src/engine/physics/broadphase/PairList.d.ts +62 -0
  298. package/src/engine/physics/broadphase/PairList.d.ts.map +1 -0
  299. package/src/engine/physics/broadphase/PairList.js +97 -0
  300. package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts +30 -0
  301. package/src/engine/physics/broadphase/aabb_transform_oriented.d.ts.map +1 -0
  302. package/src/engine/physics/broadphase/aabb_transform_oriented.js +93 -0
  303. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts +16 -0
  304. package/src/engine/physics/broadphase/compute_fat_world_aabb.d.ts.map +1 -0
  305. package/src/engine/physics/broadphase/compute_fat_world_aabb.js +61 -0
  306. package/src/engine/physics/broadphase/generate_pairs.d.ts +38 -0
  307. package/src/engine/physics/broadphase/generate_pairs.d.ts.map +1 -0
  308. package/src/engine/physics/broadphase/generate_pairs.js +101 -0
  309. package/src/engine/physics/contact/ManifoldStore.d.ts +226 -0
  310. package/src/engine/physics/contact/ManifoldStore.d.ts.map +1 -0
  311. package/src/engine/physics/contact/ManifoldStore.js +499 -0
  312. package/src/engine/physics/ecs/BodyKind.d.ts +23 -0
  313. package/src/engine/physics/ecs/BodyKind.d.ts.map +1 -0
  314. package/src/engine/physics/ecs/BodyKind.js +24 -0
  315. package/src/engine/physics/ecs/Collider.d.ts +98 -0
  316. package/src/engine/physics/ecs/Collider.d.ts.map +1 -0
  317. package/src/engine/physics/ecs/Collider.js +136 -0
  318. package/src/engine/physics/ecs/ColliderFlags.d.ts +14 -0
  319. package/src/engine/physics/ecs/ColliderFlags.d.ts.map +1 -0
  320. package/src/engine/physics/ecs/ColliderFlags.js +15 -0
  321. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts +58 -0
  322. package/src/engine/physics/ecs/ColliderObserverSystem.d.ts.map +1 -0
  323. package/src/engine/physics/ecs/ColliderObserverSystem.js +103 -0
  324. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts +25 -0
  325. package/src/engine/physics/ecs/ColliderSerializationAdapter.d.ts.map +1 -0
  326. package/src/engine/physics/ecs/ColliderSerializationAdapter.js +37 -0
  327. package/src/engine/physics/ecs/PhysicsEvents.d.ts +15 -0
  328. package/src/engine/physics/ecs/PhysicsEvents.d.ts.map +1 -0
  329. package/src/engine/physics/ecs/PhysicsEvents.js +16 -0
  330. package/src/engine/physics/ecs/PhysicsSystem.d.ts +520 -0
  331. package/src/engine/physics/ecs/PhysicsSystem.d.ts.map +1 -0
  332. package/src/engine/physics/ecs/PhysicsSystem.js +1159 -0
  333. package/src/engine/physics/ecs/RigidBody.d.ts +197 -0
  334. package/src/engine/physics/ecs/RigidBody.d.ts.map +1 -0
  335. package/src/engine/physics/ecs/RigidBody.js +240 -0
  336. package/src/engine/physics/ecs/RigidBodyFlags.d.ts +21 -0
  337. package/src/engine/physics/ecs/RigidBodyFlags.d.ts.map +1 -0
  338. package/src/engine/physics/ecs/RigidBodyFlags.js +22 -0
  339. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts +28 -0
  340. package/src/engine/physics/ecs/RigidBodySerializationAdapter.d.ts.map +1 -0
  341. package/src/engine/physics/ecs/RigidBodySerializationAdapter.js +81 -0
  342. package/src/engine/physics/ecs/SleepState.d.ts +11 -0
  343. package/src/engine/physics/ecs/SleepState.d.ts.map +1 -0
  344. package/src/engine/physics/ecs/SleepState.js +12 -0
  345. package/src/engine/physics/events/ContactEventBuffer.d.ts +46 -0
  346. package/src/engine/physics/events/ContactEventBuffer.d.ts.map +1 -0
  347. package/src/engine/physics/events/ContactEventBuffer.js +83 -0
  348. package/src/engine/physics/events/diff_manifolds.d.ts +25 -0
  349. package/src/engine/physics/events/diff_manifolds.d.ts.map +1 -0
  350. package/src/engine/physics/events/diff_manifolds.js +50 -0
  351. package/src/engine/physics/fluid/FluidField.d.ts +294 -16
  352. package/src/engine/physics/fluid/FluidField.d.ts.map +1 -1
  353. package/src/engine/physics/fluid/FluidField.js +510 -66
  354. package/src/engine/physics/fluid/FluidSimulator.d.ts +188 -5
  355. package/src/engine/physics/fluid/FluidSimulator.d.ts.map +1 -1
  356. package/src/engine/physics/fluid/FluidSimulator.js +455 -95
  357. package/src/engine/physics/fluid/SliceVisualiser.d.ts +29 -6
  358. package/src/engine/physics/fluid/SliceVisualiser.d.ts.map +1 -1
  359. package/src/engine/physics/fluid/SliceVisualiser.js +190 -165
  360. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts +154 -0
  361. package/src/engine/physics/fluid/ecs/FluidComponent.d.ts.map +1 -0
  362. package/src/engine/physics/fluid/ecs/FluidComponent.js +238 -0
  363. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts +45 -0
  364. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.d.ts.map +1 -0
  365. package/src/engine/physics/fluid/ecs/FluidEffectorsComponent.js +89 -0
  366. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts +107 -0
  367. package/src/engine/physics/fluid/ecs/FluidSystem.d.ts.map +1 -0
  368. package/src/engine/physics/fluid/ecs/FluidSystem.js +278 -0
  369. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts +62 -1
  370. package/src/engine/physics/fluid/effector/AbstractFluidEffector.d.ts.map +1 -1
  371. package/src/engine/physics/fluid/effector/AbstractFluidEffector.js +81 -6
  372. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts +17 -4
  373. package/src/engine/physics/fluid/effector/GlobalFluidEffector.d.ts.map +1 -1
  374. package/src/engine/physics/fluid/effector/GlobalFluidEffector.js +105 -12
  375. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts +43 -0
  376. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.d.ts.map +1 -0
  377. package/src/engine/physics/fluid/effector/ImpulseFluidEffector.js +210 -0
  378. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts +62 -1
  379. package/src/engine/physics/fluid/effector/WakeFluidEffector.d.ts.map +1 -1
  380. package/src/engine/physics/fluid/effector/WakeFluidEffector.js +302 -8
  381. package/src/engine/physics/fluid/prototype.js +102 -91
  382. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts +33 -0
  383. package/src/engine/physics/fluid/solver/optimal_sor_omega.d.ts.map +1 -0
  384. package/src/engine/physics/fluid/solver/optimal_sor_omega.js +41 -0
  385. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts +20 -5
  386. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.d.ts.map +1 -1
  387. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_forward.js +60 -38
  388. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts +25 -4
  389. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.d.ts.map +1 -1
  390. package/src/engine/physics/fluid/solver/v3_grid_apply_diffusion.js +93 -73
  391. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts +23 -0
  392. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.d.ts.map +1 -0
  393. package/src/engine/physics/fluid/solver/v3_grid_apply_scalar_advection.js +60 -0
  394. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts +23 -0
  395. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.d.ts.map +1 -0
  396. package/src/engine/physics/fluid/solver/v3_grid_compute_divergence.js +68 -0
  397. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts +30 -0
  398. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.d.ts.map +1 -0
  399. package/src/engine/physics/fluid/solver/v3_grid_compute_solid_neighbour_mask.js +66 -0
  400. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts +26 -0
  401. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.d.ts.map +1 -0
  402. package/src/engine/physics/fluid/solver/v3_grid_patch_edges_uniform.js +113 -0
  403. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts +30 -0
  404. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.d.ts.map +1 -0
  405. package/src/engine/physics/fluid/solver/v3_grid_shift_in_place.js +107 -0
  406. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts +49 -0
  407. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.d.ts.map +1 -0
  408. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure.js +126 -0
  409. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts +93 -0
  410. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.d.ts.map +1 -0
  411. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_pcg.js +424 -0
  412. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts +20 -0
  413. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.d.ts.map +1 -0
  414. package/src/engine/physics/fluid/solver/v3_grid_solve_pressure_unmasked_legacy.js +83 -0
  415. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts +26 -0
  416. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.d.ts.map +1 -0
  417. package/src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js +70 -0
  418. package/src/engine/physics/gjk/expanding_polytope_algorithm.d.ts.map +1 -1
  419. package/src/engine/physics/gjk/expanding_polytope_algorithm.js +8 -10
  420. package/src/engine/physics/inertia/world_inverse_inertia.d.ts +29 -0
  421. package/src/engine/physics/inertia/world_inverse_inertia.d.ts.map +1 -0
  422. package/src/engine/physics/inertia/world_inverse_inertia.js +79 -0
  423. package/src/engine/physics/integration/integrate_position.d.ts +16 -0
  424. package/src/engine/physics/integration/integrate_position.d.ts.map +1 -0
  425. package/src/engine/physics/integration/integrate_position.js +48 -0
  426. package/src/engine/physics/integration/integrate_velocity.d.ts +25 -0
  427. package/src/engine/physics/integration/integrate_velocity.d.ts.map +1 -0
  428. package/src/engine/physics/integration/integrate_velocity.js +79 -0
  429. package/src/engine/physics/integration/quat_integrate.d.ts +27 -0
  430. package/src/engine/physics/integration/quat_integrate.d.ts.map +1 -0
  431. package/src/engine/physics/integration/quat_integrate.js +62 -0
  432. package/src/engine/physics/island/IslandBuilder.d.ts +167 -0
  433. package/src/engine/physics/island/IslandBuilder.d.ts.map +1 -0
  434. package/src/engine/physics/island/IslandBuilder.js +411 -0
  435. package/src/engine/physics/island/union_find.d.ts +51 -0
  436. package/src/engine/physics/island/union_find.d.ts.map +1 -0
  437. package/src/engine/physics/island/union_find.js +76 -0
  438. package/src/engine/physics/narrowphase/PosedShape.d.ts +59 -0
  439. package/src/engine/physics/narrowphase/PosedShape.d.ts.map +1 -0
  440. package/src/engine/physics/narrowphase/PosedShape.js +110 -0
  441. package/src/engine/physics/narrowphase/box_box_manifold.d.ts +32 -0
  442. package/src/engine/physics/narrowphase/box_box_manifold.d.ts.map +1 -0
  443. package/src/engine/physics/narrowphase/box_box_manifold.js +543 -0
  444. package/src/engine/physics/narrowphase/capsule_contacts.d.ts +122 -0
  445. package/src/engine/physics/narrowphase/capsule_contacts.d.ts.map +1 -0
  446. package/src/engine/physics/narrowphase/capsule_contacts.js +508 -0
  447. package/src/engine/physics/narrowphase/narrowphase_step.d.ts +11 -0
  448. package/src/engine/physics/narrowphase/narrowphase_step.d.ts.map +1 -0
  449. package/src/engine/physics/narrowphase/narrowphase_step.js +382 -0
  450. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts +38 -0
  451. package/src/engine/physics/narrowphase/sphere_box_contact.d.ts.map +1 -0
  452. package/src/engine/physics/narrowphase/sphere_box_contact.js +130 -0
  453. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts +26 -0
  454. package/src/engine/physics/narrowphase/sphere_sphere_contact.d.ts.map +1 -0
  455. package/src/engine/physics/narrowphase/sphere_sphere_contact.js +51 -0
  456. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts +83 -0
  457. package/src/engine/physics/queries/PhysicsSurfacePoint.d.ts.map +1 -0
  458. package/src/engine/physics/queries/PhysicsSurfacePoint.js +100 -0
  459. package/src/engine/physics/queries/raycast.d.ts +20 -0
  460. package/src/engine/physics/queries/raycast.d.ts.map +1 -0
  461. package/src/engine/physics/queries/raycast.js +249 -0
  462. package/src/engine/physics/solver/friction_cone.d.ts +16 -0
  463. package/src/engine/physics/solver/friction_cone.d.ts.map +1 -0
  464. package/src/engine/physics/solver/friction_cone.js +37 -0
  465. package/src/engine/physics/solver/solve_contacts.d.ts +36 -0
  466. package/src/engine/physics/solver/solve_contacts.d.ts.map +1 -0
  467. package/src/engine/physics/solver/solve_contacts.js +598 -0
  468. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts +0 -34
  469. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.d.ts.map +0 -1
  470. package/src/core/geom/3d/topology/struct/binary/io/edge/OrderedEdge.js +0 -66
  471. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts +0 -2
  472. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.d.ts.map +0 -1
  473. package/src/core/geom/3d/topology/struct/binary/io/edge/bt_mesh_calc_edges.js +0 -54
  474. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts +0 -2
  475. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.d.ts.map +0 -1
  476. package/src/core/geom/3d/topology/struct/binary/io/edge/get_or_create_edge_map.js +0 -26
  477. package/src/engine/ecs/components/Motion.d.ts +0 -21
  478. package/src/engine/ecs/components/Motion.d.ts.map +0 -1
  479. package/src/engine/ecs/components/Motion.js +0 -27
  480. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts +0 -20
  481. package/src/engine/ecs/components/MotionSerializationAdapter.d.ts.map +0 -1
  482. package/src/engine/ecs/components/MotionSerializationAdapter.js +0 -26
  483. package/src/engine/ecs/systems/MotionSystem.d.ts +0 -9
  484. package/src/engine/ecs/systems/MotionSystem.d.ts.map +0 -1
  485. package/src/engine/ecs/systems/MotionSystem.js +0 -29
  486. package/src/engine/physics/fluid/Fluid.d.ts +0 -26
  487. package/src/engine/physics/fluid/Fluid.d.ts.map +0 -1
  488. package/src/engine/physics/fluid/Fluid.js +0 -221
  489. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts +0 -7
  490. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.d.ts.map +0 -1
  491. package/src/engine/physics/fluid/solver/v3_grid_apply_advection_reverse.js +0 -8
@@ -0,0 +1,83 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * Legacy (pre-mask) red-black SOR pressure solve, kept ONLY for the
5
+ * bench.spec.js A/B comparison against the mask-driven variant. Do not import
6
+ * from production code — {@link v3_grid_solve_pressure} is the live solver.
7
+ *
8
+ * Behaviourally identical to the live solver, but reads from the raw `solid`
9
+ * mask and performs boundary checks inline. Used to measure the per-step cost
10
+ * difference attributable to mask preprocessing.
11
+ *
12
+ * @param {Float32Array|Float16Array} pressure
13
+ * @param {Float32Array|Float16Array} divergence
14
+ * @param {number} res_x
15
+ * @param {number} res_y
16
+ * @param {number} res_z
17
+ * @param {number} iterations
18
+ * @param {number} omega
19
+ * @param {Uint8Array} solid
20
+ */
21
+ export function v3_grid_solve_pressure_unmasked_legacy(pressure, divergence, res_x, res_y, res_z, iterations, omega, solid) {
22
+ const cell_count = res_x * res_y * res_z;
23
+
24
+ assert.notEqual(pressure, divergence, "pressure must not alias divergence");
25
+ assert.greaterThanOrEqual(pressure.length, cell_count, "pressure covers grid");
26
+ assert.greaterThanOrEqual(divergence.length, cell_count, "divergence covers grid");
27
+ assert.isNonNegativeInteger(iterations, "iterations");
28
+ assert.greaterThan(omega, 0, "omega");
29
+ assert.lessThan(omega, 2, "omega");
30
+
31
+ if (iterations === 0) {
32
+ return;
33
+ }
34
+
35
+ const slice_size = res_x * res_y;
36
+ const last_x = res_x - 1;
37
+ const last_y = res_y - 1;
38
+ const last_z = res_z - 1;
39
+ const one_minus_omega = 1 - omega;
40
+
41
+ for (let iter = 0; iter < iterations; iter++) {
42
+ for (let pass = 0; pass < 2; pass++) {
43
+ for (let z = 0; z < res_z; z++) {
44
+ const z_off = z * slice_size;
45
+ const has_zm = z > 0;
46
+ const has_zp = z < last_z;
47
+
48
+ for (let y = 0; y < res_y; y++) {
49
+ const y_off = y * res_x;
50
+ const has_ym = y > 0;
51
+ const has_yp = y < last_y;
52
+
53
+ let x_start = ((z + y) & 1) ^ pass;
54
+
55
+ for (let x = x_start; x < res_x; x += 2) {
56
+ const c = z_off + y_off + x;
57
+
58
+ if (solid[c] !== 0) {
59
+ continue;
60
+ }
61
+
62
+ let sum = 0;
63
+ let count = 0;
64
+
65
+ if (x > 0 && solid[c - 1] === 0) { sum += pressure[c - 1]; count++; }
66
+ if (x < last_x && solid[c + 1] === 0) { sum += pressure[c + 1]; count++; }
67
+ if (has_ym && solid[c - res_x] === 0) { sum += pressure[c - res_x]; count++; }
68
+ if (has_yp && solid[c + res_x] === 0) { sum += pressure[c + res_x]; count++; }
69
+ if (has_zm && solid[c - slice_size] === 0) { sum += pressure[c - slice_size]; count++; }
70
+ if (has_zp && solid[c + slice_size] === 0) { sum += pressure[c + slice_size]; count++; }
71
+
72
+ if (count === 0) {
73
+ continue;
74
+ }
75
+
76
+ const p_target = (sum - divergence[c]) / count;
77
+ pressure[c] = one_minus_omega * pressure[c] + omega * p_target;
78
+ }
79
+ }
80
+ }
81
+ }
82
+ }
83
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Subtract the pressure gradient from a velocity field in-place, making the velocity
3
+ * (approximately) divergence-free:
4
+ *
5
+ * v(c) -= 0.5 * ( p(x+1) - p(x-1), p(y+1) - p(y-1), p(z+1) - p(z-1) )
6
+ *
7
+ * Pairs with {@link v3_grid_solve_pressure}. After this, divergence will be
8
+ * close to zero in the bulk; residual divergence at boundaries / under-converged solves
9
+ * is normal.
10
+ *
11
+ * Boundary cells use one-sided differences. Solid cells have their velocity zeroed
12
+ * (no-slip), and neighbour gradients across a solid face reflect the cell's own
13
+ * pressure (consistent with the Neumann condition used in the solve), which keeps the
14
+ * flow tangent to the boundary.
15
+ *
16
+ * @param {Float32Array} vel_x Mutated in place.
17
+ * @param {Float32Array} vel_y Mutated in place.
18
+ * @param {Float32Array} vel_z Mutated in place.
19
+ * @param {Float32Array} pressure From {@link v3_grid_solve_pressure}.
20
+ * @param {number} res_x
21
+ * @param {number} res_y
22
+ * @param {number} res_z
23
+ * @param {Uint8Array} solid Required (zero-filled for a wall-free domain).
24
+ */
25
+ export function v3_grid_subtract_pressure_gradient(vel_x: Float32Array, vel_y: Float32Array, vel_z: Float32Array, pressure: Float32Array, res_x: number, res_y: number, res_z: number, solid: Uint8Array): void;
26
+ //# sourceMappingURL=v3_grid_subtract_pressure_gradient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"v3_grid_subtract_pressure_gradient.d.ts","sourceRoot":"","sources":["../../../../../../src/engine/physics/fluid/solver/v3_grid_subtract_pressure_gradient.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,0DATW,YAAY,SACZ,YAAY,SACZ,YAAY,YACZ,YAAY,SACZ,MAAM,SACN,MAAM,SACN,MAAM,SACN,UAAU,QA6CpB"}
@@ -0,0 +1,70 @@
1
+ import { assert } from "../../../../core/assert.js";
2
+
3
+ /**
4
+ * Subtract the pressure gradient from a velocity field in-place, making the velocity
5
+ * (approximately) divergence-free:
6
+ *
7
+ * v(c) -= 0.5 * ( p(x+1) - p(x-1), p(y+1) - p(y-1), p(z+1) - p(z-1) )
8
+ *
9
+ * Pairs with {@link v3_grid_solve_pressure}. After this, divergence will be
10
+ * close to zero in the bulk; residual divergence at boundaries / under-converged solves
11
+ * is normal.
12
+ *
13
+ * Boundary cells use one-sided differences. Solid cells have their velocity zeroed
14
+ * (no-slip), and neighbour gradients across a solid face reflect the cell's own
15
+ * pressure (consistent with the Neumann condition used in the solve), which keeps the
16
+ * flow tangent to the boundary.
17
+ *
18
+ * @param {Float32Array} vel_x Mutated in place.
19
+ * @param {Float32Array} vel_y Mutated in place.
20
+ * @param {Float32Array} vel_z Mutated in place.
21
+ * @param {Float32Array} pressure From {@link v3_grid_solve_pressure}.
22
+ * @param {number} res_x
23
+ * @param {number} res_y
24
+ * @param {number} res_z
25
+ * @param {Uint8Array} solid Required (zero-filled for a wall-free domain).
26
+ */
27
+ export function v3_grid_subtract_pressure_gradient(vel_x, vel_y, vel_z, pressure, res_x, res_y, res_z, solid) {
28
+ const cell_count = res_x * res_y * res_z;
29
+ assert.greaterThanOrEqual(vel_x.length, cell_count, "vel_x covers grid");
30
+ assert.greaterThanOrEqual(vel_y.length, cell_count, "vel_y covers grid");
31
+ assert.greaterThanOrEqual(vel_z.length, cell_count, "vel_z covers grid");
32
+ assert.greaterThanOrEqual(pressure.length, cell_count, "pressure covers grid");
33
+
34
+ const slice_size = res_x * res_y;
35
+ const last_x = res_x - 1;
36
+ const last_y = res_y - 1;
37
+ const last_z = res_z - 1;
38
+
39
+ for (let z = 0; z < res_z; z++) {
40
+ const z_off = z * slice_size;
41
+
42
+ for (let y = 0; y < res_y; y++) {
43
+ const y_off = y * res_x;
44
+
45
+ for (let x = 0; x < res_x; x++) {
46
+ const c = z_off + y_off + x;
47
+
48
+ if (solid[c] !== 0) {
49
+ vel_x[c] = 0;
50
+ vel_y[c] = 0;
51
+ vel_z[c] = 0;
52
+ continue;
53
+ }
54
+
55
+ // Reflect pressure across a solid neighbour: that face contributes 0
56
+ // to the gradient, consistent with ∂p/∂n = 0 at the wall.
57
+ const p_xm = (x > 0 && solid[c - 1] === 0) ? pressure[c - 1] : pressure[c];
58
+ const p_xp = (x < last_x && solid[c + 1] === 0) ? pressure[c + 1] : pressure[c];
59
+ const p_ym = (y > 0 && solid[c - res_x] === 0) ? pressure[c - res_x] : pressure[c];
60
+ const p_yp = (y < last_y && solid[c + res_x] === 0) ? pressure[c + res_x] : pressure[c];
61
+ const p_zm = (z > 0 && solid[c - slice_size] === 0) ? pressure[c - slice_size] : pressure[c];
62
+ const p_zp = (z < last_z && solid[c + slice_size] === 0) ? pressure[c + slice_size] : pressure[c];
63
+
64
+ vel_x[c] -= 0.5 * (p_xp - p_xm);
65
+ vel_y[c] -= 0.5 * (p_yp - p_ym);
66
+ vel_z[c] -= 0.5 * (p_zp - p_zm);
67
+ }
68
+ }
69
+ }
70
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"expanding_polytope_algorithm.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/gjk/expanding_polytope_algorithm.js"],"names":[],"mappings":"AAgEA;;;;;;;;;;GAUG;AACH,qDATW,MAAM,EAAE,iBACR,MAAM,KACN,MAAM,EAAE,KACR,MAAM,EAAE,KACR,MAAM,EAAE,KACR,MAAM,EAAE,wDAgQlB"}
1
+ {"version":3,"file":"expanding_polytope_algorithm.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/gjk/expanding_polytope_algorithm.js"],"names":[],"mappings":"AAgEA;;;;;;;;;;GAUG;AACH,qDATW,MAAM,EAAE,iBACR,MAAM,KACN,MAAM,EAAE,KACR,MAAM,EAAE,KACR,MAAM,EAAE,KACR,MAAM,EAAE,wDA8PlB"}
@@ -238,12 +238,12 @@ export function expanding_polytope_algorithm(
238
238
  }
239
239
 
240
240
  if (!found_edge) { //add current edge to list
241
- // assert(num_loose_edges<EPA_MAX_NUM_LOOSE_EDGES);
242
-
243
- assert.lessThan(num_loose_edges, EPA_MAX_NUM_LOOSE_EDGES);
244
-
245
241
  if (num_loose_edges >= EPA_MAX_NUM_LOOSE_EDGES) {
246
- // this should not happen, but if it does it is best to be "kind of right" than to fail completely
242
+ // Polytope degenerated (typically smooth-surface
243
+ // pairs the dispatch should be special-casing — this
244
+ // is the safety net). Bail out and return the
245
+ // closest-face result accumulated so far instead of
246
+ // crashing the simulation step.
247
247
  break;
248
248
  }
249
249
 
@@ -271,12 +271,10 @@ export function expanding_polytope_algorithm(
271
271
 
272
272
  //Reconstruct polytope with p added
273
273
  for (let i = 0; i < num_loose_edges; i++) {
274
- // assert(num_faces<EPA_MAX_NUM_FACES);
275
-
276
- assert.lessThan(num_faces, EPA_MAX_NUM_FACES);
277
-
278
274
  if (num_faces >= EPA_MAX_NUM_FACES) {
279
- // should never happen
275
+ // Polytope hit the face cap before converging. Same
276
+ // degenerate-surface story as the loose-edge overflow above.
277
+ // Bail out and let the caller use the best face found so far.
280
278
  break;
281
279
  }
282
280
 
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Apply the world-frame inverse inertia tensor of a rigid body to a world-space
3
+ * vector and write the result.
4
+ *
5
+ * Body-frame inverse inertia is stored as a diagonal in principal axes
6
+ * (`rb.inverseInertiaLocal`). World inverse inertia is
7
+ * `I_w⁻¹ = R · diag · R^T` where `R` is the body's orientation. We compute
8
+ * `result = R · diag · R^T · v` without materialising the full 3x3 matrix:
9
+ *
10
+ * 1. `v_body = R^T · v` (rotate v into body frame)
11
+ * 2. scale component-wise by the diagonal
12
+ * 3. `result = R · v_body_scaled`
13
+ *
14
+ * Quaternion-rotate-vector uses the standard `q · v · q*` identity. Inverse
15
+ * rotation uses the conjugate quaternion.
16
+ *
17
+ * Sphere short-circuit: if the inverse inertia is isotropic (ix === iy === iz),
18
+ * the rotation cancels and `result = ix * v`. Skip the trig and save the work.
19
+ *
20
+ * @param {number[]|Float64Array} result length >= 3
21
+ * @param {number} result_offset
22
+ * @param {RigidBody} rb
23
+ * @param {Transform} transform
24
+ * @param {number} vx
25
+ * @param {number} vy
26
+ * @param {number} vz
27
+ */
28
+ export function world_inverse_inertia_apply(result: number[] | Float64Array, result_offset: number, rb: RigidBody, transform: Transform, vx: number, vy: number, vz: number): void;
29
+ //# sourceMappingURL=world_inverse_inertia.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"world_inverse_inertia.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/inertia/world_inverse_inertia.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,oDARW,MAAM,EAAE,GAAC,YAAY,iBACrB,MAAM,2CAGN,MAAM,MACN,MAAM,MACN,MAAM,QAqDhB"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Apply the world-frame inverse inertia tensor of a rigid body to a world-space
3
+ * vector and write the result.
4
+ *
5
+ * Body-frame inverse inertia is stored as a diagonal in principal axes
6
+ * (`rb.inverseInertiaLocal`). World inverse inertia is
7
+ * `I_w⁻¹ = R · diag · R^T` where `R` is the body's orientation. We compute
8
+ * `result = R · diag · R^T · v` without materialising the full 3x3 matrix:
9
+ *
10
+ * 1. `v_body = R^T · v` (rotate v into body frame)
11
+ * 2. scale component-wise by the diagonal
12
+ * 3. `result = R · v_body_scaled`
13
+ *
14
+ * Quaternion-rotate-vector uses the standard `q · v · q*` identity. Inverse
15
+ * rotation uses the conjugate quaternion.
16
+ *
17
+ * Sphere short-circuit: if the inverse inertia is isotropic (ix === iy === iz),
18
+ * the rotation cancels and `result = ix * v`. Skip the trig and save the work.
19
+ *
20
+ * @param {number[]|Float64Array} result length >= 3
21
+ * @param {number} result_offset
22
+ * @param {RigidBody} rb
23
+ * @param {Transform} transform
24
+ * @param {number} vx
25
+ * @param {number} vy
26
+ * @param {number} vz
27
+ */
28
+ export function world_inverse_inertia_apply(
29
+ result, result_offset,
30
+ rb, transform,
31
+ vx, vy, vz
32
+ ) {
33
+ const ii = rb.inverseInertiaLocal;
34
+ const ix = ii.x, iy = ii.y, iz = ii.z;
35
+
36
+ if (ix === iy && iy === iz) {
37
+ // Isotropic — rotation cancels.
38
+ result[result_offset] = vx * ix;
39
+ result[result_offset + 1] = vy * ix;
40
+ result[result_offset + 2] = vz * ix;
41
+ return;
42
+ }
43
+
44
+ const q = transform.rotation;
45
+ const qx = q.x, qy = q.y, qz = q.z, qw = q.w;
46
+
47
+ // Step 1: v_body = R^T · v. R^T corresponds to applying the conjugate
48
+ // quaternion (-qx, -qy, -qz, qw).
49
+ // Identity: v' = q · v · q*. For inverse rotation use q* on either side.
50
+ // Equivalent expanded form:
51
+ // t = (q* · v_quat) where v_quat = (vx, vy, vz, 0)
52
+ // v_body = (t · q).xyz
53
+ {
54
+ const cx = -qx, cy = -qy, cz = -qz;
55
+ // t = c · v (Hamilton product, treating v as pure quaternion w=0)
56
+ const tx = qw * vx + cy * vz - cz * vy;
57
+ const ty = qw * vy + cz * vx - cx * vz;
58
+ const tz = qw * vz + cx * vy - cy * vx;
59
+ const tw = -cx * vx - cy * vy - cz * vz;
60
+ // v_body = t · (c*) where c* = (qx, qy, qz, qw)
61
+ const vbx = tx * qw + tw * qx + ty * qz - tz * qy;
62
+ const vby = ty * qw + tw * qy + tz * qx - tx * qz;
63
+ const vbz = tz * qw + tw * qz + tx * qy - ty * qx;
64
+
65
+ // Step 2: scale by diagonal.
66
+ const sx = vbx * ix;
67
+ const sy = vby * iy;
68
+ const sz = vbz * iz;
69
+
70
+ // Step 3: result = R · scaled = q · scaled · q*
71
+ const ux = qw * sx + qy * sz - qz * sy;
72
+ const uy = qw * sy + qz * sx - qx * sz;
73
+ const uz = qw * sz + qx * sy - qy * sx;
74
+ const uw = -qx * sx - qy * sy - qz * sz;
75
+ result[result_offset] = ux * qw + uw * (-qx) + uy * (-qz) - uz * (-qy);
76
+ result[result_offset + 1] = uy * qw + uw * (-qy) + uz * (-qx) - ux * (-qz);
77
+ result[result_offset + 2] = uz * qw + uw * (-qz) + ux * (-qy) - uy * (-qx);
78
+ }
79
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Integrate `transform.position` and `transform.rotation` from the body's
3
+ * current linear and angular velocity over a step `dt`. Static bodies are not
4
+ * touched.
5
+ *
6
+ * KinematicPosition bodies are treated like Dynamic for the position update —
7
+ * if the gameplay code is driving them, their velocity is whatever the user
8
+ * wrote (typically zero); the step is effectively a no-op in that case.
9
+ * KinematicVelocity bodies advance under their user-set velocity.
10
+ *
11
+ * @param {RigidBody} rb
12
+ * @param {Transform} transform
13
+ * @param {number} dt
14
+ */
15
+ export function integrate_position(rb: RigidBody, transform: Transform, dt: number): void;
16
+ //# sourceMappingURL=integrate_position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrate_position.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/integration/integrate_position.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;GAaG;AACH,4EAFW,MAAM,QA8BhB"}
@@ -0,0 +1,48 @@
1
+ import { BodyKind } from "../ecs/BodyKind.js";
2
+ import { quat_integrate } from "./quat_integrate.js";
3
+
4
+ const scratch_q = new Float64Array(4);
5
+
6
+ /**
7
+ * Integrate `transform.position` and `transform.rotation` from the body's
8
+ * current linear and angular velocity over a step `dt`. Static bodies are not
9
+ * touched.
10
+ *
11
+ * KinematicPosition bodies are treated like Dynamic for the position update —
12
+ * if the gameplay code is driving them, their velocity is whatever the user
13
+ * wrote (typically zero); the step is effectively a no-op in that case.
14
+ * KinematicVelocity bodies advance under their user-set velocity.
15
+ *
16
+ * @param {RigidBody} rb
17
+ * @param {Transform} transform
18
+ * @param {number} dt
19
+ */
20
+ export function integrate_position(rb, transform, dt) {
21
+ if (rb.kind === BodyKind.Static) {
22
+ return;
23
+ }
24
+
25
+ const lv = rb.linearVelocity;
26
+ const p = transform.position;
27
+
28
+ // Direct reads via typed-array index; the write goes through .set() so
29
+ // Transform's onChanged subscribers (matrix recompose, parent/child sync,
30
+ // viewport position, fog-of-war reveal) fire once per body per step.
31
+ p.set(
32
+ p[0] + lv[0] * dt,
33
+ p[1] + lv[1] * dt,
34
+ p[2] + lv[2] * dt
35
+ );
36
+
37
+ const av = rb.angularVelocity;
38
+ if (av[0] !== 0 || av[1] !== 0 || av[2] !== 0) {
39
+ const q = transform.rotation;
40
+ quat_integrate(
41
+ scratch_q,
42
+ q[0], q[1], q[2], q[3],
43
+ av[0], av[1], av[2],
44
+ dt
45
+ );
46
+ q.set(scratch_q[0], scratch_q[1], scratch_q[2], scratch_q[3]);
47
+ }
48
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Semi-implicit Euler velocity integration for a single rigid body.
3
+ *
4
+ * For Dynamic bodies:
5
+ * - gravity (scaled by `gravityScale`) and the accumulated force are converted
6
+ * to a velocity delta via `1/mass`,
7
+ * - accumulated torque is converted to angular acceleration via the
8
+ * world-frame inverse inertia (R · diag(I_local) · R^T applied to τ),
9
+ * - linear and angular damping are applied as a stable implicit decay
10
+ * `v *= 1 / (1 + d·dt)` (Box2D / Bullet recipe — never goes negative, no
11
+ * `exp()` call on the hot path),
12
+ * - the force / torque accumulators are zeroed afterwards.
13
+ *
14
+ * Kinematic and Static bodies are skipped — their velocity is the
15
+ * user / animation system's responsibility.
16
+ *
17
+ * @param {RigidBody} rb
18
+ * @param {Transform} transform used to rotate body-frame inertia into world
19
+ * @param {number} gx world gravity x
20
+ * @param {number} gy world gravity y
21
+ * @param {number} gz world gravity z
22
+ * @param {number} dt step size in seconds
23
+ */
24
+ export function integrate_velocity(rb: RigidBody, transform: Transform, gx: number, gy: number, gz: number, dt: number): void;
25
+ //# sourceMappingURL=integrate_velocity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"integrate_velocity.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/integration/integrate_velocity.js"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,4EALW,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,QAoDhB"}
@@ -0,0 +1,79 @@
1
+ import { BodyKind } from "../ecs/BodyKind.js";
2
+ import { world_inverse_inertia_apply } from "../inertia/world_inverse_inertia.js";
3
+
4
+ const scratch_angular = new Float64Array(3);
5
+
6
+ /**
7
+ * Semi-implicit Euler velocity integration for a single rigid body.
8
+ *
9
+ * For Dynamic bodies:
10
+ * - gravity (scaled by `gravityScale`) and the accumulated force are converted
11
+ * to a velocity delta via `1/mass`,
12
+ * - accumulated torque is converted to angular acceleration via the
13
+ * world-frame inverse inertia (R · diag(I_local) · R^T applied to τ),
14
+ * - linear and angular damping are applied as a stable implicit decay
15
+ * `v *= 1 / (1 + d·dt)` (Box2D / Bullet recipe — never goes negative, no
16
+ * `exp()` call on the hot path),
17
+ * - the force / torque accumulators are zeroed afterwards.
18
+ *
19
+ * Kinematic and Static bodies are skipped — their velocity is the
20
+ * user / animation system's responsibility.
21
+ *
22
+ * @param {RigidBody} rb
23
+ * @param {Transform} transform used to rotate body-frame inertia into world
24
+ * @param {number} gx world gravity x
25
+ * @param {number} gy world gravity y
26
+ * @param {number} gz world gravity z
27
+ * @param {number} dt step size in seconds
28
+ */
29
+ export function integrate_velocity(rb, transform, gx, gy, gz, dt) {
30
+ const af = rb.accumulatedForce;
31
+ const at = rb.accumulatedTorque;
32
+
33
+ if (rb.kind !== BodyKind.Dynamic) {
34
+ // Direct indexing — no observer listens to body-internal accumulators.
35
+ af[0] = 0; af[1] = 0; af[2] = 0;
36
+ at[0] = 0; at[1] = 0; at[2] = 0;
37
+ return;
38
+ }
39
+
40
+ const inv_m = rb.mass > 0 ? 1 / rb.mass : 0;
41
+ const gs = rb.gravityScale;
42
+
43
+ // Linear velocity update: v += (F * invM + g * gravityScale) * dt
44
+ const lv = rb.linearVelocity;
45
+ let lvx = lv[0] + (af[0] * inv_m + gx * gs) * dt;
46
+ let lvy = lv[1] + (af[1] * inv_m + gy * gs) * dt;
47
+ let lvz = lv[2] + (af[2] * inv_m + gz * gs) * dt;
48
+
49
+ if (rb.linearDamping > 0) {
50
+ const k = 1 / (1 + rb.linearDamping * dt);
51
+ lvx *= k;
52
+ lvy *= k;
53
+ lvz *= k;
54
+ }
55
+ lv[0] = lvx; lv[1] = lvy; lv[2] = lvz;
56
+
57
+ // Angular velocity update: ω += I_world⁻¹ · τ · dt
58
+ const av = rb.angularVelocity;
59
+ let avx = av[0];
60
+ let avy = av[1];
61
+ let avz = av[2];
62
+ if (at[0] !== 0 || at[1] !== 0 || at[2] !== 0) {
63
+ world_inverse_inertia_apply(scratch_angular, 0, rb, transform, at[0], at[1], at[2]);
64
+ avx += scratch_angular[0] * dt;
65
+ avy += scratch_angular[1] * dt;
66
+ avz += scratch_angular[2] * dt;
67
+ }
68
+
69
+ if (rb.angularDamping > 0) {
70
+ const k = 1 / (1 + rb.angularDamping * dt);
71
+ avx *= k;
72
+ avy *= k;
73
+ avz *= k;
74
+ }
75
+ av[0] = avx; av[1] = avy; av[2] = avz;
76
+
77
+ af[0] = 0; af[1] = 0; af[2] = 0;
78
+ at[0] = 0; at[1] = 0; at[2] = 0;
79
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Advance a unit quaternion `q` by an angular velocity `omega` over a step `dt`,
3
+ * using the first-order formula
4
+ *
5
+ * dq/dt = 0.5 * Omega(omega) * q
6
+ *
7
+ * where `Omega(omega)` is the pure-quaternion `(omega_x, omega_y, omega_z, 0)`.
8
+ * Result is renormalised so the output stays unit.
9
+ *
10
+ * This is the standard semi-implicit angular integrator (Catto GDC 2009 et al.).
11
+ * For typical game-physics step sizes (1/60 s) and angular speeds, the
12
+ * first-order error is dominated by the renormalisation projection back to the
13
+ * unit sphere — closed-form exp via axis-angle would only matter for very large
14
+ * `|omega|·dt`.
15
+ *
16
+ * @param {number[]|Float64Array|Quaternion} result_q destination (may alias `qx..qw`)
17
+ * @param {number} qx
18
+ * @param {number} qy
19
+ * @param {number} qz
20
+ * @param {number} qw
21
+ * @param {number} omega_x
22
+ * @param {number} omega_y
23
+ * @param {number} omega_z
24
+ * @param {number} dt
25
+ */
26
+ export function quat_integrate(result_q: number[] | Float64Array | Quaternion, qx: number, qy: number, qz: number, qw: number, omega_x: number, omega_y: number, omega_z: number, dt: number): void;
27
+ //# sourceMappingURL=quat_integrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quat_integrate.d.ts","sourceRoot":"","sources":["../../../../../src/engine/physics/integration/quat_integrate.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,yCAVW,MAAM,EAAE,GAAC,YAAY,aAAW,MAChC,MAAM,MACN,MAAM,MACN,MAAM,MACN,MAAM,WACN,MAAM,WACN,MAAM,WACN,MAAM,MACN,MAAM,QAsChB"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Advance a unit quaternion `q` by an angular velocity `omega` over a step `dt`,
3
+ * using the first-order formula
4
+ *
5
+ * dq/dt = 0.5 * Omega(omega) * q
6
+ *
7
+ * where `Omega(omega)` is the pure-quaternion `(omega_x, omega_y, omega_z, 0)`.
8
+ * Result is renormalised so the output stays unit.
9
+ *
10
+ * This is the standard semi-implicit angular integrator (Catto GDC 2009 et al.).
11
+ * For typical game-physics step sizes (1/60 s) and angular speeds, the
12
+ * first-order error is dominated by the renormalisation projection back to the
13
+ * unit sphere — closed-form exp via axis-angle would only matter for very large
14
+ * `|omega|·dt`.
15
+ *
16
+ * @param {number[]|Float64Array|Quaternion} result_q destination (may alias `qx..qw`)
17
+ * @param {number} qx
18
+ * @param {number} qy
19
+ * @param {number} qz
20
+ * @param {number} qw
21
+ * @param {number} omega_x
22
+ * @param {number} omega_y
23
+ * @param {number} omega_z
24
+ * @param {number} dt
25
+ */
26
+ export function quat_integrate(
27
+ result_q,
28
+ qx, qy, qz, qw,
29
+ omega_x, omega_y, omega_z,
30
+ dt
31
+ ) {
32
+ const h = 0.5 * dt;
33
+
34
+ const dqx = h * (omega_x * qw + omega_y * qz - omega_z * qy);
35
+ const dqy = h * (omega_y * qw + omega_z * qx - omega_x * qz);
36
+ const dqz = h * (omega_z * qw + omega_x * qy - omega_y * qx);
37
+ const dqw = -h * (omega_x * qx + omega_y * qy + omega_z * qz);
38
+
39
+ let nx = qx + dqx;
40
+ let ny = qy + dqy;
41
+ let nz = qz + dqz;
42
+ let nw = qw + dqw;
43
+
44
+ // Renormalise. Using sqrt (which is bit-exact across IEEE-754 platforms)
45
+ // rather than the (3 - |q|²)/2 cheap-Newton trick — the latter biases
46
+ // length for non-unit inputs.
47
+ const norm_sqr = nx * nx + ny * ny + nz * nz + nw * nw;
48
+ if (norm_sqr > 0) {
49
+ const inv_len = 1 / Math.sqrt(norm_sqr);
50
+ nx *= inv_len;
51
+ ny *= inv_len;
52
+ nz *= inv_len;
53
+ nw *= inv_len;
54
+ } else {
55
+ nx = 0; ny = 0; nz = 0; nw = 1;
56
+ }
57
+
58
+ result_q[0] = nx;
59
+ result_q[1] = ny;
60
+ result_q[2] = nz;
61
+ result_q[3] = nw;
62
+ }