rn-gamekit 0.1.0 → 0.2.1

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 +75 -0
  2. package/README.md +97 -16
  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 +100 -10
  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,308 @@
1
+ "use strict";
2
+
3
+ import { useContext, useMemo } from 'react';
4
+ import { Atlas, Picture, Skia } from '@shopify/react-native-skia';
5
+ import { useColorBuffer, useRectBuffer, useRSXformBuffer } from '@shopify/react-native-skia';
6
+ import { useDerivedValue } from 'react-native-reanimated';
7
+ import { GameWorldContext } from "../sprites/GameWorld2D.js";
8
+ import { PARTICLE_CULL_PADDING, cameraVisibleWorldBounds, maxParticleExtent, screenVisibleBounds, viewportWorldBounds, visibleInBounds } from "./culling.js";
9
+ import { assertUniformParticleSpriteRatio, particleSpriteXform } from "./spriteXForm.js";
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ /**
12
+ * Presentation-only particle renderer.
13
+ *
14
+ * Topology is CONSTANT per effect regardless of capacity (T15-RF5): exactly
15
+ * one React node (`Picture` for shapes, `Atlas` for sprites) plus a single
16
+ * UI-runtime derived worklet that walks the effect's emission records and
17
+ * computes analytic transforms from the scalar active-time clock. No per-slot
18
+ * data crosses the runtime boundary per frame (T15-SF1).
19
+ *
20
+ * Coordinate ownership (GS-PARTICLE-02): `space: 'world'` effects sample in
21
+ * world units and must mount inside world space (no parent transform);
22
+ * `space: 'screen'` effects sample in surface pixels and must mount inside
23
+ * screen space. World culling uses the presented camera when one exists
24
+ * and the resolved viewport bounds otherwise; zoom applies through the
25
+ * camera, and there is no parallax factor on particles by design.
26
+ */
27
+ export function ParticleView({
28
+ system,
29
+ effect,
30
+ width,
31
+ height,
32
+ presentation,
33
+ spriteSource
34
+ }) {
35
+ const definition = useMemo(() => system.bindPresentation().definition(effect), [system, effect]);
36
+ // GS-PARTICLE-02: conservative cull extent from authored geometry and
37
+ // scale endpoints (bounding radius, rotation-proof); overscan stays in
38
+ // the bounds padding, never in this extent.
39
+ const cullExtent = useMemo(() => maxParticleExtent(definition), [definition]);
40
+ const world = useContext(GameWorldContext);
41
+ const camera = world?.camera ?? null;
42
+ const viewport = world?.viewport ?? null;
43
+ if (definition.particle.kind === 'sprite') {
44
+ if (spriteSource === undefined) {
45
+ throw new Error(`[rn-gamekit/particles] effect "${effect}" declares kind "sprite" but no spriteSource was provided — resolve the sheet via the asset store before rendering`);
46
+ }
47
+ assertUniformParticleSpriteRatio(definition.particle.size.width, definition.particle.size.height, spriteSource.frame.width, spriteSource.frame.height);
48
+ return /*#__PURE__*/_jsx(SpriteSlots, {
49
+ clock: presentation.clock,
50
+ registry: presentation.registry,
51
+ effect: effect,
52
+ capacity: definition.capacity,
53
+ image: spriteSource.image,
54
+ frameRect: spriteSource.frame,
55
+ drawWidth: definition.particle.size.width,
56
+ drawHeight: definition.particle.size.height,
57
+ cullExtent: cullExtent,
58
+ fadeOut: definition.fadeOut,
59
+ gravityX: definition.gravity.x,
60
+ gravityY: definition.gravity.y,
61
+ width: width,
62
+ height: height,
63
+ space: definition.space,
64
+ camera: camera,
65
+ viewport: viewport
66
+ });
67
+ }
68
+ return /*#__PURE__*/_jsx(ShapeBatch, {
69
+ clock: presentation.clock,
70
+ registry: presentation.registry,
71
+ effect: effect,
72
+ capacity: definition.capacity,
73
+ shape: definition.particle.shape === 'rectangle' ? 'rect' : 'circle',
74
+ radius: definition.particle.radius ?? 3,
75
+ rectWidth: definition.particle.width ?? 6,
76
+ rectHeight: definition.particle.height ?? 6,
77
+ cullExtent: cullExtent,
78
+ color: definition.particle.color ?? '#ffffff',
79
+ fadeOut: definition.fadeOut,
80
+ gravityX: definition.gravity.x,
81
+ gravityY: definition.gravity.y,
82
+ width: width,
83
+ height: height,
84
+ space: definition.space,
85
+ camera: camera,
86
+ viewport: viewport
87
+ });
88
+ }
89
+
90
+ /**
91
+ * Analytic transform for one emission at the given ACTIVE time.
92
+ *
93
+ * T15-TF3: opacity honors the definition's fade policy — `fadeOut: true`
94
+ * ramps `1 -> t`, `fadeOut: false` stays fully opaque for the whole life.
95
+ */
96
+ export function sampleEmission(e, now, gravityX, gravityY, fadeOut) {
97
+ 'worklet';
98
+
99
+ const age = now - e.bornAt;
100
+ if (age < 0 || age >= e.lifetime) {
101
+ return {
102
+ x: 0,
103
+ y: 0,
104
+ rotation: 0,
105
+ scale: 0,
106
+ opacity: 0,
107
+ alive: false
108
+ };
109
+ }
110
+ const t = age / e.lifetime;
111
+ const x = e.originX + e.vx * age + 0.5 * gravityX * age * age;
112
+ const y = e.originY + e.vy * age + 0.5 * gravityY * age * age;
113
+ const rotation = e.rotation + e.rotationSpeed * age;
114
+ // T20A-R1: definitions guarantee non-negative scale. The clamp keeps any
115
+ // legacy negative `scaleOverLife` value DEFINED (collapse to a point)
116
+ // instead of handing Skia a signed radius or rectangle extent.
117
+ const scale = Math.max(0, e.scaleStart + (e.scaleEnd - e.scaleStart) * t);
118
+ const opacity = fadeOut ? 1 - t : 1;
119
+ return {
120
+ x,
121
+ y,
122
+ rotation,
123
+ scale,
124
+ opacity,
125
+ alive: true
126
+ };
127
+ }
128
+
129
+ // ---------------------------------------------------------------------------
130
+ // Shapes: ONE immediate Picture built in ONE worklet per effect (T15-RF5).
131
+ // ---------------------------------------------------------------------------
132
+
133
+ function ShapeBatch(props) {
134
+ const {
135
+ clock,
136
+ registry,
137
+ effect,
138
+ capacity,
139
+ shape,
140
+ radius,
141
+ rectWidth,
142
+ rectHeight,
143
+ color,
144
+ fadeOut,
145
+ gravityX,
146
+ gravityY,
147
+ width,
148
+ height,
149
+ space,
150
+ cullExtent,
151
+ camera,
152
+ viewport
153
+ } = props;
154
+ const picture = useDerivedValue(() => {
155
+ 'worklet';
156
+
157
+ const reg = registry.value;
158
+ const entry = reg.effects[effect];
159
+ const now = clock.value;
160
+ // Culling bounds computed ONCE per revision. World space without a
161
+ // presented camera falls back to the resolved viewport bounds (never
162
+ // fail-closed hide); the particle extent keeps crossings visible.
163
+ const bounds = space === 'world' ? camera?.value?.camera === undefined ? viewportWorldBounds(viewport, PARTICLE_CULL_PADDING) : cameraVisibleWorldBounds(camera, viewport, PARTICLE_CULL_PADDING) : screenVisibleBounds(width, height, PARTICLE_CULL_PADDING);
164
+ const recorder = Skia.PictureRecorder();
165
+ const canvas = recorder.beginRecording();
166
+ if (entry === undefined) return recorder.finishRecordingAsPicture();
167
+ const paint = Skia.Paint();
168
+ paint.setColor(Skia.Color(color));
169
+ const particles = entry.particles;
170
+ for (let i = 0; i < particles.length && i < capacity; i++) {
171
+ const e = particles[i];
172
+ const s = sampleEmission(e, now, gravityX, gravityY, fadeOut);
173
+ if (!s.alive || s.opacity <= 0) continue;
174
+ if (!visibleInBounds(s.x, s.y, cullExtent, bounds)) continue;
175
+ paint.setAlphaf(Math.max(0, Math.min(1, s.opacity)));
176
+ if (shape === 'circle') {
177
+ canvas.drawCircle(s.x, s.y, radius * s.scale, paint);
178
+ } else {
179
+ const w = rectWidth * s.scale;
180
+ const h = rectHeight * s.scale;
181
+ const matrix = Skia.Matrix().translate(s.x, s.y).rotate(s.rotation);
182
+ canvas.save();
183
+ canvas.concat(matrix);
184
+ canvas.drawRect({
185
+ x: -w / 2,
186
+ y: -h / 2,
187
+ width: w,
188
+ height: h
189
+ }, paint);
190
+ canvas.restore();
191
+ }
192
+ }
193
+ return recorder.finishRecordingAsPicture();
194
+ });
195
+ return /*#__PURE__*/_jsx(Picture, {
196
+ picture: picture
197
+ });
198
+ }
199
+
200
+ // ---------------------------------------------------------------------------
201
+ // Sprites: fixed-capacity Atlas buffers filled by ONE worklet (T15-F3/R4/SF2).
202
+ // ---------------------------------------------------------------------------
203
+
204
+ function SpriteSlots(props) {
205
+ const {
206
+ clock,
207
+ registry,
208
+ effect,
209
+ capacity,
210
+ image,
211
+ frameRect,
212
+ drawWidth,
213
+ drawHeight,
214
+ fadeOut,
215
+ gravityX,
216
+ gravityY,
217
+ width,
218
+ height,
219
+ space,
220
+ cullExtent,
221
+ camera,
222
+ viewport
223
+ } = props;
224
+
225
+ // UI-owned buffers created once per mount (T15-SF1). Colors use the
226
+ // supported Skia color buffer (T15-TF3): each entry is an SkColor
227
+ // Float32Array [r,g,b,a] mutated on the UI runtime.
228
+ const rects = useRectBuffer(capacity, rect => {
229
+ 'worklet';
230
+
231
+ rect.setXYWH(0, 0, 0, 0);
232
+ });
233
+ const xforms = useRSXformBuffer(capacity, xform => {
234
+ 'worklet';
235
+
236
+ xform.set(1, 0, 0, 0);
237
+ });
238
+ const colors = useColorBuffer(capacity, color => {
239
+ 'worklet';
240
+
241
+ color[0] = 1;
242
+ color[1] = 1;
243
+ color[2] = 1;
244
+ color[3] = 0;
245
+ });
246
+ useDerivedValue(() => {
247
+ 'worklet';
248
+
249
+ const reg = registry.value;
250
+ const entry = reg.effects[effect];
251
+ const now = clock.value;
252
+ const bounds = space === 'world' ? camera?.value?.camera === undefined ? viewportWorldBounds(viewport, PARTICLE_CULL_PADDING) : cameraVisibleWorldBounds(camera, viewport, PARTICLE_CULL_PADDING) : screenVisibleBounds(width, height, PARTICLE_CULL_PADDING);
253
+ for (let i = 0; i < capacity; i++) {
254
+ const rectSlot = rects.value[i];
255
+ const xformSlot = xforms.value[i];
256
+ const colorSlot = colors.value[i];
257
+ if (rectSlot === undefined || xformSlot === undefined || colorSlot === undefined) continue;
258
+ let placed = false;
259
+ if (entry !== undefined && i < entry.particles.length) {
260
+ const e = entry.particles[i];
261
+ const age = now - e.bornAt;
262
+ if (age >= 0 && age < e.lifetime) {
263
+ const t = age / e.lifetime;
264
+ const x = e.originX + e.vx * age + 0.5 * gravityX * age * age;
265
+ const y = e.originY + e.vy * age + 0.5 * gravityY * age * age;
266
+ if (visibleInBounds(x, y, cullExtent, bounds)) {
267
+ const op = fadeOut ? 1 - t : 1;
268
+ const xf = particleSpriteXform({
269
+ x,
270
+ y,
271
+ rotation: e.rotation + e.rotationSpeed * age,
272
+ // T20A-R1: non-negative clamp — see the shape sampler note.
273
+ scale: Math.max(0, e.scaleStart + (e.scaleEnd - e.scaleStart) * t),
274
+ drawWidth,
275
+ drawHeight,
276
+ frameWidth: frameRect.width,
277
+ frameHeight: frameRect.height
278
+ });
279
+ rectSlot.setXYWH(frameRect.x, frameRect.y, frameRect.width, frameRect.height);
280
+ xformSlot.set(xf.scos, xf.ssin, xf.tx, xf.ty);
281
+ // White modulates the texture; alpha carries sampled fade.
282
+ colorSlot[0] = 1;
283
+ colorSlot[1] = 1;
284
+ colorSlot[2] = 1;
285
+ colorSlot[3] = Math.max(0, Math.min(1, op));
286
+ placed = true;
287
+ }
288
+ }
289
+ }
290
+ if (!placed) {
291
+ // Hide inactive/culled slots AND clear stale alpha (T15-SF2).
292
+ rectSlot.setXYWH(0, 0, 0, 0);
293
+ colorSlot[0] = 1;
294
+ colorSlot[1] = 1;
295
+ colorSlot[2] = 1;
296
+ colorSlot[3] = 0;
297
+ }
298
+ }
299
+ return colors;
300
+ });
301
+ return /*#__PURE__*/_jsx(Atlas, {
302
+ image: image,
303
+ sprites: rects,
304
+ transforms: xforms,
305
+ colors: colors
306
+ });
307
+ }
308
+ //# sourceMappingURL=ParticleView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useContext","useMemo","Atlas","Picture","Skia","useColorBuffer","useRectBuffer","useRSXformBuffer","useDerivedValue","GameWorldContext","PARTICLE_CULL_PADDING","cameraVisibleWorldBounds","maxParticleExtent","screenVisibleBounds","viewportWorldBounds","visibleInBounds","assertUniformParticleSpriteRatio","particleSpriteXform","jsx","_jsx","ParticleView","system","effect","width","height","presentation","spriteSource","definition","bindPresentation","cullExtent","world","camera","viewport","particle","kind","undefined","Error","size","frame","SpriteSlots","clock","registry","capacity","image","frameRect","drawWidth","drawHeight","fadeOut","gravityX","gravity","x","gravityY","y","space","ShapeBatch","shape","radius","rectWidth","rectHeight","color","sampleEmission","e","now","age","bornAt","lifetime","rotation","scale","opacity","alive","t","originX","vx","originY","vy","rotationSpeed","Math","max","scaleStart","scaleEnd","props","picture","reg","value","entry","effects","bounds","recorder","PictureRecorder","canvas","beginRecording","finishRecordingAsPicture","paint","Paint","setColor","Color","particles","i","length","s","setAlphaf","min","drawCircle","w","h","matrix","Matrix","translate","rotate","save","concat","drawRect","restore","rects","rect","setXYWH","xforms","xform","set","colors","rectSlot","xformSlot","colorSlot","placed","op","xf","frameWidth","frameHeight","scos","ssin","tx","ty","sprites","transforms"],"sourceRoot":"../../../../src","sources":["react/particles/ParticleView.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+
3
+ /** Conservative world-space AABB used for presentation-only culling. */
4
+ import { rotatedHalfExtents2D } from "../../camera2d/extents.js";
5
+ export const PARTICLE_CULL_PADDING = 16;
6
+
7
+ /**
8
+ * The world region visible through the PRESENTED camera (T15-RF2).
9
+ *
10
+ * The logical viewport rectangle is rotated/zoomed by the camera, so its
11
+ * axis-aligned world bounds are the center plus the rotated half-extents:
12
+ *
13
+ * ex = |hx·cosθ| + |hy·sinθ|, ey = |hx·sinθ| + |hy·cosθ|
14
+ *
15
+ * which is the exact AABB of the rotated view rect. Padding is applied in
16
+ * world units. Worklet-safe; shared by the shape Picture and Atlas paths so
17
+ * their culling results cannot diverge.
18
+ */
19
+ export function cameraVisibleWorldBounds(camera, viewport, pad) {
20
+ 'worklet';
21
+
22
+ if (camera === null || viewport === null) return undefined;
23
+ const view = viewport.value?.visibleLogicalBounds;
24
+ const cam = camera.value?.camera;
25
+ if (view === undefined || cam === undefined) return undefined;
26
+ const hx = view.width / (2 * cam.zoom);
27
+ const hy = view.height / (2 * cam.zoom);
28
+ const extent = rotatedHalfExtents2D(hx, hy, cam.rotationRadians);
29
+ const ex = extent.x + pad;
30
+ const ey = extent.y + pad;
31
+ return {
32
+ minX: cam.center.x - ex,
33
+ minY: cam.center.y - ey,
34
+ maxX: cam.center.x + ex,
35
+ maxY: cam.center.y + ey
36
+ };
37
+ }
38
+ export function screenVisibleBounds(width, height, pad) {
39
+ 'worklet';
40
+
41
+ return {
42
+ minX: -pad,
43
+ minY: -pad,
44
+ maxX: width + pad,
45
+ maxY: height + pad
46
+ };
47
+ }
48
+
49
+ /**
50
+ * Viewport-only world bounds for presentation without a presented camera
51
+ * (GS-PARTICLE-02): the tile layer's viewport-only path — the resolved
52
+ * logical bounds expanded by world-unit padding. World particles inside an
53
+ * ordinary viewport-only GameWorld2D render instead of failing closed.
54
+ */
55
+ export function viewportWorldBounds(viewport, pad) {
56
+ 'worklet';
57
+
58
+ const view = viewport?.value?.visibleLogicalBounds;
59
+ if (view === undefined) return undefined;
60
+ return {
61
+ minX: view.x - pad,
62
+ minY: view.y - pad,
63
+ maxX: view.x + view.width + pad,
64
+ maxY: view.y + view.height + pad
65
+ };
66
+ }
67
+
68
+ /**
69
+ * Circle-vs-bounds visibility (GS-PARTICLE-02): the particle's
70
+ * conservative extent (bounding radius from geometry and scale endpoints)
71
+ * expands the bounds, so partially crossing shapes stay visible while
72
+ * fully outside shapes cull. Extra overscan stays in the bounds padding —
73
+ * never folded into the shape extent. A missing bounds still hides.
74
+ */
75
+ export function visibleInBounds(x, y, extent, b) {
76
+ 'worklet';
77
+
78
+ if (b === undefined) return false;
79
+ return x >= b.minX - extent && x <= b.maxX + extent && y >= b.minY - extent && y <= b.maxY + extent;
80
+ }
81
+
82
+ /**
83
+ * Conservative per-effect cull extent (GS-PARTICLE-02): the bounding
84
+ * radius of the authored geometry times the largest scale endpoint, so
85
+ * rotation can never push drawn pixels past the culled region. Circles
86
+ * use radius; rectangles and sprites use half the diagonal; absent
87
+ * dimensions fall back to the render defaults. The legacy scale range
88
+ * contributes its maximum; definitions without scale use 1.
89
+ */
90
+ export function maxParticleExtent(definition) {
91
+ 'worklet';
92
+
93
+ let maxScale = 1;
94
+ const scale = definition.scale;
95
+ if (scale !== undefined) {
96
+ if (scale.start.max > maxScale) maxScale = scale.start.max;
97
+ if (scale.end.max > maxScale) maxScale = scale.end.max;
98
+ }
99
+ const legacy = definition.scaleOverLife;
100
+ if (legacy !== undefined && legacy.max > maxScale) maxScale = legacy.max;
101
+ const particle = definition.particle;
102
+ if (particle.kind === 'sprite') {
103
+ return Math.hypot(particle.size.width, particle.size.height) / 2 * maxScale;
104
+ }
105
+ if (particle.shape === 'circle') {
106
+ return (particle.radius ?? 3) * maxScale;
107
+ }
108
+ return Math.hypot(particle.width ?? 6, particle.height ?? 6) / 2 * maxScale;
109
+ }
110
+ // keeping this pure module free of Reanimated/RN imports while accepting
111
+ // real SharedValue<CameraCut2D|ResolvedViewport2D> instances.
112
+ // Minimal structural mirrors of the shared refs the view layer passes in,
113
+ // keeping this pure module free of Reanimated/RN imports while accepting
114
+ // real SharedValue<CameraCut2D|ResolvedViewport2D> instances.
115
+ //# sourceMappingURL=culling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rotatedHalfExtents2D","PARTICLE_CULL_PADDING","cameraVisibleWorldBounds","camera","viewport","pad","undefined","view","value","visibleLogicalBounds","cam","hx","width","zoom","hy","height","extent","rotationRadians","ex","x","ey","y","minX","center","minY","maxX","maxY","screenVisibleBounds","viewportWorldBounds","visibleInBounds","b","maxParticleExtent","definition","maxScale","scale","start","max","end","legacy","scaleOverLife","particle","kind","Math","hypot","size","shape","radius"],"sourceRoot":"../../../../src","sources":["react/particles/culling.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ export { ParticleView } from "./ParticleView.js";
4
+ export { useParticlePresentation } from "./useParticlePresentation.js";
5
+ export { particleSpriteXform, assertUniformParticleSpriteRatio } from "./spriteXForm.js";
6
+ export { cameraVisibleWorldBounds, screenVisibleBounds, visibleInBounds, PARTICLE_CULL_PADDING } from "./culling.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ParticleView","useParticlePresentation","particleSpriteXform","assertUniformParticleSpriteRatio","cameraVisibleWorldBounds","screenVisibleBounds","visibleInBounds","PARTICLE_CULL_PADDING"],"sourceRoot":"../../../../src","sources":["react/particles/index.ts"],"mappings":";;AAAA,SAASA,YAAY,QAAQ,mBAAgB;AAE7C,SAASC,uBAAuB,QAAQ,8BAA2B;AAEnE,SAASC,mBAAmB,EAAEC,gCAAgC,QAAQ,kBAAe;AACrF,SAASC,wBAAwB,EAAEC,mBAAmB,EAAEC,eAAe,EAAEC,qBAAqB,QAAQ,cAAW","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Particle sprite transform (T15-RF4).
5
+ *
6
+ * Atlas RSXform carries rotation AND uniform scale in its 2×2 part:
7
+ * \`scos = s·cosθ\`, \`ssin = s·sinθ\`. The pivot compensation uses the
8
+ * AUTHORED draw size (the definition's \`size\`), and the source rect stays
9
+ * the sheet frame — so the authored-to-source ratio scales the drawn sprite.
10
+ *
11
+ * v1 requires the authored size ratio to match the source frame ratio; a
12
+ * mismatch is a structured error (RSXform cannot express nonuniform scale).
13
+ */
14
+ import { ParticleError } from "../../particles/errors.js";
15
+ export function particleSpriteXform(input) {
16
+ 'worklet';
17
+
18
+ // T15-SF2: Atlas draws the SOURCE rect, so the authored-to-source ratio
19
+ // must ride in scos/ssin or the drawn size ignores particle.size entirely.
20
+ const effScale = input.scale * (input.drawWidth / input.frameWidth);
21
+ const cos = Math.cos(input.rotation);
22
+ const sin = Math.sin(input.rotation);
23
+ // Center anchor pivot against the DRAWN (scaled source) extent.
24
+ const px = input.frameWidth / 2 * effScale;
25
+ const py = input.frameHeight / 2 * effScale;
26
+ return {
27
+ scos: effScale * cos,
28
+ ssin: effScale * sin,
29
+ tx: input.x - px * cos + py * sin,
30
+ ty: input.y - px * sin - py * cos
31
+ };
32
+ }
33
+
34
+ /**
35
+ * Validate that the authored size ratio matches the source frame ratio so
36
+ * uniform-scale Atlas drawing preserves the intended aspect.
37
+ */
38
+ export function assertUniformParticleSpriteRatio(drawWidth, drawHeight, frameWidth, frameHeight) {
39
+ const drawRatio = drawWidth / drawHeight;
40
+ const frameRatio = frameWidth / frameHeight;
41
+ if (!Number.isFinite(drawRatio) || !Number.isFinite(frameRatio) || Math.abs(drawRatio - frameRatio) > 1e-3) {
42
+ throw new ParticleError(`[rn-gamekit/particles] sprite effect size ${drawWidth}x${drawHeight} does not match source frame ${frameWidth}x${frameHeight} aspect — nonuniform sprite scaling is not supported in v1`);
43
+ }
44
+ }
45
+ //# sourceMappingURL=spriteXForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ParticleError","particleSpriteXform","input","effScale","scale","drawWidth","frameWidth","cos","Math","rotation","sin","px","py","frameHeight","scos","ssin","tx","x","ty","y","assertUniformParticleSpriteRatio","drawHeight","drawRatio","frameRatio","Number","isFinite","abs"],"sourceRoot":"../../../../src","sources":["react/particles/spriteXForm.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,aAAa,QAAQ,2BAAwB;AAyBtD,OAAO,SAASC,mBAAmBA,CAACC,KAA+B,EAAuB;EACxF,SAAS;;EACT;EACA;EACA,MAAMC,QAAQ,GAAGD,KAAK,CAACE,KAAK,IAAIF,KAAK,CAACG,SAAS,GAAGH,KAAK,CAACI,UAAU,CAAC;EACnE,MAAMC,GAAG,GAAGC,IAAI,CAACD,GAAG,CAACL,KAAK,CAACO,QAAQ,CAAC;EACpC,MAAMC,GAAG,GAAGF,IAAI,CAACE,GAAG,CAACR,KAAK,CAACO,QAAQ,CAAC;EACpC;EACA,MAAME,EAAE,GAAIT,KAAK,CAACI,UAAU,GAAG,CAAC,GAAIH,QAAQ;EAC5C,MAAMS,EAAE,GAAIV,KAAK,CAACW,WAAW,GAAG,CAAC,GAAIV,QAAQ;EAC7C,OAAO;IACLW,IAAI,EAAEX,QAAQ,GAAGI,GAAG;IACpBQ,IAAI,EAAEZ,QAAQ,GAAGO,GAAG;IACpBM,EAAE,EAAEd,KAAK,CAACe,CAAC,GAAGN,EAAE,GAAGJ,GAAG,GAAGK,EAAE,GAAGF,GAAG;IACjCQ,EAAE,EAAEhB,KAAK,CAACiB,CAAC,GAAGR,EAAE,GAAGD,GAAG,GAAGE,EAAE,GAAGL;EAChC,CAAC;AACH;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASa,gCAAgCA,CAC9Cf,SAAiB,EACjBgB,UAAkB,EAClBf,UAAkB,EAClBO,WAAmB,EACb;EACN,MAAMS,SAAS,GAAGjB,SAAS,GAAGgB,UAAU;EACxC,MAAME,UAAU,GAAGjB,UAAU,GAAGO,WAAW;EAC3C,IAAI,CAACW,MAAM,CAACC,QAAQ,CAACH,SAAS,CAAC,IAAI,CAACE,MAAM,CAACC,QAAQ,CAACF,UAAU,CAAC,IAAIf,IAAI,CAACkB,GAAG,CAACJ,SAAS,GAAGC,UAAU,CAAC,GAAG,IAAI,EAAE;IAC1G,MAAM,IAAIvB,aAAa,CACrB,6CAA6CK,SAAS,IAAIgB,UAAU,gCAAgCf,UAAU,IAAIO,WAAW,4DAC/H,CAAC;EACH;AACF","ignoreList":[]}