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
@@ -1,13 +1,16 @@
1
1
  "use strict";
2
2
 
3
3
  /**
4
- * `GameWorld2D` — the viewport transform group (T7.6).
4
+ * `GameWorld2D` — the viewport + camera transform group (T7.6, T12.5).
5
5
  *
6
- * Applies the resolved viewport offset/scale exactly once to all child
7
- * sprites. It adds no camera state, subscribes no React per frame, and is
8
- * not a camera API. Raw Skia nodes may be nested inside.
6
+ * Applies the resolved viewport offset/scale to all child sprites, and —
7
+ * when the game opts into a camera — composes the presented camera
8
+ * transform BEFORE the viewport. The group's element list maps world ->
9
+ * surface directly; `GameLayer2D` children consume the same camera through
10
+ * the world context and apply only their parallax correction, so layers
11
+ * never double-apply the camera.
9
12
  */
10
-
13
+ import { createContext, useContext } from 'react';
11
14
  import { Group } from '@shopify/react-native-skia';
12
15
  import { useDerivedValue } from 'react-native-reanimated';
13
16
  import { jsx as _jsx } from "react/jsx-runtime";
@@ -31,14 +34,114 @@ export function viewportTransform(viewport) {
31
34
  scaleY: viewport.scale
32
35
  }];
33
36
  }
37
+
38
+ /**
39
+ * The composed camera + viewport transform (T12.5).
40
+ *
41
+ * Skia applies the element list last-first, so the list below is the
42
+ * forward mapping `surface = viewport(L + rotate(P - C, -R) * Z)`:
43
+ * translate(-C) -> scale(Z) -> rotate(-R) -> translate(L) -> viewport.
44
+ */
45
+ export function cameraViewportTransform2D(camera, viewport) {
46
+ 'worklet';
47
+
48
+ if (camera === undefined || viewport === undefined) {
49
+ return [];
50
+ }
51
+ const {
52
+ center,
53
+ zoom,
54
+ rotationRadians
55
+ } = camera.camera;
56
+ const view = viewport.visibleLogicalBounds;
57
+ const logicalX = view.x + view.width / 2;
58
+ const logicalY = view.y + view.height / 2;
59
+ return [{
60
+ translateX: viewport.offsetX
61
+ }, {
62
+ translateY: viewport.offsetY
63
+ }, {
64
+ scaleX: viewport.scale
65
+ }, {
66
+ scaleY: viewport.scale
67
+ }, {
68
+ translateX: logicalX
69
+ }, {
70
+ translateY: logicalY
71
+ }, {
72
+ rotate: -rotationRadians
73
+ }, {
74
+ scaleX: zoom
75
+ }, {
76
+ scaleY: zoom
77
+ }, {
78
+ translateX: -center.x
79
+ }, {
80
+ translateY: -center.y
81
+ }];
82
+ }
83
+
84
+ /**
85
+ * The parallax correction for one layer (T12.5).
86
+ *
87
+ * A layer with factor p draws with the camera whose effective center is
88
+ * `C' = L + (C - L) * p` per axis. Since zoom and rotation apply fully at
89
+ * every factor, the correction relative to the parent camera is exactly a
90
+ * translation by `(C - L) * (1 - p)` in world units.
91
+ */
92
+ export function layerParallaxTransform2D(camera, viewport, parallaxX, parallaxY) {
93
+ 'worklet';
94
+
95
+ if (camera === undefined || viewport === undefined) {
96
+ return [];
97
+ }
98
+ const view = viewport.visibleLogicalBounds;
99
+ const logicalX = view.x + view.width / 2;
100
+ const logicalY = view.y + view.height / 2;
101
+ const dx = (camera.camera.center.x - logicalX) * (1 - parallaxX);
102
+ const dy = (camera.camera.center.y - logicalY) * (1 - parallaxY);
103
+ const elements = [];
104
+ if (dx !== 0) {
105
+ elements.push({
106
+ translateX: dx
107
+ });
108
+ }
109
+ if (dy !== 0) {
110
+ elements.push({
111
+ translateY: dy
112
+ });
113
+ }
114
+ return elements;
115
+ }
116
+
117
+ /** The camera + viewport context provided by `GameWorld2D`. */
118
+
119
+ export const GameWorldContext = /*#__PURE__*/createContext(null);
34
120
  export function GameWorld2D({
35
121
  viewport,
122
+ camera,
36
123
  children
37
124
  }) {
38
- const transform = useDerivedValue(() => viewportTransform(viewport.value));
39
- return /*#__PURE__*/_jsx(Group, {
40
- transform: transform,
41
- children: children
125
+ const transform = useDerivedValue(() => camera === undefined ? viewportTransform(viewport.value) : cameraViewportTransform2D(camera.value, viewport.value));
126
+ const context = {
127
+ viewport,
128
+ camera
129
+ };
130
+ return /*#__PURE__*/_jsx(GameWorldContext.Provider, {
131
+ value: context,
132
+ children: /*#__PURE__*/_jsx(Group, {
133
+ transform: transform,
134
+ children: children
135
+ })
42
136
  });
43
137
  }
138
+
139
+ /** Consume the world context; throws outside `GameWorld2D`. */
140
+ export function useGameWorldContext() {
141
+ const context = useContext(GameWorldContext);
142
+ if (context === null) {
143
+ throw new Error('GameLayer2D must be rendered inside a GameWorld2D');
144
+ }
145
+ return context;
146
+ }
44
147
  //# sourceMappingURL=GameWorld2D.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["Group","useDerivedValue","jsx","_jsx","viewportTransform","viewport","undefined","translateX","offsetX","translateY","offsetY","scaleX","scale","scaleY","GameWorld2D","children","transform","value"],"sourceRoot":"../../../../src","sources":["react/sprites/GameWorld2D.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,KAAK,QAAQ,4BAA4B;AAClD,SAASC,eAAe,QAA0B,yBAAyB;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAI5E;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAACC,QAAwC,EAKtE;EACF,SAAS;;EACT,IAAIA,QAAQ,KAAKC,SAAS,EAAE;IAC1B,OAAO,EAAE;EACX;EACA,OAAO,CACL;IAAEC,UAAU,EAAEF,QAAQ,CAACG;EAAQ,CAAC,EAChC;IAAEC,UAAU,EAAEJ,QAAQ,CAACK;EAAQ,CAAC,EAChC;IAAEC,MAAM,EAAEN,QAAQ,CAACO;EAAM,CAAC,EAC1B;IAAEC,MAAM,EAAER,QAAQ,CAACO;EAAM,CAAC,CAC3B;AACH;AAEA,OAAO,SAASE,WAAWA,CAAC;EAC1BT,QAAQ;EACRU;AAKF,CAAC,EAAE;EACD,MAAMC,SAAS,GAAGf,eAAe,CAAC,MAAMG,iBAAiB,CAACC,QAAQ,CAACY,KAAK,CAAC,CAAC;EAC1E,oBAAOd,IAAA,CAACH,KAAK;IAACgB,SAAS,EAAEA,SAAmB;IAAAD,QAAA,EAAEA;EAAQ,CAAQ,CAAC;AACjE","ignoreList":[]}
1
+ {"version":3,"names":["createContext","useContext","Group","useDerivedValue","jsx","_jsx","viewportTransform","viewport","undefined","translateX","offsetX","translateY","offsetY","scaleX","scale","scaleY","cameraViewportTransform2D","camera","center","zoom","rotationRadians","view","visibleLogicalBounds","logicalX","x","width","logicalY","y","height","rotate","layerParallaxTransform2D","parallaxX","parallaxY","dx","dy","elements","push","GameWorldContext","GameWorld2D","children","transform","value","context","Provider","useGameWorldContext","Error"],"sourceRoot":"../../../../src","sources":["react/sprites/GameWorld2D.tsx"],"mappings":"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","ignoreList":[]}
@@ -15,7 +15,8 @@ import { useMemo } from 'react';
15
15
  import { Atlas, Group } from '@shopify/react-native-skia';
16
16
  import { useDerivedValue } from 'react-native-reanimated';
17
17
  import { useRectBuffer, useRSXformBuffer } from '@shopify/react-native-skia';
18
- import { computeSpriteRsxform, resolveSpriteFrameRect, spriteGroupCorrection } from "./spriteTransform.js";
18
+ import { computeSpriteRsxform, spriteGroupCorrection } from "./spriteTransform.js";
19
+ import { applySpriteFrameSelection, materializeSpriteSelection, selectSpriteFrameRect } from "./spriteSelection.js";
19
20
  import { jsx as _jsx } from "react/jsx-runtime";
20
21
  export { resolveSpriteFrameRect } from "./spriteTransform.js";
21
22
  export function Sprite({
@@ -43,82 +44,66 @@ export function Sprite({
43
44
  // Worklet-safe frame resolution: an explicit `frame` wins; otherwise the
44
45
  // clip + elapsed time select the frame (the clip/elapsed may be animated
45
46
  // shared values, so the resolution happens inside the rect modifier).
47
+ // The arithmetic lives in the shared selection contract — this modifier
48
+ // only adapts props into it (GS-ANIMATION-01).
46
49
  const resolveFrameRectWorklet = rect => {
47
50
  'worklet';
48
51
 
49
52
  const clipValue = typeof clip === 'string' ? clip : clip?.value;
50
53
  const elapsedValue = typeof elapsedMs === 'number' ? elapsedMs : elapsedMs?.value;
51
- let name = typeof frame === 'string' ? frame : frame?.value;
52
- if (name === undefined && source.descriptor.kind === 'sprite-sheet' && clipValue !== undefined) {
53
- const sheet = source;
54
- // R3: resolve the clip through the descriptor's animation table, then
55
- // the returned frame name through the frame rectangles below.
56
- const animation = sheet.descriptor.animations[clipValue];
57
- if (animation !== undefined && animation.frames.length > 0) {
58
- const duration = animation.frameDurationMs;
59
- const count = animation.frames.length;
60
- const index = animation.mode === 'once' ? Math.min(Math.floor((elapsedValue ?? 0) / duration), count - 1) : Math.floor((elapsedValue ?? 0) / duration) % count;
61
- name = animation.frames[index] ?? animation.frames[0];
62
- }
63
- }
64
- const frameRect = source.descriptor.kind === 'image' ? {
65
- x: 0,
66
- y: 0,
67
- width: source.width,
68
- height: source.height
69
- } : name === undefined ? undefined : source.frames[name];
70
- if (frameRect === undefined) {
71
- if (name === undefined) {
72
- // RF4: the selection has not been published yet (scene mismatch or a
73
- // shared frame before its first value): present nothing, never throw.
74
- rect.setXYWH(0, 0, 0, 0);
75
- return;
76
- }
77
- throw new Error(`frame ${JSON.stringify(name)} does not belong to this sprite sheet (loaded frames: ${Object.keys(source.frames).join(', ')})`);
78
- }
79
- rect.setXYWH(frameRect.x, frameRect.y, frameRect.width, frameRect.height);
80
- };
81
- const staticFrame = typeof frame === 'string' ? frame : undefined;
82
- const frameSize = useMemo(() => resolveSpriteFrameRect(source, staticFrame), [source, staticFrame]);
83
- const input = {
84
- x,
85
- y,
86
- rotation,
87
- scale,
88
- flipX,
89
- flipY,
90
- anchorX: anchor.x,
91
- anchorY: anchor.y,
92
- frameWidth: frameSize.width,
93
- frameHeight: frameSize.height
54
+ const name = typeof frame === 'string' ? frame : frame?.value;
55
+ applySpriteFrameSelection(rect, source, {
56
+ ...(name === undefined ? {} : {
57
+ frame: name
58
+ }),
59
+ ...(clipValue === undefined ? {} : {
60
+ clip: clipValue
61
+ }),
62
+ ...(elapsedValue === undefined ? {} : {
63
+ elapsedMs: elapsedValue
64
+ })
65
+ });
94
66
  };
95
67
  const rects = useRectBuffer(1, resolveFrameRectWorklet);
96
68
  const xforms = useRSXformBuffer(1, xform => {
97
69
  'worklet';
98
70
 
99
- // RF4: resolve the selected frame's rectangle and dimensions in the same
100
- // worklet update so the anchor math always uses the current frame size.
101
- const name = typeof frame === 'string' ? frame : frame?.value;
102
- let width = frameSize.width;
103
- let height = frameSize.height;
104
- if (name !== undefined && source.descriptor.kind === 'sprite-sheet') {
105
- const rect = source.frames[name];
106
- if (rect !== undefined) {
107
- width = rect.width;
108
- height = rect.height;
109
- }
110
- }
71
+ // GS-SPRITE-03: the same shared selection the rect modifier resolves,
72
+ // so clip-driven frame changes reach the anchor math with current
73
+ // dimensions. Absent selection draws nothing; its transform is finite.
74
+ const resolved = selectSpriteFrameRect(source, materializeSpriteSelection(frame, clip, elapsedMs));
111
75
  const result = computeSpriteRsxform({
112
- ...input,
113
- frameWidth: width,
114
- frameHeight: height
76
+ x,
77
+ y,
78
+ rotation,
79
+ scale,
80
+ flipX,
81
+ flipY,
82
+ anchorX: anchor.x,
83
+ anchorY: anchor.y,
84
+ frameWidth: resolved?.width ?? 0,
85
+ frameHeight: resolved?.height ?? 0
115
86
  });
116
87
  xform.set(result.scos, result.ssin, result.tx, result.ty);
117
88
  });
118
- const groupTransform = useMemo(() => spriteGroupCorrection(input),
119
- // The correction reads animated values at draw time; the element list
120
- // identity is stable (values are shared-value reads inside the group).
121
- [anchor.x, anchor.y, frameSize.width, frameSize.height]);
89
+ // GS-SPRITE-01: the correction depends on position, rotation, scale,
90
+ // flips, and the live frame dimensions, so it is derived on the UI
91
+ // runtime from live values — never memoized from React-render reads.
92
+ const groupTransform = useDerivedValue(() => {
93
+ const resolved = selectSpriteFrameRect(source, materializeSpriteSelection(frame, clip, elapsedMs));
94
+ return spriteGroupCorrection({
95
+ x,
96
+ y,
97
+ rotation,
98
+ scale,
99
+ flipX,
100
+ flipY,
101
+ anchorX: anchor.x,
102
+ anchorY: anchor.y,
103
+ frameWidth: resolved?.width ?? 0,
104
+ frameHeight: resolved?.height ?? 0
105
+ });
106
+ }, [x, y, rotation, scale, flipX, flipY, frame, clip, elapsedMs, source, anchor.x, anchor.y]);
122
107
  const colors = useMemo(() => tint === undefined ? undefined : [tint], [tint]);
123
108
 
124
109
  // The Skia Group has no `visible` prop: hiding is expressed as a combined
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Atlas","Group","useDerivedValue","useRectBuffer","useRSXformBuffer","computeSpriteRsxform","resolveSpriteFrameRect","spriteGroupCorrection","jsx","_jsx","Sprite","source","frame","clip","elapsedMs","x","y","rotation","scale","anchor","flipX","flipY","opacity","tint","sampling","visible","image","resolveFrameRectWorklet","rect","clipValue","value","elapsedValue","name","undefined","descriptor","kind","sheet","animation","animations","frames","length","duration","frameDurationMs","count","index","mode","Math","min","floor","frameRect","width","height","setXYWH","Error","JSON","stringify","Object","keys","join","staticFrame","frameSize","input","anchorX","anchorY","frameWidth","frameHeight","rects","xforms","xform","result","set","scos","ssin","tx","ty","groupTransform","colors","effectiveOpacity","o","v","transform","children","sprites","transforms"],"sourceRoot":"../../../../src","sources":["react/sprites/Sprite.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Atlas","Group","useDerivedValue","useRectBuffer","useRSXformBuffer","computeSpriteRsxform","spriteGroupCorrection","applySpriteFrameSelection","materializeSpriteSelection","selectSpriteFrameRect","jsx","_jsx","resolveSpriteFrameRect","Sprite","source","frame","clip","elapsedMs","x","y","rotation","scale","anchor","flipX","flipY","opacity","tint","sampling","visible","image","resolveFrameRectWorklet","rect","clipValue","value","elapsedValue","name","undefined","rects","xforms","xform","resolved","result","anchorX","anchorY","frameWidth","width","frameHeight","height","set","scos","ssin","tx","ty","groupTransform","colors","effectiveOpacity","o","v","transform","children","sprites","transforms"],"sourceRoot":"../../../../src","sources":["react/sprites/Sprite.tsx"],"mappings":"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","ignoreList":[]}
@@ -7,8 +7,9 @@
7
7
  * `Atlas` with fixed-capacity, UI-owned buffers. The normal path owns all
8
8
  * derived-value plumbing: `select` maps the committed snapshot to the item
9
9
  * array and `write` is a UI-runtime setter that writes transforms in place —
10
- * no per-frame allocation, no per-frame React, no author-written
11
- * `useDerivedValue` side effects.
10
+ * no per-frame React and no author-written `useDerivedValue` side effects.
11
+ * Per commit the select array, one policy object, and one RSXform result
12
+ * per written item are allocated; buffers themselves are never reallocated.
12
13
  *
13
14
  * Contract:
14
15
  * - `capacity` is fixed for the mounted batch; active count is explicit.
@@ -21,7 +22,10 @@ import { useMemo } from 'react';
21
22
  import { Atlas } from '@shopify/react-native-skia';
22
23
  import { useDerivedValue } from 'react-native-reanimated';
23
24
  import { useRectBuffer, useRSXformBuffer } from '@shopify/react-native-skia';
25
+ import { batchVisibleBounds2D, intersectsBounds2D } from "./batchVisibility.js";
26
+ export { batchVisibleBounds2D, intersectsBounds2D };
24
27
  import { computeSpriteRsxform } from "./spriteTransform.js";
28
+ import { selectSpriteFrameRect } from "./spriteSelection.js";
25
29
  import { batchUpdatePolicy } from "./spriteBatchPolicy.js";
26
30
 
27
31
  /** The per-item write surface handed to the author's `write` mapper. */
@@ -29,16 +33,15 @@ import { jsx as _jsx } from "react/jsx-runtime";
29
33
  function frameRectOf(source, frame) {
30
34
  'worklet';
31
35
 
32
- if (source.descriptor.kind === 'image') {
33
- const image = source;
34
- return {
35
- x: 0,
36
- y: 0,
37
- width: image.width,
38
- height: image.height
39
- };
36
+ // GS-SPRITE-04: the shared selection contract resolves the rectangle, so
37
+ // unknown frames fail with the same actionable error as retained sprites.
38
+ const resolved = selectSpriteFrameRect(source, {
39
+ frame
40
+ });
41
+ if (resolved === undefined) {
42
+ throw new Error(`frame ${JSON.stringify(frame)} does not belong to this sprite sheet`);
40
43
  }
41
- return source.frames[frame];
44
+ return resolved;
42
45
  }
43
46
  export function SpriteBatch({
44
47
  scene,
@@ -51,12 +54,19 @@ export function SpriteBatch({
51
54
  anchor = {
52
55
  x: 0,
53
56
  y: 0
54
- }
57
+ },
58
+ cull
55
59
  }) {
56
60
  const image = source.image;
57
61
  if (!Number.isInteger(capacity) || capacity <= 0) {
58
62
  throw new Error(`SpriteBatch capacity must be a positive integer, got ${String(capacity)}`);
59
63
  }
64
+ // T12-F5: culling padding is validated ONCE at the React boundary; the UI
65
+ // worklet consumes a trusted finite nonnegative scalar.
66
+ const cullPadding = cull?.padding ?? 0;
67
+ if (!Number.isFinite(cullPadding) || cullPadding < 0) {
68
+ throw new RangeError(`SpriteBatch cull.padding must be a finite nonnegative number, got ${String(cullPadding)}`);
69
+ }
60
70
  const rects = useRectBuffer(capacity, rect => {
61
71
  'worklet';
62
72
 
@@ -74,8 +84,10 @@ export function SpriteBatch({
74
84
  set: (index, frame, x, y, rotation, scale, visible = true) => {
75
85
  'worklet';
76
86
 
77
- if (index < 0 || index >= capacity) {
78
- throw new Error(`SpriteBatch write index ${index} is outside the capacity ${capacity}`);
87
+ // GS-SPRITE-04: the author-exposed index is validated as an integer
88
+ // slot — a fractional index would silently miss every buffer slot.
89
+ if (!Number.isInteger(index) || index < 0 || index >= capacity) {
90
+ throw new Error(`SpriteBatch write index ${String(index)} is outside the capacity ${capacity}`);
79
91
  }
80
92
  const rectSlot = rects.value[index];
81
93
  const xformSlot = xforms.value[index];
@@ -111,8 +123,10 @@ export function SpriteBatch({
111
123
 
112
124
  // The batch's own UI mapper: one derived value reads the committed
113
125
  // snapshot, runs the author's select + write per item, and reports the
114
- // active count. Buffers are mutated in place; no objects are allocated
115
- // per item per frame beyond the item array the select returns.
126
+ // active count. Buffers are mutated in place with no per-frame React;
127
+ // per commit the select array, one policy object, and one RSXform result
128
+ // per written item are allocated (GS-SPRITE-04: scalar writers stay
129
+ // unjustified without a benchmark showing this matters).
116
130
  const activeCount = useDerivedValue(() => {
117
131
  'worklet';
118
132
 
@@ -133,22 +147,33 @@ export function SpriteBatch({
133
147
  alpha: alpha.value
134
148
  });
135
149
  const policy = batchUpdatePolicy(items.length, capacity, __DEV__);
136
- if (policy.overflow) {
137
- // RF8: production never crashes the UI runtime for ordinary data
138
- // growth: hide the overflowing items.
139
- for (let index = capacity; index < items.length; index += 1) {
150
+ // GS-SPRITE-04: no overflow loop — `policy.activeCount` already clamps
151
+ // production writes to capacity, and every buffer slot past capacity is
152
+ // absent by construction, so iterating [capacity, items.length) could
153
+ // only add unbounded dead work.
154
+ const count = policy.activeCount;
155
+ // T12.6 + T12-F5: culling hides off-screen slots in place, and
156
+ // authored writes run ONLY through `policy.activeCount`. In production
157
+ // an overflowing item (index >= capacity) is never written and never
158
+ // indexes a buffer — the [count, capacity) hide loop below clears the
159
+ // unused tail. The visible bounds are computed once per commit from the
160
+ // PRESENTED camera; hidden slots are cleared directly (zero size)
161
+ // without touching the author's write or reallocating buffers, so slot
162
+ // identity is stable across camera moves.
163
+ const visible = cull === undefined ? undefined : batchVisibleBounds2D(cull.camera.value, cull.viewport.value, cullPadding);
164
+ for (let index = 0; index < count; index += 1) {
165
+ const item = items[index];
166
+ if (item === undefined) {
167
+ continue;
168
+ }
169
+ if (visible !== undefined && !intersectsBounds2D(cull.bounds(item), visible)) {
140
170
  const slot = rects.value[index];
141
171
  if (slot !== undefined) {
142
172
  slot.setXYWH(0, 0, 0, 0);
143
173
  }
174
+ continue;
144
175
  }
145
- }
146
- const count = policy.activeCount;
147
- for (let index = 0; index < items.length; index += 1) {
148
- const item = items[index];
149
- if (item !== undefined) {
150
- write(writeApi, item, index);
151
- }
176
+ write(writeApi, item, index);
152
177
  }
153
178
  // Hide every inactive slot.
154
179
  for (let index = count; index < capacity; index += 1) {
@@ -158,7 +183,7 @@ export function SpriteBatch({
158
183
  }
159
184
  }
160
185
  return count;
161
- }, [commit, alpha, scene, select, write, writeApi]);
186
+ }, [commit, alpha, scene, select, write, writeApi, cull, cullPadding]);
162
187
  void activeCount;
163
188
 
164
189
  // The atlas renders the full buffer; the UI mapper keeps slots aligned.
@@ -1 +1 @@
1
- {"version":3,"names":["useMemo","Atlas","useDerivedValue","useRectBuffer","useRSXformBuffer","computeSpriteRsxform","batchUpdatePolicy","jsx","_jsx","frameRectOf","source","frame","descriptor","kind","image","x","y","width","height","frames","SpriteBatch","scene","commit","alpha","capacity","select","write","anchor","Number","isInteger","Error","String","rects","rect","setXYWH","xforms","xform","set","writeApi","index","rotation","scale","visible","rectSlot","value","xformSlot","undefined","JSON","stringify","rsxform","flipX","flipY","anchorX","anchorY","frameWidth","frameHeight","scos","ssin","tx","ty","activeCount","envelope","slot","items","current","policy","length","__DEV__","overflow","count","item","sampling","sprites","transforms"],"sourceRoot":"../../../../src","sources":["react/sprites/SpriteBatch.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,OAAO,QAAQ,OAAO;AAC/B,SAASC,KAAK,QAAsB,4BAA4B;AAChE,SAASC,eAAe,QAA0B,yBAAyB;AAC3E,SAASC,aAAa,EAAEC,gBAAgB,QAAQ,4BAA4B;AAM5E,SAASC,oBAAoB,QAAQ,sBAAmB;AACxD,SAASC,iBAAiB,QAAQ,wBAAqB;;AAEvD;AAAA,SAAAC,GAAA,IAAAC,IAAA;AA6CA,SAASC,WAAWA,CAClBC,MAAuC,EACvCC,KAAa,EACwD;EACrE,SAAS;;EACT,IAAID,MAAM,CAACE,UAAU,CAACC,IAAI,KAAK,OAAO,EAAE;IACtC,MAAMC,KAAK,GAAGJ,MAAqB;IACnC,OAAO;MAAEK,CAAC,EAAE,CAAC;MAAEC,CAAC,EAAE,CAAC;MAAEC,KAAK,EAAEH,KAAK,CAACG,KAAK;MAAEC,MAAM,EAAEJ,KAAK,CAACI;IAAO,CAAC;EACjE;EACA,OAAQR,MAAM,CAAuBS,MAAM,CAACR,KAAK,CAAC;AACpD;AAEA,OAAO,SAASS,WAAWA,CAIzB;EACAC,KAAK;EACLC,MAAM;EACNC,KAAK;EACLb,MAAM;EACNc,QAAQ;EACRC,MAAM;EACNC,KAAK;EACLC,MAAM,GAAG;IAAEZ,CAAC,EAAE,CAAC;IAAEC,CAAC,EAAE;EAAE;AACsB,CAAC,EAAE;EAC/C,MAAMF,KAAK,GAAGJ,MAAM,CAACI,KAAgB;EACrC,IAAI,CAACc,MAAM,CAACC,SAAS,CAACL,QAAQ,CAAC,IAAIA,QAAQ,IAAI,CAAC,EAAE;IAChD,MAAM,IAAIM,KAAK,CACb,wDAAwDC,MAAM,CAACP,QAAQ,CAAC,EAC1E,CAAC;EACH;EACA,MAAMQ,KAAK,GAAG7B,aAAa,CAACqB,QAAQ,EAAGS,IAAI,IAAK;IAC9C,SAAS;;IACTA,IAAI,CAACC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EAC1B,CAAC,CAAC;EACF,MAAMC,MAAM,GAAG/B,gBAAgB,CAACoB,QAAQ,EAAGY,KAAK,IAAK;IACnD,SAAS;;IACTA,KAAK,CAACC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EACvB,CAAC,CAAC;;EAEF;EACA;EACA,MAAMC,QAA0B,GAAGtC,OAAO,CACxC,OAAO;IACLqC,GAAG,EAAEA,CAACE,KAAK,EAAE5B,KAAK,EAAEI,CAAC,EAAEC,CAAC,EAAEwB,QAAQ,EAAEC,KAAK,EAAEC,OAAO,GAAG,IAAI,KAAK;MAC5D,SAAS;;MACT,IAAIH,KAAK,GAAG,CAAC,IAAIA,KAAK,IAAIf,QAAQ,EAAE;QAClC,MAAM,IAAIM,KAAK,CACb,2BAA2BS,KAAK,4BAA4Bf,QAAQ,EACtE,CAAC;MACH;MACA,MAAMmB,QAAQ,GAAGX,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;MACnC,MAAMM,SAAS,GAAGV,MAAM,CAACS,KAAK,CAACL,KAAK,CAAC;MACrC,IAAII,QAAQ,KAAKG,SAAS,IAAID,SAAS,KAAKC,SAAS,EAAE;QACrD;MACF;MACA,IAAI,CAACJ,OAAO,EAAE;QACZC,QAAQ,CAACT,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B;MACF;MACA,MAAMD,IAAI,GAAGxB,WAAW,CAACC,MAAM,EAAEC,KAAK,CAAC;MACvC,IAAIsB,IAAI,KAAKa,SAAS,EAAE;QACtB,MAAM,IAAIhB,KAAK,CACb,SAASiB,IAAI,CAACC,SAAS,CAACrC,KAAK,CAAC,uCAChC,CAAC;MACH;MACAgC,QAAQ,CAACT,OAAO,CAACD,IAAI,CAAClB,CAAC,EAAEkB,IAAI,CAACjB,CAAC,EAAEiB,IAAI,CAAChB,KAAK,EAAEgB,IAAI,CAACf,MAAM,CAAC;MACzD,MAAM+B,OAAO,GAAG5C,oBAAoB,CAAC;QACnCU,CAAC;QACDC,CAAC;QACDwB,QAAQ;QACRC,KAAK;QACLS,KAAK,EAAE,KAAK;QACZC,KAAK,EAAE,KAAK;QACZC,OAAO,EAAEzB,MAAM,CAACZ,CAAC;QACjBsC,OAAO,EAAE1B,MAAM,CAACX,CAAC;QACjBsC,UAAU,EAAErB,IAAI,CAAChB,KAAK;QACtBsC,WAAW,EAAEtB,IAAI,CAACf;MACpB,CAAC,CAAC;MACF2B,SAAS,CAACR,GAAG,CAACY,OAAO,CAACO,IAAI,EAAEP,OAAO,CAACQ,IAAI,EAAER,OAAO,CAACS,EAAE,EAAET,OAAO,CAACU,EAAE,CAAC;IACnE;EACF,CAAC,CAAC;EACF;EACA,CAACnC,QAAQ,EAAEQ,KAAK,EAAEG,MAAM,EAAEzB,MAAM,EAAEiB,MAAM,CAACZ,CAAC,EAAEY,MAAM,CAACX,CAAC,CACtD,CAAC;;EAED;EACA;EACA;EACA;EACA,MAAM4C,WAAW,GAAG1D,eAAe,CAAC,MAAM;IACxC,SAAS;;IACT,MAAM2D,QAAQ,GAAGvC,MAAM,CAACsB,KAAK;IAC7B,IAAIiB,QAAQ,CAACxC,KAAK,KAAKA,KAAK,EAAE;MAC5B;MACA;MACA,KAAK,IAAIkB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGf,QAAQ,EAAEe,KAAK,IAAI,CAAC,EAAE;QAChD,MAAMuB,IAAI,GAAG9B,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;QAC/B,IAAIuB,IAAI,KAAKhB,SAAS,EAAE;UACtBgB,IAAI,CAAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1B;MACF;MACA,OAAO,CAAC;IACV;IACA,MAAM6B,KAAK,GAAGtC,MAAM,CAAC;MACnBuC,OAAO,EAAEH,QAAQ,CAACG,OAAsD;MACxEzC,KAAK,EAAEA,KAAK,CAACqB;IACf,CAAC,CAAC;IACF,MAAMqB,MAAM,GAAG3D,iBAAiB,CAACyD,KAAK,CAACG,MAAM,EAAE1C,QAAQ,EAAE2C,OAAO,CAAC;IACjE,IAAIF,MAAM,CAACG,QAAQ,EAAE;MACnB;MACA;MACA,KAAK,IAAI7B,KAAK,GAAGf,QAAQ,EAAEe,KAAK,GAAGwB,KAAK,CAACG,MAAM,EAAE3B,KAAK,IAAI,CAAC,EAAE;QAC3D,MAAMuB,IAAI,GAAG9B,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;QAC/B,IAAIuB,IAAI,KAAKhB,SAAS,EAAE;UACtBgB,IAAI,CAAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1B;MACF;IACF;IACA,MAAMmC,KAAK,GAAGJ,MAAM,CAACL,WAAW;IAChC,KAAK,IAAIrB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGwB,KAAK,CAACG,MAAM,EAAE3B,KAAK,IAAI,CAAC,EAAE;MACpD,MAAM+B,IAAI,GAAGP,KAAK,CAACxB,KAAK,CAAC;MACzB,IAAI+B,IAAI,KAAKxB,SAAS,EAAE;QACtBpB,KAAK,CAACY,QAAQ,EAAEgC,IAAI,EAAE/B,KAAK,CAAC;MAC9B;IACF;IACA;IACA,KAAK,IAAIA,KAAK,GAAG8B,KAAK,EAAE9B,KAAK,GAAGf,QAAQ,EAAEe,KAAK,IAAI,CAAC,EAAE;MACpD,MAAMuB,IAAI,GAAG9B,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;MAC/B,IAAIuB,IAAI,KAAKhB,SAAS,EAAE;QACtBgB,IAAI,CAAC5B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAC1B;IACF;IACA,OAAOmC,KAAK;EACd,CAAC,EAAE,CAAC/C,MAAM,EAAEC,KAAK,EAAEF,KAAK,EAAEI,MAAM,EAAEC,KAAK,EAAEY,QAAQ,CAAC,CAAC;EAEnD,KAAKsB,WAAW;;EAEhB;EACA,MAAMW,QAAQ,GAAGvE,OAAO,CAAC,MAAM,SAAkB,EAAE,EAAE,CAAC;EACtD,oBACEQ,IAAA,CAACP,KAAK;IAACa,KAAK,EAAEA,KAAM;IAAC0D,OAAO,EAAExC,KAAM;IAACyC,UAAU,EAAEtC,MAAO;IAACoC,QAAQ,EAAEA;EAAkB,CAAE,CAAC;AAE5F","ignoreList":[]}
1
+ {"version":3,"names":["useMemo","Atlas","useDerivedValue","useRectBuffer","useRSXformBuffer","batchVisibleBounds2D","intersectsBounds2D","computeSpriteRsxform","selectSpriteFrameRect","batchUpdatePolicy","jsx","_jsx","frameRectOf","source","frame","resolved","undefined","Error","JSON","stringify","SpriteBatch","scene","commit","alpha","capacity","select","write","anchor","x","y","cull","image","Number","isInteger","String","cullPadding","padding","isFinite","RangeError","rects","rect","setXYWH","xforms","xform","set","writeApi","index","rotation","scale","visible","rectSlot","value","xformSlot","width","height","rsxform","flipX","flipY","anchorX","anchorY","frameWidth","frameHeight","scos","ssin","tx","ty","activeCount","envelope","slot","items","current","policy","length","__DEV__","count","camera","viewport","item","bounds","sampling","sprites","transforms"],"sourceRoot":"../../../../src","sources":["react/sprites/SpriteBatch.tsx"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Batch culling math (T12.6, T12-F5) — pure and worklet-safe, with no React
5
+ * imports, so the benchmark and headless tests can import them directly.
6
+ */
7
+
8
+ import { rotatedHalfExtents2D } from "../../camera2d/extents.js";
9
+ /**
10
+ * Conservative visible bounds for batch culling (T12.6).
11
+ *
12
+ * Worklet-safe inline version of the headless `paddedCameraBounds2D` —
13
+ * the presented camera is already validated at the public boundary, so the
14
+ * per-frame path allocates nothing and validates nothing.
15
+ */
16
+ export function batchVisibleBounds2D(camera, viewport, padding) {
17
+ 'worklet';
18
+
19
+ if (camera === undefined || viewport === undefined) {
20
+ return undefined;
21
+ }
22
+ const view = viewport.visibleLogicalBounds;
23
+ const extent = rotatedHalfExtents2D(view.width / 2 / camera.camera.zoom, view.height / 2 / camera.camera.zoom, camera.camera.rotationRadians);
24
+ const extentX = extent.x + padding;
25
+ const extentY = extent.y + padding;
26
+ return {
27
+ x: camera.camera.center.x - extentX,
28
+ y: camera.camera.center.y - extentY,
29
+ width: extentX * 2,
30
+ height: extentY * 2
31
+ };
32
+ }
33
+ function isFiniteBounds(bounds) {
34
+ 'worklet';
35
+
36
+ return Number.isFinite(bounds.x) && Number.isFinite(bounds.y) && Number.isFinite(bounds.width) && Number.isFinite(bounds.height) && bounds.width >= 0 && bounds.height >= 0;
37
+ }
38
+
39
+ /** Axis-aligned intersection test, worklet-safe (no validation).
40
+ *
41
+ * Inclusive comparisons, matching the public `intersectsAabbAabb2D`
42
+ * contract (T12-F5): exact boundary contact IS an intersection, so a
43
+ * sprite touching the camera edge is never culled.
44
+ *
45
+ * T12-RF6 malformed-bounds fail-safe: any non-finite field or negative
46
+ * size in EITHER rect hides the item (returns false) before the
47
+ * intersection test — invalid geometry is never drawn. Scalar and
48
+ * allocation-free; no structured error construction on the UI path.
49
+ */
50
+ export function intersectsBounds2D(first, second) {
51
+ 'worklet';
52
+
53
+ if (!isFiniteBounds(first) || !isFiniteBounds(second)) {
54
+ return false;
55
+ }
56
+ return first.x <= second.x + second.width && first.x + first.width >= second.x && first.y <= second.y + second.height && first.y + first.height >= second.y;
57
+ }
58
+ //# sourceMappingURL=batchVisibility.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["rotatedHalfExtents2D","batchVisibleBounds2D","camera","viewport","padding","undefined","view","visibleLogicalBounds","extent","width","zoom","height","rotationRadians","extentX","x","extentY","y","center","isFiniteBounds","bounds","Number","isFinite","intersectsBounds2D","first","second"],"sourceRoot":"../../../../src","sources":["react/sprites/batchVisibility.ts"],"mappings":";;AAAA;AACA;AACA;AACA;;AAEA,SAASA,oBAAoB,QAAQ,2BAAwB;AAI7D;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,oBAAoBA,CAClCC,MAA+B,EAC/BC,QAAwC,EACxCC,OAAe,EACK;EACpB,SAAS;;EACT,IAAIF,MAAM,KAAKG,SAAS,IAAIF,QAAQ,KAAKE,SAAS,EAAE;IAClD,OAAOA,SAAS;EAClB;EACA,MAAMC,IAAI,GAAGH,QAAQ,CAACI,oBAAoB;EAC1C,MAAMC,MAAM,GAAGR,oBAAoB,CACjCM,IAAI,CAACG,KAAK,GAAG,CAAC,GAAGP,MAAM,CAACA,MAAM,CAACQ,IAAI,EACnCJ,IAAI,CAACK,MAAM,GAAG,CAAC,GAAGT,MAAM,CAACA,MAAM,CAACQ,IAAI,EACpCR,MAAM,CAACA,MAAM,CAACU,eAChB,CAAC;EACD,MAAMC,OAAO,GAAGL,MAAM,CAACM,CAAC,GAAGV,OAAO;EAClC,MAAMW,OAAO,GAAGP,MAAM,CAACQ,CAAC,GAAGZ,OAAO;EAClC,OAAO;IACLU,CAAC,EAAEZ,MAAM,CAACA,MAAM,CAACe,MAAM,CAACH,CAAC,GAAGD,OAAO;IACnCG,CAAC,EAAEd,MAAM,CAACA,MAAM,CAACe,MAAM,CAACD,CAAC,GAAGD,OAAO;IACnCN,KAAK,EAAEI,OAAO,GAAG,CAAC;IAClBF,MAAM,EAAEI,OAAO,GAAG;EACpB,CAAC;AACH;AAEA,SAASG,cAAcA,CAACC,MAAc,EAAW;EAC/C,SAAS;;EACT,OACEC,MAAM,CAACC,QAAQ,CAACF,MAAM,CAACL,CAAC,CAAC,IACzBM,MAAM,CAACC,QAAQ,CAACF,MAAM,CAACH,CAAC,CAAC,IACzBI,MAAM,CAACC,QAAQ,CAACF,MAAM,CAACV,KAAK,CAAC,IAC7BW,MAAM,CAACC,QAAQ,CAACF,MAAM,CAACR,MAAM,CAAC,IAC9BQ,MAAM,CAACV,KAAK,IAAI,CAAC,IACjBU,MAAM,CAACR,MAAM,IAAI,CAAC;AAEtB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASW,kBAAkBA,CAACC,KAAa,EAAEC,MAAc,EAAW;EACzE,SAAS;;EACT,IAAI,CAACN,cAAc,CAACK,KAAK,CAAC,IAAI,CAACL,cAAc,CAACM,MAAM,CAAC,EAAE;IACrD,OAAO,KAAK;EACd;EACA,OACED,KAAK,CAACT,CAAC,IAAIU,MAAM,CAACV,CAAC,GAAGU,MAAM,CAACf,KAAK,IAClCc,KAAK,CAACT,CAAC,GAAGS,KAAK,CAACd,KAAK,IAAIe,MAAM,CAACV,CAAC,IACjCS,KAAK,CAACP,CAAC,IAAIQ,MAAM,CAACR,CAAC,GAAGQ,MAAM,CAACb,MAAM,IACnCY,KAAK,CAACP,CAAC,GAAGO,KAAK,CAACZ,MAAM,IAAIa,MAAM,CAACR,CAAC;AAEtC","ignoreList":[]}