rn-gamekit 0.1.0 → 0.2.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 (601) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +95 -14
  3. package/lib/module/assets/defineAssets.js +28 -3
  4. package/lib/module/assets/defineAssets.js.map +1 -1
  5. package/lib/module/assets.js +11 -0
  6. package/lib/module/assets.js.map +1 -0
  7. package/lib/module/audio/createGameAudio.js +784 -0
  8. package/lib/module/audio/createGameAudio.js.map +1 -0
  9. package/lib/module/audio/errors.js +12 -0
  10. package/lib/module/audio/errors.js.map +1 -0
  11. package/lib/module/audio/index.js +5 -0
  12. package/lib/module/audio/index.js.map +1 -0
  13. package/lib/module/audio/resolver.js +37 -0
  14. package/lib/module/audio/resolver.js.map +1 -0
  15. package/lib/module/audio/types.js +4 -0
  16. package/lib/module/audio/types.js.map +1 -0
  17. package/lib/module/audio.js +9 -0
  18. package/lib/module/audio.js.map +1 -0
  19. package/lib/module/camera2d/bounds.js +59 -0
  20. package/lib/module/camera2d/bounds.js.map +1 -0
  21. package/lib/module/camera2d/extents.js +25 -0
  22. package/lib/module/camera2d/extents.js.map +1 -0
  23. package/lib/module/camera2d/follow.js +138 -0
  24. package/lib/module/camera2d/follow.js.map +1 -0
  25. package/lib/module/camera2d/index.js +20 -0
  26. package/lib/module/camera2d/index.js.map +1 -0
  27. package/lib/module/camera2d/interpolation.js +98 -0
  28. package/lib/module/camera2d/interpolation.js.map +1 -0
  29. package/lib/module/camera2d/shake.js +85 -0
  30. package/lib/module/camera2d/shake.js.map +1 -0
  31. package/lib/module/camera2d/transform.js +151 -0
  32. package/lib/module/camera2d/transform.js.map +1 -0
  33. package/lib/module/camera2d/types.js +4 -0
  34. package/lib/module/camera2d/types.js.map +1 -0
  35. package/lib/module/camera2d/validation.js +98 -0
  36. package/lib/module/camera2d/validation.js.map +1 -0
  37. package/lib/module/camera2d/visibility.js +138 -0
  38. package/lib/module/camera2d/visibility.js.map +1 -0
  39. package/lib/module/camera2d.js +9 -0
  40. package/lib/module/camera2d.js.map +1 -0
  41. package/lib/module/collision2d/colliders.js +266 -0
  42. package/lib/module/collision2d/colliders.js.map +1 -0
  43. package/lib/module/collision2d/debug.js +105 -0
  44. package/lib/module/collision2d/debug.js.map +1 -0
  45. package/lib/module/collision2d/filters.js +40 -0
  46. package/lib/module/collision2d/filters.js.map +1 -0
  47. package/lib/module/collision2d/index.js +12 -0
  48. package/lib/module/collision2d/index.js.map +1 -0
  49. package/lib/module/collision2d/intersections.js +67 -0
  50. package/lib/module/collision2d/intersections.js.map +1 -0
  51. package/lib/module/collision2d/manifolds.js +218 -0
  52. package/lib/module/collision2d/manifolds.js.map +1 -0
  53. package/lib/module/collision2d/segments.js +187 -0
  54. package/lib/module/collision2d/segments.js.map +1 -0
  55. package/lib/module/collision2d/spatialHash.js +167 -0
  56. package/lib/module/collision2d/spatialHash.js.map +1 -0
  57. package/lib/module/collision2d/sweeps.js +255 -0
  58. package/lib/module/collision2d/sweeps.js.map +1 -0
  59. package/lib/module/collision2d.js +9 -0
  60. package/lib/module/collision2d.js.map +1 -0
  61. package/lib/module/core/input/buttonPad.js +214 -0
  62. package/lib/module/core/input/buttonPad.js.map +1 -0
  63. package/lib/module/core/input/createInputBuffer.js +66 -14
  64. package/lib/module/core/input/createInputBuffer.js.map +1 -1
  65. package/lib/module/core/session/createGameSession.js +454 -50
  66. package/lib/module/core/session/createGameSession.js.map +1 -1
  67. package/lib/module/core/session/deepFreeze.js +92 -2
  68. package/lib/module/core/session/deepFreeze.js.map +1 -1
  69. package/lib/module/core/session/types.js +12 -0
  70. package/lib/module/core/session/types.js.map +1 -1
  71. package/lib/module/definition/defineGame.js +23 -0
  72. package/lib/module/definition/defineGame.js.map +1 -1
  73. package/lib/module/events/defineGameEvents.js +46 -0
  74. package/lib/module/events/defineGameEvents.js.map +1 -0
  75. package/lib/module/events/errors.js +16 -0
  76. package/lib/module/events/errors.js.map +1 -0
  77. package/lib/module/events/index.js +7 -0
  78. package/lib/module/events/index.js.map +1 -0
  79. package/lib/module/events/payload.js +219 -0
  80. package/lib/module/events/payload.js.map +1 -0
  81. package/lib/module/events/seed.js +33 -0
  82. package/lib/module/events/seed.js.map +1 -0
  83. package/lib/module/events/types.js +4 -0
  84. package/lib/module/events/types.js.map +1 -0
  85. package/lib/module/events.js +13 -0
  86. package/lib/module/events.js.map +1 -0
  87. package/lib/module/geometry/helpers.js +140 -0
  88. package/lib/module/geometry/helpers.js.map +1 -0
  89. package/lib/module/geometry/index.js +5 -0
  90. package/lib/module/geometry/index.js.map +1 -0
  91. package/lib/module/geometry/validation.js +104 -0
  92. package/lib/module/geometry/validation.js.map +1 -0
  93. package/lib/module/geometry.js +9 -0
  94. package/lib/module/geometry.js.map +1 -0
  95. package/lib/module/haptics/createGameHaptics.js +214 -0
  96. package/lib/module/haptics/createGameHaptics.js.map +1 -0
  97. package/lib/module/haptics/errors.js +12 -0
  98. package/lib/module/haptics/errors.js.map +1 -0
  99. package/lib/module/haptics/index.js +5 -0
  100. package/lib/module/haptics/index.js.map +1 -0
  101. package/lib/module/haptics/resolver.js +37 -0
  102. package/lib/module/haptics/resolver.js.map +1 -0
  103. package/lib/module/haptics/types.js +4 -0
  104. package/lib/module/haptics/types.js.map +1 -0
  105. package/lib/module/haptics.js +9 -0
  106. package/lib/module/haptics.js.map +1 -0
  107. package/lib/module/index.js +8 -1
  108. package/lib/module/index.js.map +1 -1
  109. package/lib/module/particles/createParticleSystem.js +481 -0
  110. package/lib/module/particles/createParticleSystem.js.map +1 -0
  111. package/lib/module/particles/defineParticleEffect.js +178 -0
  112. package/lib/module/particles/defineParticleEffect.js.map +1 -0
  113. package/lib/module/particles/errors.js +9 -0
  114. package/lib/module/particles/errors.js.map +1 -0
  115. package/lib/module/particles/index.js +8 -0
  116. package/lib/module/particles/index.js.map +1 -0
  117. package/lib/module/particles/sampling.js +121 -0
  118. package/lib/module/particles/sampling.js.map +1 -0
  119. package/lib/module/particles/types.js +4 -0
  120. package/lib/module/particles/types.js.map +1 -0
  121. package/lib/module/particles.js +4 -0
  122. package/lib/module/particles.js.map +1 -0
  123. package/lib/module/react/GameButtonPad.js +344 -0
  124. package/lib/module/react/GameButtonPad.js.map +1 -0
  125. package/lib/module/react/GamePointerInput.js +74 -16
  126. package/lib/module/react/GamePointerInput.js.map +1 -1
  127. package/lib/module/react/GameView.js +139 -60
  128. package/lib/module/react/GameView.js.map +1 -1
  129. package/lib/module/react/assets/createGameAssetStore.js +145 -95
  130. package/lib/module/react/assets/createGameAssetStore.js.map +1 -1
  131. package/lib/module/react/assets/useGameAssets.js +60 -35
  132. package/lib/module/react/assets/useGameAssets.js.map +1 -1
  133. package/lib/module/react/bindAppLifecycle.js +46 -17
  134. package/lib/module/react/bindAppLifecycle.js.map +1 -1
  135. package/lib/module/react/bindGameSession.js +13 -2
  136. package/lib/module/react/bindGameSession.js.map +1 -1
  137. package/lib/module/react/camera2d/GameLayer2D.js +50 -0
  138. package/lib/module/react/camera2d/GameLayer2D.js.map +1 -0
  139. package/lib/module/react/camera2d/defineGameCamera2D.js +30 -0
  140. package/lib/module/react/camera2d/defineGameCamera2D.js.map +1 -0
  141. package/lib/module/react/camera2d/usePresentedCameraBinding.js +177 -0
  142. package/lib/module/react/camera2d/usePresentedCameraBinding.js.map +1 -0
  143. package/lib/module/react/cleanupList.js +38 -0
  144. package/lib/module/react/cleanupList.js.map +1 -0
  145. package/lib/module/react/lifecycleSource.js +49 -0
  146. package/lib/module/react/lifecycleSource.js.map +1 -0
  147. package/lib/module/react/particles/ParticleView.js +308 -0
  148. package/lib/module/react/particles/ParticleView.js.map +1 -0
  149. package/lib/module/react/particles/culling.js +115 -0
  150. package/lib/module/react/particles/culling.js.map +1 -0
  151. package/lib/module/react/particles/index.js +7 -0
  152. package/lib/module/react/particles/index.js.map +1 -0
  153. package/lib/module/react/particles/spriteXForm.js +45 -0
  154. package/lib/module/react/particles/spriteXForm.js.map +1 -0
  155. package/lib/module/react/particles/useParticlePresentation.js +204 -0
  156. package/lib/module/react/particles/useParticlePresentation.js.map +1 -0
  157. package/lib/module/react/pointerBinding.js +55 -17
  158. package/lib/module/react/pointerBinding.js.map +1 -1
  159. package/lib/module/react/pointerCamera.js +28 -0
  160. package/lib/module/react/pointerCamera.js.map +1 -0
  161. package/lib/module/react/pointerCoalescer.js +16 -9
  162. package/lib/module/react/pointerCoalescer.js.map +1 -1
  163. package/lib/module/react/sprites/GameSprite.js +5 -17
  164. package/lib/module/react/sprites/GameSprite.js.map +1 -1
  165. package/lib/module/react/sprites/GameWorld2D.js +112 -9
  166. package/lib/module/react/sprites/GameWorld2D.js.map +1 -1
  167. package/lib/module/react/sprites/Sprite.js +48 -63
  168. package/lib/module/react/sprites/Sprite.js.map +1 -1
  169. package/lib/module/react/sprites/SpriteBatch.js +53 -28
  170. package/lib/module/react/sprites/SpriteBatch.js.map +1 -1
  171. package/lib/module/react/sprites/batchVisibility.js +58 -0
  172. package/lib/module/react/sprites/batchVisibility.js.map +1 -0
  173. package/lib/module/react/sprites/spriteSelection.js +103 -0
  174. package/lib/module/react/sprites/spriteSelection.js.map +1 -0
  175. package/lib/module/react/sprites/spriteTransform.js +46 -25
  176. package/lib/module/react/sprites/spriteTransform.js.map +1 -1
  177. package/lib/module/react/tilemap/TileMapLayer2D.js +217 -0
  178. package/lib/module/react/tilemap/TileMapLayer2D.js.map +1 -0
  179. package/lib/module/react/tilemap/tilePresentation.js +374 -0
  180. package/lib/module/react/tilemap/tilePresentation.js.map +1 -0
  181. package/lib/module/react/useGameSession.js +70 -0
  182. package/lib/module/react/useGameSession.js.map +1 -0
  183. package/lib/module/react/useGameSessionStatus.js +46 -0
  184. package/lib/module/react/useGameSessionStatus.js.map +1 -0
  185. package/lib/module/react/viewportBinding.js +5 -1
  186. package/lib/module/react/viewportBinding.js.map +1 -1
  187. package/lib/module/react.js +12 -1
  188. package/lib/module/react.js.map +1 -1
  189. package/lib/module/scene/defineScene.js +17 -0
  190. package/lib/module/scene/defineScene.js.map +1 -1
  191. package/lib/module/sprites/sampleSpriteClip.js +66 -6
  192. package/lib/module/sprites/sampleSpriteClip.js.map +1 -1
  193. package/lib/module/sprites/spriteAnimationState.js +10 -20
  194. package/lib/module/sprites/spriteAnimationState.js.map +1 -1
  195. package/lib/module/sprites.js +11 -0
  196. package/lib/module/sprites.js.map +1 -0
  197. package/lib/module/storage/adapters/asyncStorage.js +57 -0
  198. package/lib/module/storage/adapters/asyncStorage.js.map +1 -0
  199. package/lib/module/storage/adapters/memory.js +50 -0
  200. package/lib/module/storage/adapters/memory.js.map +1 -0
  201. package/lib/module/storage/errors.js +34 -0
  202. package/lib/module/storage/errors.js.map +1 -0
  203. package/lib/module/storage/index.js +11 -0
  204. package/lib/module/storage/index.js.map +1 -0
  205. package/lib/module/storage/schema.js +151 -0
  206. package/lib/module/storage/schema.js.map +1 -0
  207. package/lib/module/storage/serialization.js +249 -0
  208. package/lib/module/storage/serialization.js.map +1 -0
  209. package/lib/module/storage/store.js +387 -0
  210. package/lib/module/storage/store.js.map +1 -0
  211. package/lib/module/storage/types.js +16 -0
  212. package/lib/module/storage/types.js.map +1 -0
  213. package/lib/module/storage/validation.js +111 -0
  214. package/lib/module/storage/validation.js.map +1 -0
  215. package/lib/module/storage.js +4 -0
  216. package/lib/module/storage.js.map +1 -0
  217. package/lib/module/testing.js +4 -0
  218. package/lib/module/testing.js.map +1 -1
  219. package/lib/module/tilemap/chunkStats.js +27 -0
  220. package/lib/module/tilemap/chunkStats.js.map +1 -0
  221. package/lib/module/tilemap/definitions.js +308 -0
  222. package/lib/module/tilemap/definitions.js.map +1 -0
  223. package/lib/module/tilemap/errors.js +13 -0
  224. package/lib/module/tilemap/errors.js.map +1 -0
  225. package/lib/module/tilemap/index.js +10 -0
  226. package/lib/module/tilemap/index.js.map +1 -0
  227. package/lib/module/tilemap/movement.js +379 -0
  228. package/lib/module/tilemap/movement.js.map +1 -0
  229. package/lib/module/tilemap/queries.js +114 -0
  230. package/lib/module/tilemap/queries.js.map +1 -0
  231. package/lib/module/tilemap/tiledAdapter.js +141 -0
  232. package/lib/module/tilemap/tiledAdapter.js.map +1 -0
  233. package/lib/module/tilemap/types.js +4 -0
  234. package/lib/module/tilemap/types.js.map +1 -0
  235. package/lib/module/tilemap.js +4 -0
  236. package/lib/module/tilemap.js.map +1 -0
  237. package/lib/typescript/src/assets/defineAssets.d.ts +1 -1
  238. package/lib/typescript/src/assets/defineAssets.d.ts.map +1 -1
  239. package/lib/typescript/src/assets.d.ts +11 -0
  240. package/lib/typescript/src/assets.d.ts.map +1 -0
  241. package/lib/typescript/src/audio/createGameAudio.d.ts +5 -0
  242. package/lib/typescript/src/audio/createGameAudio.d.ts.map +1 -0
  243. package/lib/typescript/src/audio/errors.d.ts +6 -0
  244. package/lib/typescript/src/audio/errors.d.ts.map +1 -0
  245. package/lib/typescript/src/audio/index.d.ts +4 -0
  246. package/lib/typescript/src/audio/index.d.ts.map +1 -0
  247. package/lib/typescript/src/audio/resolver.d.ts +44 -0
  248. package/lib/typescript/src/audio/resolver.d.ts.map +1 -0
  249. package/lib/typescript/src/audio/types.d.ts +42 -0
  250. package/lib/typescript/src/audio/types.d.ts.map +1 -0
  251. package/lib/typescript/src/audio.d.ts +8 -0
  252. package/lib/typescript/src/audio.d.ts.map +1 -0
  253. package/lib/typescript/src/camera2d/bounds.d.ts +25 -0
  254. package/lib/typescript/src/camera2d/bounds.d.ts.map +1 -0
  255. package/lib/typescript/src/camera2d/extents.d.ts +17 -0
  256. package/lib/typescript/src/camera2d/extents.d.ts.map +1 -0
  257. package/lib/typescript/src/camera2d/follow.d.ts +24 -0
  258. package/lib/typescript/src/camera2d/follow.d.ts.map +1 -0
  259. package/lib/typescript/src/camera2d/index.d.ts +19 -0
  260. package/lib/typescript/src/camera2d/index.d.ts.map +1 -0
  261. package/lib/typescript/src/camera2d/interpolation.d.ts +17 -0
  262. package/lib/typescript/src/camera2d/interpolation.d.ts.map +1 -0
  263. package/lib/typescript/src/camera2d/shake.d.ts +20 -0
  264. package/lib/typescript/src/camera2d/shake.d.ts.map +1 -0
  265. package/lib/typescript/src/camera2d/transform.d.ts +44 -0
  266. package/lib/typescript/src/camera2d/transform.d.ts.map +1 -0
  267. package/lib/typescript/src/camera2d/types.d.ts +74 -0
  268. package/lib/typescript/src/camera2d/types.d.ts.map +1 -0
  269. package/lib/typescript/src/camera2d/validation.d.ts +30 -0
  270. package/lib/typescript/src/camera2d/validation.d.ts.map +1 -0
  271. package/lib/typescript/src/camera2d/visibility.d.ts +47 -0
  272. package/lib/typescript/src/camera2d/visibility.d.ts.map +1 -0
  273. package/lib/typescript/src/camera2d.d.ts +7 -0
  274. package/lib/typescript/src/camera2d.d.ts.map +1 -0
  275. package/lib/typescript/src/collision2d/colliders.d.ts +120 -0
  276. package/lib/typescript/src/collision2d/colliders.d.ts.map +1 -0
  277. package/lib/typescript/src/collision2d/debug.d.ts +67 -0
  278. package/lib/typescript/src/collision2d/debug.d.ts.map +1 -0
  279. package/lib/typescript/src/collision2d/filters.d.ts +28 -0
  280. package/lib/typescript/src/collision2d/filters.d.ts.map +1 -0
  281. package/lib/typescript/src/collision2d/index.d.ts +17 -0
  282. package/lib/typescript/src/collision2d/index.d.ts.map +1 -0
  283. package/lib/typescript/src/collision2d/intersections.d.ts +24 -0
  284. package/lib/typescript/src/collision2d/intersections.d.ts.map +1 -0
  285. package/lib/typescript/src/collision2d/manifolds.d.ts +39 -0
  286. package/lib/typescript/src/collision2d/manifolds.d.ts.map +1 -0
  287. package/lib/typescript/src/collision2d/segments.d.ts +24 -0
  288. package/lib/typescript/src/collision2d/segments.d.ts.map +1 -0
  289. package/lib/typescript/src/collision2d/spatialHash.d.ts +50 -0
  290. package/lib/typescript/src/collision2d/spatialHash.d.ts.map +1 -0
  291. package/lib/typescript/src/collision2d/sweeps.d.ts +60 -0
  292. package/lib/typescript/src/collision2d/sweeps.d.ts.map +1 -0
  293. package/lib/typescript/src/collision2d.d.ts +7 -0
  294. package/lib/typescript/src/collision2d.d.ts.map +1 -0
  295. package/lib/typescript/src/core/input/buttonPad.d.ts +59 -0
  296. package/lib/typescript/src/core/input/buttonPad.d.ts.map +1 -0
  297. package/lib/typescript/src/core/input/createInputBuffer.d.ts +1 -1
  298. package/lib/typescript/src/core/input/createInputBuffer.d.ts.map +1 -1
  299. package/lib/typescript/src/core/input/types.d.ts +7 -0
  300. package/lib/typescript/src/core/input/types.d.ts.map +1 -1
  301. package/lib/typescript/src/core/session/createGameSession.d.ts +4 -2
  302. package/lib/typescript/src/core/session/createGameSession.d.ts.map +1 -1
  303. package/lib/typescript/src/core/session/deepFreeze.d.ts +21 -1
  304. package/lib/typescript/src/core/session/deepFreeze.d.ts.map +1 -1
  305. package/lib/typescript/src/core/session/diagnostics.d.ts +2 -0
  306. package/lib/typescript/src/core/session/diagnostics.d.ts.map +1 -1
  307. package/lib/typescript/src/core/session/types.d.ts +69 -4
  308. package/lib/typescript/src/core/session/types.d.ts.map +1 -1
  309. package/lib/typescript/src/definition/defineGame.d.ts +12 -1
  310. package/lib/typescript/src/definition/defineGame.d.ts.map +1 -1
  311. package/lib/typescript/src/definition/types.d.ts +10 -1
  312. package/lib/typescript/src/definition/types.d.ts.map +1 -1
  313. package/lib/typescript/src/events/defineGameEvents.d.ts +26 -0
  314. package/lib/typescript/src/events/defineGameEvents.d.ts.map +1 -0
  315. package/lib/typescript/src/events/errors.d.ts +12 -0
  316. package/lib/typescript/src/events/errors.d.ts.map +1 -0
  317. package/lib/typescript/src/events/index.d.ts +6 -0
  318. package/lib/typescript/src/events/index.d.ts.map +1 -0
  319. package/lib/typescript/src/events/payload.d.ts +21 -0
  320. package/lib/typescript/src/events/payload.d.ts.map +1 -0
  321. package/lib/typescript/src/events/seed.d.ts +3 -0
  322. package/lib/typescript/src/events/seed.d.ts.map +1 -0
  323. package/lib/typescript/src/events/types.d.ts +42 -0
  324. package/lib/typescript/src/events/types.d.ts.map +1 -0
  325. package/lib/typescript/src/events.d.ts +12 -0
  326. package/lib/typescript/src/events.d.ts.map +1 -0
  327. package/lib/typescript/src/geometry/helpers.d.ts +35 -0
  328. package/lib/typescript/src/geometry/helpers.d.ts.map +1 -0
  329. package/lib/typescript/src/geometry/index.d.ts +4 -0
  330. package/lib/typescript/src/geometry/index.d.ts.map +1 -0
  331. package/lib/typescript/src/geometry/types.d.ts +49 -0
  332. package/lib/typescript/src/geometry/types.d.ts.map +1 -1
  333. package/lib/typescript/src/geometry/validation.d.ts +44 -0
  334. package/lib/typescript/src/geometry/validation.d.ts.map +1 -0
  335. package/lib/typescript/src/geometry.d.ts +7 -0
  336. package/lib/typescript/src/geometry.d.ts.map +1 -0
  337. package/lib/typescript/src/haptics/createGameHaptics.d.ts +3 -0
  338. package/lib/typescript/src/haptics/createGameHaptics.d.ts.map +1 -0
  339. package/lib/typescript/src/haptics/errors.d.ts +6 -0
  340. package/lib/typescript/src/haptics/errors.d.ts.map +1 -0
  341. package/lib/typescript/src/haptics/index.d.ts +4 -0
  342. package/lib/typescript/src/haptics/index.d.ts.map +1 -0
  343. package/lib/typescript/src/haptics/resolver.d.ts +22 -0
  344. package/lib/typescript/src/haptics/resolver.d.ts.map +1 -0
  345. package/lib/typescript/src/haptics/types.d.ts +37 -0
  346. package/lib/typescript/src/haptics/types.d.ts.map +1 -0
  347. package/lib/typescript/src/haptics.d.ts +8 -0
  348. package/lib/typescript/src/haptics.d.ts.map +1 -0
  349. package/lib/typescript/src/index.d.ts +10 -2
  350. package/lib/typescript/src/index.d.ts.map +1 -1
  351. package/lib/typescript/src/particles/createParticleSystem.d.ts +5 -0
  352. package/lib/typescript/src/particles/createParticleSystem.d.ts.map +1 -0
  353. package/lib/typescript/src/particles/defineParticleEffect.d.ts +3 -0
  354. package/lib/typescript/src/particles/defineParticleEffect.d.ts.map +1 -0
  355. package/lib/typescript/src/particles/errors.d.ts +5 -0
  356. package/lib/typescript/src/particles/errors.d.ts.map +1 -0
  357. package/lib/typescript/src/particles/index.d.ts +6 -0
  358. package/lib/typescript/src/particles/index.d.ts.map +1 -0
  359. package/lib/typescript/src/particles/sampling.d.ts +54 -0
  360. package/lib/typescript/src/particles/sampling.d.ts.map +1 -0
  361. package/lib/typescript/src/particles/types.d.ts +292 -0
  362. package/lib/typescript/src/particles/types.d.ts.map +1 -0
  363. package/lib/typescript/src/particles.d.ts +2 -0
  364. package/lib/typescript/src/particles.d.ts.map +1 -0
  365. package/lib/typescript/src/react/GameButtonPad.d.ts +84 -0
  366. package/lib/typescript/src/react/GameButtonPad.d.ts.map +1 -0
  367. package/lib/typescript/src/react/GamePointerInput.d.ts.map +1 -1
  368. package/lib/typescript/src/react/GameView.d.ts +27 -1
  369. package/lib/typescript/src/react/GameView.d.ts.map +1 -1
  370. package/lib/typescript/src/react/assets/createGameAssetStore.d.ts.map +1 -1
  371. package/lib/typescript/src/react/assets/useGameAssets.d.ts.map +1 -1
  372. package/lib/typescript/src/react/bindAppLifecycle.d.ts +7 -1
  373. package/lib/typescript/src/react/bindAppLifecycle.d.ts.map +1 -1
  374. package/lib/typescript/src/react/bindGameSession.d.ts.map +1 -1
  375. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts +24 -0
  376. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts.map +1 -0
  377. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts +44 -0
  378. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts.map +1 -0
  379. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts +22 -0
  380. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts.map +1 -0
  381. package/lib/typescript/src/react/cleanupList.d.ts +21 -0
  382. package/lib/typescript/src/react/cleanupList.d.ts.map +1 -0
  383. package/lib/typescript/src/react/instrumentation.d.ts +33 -3
  384. package/lib/typescript/src/react/instrumentation.d.ts.map +1 -1
  385. package/lib/typescript/src/react/lifecycleSource.d.ts +21 -0
  386. package/lib/typescript/src/react/lifecycleSource.d.ts.map +1 -0
  387. package/lib/typescript/src/react/particles/ParticleView.d.ts +65 -0
  388. package/lib/typescript/src/react/particles/ParticleView.d.ts.map +1 -0
  389. package/lib/typescript/src/react/particles/culling.d.ts +70 -0
  390. package/lib/typescript/src/react/particles/culling.d.ts.map +1 -0
  391. package/lib/typescript/src/react/particles/index.d.ts +7 -0
  392. package/lib/typescript/src/react/particles/index.d.ts.map +1 -0
  393. package/lib/typescript/src/react/particles/spriteXForm.d.ts +28 -0
  394. package/lib/typescript/src/react/particles/spriteXForm.d.ts.map +1 -0
  395. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts +48 -0
  396. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts.map +1 -0
  397. package/lib/typescript/src/react/pointerBinding.d.ts +38 -8
  398. package/lib/typescript/src/react/pointerBinding.d.ts.map +1 -1
  399. package/lib/typescript/src/react/pointerCamera.d.ts +20 -0
  400. package/lib/typescript/src/react/pointerCamera.d.ts.map +1 -0
  401. package/lib/typescript/src/react/pointerCoalescer.d.ts +17 -1
  402. package/lib/typescript/src/react/pointerCoalescer.d.ts.map +1 -1
  403. package/lib/typescript/src/react/sprites/GameSprite.d.ts +3 -10
  404. package/lib/typescript/src/react/sprites/GameSprite.d.ts.map +1 -1
  405. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts +51 -6
  406. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts.map +1 -1
  407. package/lib/typescript/src/react/sprites/Sprite.d.ts.map +1 -1
  408. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts +22 -1
  409. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts.map +1 -1
  410. package/lib/typescript/src/react/sprites/batchVisibility.d.ts +28 -0
  411. package/lib/typescript/src/react/sprites/batchVisibility.d.ts.map +1 -0
  412. package/lib/typescript/src/react/sprites/spriteSelection.d.ts +58 -0
  413. package/lib/typescript/src/react/sprites/spriteSelection.d.ts.map +1 -0
  414. package/lib/typescript/src/react/sprites/spriteTransform.d.ts +27 -12
  415. package/lib/typescript/src/react/sprites/spriteTransform.d.ts.map +1 -1
  416. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts +69 -0
  417. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts.map +1 -0
  418. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts +217 -0
  419. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts.map +1 -0
  420. package/lib/typescript/src/react/useGameSession.d.ts +48 -0
  421. package/lib/typescript/src/react/useGameSession.d.ts.map +1 -0
  422. package/lib/typescript/src/react/useGameSessionStatus.d.ts +23 -0
  423. package/lib/typescript/src/react/useGameSessionStatus.d.ts.map +1 -0
  424. package/lib/typescript/src/react/viewportBinding.d.ts +5 -1
  425. package/lib/typescript/src/react/viewportBinding.d.ts.map +1 -1
  426. package/lib/typescript/src/react.d.ts +18 -1
  427. package/lib/typescript/src/react.d.ts.map +1 -1
  428. package/lib/typescript/src/scene/defineScene.d.ts +22 -2
  429. package/lib/typescript/src/scene/defineScene.d.ts.map +1 -1
  430. package/lib/typescript/src/scene/types.d.ts +24 -4
  431. package/lib/typescript/src/scene/types.d.ts.map +1 -1
  432. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts +26 -2
  433. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts.map +1 -1
  434. package/lib/typescript/src/sprites/spriteAnimationState.d.ts +6 -7
  435. package/lib/typescript/src/sprites/spriteAnimationState.d.ts.map +1 -1
  436. package/lib/typescript/src/sprites.d.ts +10 -0
  437. package/lib/typescript/src/sprites.d.ts.map +1 -0
  438. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts +18 -0
  439. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts.map +1 -0
  440. package/lib/typescript/src/storage/adapters/memory.d.ts +16 -0
  441. package/lib/typescript/src/storage/adapters/memory.d.ts.map +1 -0
  442. package/lib/typescript/src/storage/errors.d.ts +37 -0
  443. package/lib/typescript/src/storage/errors.d.ts.map +1 -0
  444. package/lib/typescript/src/storage/index.d.ts +11 -0
  445. package/lib/typescript/src/storage/index.d.ts.map +1 -0
  446. package/lib/typescript/src/storage/schema.d.ts +22 -0
  447. package/lib/typescript/src/storage/schema.d.ts.map +1 -0
  448. package/lib/typescript/src/storage/serialization.d.ts +23 -0
  449. package/lib/typescript/src/storage/serialization.d.ts.map +1 -0
  450. package/lib/typescript/src/storage/store.d.ts +3 -0
  451. package/lib/typescript/src/storage/store.d.ts.map +1 -0
  452. package/lib/typescript/src/storage/types.d.ts +69 -0
  453. package/lib/typescript/src/storage/types.d.ts.map +1 -0
  454. package/lib/typescript/src/storage/validation.d.ts +24 -0
  455. package/lib/typescript/src/storage/validation.d.ts.map +1 -0
  456. package/lib/typescript/src/storage.d.ts +2 -0
  457. package/lib/typescript/src/storage.d.ts.map +1 -0
  458. package/lib/typescript/src/testing.d.ts +1 -0
  459. package/lib/typescript/src/testing.d.ts.map +1 -1
  460. package/lib/typescript/src/tilemap/chunkStats.d.ts +14 -0
  461. package/lib/typescript/src/tilemap/chunkStats.d.ts.map +1 -0
  462. package/lib/typescript/src/tilemap/definitions.d.ts +38 -0
  463. package/lib/typescript/src/tilemap/definitions.d.ts.map +1 -0
  464. package/lib/typescript/src/tilemap/errors.d.ts +7 -0
  465. package/lib/typescript/src/tilemap/errors.d.ts.map +1 -0
  466. package/lib/typescript/src/tilemap/index.d.ts +8 -0
  467. package/lib/typescript/src/tilemap/index.d.ts.map +1 -0
  468. package/lib/typescript/src/tilemap/movement.d.ts +52 -0
  469. package/lib/typescript/src/tilemap/movement.d.ts.map +1 -0
  470. package/lib/typescript/src/tilemap/queries.d.ts +21 -0
  471. package/lib/typescript/src/tilemap/queries.d.ts.map +1 -0
  472. package/lib/typescript/src/tilemap/tiledAdapter.d.ts +32 -0
  473. package/lib/typescript/src/tilemap/tiledAdapter.d.ts.map +1 -0
  474. package/lib/typescript/src/tilemap/types.d.ts +127 -0
  475. package/lib/typescript/src/tilemap/types.d.ts.map +1 -0
  476. package/lib/typescript/src/tilemap.d.ts +2 -0
  477. package/lib/typescript/src/tilemap.d.ts.map +1 -0
  478. package/package.json +94 -4
  479. package/src/assets/defineAssets.ts +31 -5
  480. package/src/assets.ts +27 -0
  481. package/src/audio/createGameAudio.ts +749 -0
  482. package/src/audio/errors.ts +12 -0
  483. package/src/audio/index.ts +9 -0
  484. package/src/audio/resolver.ts +74 -0
  485. package/src/audio/types.ts +47 -0
  486. package/src/audio.ts +13 -0
  487. package/src/camera2d/bounds.ts +69 -0
  488. package/src/camera2d/extents.ts +25 -0
  489. package/src/camera2d/follow.ts +165 -0
  490. package/src/camera2d/index.ts +29 -0
  491. package/src/camera2d/interpolation.ts +113 -0
  492. package/src/camera2d/shake.ts +90 -0
  493. package/src/camera2d/transform.ts +148 -0
  494. package/src/camera2d/types.ts +73 -0
  495. package/src/camera2d/validation.ts +126 -0
  496. package/src/camera2d/visibility.ts +181 -0
  497. package/src/camera2d.ts +6 -0
  498. package/src/collision2d/colliders.ts +292 -0
  499. package/src/collision2d/debug.ts +133 -0
  500. package/src/collision2d/filters.ts +48 -0
  501. package/src/collision2d/index.ts +74 -0
  502. package/src/collision2d/intersections.ts +82 -0
  503. package/src/collision2d/manifolds.ts +191 -0
  504. package/src/collision2d/segments.ts +176 -0
  505. package/src/collision2d/spatialHash.ts +211 -0
  506. package/src/collision2d/sweeps.ts +269 -0
  507. package/src/collision2d.ts +6 -0
  508. package/src/core/input/buttonPad.ts +235 -0
  509. package/src/core/input/createInputBuffer.ts +95 -14
  510. package/src/core/input/types.ts +7 -0
  511. package/src/core/session/createGameSession.ts +480 -53
  512. package/src/core/session/deepFreeze.ts +104 -3
  513. package/src/core/session/diagnostics.ts +2 -0
  514. package/src/core/session/types.ts +77 -4
  515. package/src/definition/defineGame.ts +61 -3
  516. package/src/definition/types.ts +10 -0
  517. package/src/events/defineGameEvents.ts +46 -0
  518. package/src/events/errors.ts +14 -0
  519. package/src/events/index.ts +14 -0
  520. package/src/events/payload.ts +234 -0
  521. package/src/events/seed.ts +33 -0
  522. package/src/events/types.ts +53 -0
  523. package/src/events.ts +20 -0
  524. package/src/geometry/helpers.ts +136 -0
  525. package/src/geometry/index.ts +14 -0
  526. package/src/geometry/types.ts +54 -0
  527. package/src/geometry/validation.ts +131 -0
  528. package/src/geometry.ts +6 -0
  529. package/src/haptics/createGameHaptics.ts +214 -0
  530. package/src/haptics/errors.ts +12 -0
  531. package/src/haptics/index.ts +3 -0
  532. package/src/haptics/resolver.ts +58 -0
  533. package/src/haptics/types.ts +48 -0
  534. package/src/haptics.ts +7 -0
  535. package/src/index.ts +37 -1
  536. package/src/particles/createParticleSystem.ts +505 -0
  537. package/src/particles/defineParticleEffect.ts +164 -0
  538. package/src/particles/errors.ts +6 -0
  539. package/src/particles/index.ts +5 -0
  540. package/src/particles/sampling.ts +141 -0
  541. package/src/particles/types.ts +327 -0
  542. package/src/particles.ts +1 -0
  543. package/src/react/GameButtonPad.tsx +436 -0
  544. package/src/react/GamePointerInput.tsx +73 -8
  545. package/src/react/GameView.tsx +160 -61
  546. package/src/react/assets/createGameAssetStore.ts +140 -107
  547. package/src/react/assets/useGameAssets.ts +63 -31
  548. package/src/react/bindAppLifecycle.ts +55 -19
  549. package/src/react/bindGameSession.ts +12 -2
  550. package/src/react/camera2d/GameLayer2D.tsx +43 -0
  551. package/src/react/camera2d/defineGameCamera2D.ts +59 -0
  552. package/src/react/camera2d/usePresentedCameraBinding.ts +185 -0
  553. package/src/react/cleanupList.ts +48 -0
  554. package/src/react/instrumentation.ts +31 -3
  555. package/src/react/lifecycleSource.ts +58 -0
  556. package/src/react/particles/ParticleView.tsx +358 -0
  557. package/src/react/particles/culling.ts +145 -0
  558. package/src/react/particles/index.ts +6 -0
  559. package/src/react/particles/spriteXForm.ts +72 -0
  560. package/src/react/particles/useParticlePresentation.ts +261 -0
  561. package/src/react/pointerBinding.ts +74 -16
  562. package/src/react/pointerCamera.ts +33 -0
  563. package/src/react/pointerCoalescer.ts +36 -10
  564. package/src/react/sprites/GameSprite.tsx +4 -33
  565. package/src/react/sprites/GameWorld2D.tsx +113 -7
  566. package/src/react/sprites/Sprite.tsx +51 -72
  567. package/src/react/sprites/SpriteBatch.tsx +74 -22
  568. package/src/react/sprites/batchVisibility.ts +76 -0
  569. package/src/react/sprites/spriteSelection.ts +133 -0
  570. package/src/react/sprites/spriteTransform.ts +46 -26
  571. package/src/react/tilemap/TileMapLayer2D.tsx +274 -0
  572. package/src/react/tilemap/tilePresentation.ts +491 -0
  573. package/src/react/useGameSession.ts +90 -0
  574. package/src/react/useGameSessionStatus.ts +53 -0
  575. package/src/react/viewportBinding.ts +5 -1
  576. package/src/react.ts +18 -1
  577. package/src/scene/defineScene.ts +47 -5
  578. package/src/scene/types.ts +37 -3
  579. package/src/sprites/sampleSpriteClip.ts +82 -14
  580. package/src/sprites/spriteAnimationState.ts +29 -25
  581. package/src/sprites.ts +22 -0
  582. package/src/storage/adapters/asyncStorage.ts +77 -0
  583. package/src/storage/adapters/memory.ts +58 -0
  584. package/src/storage/errors.ts +88 -0
  585. package/src/storage/index.ts +18 -0
  586. package/src/storage/schema.ts +147 -0
  587. package/src/storage/serialization.ts +248 -0
  588. package/src/storage/store.ts +380 -0
  589. package/src/storage/types.ts +76 -0
  590. package/src/storage/validation.ts +102 -0
  591. package/src/storage.ts +1 -0
  592. package/src/testing.ts +4 -0
  593. package/src/tilemap/chunkStats.ts +24 -0
  594. package/src/tilemap/definitions.ts +327 -0
  595. package/src/tilemap/errors.ts +11 -0
  596. package/src/tilemap/index.ts +10 -0
  597. package/src/tilemap/movement.ts +368 -0
  598. package/src/tilemap/queries.ts +136 -0
  599. package/src/tilemap/tiledAdapter.ts +165 -0
  600. package/src/tilemap/types.ts +119 -0
  601. package/src/tilemap.ts +1 -0
@@ -0,0 +1,218 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Contact manifolds (T11.2).
5
+ *
6
+ * A `CollisionHit2D` reports geometry only: the normal that moves the FIRST
7
+ * argument out of the SECOND, the nonnegative penetration depth, and a
8
+ * stable contact point. Applying `first += normal * depth` resolves an
9
+ * ordinary overlap within documented floating-point tolerance. Misses
10
+ * return `undefined` and allocate nothing.
11
+ *
12
+ * Conventions (locked in T11.0):
13
+ * - Boundary contact counts as intersection and may return a zero-depth hit.
14
+ * - Circle-AABB: the contact point is the closest point on the AABB to the
15
+ * circle center; when the center is inside the AABB, the minimum
16
+ * penetration face wins with ties in the order left, top, right, bottom.
17
+ * - Circle-circle: the contact point is on the first circle's boundary
18
+ * toward the second; coincident centers use the fallback normal `(0, 1)`
19
+ * (straight up the positive-y axis) with full overlap depth `r1 + r2`.
20
+ * - AABB-AABB: the contact point is the center of the overlap rectangle;
21
+ * exact corner ties use the normal `(0, 1)`.
22
+ */
23
+
24
+ import { assertValidAabb2D, assertValidCircle2D } from "../geometry/validation.js";
25
+ import { closestPointOnAabb2D } from "./intersections.js";
26
+
27
+ /** One contact between two shapes, in the first shape's local resolution. */
28
+
29
+ /** Resolution tolerance used by tests: relative to the shape size. */
30
+ export const RESOLUTION_TOLERANCE = 1e-9;
31
+
32
+ /** AABB-AABB contact manifold. `undefined` when the shapes do not touch. */
33
+ export function collideAabbAabb2D(first, second) {
34
+ assertValidAabb2D(first, 'first');
35
+ assertValidAabb2D(second, 'second');
36
+ const firstMaxX = first.x + first.width;
37
+ const firstMaxY = first.y + first.height;
38
+ const secondMaxX = second.x + second.width;
39
+ const secondMaxY = second.y + second.height;
40
+ if (firstMaxX < second.x || first.x > secondMaxX || firstMaxY < second.y || first.y > secondMaxY) {
41
+ return undefined;
42
+ }
43
+
44
+ // Directional minimum translation (T11-F1): for each axis, the distance
45
+ // that fully separates the intervals in each direction. This resolves
46
+ // containment completely, not merely to a smaller intersection rectangle.
47
+ const exitLeft = firstMaxX - second.x;
48
+ const exitRight = secondMaxX - first.x;
49
+ const exitUp = firstMaxY - second.y;
50
+ const exitDown = secondMaxY - first.y;
51
+ const depthX = Math.min(exitLeft, exitRight);
52
+ const depthY = Math.min(exitUp, exitDown);
53
+ let normal;
54
+ let depth;
55
+ if (depthX === 0 && depthY === 0) {
56
+ // Exact corner touch: locked deterministic tie rule.
57
+ normal = Object.freeze({
58
+ x: 0,
59
+ y: 1
60
+ });
61
+ depth = 0;
62
+ } else if (depthX < depthY) {
63
+ normal = Object.freeze({
64
+ x: exitLeft <= exitRight ? -1 : 1,
65
+ y: 0
66
+ });
67
+ depth = depthX;
68
+ } else {
69
+ // Equal axes resolve on Y (locked tie rule); equal directions on the
70
+ // chosen axis resolve toward the negative direction.
71
+ normal = Object.freeze({
72
+ x: 0,
73
+ y: exitUp <= exitDown ? -1 : 1
74
+ });
75
+ depth = depthY;
76
+ }
77
+ return Object.freeze({
78
+ normal,
79
+ depth,
80
+ point: Object.freeze({
81
+ x: (Math.max(first.x, second.x) + Math.min(firstMaxX, secondMaxX)) / 2,
82
+ y: (Math.max(first.y, second.y) + Math.min(firstMaxY, secondMaxY)) / 2
83
+ })
84
+ });
85
+ }
86
+
87
+ /** Circle-circle contact manifold. `undefined` when the circles do not touch. */
88
+ export function collideCircleCircle2D(first, second) {
89
+ assertValidCircle2D(first, 'first');
90
+ assertValidCircle2D(second, 'second');
91
+ const dx = first.x - second.x;
92
+ const dy = first.y - second.y;
93
+ const radiusSum = first.radius + second.radius;
94
+ const distanceSquared = dx * dx + dy * dy;
95
+ if (distanceSquared > radiusSum * radiusSum) {
96
+ return undefined;
97
+ }
98
+ const distance = Math.sqrt(distanceSquared);
99
+ if (distance === 0) {
100
+ // Coincident centers: locked fallback normal (straight up), full
101
+ // overlap depth, contact point on the first circle's boundary along
102
+ // the normal.
103
+ return Object.freeze({
104
+ normal: Object.freeze({
105
+ x: 0,
106
+ y: 1
107
+ }),
108
+ depth: radiusSum,
109
+ point: Object.freeze({
110
+ x: first.x,
111
+ y: first.y + first.radius
112
+ })
113
+ });
114
+ }
115
+
116
+ // From the second center toward the first: moves the first argument out
117
+ // of the second.
118
+ const normal = Object.freeze({
119
+ x: dx / distance,
120
+ y: dy / distance
121
+ });
122
+ // Contact point: on the first circle's boundary, on the side facing the
123
+ // second circle (opposite the push-out normal).
124
+ return Object.freeze({
125
+ normal,
126
+ depth: radiusSum - distance,
127
+ point: Object.freeze({
128
+ x: first.x - normal.x * first.radius,
129
+ y: first.y - normal.y * first.radius
130
+ })
131
+ });
132
+ }
133
+
134
+ /** Circle-AABB contact manifold. `undefined` when they do not touch. */
135
+ export function collideCircleAabb2D(circle, aabb) {
136
+ assertValidCircle2D(circle);
137
+ assertValidAabb2D(aabb);
138
+ const closest = closestPointOnAabb2D(circle, aabb);
139
+ const dx = circle.x - closest.x;
140
+ const dy = circle.y - closest.y;
141
+ const distanceSquared = dx * dx + dy * dy;
142
+ if (distanceSquared > circle.radius * circle.radius) {
143
+ return undefined;
144
+ }
145
+ if (distanceSquared === 0) {
146
+ // The circle center is inside the AABB: push out along the nearest
147
+ // face; ties resolve left, top, right, bottom (locked).
148
+ const left = circle.x - aabb.x;
149
+ const right = aabb.x + aabb.width - circle.x;
150
+ const top = circle.y - aabb.y;
151
+ const bottom = aabb.y + aabb.height - circle.y;
152
+ const minimum = Math.min(left, right, top, bottom);
153
+ let normal;
154
+ let point;
155
+ if (minimum === left) {
156
+ normal = Object.freeze({
157
+ x: -1,
158
+ y: 0
159
+ });
160
+ point = Object.freeze({
161
+ x: aabb.x,
162
+ y: circle.y
163
+ });
164
+ } else if (minimum === top) {
165
+ normal = Object.freeze({
166
+ x: 0,
167
+ y: -1
168
+ });
169
+ point = Object.freeze({
170
+ x: circle.x,
171
+ y: aabb.y
172
+ });
173
+ } else if (minimum === right) {
174
+ normal = Object.freeze({
175
+ x: 1,
176
+ y: 0
177
+ });
178
+ point = Object.freeze({
179
+ x: aabb.x + aabb.width,
180
+ y: circle.y
181
+ });
182
+ } else {
183
+ normal = Object.freeze({
184
+ x: 0,
185
+ y: 1
186
+ });
187
+ point = Object.freeze({
188
+ x: circle.x,
189
+ y: aabb.y + aabb.height
190
+ });
191
+ }
192
+ return Object.freeze({
193
+ normal,
194
+ depth: minimum + circle.radius,
195
+ point
196
+ });
197
+ }
198
+ const distance = Math.sqrt(distanceSquared);
199
+ // From the closest AABB point toward the circle center: moves the circle
200
+ // (the first argument) out of the AABB.
201
+ const normal = Object.freeze({
202
+ x: dx / distance,
203
+ y: dy / distance
204
+ });
205
+ return Object.freeze({
206
+ normal,
207
+ depth: circle.radius - distance,
208
+ // GS-COLLISION-01: copy-freeze the contact point at the public result
209
+ // boundary. `closest` is rebuilt per call, but copying keeps the hit
210
+ // independent of any future helper caching; sweeps reuse this object
211
+ // through hitFromManifold, so one fix covers every wrapper.
212
+ point: Object.freeze({
213
+ x: closest.x,
214
+ y: closest.y
215
+ })
216
+ });
217
+ }
218
+ //# sourceMappingURL=manifolds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["assertValidAabb2D","assertValidCircle2D","closestPointOnAabb2D","RESOLUTION_TOLERANCE","collideAabbAabb2D","first","second","firstMaxX","x","width","firstMaxY","y","height","secondMaxX","secondMaxY","undefined","exitLeft","exitRight","exitUp","exitDown","depthX","Math","min","depthY","normal","depth","Object","freeze","point","max","collideCircleCircle2D","dx","dy","radiusSum","radius","distanceSquared","distance","sqrt","collideCircleAabb2D","circle","aabb","closest","left","right","top","bottom","minimum"],"sourceRoot":"../../../src","sources":["collision2d/manifolds.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,187 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Segment queries (T11.3).
5
+ *
6
+ * Return the earliest crossing of a directed segment with a shape, with
7
+ * `time` in `[0, 1]`. A segment starting inside a shape returns `time: 0`
8
+ * with the deterministic nearest-face normal (same tie rule as the
9
+ * manifolds: left, top, right, bottom for AABBs; the outward radial
10
+ * direction for circles with the `(0, 1)` fallback at the center).
11
+ */
12
+
13
+ import { assertValidAabb2D, assertValidCircle2D, assertValidSegment2D } from "../geometry/validation.js";
14
+ import { pointInAabb2D, pointInCircle2D } from "./intersections.js";
15
+
16
+ /** Earliest segment crossing of a shape. */
17
+
18
+ /** Earliest crossing of a segment with an AABB (slab method). */
19
+ export function intersectSegmentAabb2D(segment, aabb) {
20
+ assertValidSegment2D(segment);
21
+ assertValidAabb2D(aabb);
22
+ if (pointInAabb2D(segment.start, aabb)) {
23
+ return insideStart(segment.start, aabb);
24
+ }
25
+ const dx = segment.end.x - segment.start.x;
26
+ const dy = segment.end.y - segment.start.y;
27
+ const minX = aabb.x;
28
+ const maxX = aabb.x + aabb.width;
29
+ const minY = aabb.y;
30
+ const maxY = aabb.y + aabb.height;
31
+ let tMin = 0;
32
+ let tMax = 1;
33
+ let entryAxis;
34
+ let entrySign = 0;
35
+ for (const axis of ['x', 'y']) {
36
+ const origin = axis === 'x' ? segment.start.x : segment.start.y;
37
+ const delta = axis === 'x' ? dx : dy;
38
+ const min = axis === 'x' ? minX : minY;
39
+ const max = axis === 'x' ? maxX : maxY;
40
+ if (delta === 0) {
41
+ if (origin <= min || origin >= max) {
42
+ // Parallel and outside the slab, or grazing exactly along a
43
+ // boundary: neither is a crossing.
44
+ return undefined;
45
+ }
46
+ continue;
47
+ }
48
+ const tMinFace = (min - origin) / delta;
49
+ const tMaxFace = (max - origin) / delta;
50
+ const t1 = Math.min(tMinFace, tMaxFace);
51
+ const t2 = Math.max(tMinFace, tMaxFace);
52
+ if (t1 > tMin) {
53
+ tMin = t1;
54
+ entryAxis = axis;
55
+ // The outward normal of the face crossed first: the min face points
56
+ // -axis, the max face points +axis.
57
+ entrySign = t1 === tMinFace ? -1 : 1;
58
+ }
59
+ tMax = Math.min(tMax, t2);
60
+ if (tMax < tMin) {
61
+ return undefined;
62
+ }
63
+ }
64
+ if (entryAxis === undefined) {
65
+ return undefined; // The segment travels along the boundary without crossing.
66
+ }
67
+ const atX = segment.start.x + dx * tMin;
68
+ const atY = segment.start.y + dy * tMin;
69
+ const normal = entryAxis === 'x' ? Object.freeze({
70
+ x: entrySign,
71
+ y: 0
72
+ }) : Object.freeze({
73
+ x: 0,
74
+ y: entrySign
75
+ });
76
+ return Object.freeze({
77
+ time: tMin,
78
+ normal,
79
+ point: Object.freeze({
80
+ x: atX,
81
+ y: atY
82
+ })
83
+ });
84
+ }
85
+
86
+ /** A segment starting inside an AABB: time 0 with the nearest-face normal. */
87
+ function insideStart(point, aabb) {
88
+ const left = point.x - aabb.x;
89
+ const right = aabb.x + aabb.width - point.x;
90
+ const top = point.y - aabb.y;
91
+ const bottom = aabb.y + aabb.height - point.y;
92
+ const minimum = Math.min(left, right, top, bottom);
93
+ let normal;
94
+ if (minimum === left) {
95
+ normal = Object.freeze({
96
+ x: -1,
97
+ y: 0
98
+ });
99
+ } else if (minimum === top) {
100
+ normal = Object.freeze({
101
+ x: 0,
102
+ y: -1
103
+ });
104
+ } else if (minimum === right) {
105
+ normal = Object.freeze({
106
+ x: 1,
107
+ y: 0
108
+ });
109
+ } else {
110
+ normal = Object.freeze({
111
+ x: 0,
112
+ y: 1
113
+ });
114
+ }
115
+ return Object.freeze({
116
+ time: 0,
117
+ normal,
118
+ point: Object.freeze({
119
+ x: point.x,
120
+ y: point.y
121
+ })
122
+ });
123
+ }
124
+
125
+ /** Earliest crossing of a segment with a circle. */
126
+ export function intersectSegmentCircle2D(segment, circle) {
127
+ assertValidSegment2D(segment);
128
+ assertValidCircle2D(circle);
129
+ const dx = segment.end.x - segment.start.x;
130
+ const dy = segment.end.y - segment.start.y;
131
+ const fx = segment.start.x - circle.x;
132
+ const fy = segment.start.y - circle.y;
133
+ if (pointInCircle2D(segment.start, circle)) {
134
+ const distanceSquared = fx * fx + fy * fy;
135
+ const distance = Math.sqrt(distanceSquared);
136
+ // Outward radial: the normalized center-to-start vector. The (0, 1)
137
+ // fallback applies only at the exact center.
138
+ const normal = distance === 0 ? Object.freeze({
139
+ x: 0,
140
+ y: 1
141
+ }) : Object.freeze({
142
+ x: fx / distance,
143
+ y: fy / distance
144
+ });
145
+ return Object.freeze({
146
+ time: 0,
147
+ normal,
148
+ point: Object.freeze({
149
+ x: segment.start.x,
150
+ y: segment.start.y
151
+ })
152
+ });
153
+ }
154
+ const a = dx * dx + dy * dy;
155
+ const b = 2 * (fx * dx + fy * dy);
156
+ const c = fx * fx + fy * fy - circle.radius * circle.radius;
157
+ const discriminant = b * b - 4 * a * c;
158
+ if (discriminant < 0) {
159
+ return undefined;
160
+ }
161
+ const root = Math.sqrt(discriminant);
162
+ const t = (-b - root) / (2 * a);
163
+ if (t < 0 || t > 1) {
164
+ return undefined;
165
+ }
166
+ const atX = segment.start.x + dx * t;
167
+ const atY = segment.start.y + dy * t;
168
+ const outX = atX - circle.x;
169
+ const outY = atY - circle.y;
170
+ const outDistance = Math.hypot(outX, outY);
171
+ const normal = outDistance === 0 ? Object.freeze({
172
+ x: 0,
173
+ y: 1
174
+ }) : Object.freeze({
175
+ x: outX / outDistance,
176
+ y: outY / outDistance
177
+ });
178
+ return Object.freeze({
179
+ time: t,
180
+ normal,
181
+ point: Object.freeze({
182
+ x: atX,
183
+ y: atY
184
+ })
185
+ });
186
+ }
187
+ //# sourceMappingURL=segments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["assertValidAabb2D","assertValidCircle2D","assertValidSegment2D","pointInAabb2D","pointInCircle2D","intersectSegmentAabb2D","segment","aabb","start","insideStart","dx","end","x","dy","y","minX","maxX","width","minY","maxY","height","tMin","tMax","entryAxis","entrySign","axis","origin","delta","min","max","undefined","tMinFace","tMaxFace","t1","Math","t2","atX","atY","normal","Object","freeze","time","point","left","right","top","bottom","minimum","intersectSegmentCircle2D","circle","fx","fy","distanceSquared","distance","sqrt","a","b","c","radius","discriminant","root","t","outX","outY","outDistance","hypot"],"sourceRoot":"../../../src","sources":["collision2d/segments.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Deterministic spatial hash broad phase (T11.5).
5
+ *
6
+ * `buildSpatialHash2D` validates and freezes a plain immutable index value;
7
+ * the per-cell buckets live in an internal WeakMap so callers can never
8
+ * mutate or depend on them. `querySpatialHash2D` visits only the query's
9
+ * cells and returns candidate ids deduplicated and in original insertion
10
+ * order. The broad phase is conservative: it returns candidates, never a
11
+ * narrow-phase collision claim.
12
+ */
13
+
14
+ import { assertValidAabb2D, GeometryError } from "../geometry/validation.js";
15
+
16
+ /** One indexed item with a stable identifier and AABB bounds. */
17
+
18
+ /** A frozen, immutable spatial-hash index. */
19
+
20
+ /** Options for building an index. */
21
+
22
+ /** Maximum cells an item or query may OCCUPY per axis (bounded execution). */
23
+ export const MAX_SPATIAL_HASH_SPAN_CELLS = 1024;
24
+
25
+ /**
26
+ * Maximum cells visited by ONE item insert or ONE query (GS-COLLISION-02).
27
+ *
28
+ * The per-axis bound alone permits ~1M cell visits per operation (~38ms
29
+ * on desktop V8, multiples of that on mobile). The total budget fails
30
+ * clearly before such spans do any work. Ordinary game spans (a few
31
+ * hundred cells per axis at most) pass with wide headroom; aggregate build
32
+ * cost still scales with item count, so prefer an appropriate cell size
33
+ * and reuse static indexes instead of rebuilding per dynamic body per tick.
34
+ */
35
+ export const MAX_SPATIAL_HASH_TOTAL_CELLS = 65_536;
36
+
37
+ /** Opaque per-index internal buckets and order, never exposed publicly. */
38
+ const internalState = new WeakMap();
39
+
40
+ /** Build a spatial-hash index over the given items. */
41
+ export function buildSpatialHash2D(options) {
42
+ const {
43
+ items,
44
+ cellSize
45
+ } = options;
46
+ if (!Number.isFinite(cellSize) || cellSize <= 0) {
47
+ throw new GeometryError('GEOMETRY_INVALID_NUMBER', 'cellSize', `expected a positive finite number, got ${String(cellSize)}`);
48
+ }
49
+ const seen = new Set();
50
+ const cells = new Map();
51
+ const order = new Map();
52
+ const frozenItems = [];
53
+ for (const item of items) {
54
+ if (seen.has(item.id)) {
55
+ throw new GeometryError('GEOMETRY_DUPLICATE_ID', 'items.id', `expected unique item ids, got duplicate "${item.id}"`);
56
+ }
57
+ seen.add(item.id);
58
+ assertValidAabb2D(item.bounds, `items.${item.id}.bounds`);
59
+ // Clone the caller's item and its bounds: the index must never freeze
60
+ // or retain caller-owned objects, and the private buckets must agree
61
+ // with the public `items` view.
62
+ const cloned = Object.freeze({
63
+ id: item.id,
64
+ bounds: Object.freeze({
65
+ ...item.bounds
66
+ })
67
+ });
68
+ frozenItems.push(cloned);
69
+ order.set(item.id, frozenItems.length - 1);
70
+ for (const cell of cellsOf(cloned.bounds, cellSize)) {
71
+ const key = cellKey(cell.x, cell.y);
72
+ const bucket = cells.get(key);
73
+ if (bucket === undefined) {
74
+ cells.set(key, [item.id]);
75
+ } else {
76
+ bucket.push(item.id);
77
+ }
78
+ }
79
+ }
80
+ const index = Object.freeze({
81
+ cellSize,
82
+ items: Object.freeze(frozenItems)
83
+ });
84
+ internalState.set(index, {
85
+ cells: new Map([...cells.entries()].map(([key, ids]) => [key, Object.freeze(ids)])),
86
+ // The local `order` map never escapes this function, so it is stored
87
+ // directly (GS-COLLISION-02): the extra copy served no ownership purpose.
88
+ order
89
+ });
90
+ return index;
91
+ }
92
+
93
+ /** Query candidates whose bounds share a cell with the query bounds. */
94
+ export function querySpatialHash2D(index, bounds) {
95
+ assertValidAabb2D(bounds, 'bounds');
96
+ const state = internalState.get(index);
97
+ if (state === undefined) {
98
+ throw new GeometryError('GEOMETRY_INVALID_NUMBER', 'index', 'expected an index built by buildSpatialHash2D');
99
+ }
100
+ const seen = new Set();
101
+ const collected = [];
102
+ for (const cell of cellsOf(bounds, index.cellSize)) {
103
+ const bucket = state.cells.get(cellKey(cell.x, cell.y));
104
+ if (bucket === undefined) {
105
+ continue;
106
+ }
107
+ for (const id of bucket) {
108
+ if (!seen.has(id)) {
109
+ seen.add(id);
110
+ collected.push(id);
111
+ }
112
+ }
113
+ }
114
+ // Preserve original insertion order regardless of bucket order.
115
+ collected.sort((a, b) => state.order.get(a) - state.order.get(b));
116
+ // The public result is frozen (T11-FF5): the immutable contract is
117
+ // runtime-enforced, not only a type-level promise.
118
+ return Object.freeze(collected);
119
+ }
120
+ /** Every cell an AABB occupies, in deterministic order. */
121
+ function* cellsOf(bounds, cellSize) {
122
+ const minX = cellIndex(bounds.x, cellSize);
123
+ const maxX = cellIndex(bounds.x + bounds.width, cellSize);
124
+ const minY = cellIndex(bounds.y, cellSize);
125
+ const maxY = cellIndex(bounds.y + bounds.height, cellSize);
126
+ assertSpan(maxX - minX, 'x');
127
+ assertSpan(maxY - minY, 'y');
128
+ assertTotalCells(maxX - minX, maxY - minY);
129
+ for (let y = minY; y <= maxY; y += 1) {
130
+ for (let x = minX; x <= maxX; x += 1) {
131
+ yield {
132
+ x,
133
+ y
134
+ };
135
+ }
136
+ }
137
+ }
138
+
139
+ /** Validate a derived cell index as a finite safe integer. */
140
+ function cellIndex(coord, cellSize) {
141
+ const index = Math.floor(coord / cellSize);
142
+ if (!Number.isSafeInteger(index)) {
143
+ throw new GeometryError('GEOMETRY_SPATIAL_INDEX_RANGE', 'bounds', `coordinate ${coord} produces an unsafe cell index`);
144
+ }
145
+ return index;
146
+ }
147
+
148
+ /** Reject spans that would block the JS thread (bounded execution). */
149
+ function assertSpan(span, axis) {
150
+ const cells = span + 1; // The inclusive loop visits span + 1 cells.
151
+ if (cells > MAX_SPATIAL_HASH_SPAN_CELLS) {
152
+ throw new GeometryError('GEOMETRY_SPATIAL_INDEX_RANGE', `bounds.${axis}`, `bounds occupy ${cells} cells, exceeding the maximum of ${MAX_SPATIAL_HASH_SPAN_CELLS}`);
153
+ }
154
+ }
155
+
156
+ /** Reject total occupied cells beyond the work budget (GS-COLLISION-02). */
157
+ function assertTotalCells(spanX, spanY) {
158
+ // Both axes already passed assertSpan, so the product cannot overflow.
159
+ const total = (spanX + 1) * (spanY + 1);
160
+ if (total > MAX_SPATIAL_HASH_TOTAL_CELLS) {
161
+ throw new GeometryError('GEOMETRY_SPATIAL_INDEX_RANGE', 'bounds', `bounds occupy ${total} cells, exceeding the total maximum of ${MAX_SPATIAL_HASH_TOTAL_CELLS}`);
162
+ }
163
+ }
164
+ function cellKey(x, y) {
165
+ return `${x},${y}`;
166
+ }
167
+ //# sourceMappingURL=spatialHash.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["assertValidAabb2D","GeometryError","MAX_SPATIAL_HASH_SPAN_CELLS","MAX_SPATIAL_HASH_TOTAL_CELLS","internalState","WeakMap","buildSpatialHash2D","options","items","cellSize","Number","isFinite","String","seen","Set","cells","Map","order","frozenItems","item","has","id","add","bounds","cloned","Object","freeze","push","set","length","cell","cellsOf","key","cellKey","x","y","bucket","get","undefined","index","entries","map","ids","querySpatialHash2D","state","collected","sort","a","b","minX","cellIndex","maxX","width","minY","maxY","height","assertSpan","assertTotalCells","coord","Math","floor","isSafeInteger","span","axis","spanX","spanY","total"],"sourceRoot":"../../../src","sources":["collision2d/spatialHash.ts"],"mappings":"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","ignoreList":[]}