rn-gamekit 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/README.md +95 -14
  3. package/lib/module/assets/defineAssets.js +28 -3
  4. package/lib/module/assets/defineAssets.js.map +1 -1
  5. package/lib/module/assets.js +11 -0
  6. package/lib/module/assets.js.map +1 -0
  7. package/lib/module/audio/createGameAudio.js +784 -0
  8. package/lib/module/audio/createGameAudio.js.map +1 -0
  9. package/lib/module/audio/errors.js +12 -0
  10. package/lib/module/audio/errors.js.map +1 -0
  11. package/lib/module/audio/index.js +5 -0
  12. package/lib/module/audio/index.js.map +1 -0
  13. package/lib/module/audio/resolver.js +37 -0
  14. package/lib/module/audio/resolver.js.map +1 -0
  15. package/lib/module/audio/types.js +4 -0
  16. package/lib/module/audio/types.js.map +1 -0
  17. package/lib/module/audio.js +9 -0
  18. package/lib/module/audio.js.map +1 -0
  19. package/lib/module/camera2d/bounds.js +59 -0
  20. package/lib/module/camera2d/bounds.js.map +1 -0
  21. package/lib/module/camera2d/extents.js +25 -0
  22. package/lib/module/camera2d/extents.js.map +1 -0
  23. package/lib/module/camera2d/follow.js +138 -0
  24. package/lib/module/camera2d/follow.js.map +1 -0
  25. package/lib/module/camera2d/index.js +20 -0
  26. package/lib/module/camera2d/index.js.map +1 -0
  27. package/lib/module/camera2d/interpolation.js +98 -0
  28. package/lib/module/camera2d/interpolation.js.map +1 -0
  29. package/lib/module/camera2d/shake.js +85 -0
  30. package/lib/module/camera2d/shake.js.map +1 -0
  31. package/lib/module/camera2d/transform.js +151 -0
  32. package/lib/module/camera2d/transform.js.map +1 -0
  33. package/lib/module/camera2d/types.js +4 -0
  34. package/lib/module/camera2d/types.js.map +1 -0
  35. package/lib/module/camera2d/validation.js +98 -0
  36. package/lib/module/camera2d/validation.js.map +1 -0
  37. package/lib/module/camera2d/visibility.js +138 -0
  38. package/lib/module/camera2d/visibility.js.map +1 -0
  39. package/lib/module/camera2d.js +9 -0
  40. package/lib/module/camera2d.js.map +1 -0
  41. package/lib/module/collision2d/colliders.js +266 -0
  42. package/lib/module/collision2d/colliders.js.map +1 -0
  43. package/lib/module/collision2d/debug.js +105 -0
  44. package/lib/module/collision2d/debug.js.map +1 -0
  45. package/lib/module/collision2d/filters.js +40 -0
  46. package/lib/module/collision2d/filters.js.map +1 -0
  47. package/lib/module/collision2d/index.js +12 -0
  48. package/lib/module/collision2d/index.js.map +1 -0
  49. package/lib/module/collision2d/intersections.js +67 -0
  50. package/lib/module/collision2d/intersections.js.map +1 -0
  51. package/lib/module/collision2d/manifolds.js +218 -0
  52. package/lib/module/collision2d/manifolds.js.map +1 -0
  53. package/lib/module/collision2d/segments.js +187 -0
  54. package/lib/module/collision2d/segments.js.map +1 -0
  55. package/lib/module/collision2d/spatialHash.js +167 -0
  56. package/lib/module/collision2d/spatialHash.js.map +1 -0
  57. package/lib/module/collision2d/sweeps.js +255 -0
  58. package/lib/module/collision2d/sweeps.js.map +1 -0
  59. package/lib/module/collision2d.js +9 -0
  60. package/lib/module/collision2d.js.map +1 -0
  61. package/lib/module/core/input/buttonPad.js +214 -0
  62. package/lib/module/core/input/buttonPad.js.map +1 -0
  63. package/lib/module/core/input/createInputBuffer.js +66 -14
  64. package/lib/module/core/input/createInputBuffer.js.map +1 -1
  65. package/lib/module/core/session/createGameSession.js +454 -50
  66. package/lib/module/core/session/createGameSession.js.map +1 -1
  67. package/lib/module/core/session/deepFreeze.js +92 -2
  68. package/lib/module/core/session/deepFreeze.js.map +1 -1
  69. package/lib/module/core/session/types.js +12 -0
  70. package/lib/module/core/session/types.js.map +1 -1
  71. package/lib/module/definition/defineGame.js +23 -0
  72. package/lib/module/definition/defineGame.js.map +1 -1
  73. package/lib/module/events/defineGameEvents.js +46 -0
  74. package/lib/module/events/defineGameEvents.js.map +1 -0
  75. package/lib/module/events/errors.js +16 -0
  76. package/lib/module/events/errors.js.map +1 -0
  77. package/lib/module/events/index.js +7 -0
  78. package/lib/module/events/index.js.map +1 -0
  79. package/lib/module/events/payload.js +219 -0
  80. package/lib/module/events/payload.js.map +1 -0
  81. package/lib/module/events/seed.js +33 -0
  82. package/lib/module/events/seed.js.map +1 -0
  83. package/lib/module/events/types.js +4 -0
  84. package/lib/module/events/types.js.map +1 -0
  85. package/lib/module/events.js +13 -0
  86. package/lib/module/events.js.map +1 -0
  87. package/lib/module/geometry/helpers.js +140 -0
  88. package/lib/module/geometry/helpers.js.map +1 -0
  89. package/lib/module/geometry/index.js +5 -0
  90. package/lib/module/geometry/index.js.map +1 -0
  91. package/lib/module/geometry/validation.js +104 -0
  92. package/lib/module/geometry/validation.js.map +1 -0
  93. package/lib/module/geometry.js +9 -0
  94. package/lib/module/geometry.js.map +1 -0
  95. package/lib/module/haptics/createGameHaptics.js +214 -0
  96. package/lib/module/haptics/createGameHaptics.js.map +1 -0
  97. package/lib/module/haptics/errors.js +12 -0
  98. package/lib/module/haptics/errors.js.map +1 -0
  99. package/lib/module/haptics/index.js +5 -0
  100. package/lib/module/haptics/index.js.map +1 -0
  101. package/lib/module/haptics/resolver.js +37 -0
  102. package/lib/module/haptics/resolver.js.map +1 -0
  103. package/lib/module/haptics/types.js +4 -0
  104. package/lib/module/haptics/types.js.map +1 -0
  105. package/lib/module/haptics.js +9 -0
  106. package/lib/module/haptics.js.map +1 -0
  107. package/lib/module/index.js +8 -1
  108. package/lib/module/index.js.map +1 -1
  109. package/lib/module/particles/createParticleSystem.js +481 -0
  110. package/lib/module/particles/createParticleSystem.js.map +1 -0
  111. package/lib/module/particles/defineParticleEffect.js +178 -0
  112. package/lib/module/particles/defineParticleEffect.js.map +1 -0
  113. package/lib/module/particles/errors.js +9 -0
  114. package/lib/module/particles/errors.js.map +1 -0
  115. package/lib/module/particles/index.js +8 -0
  116. package/lib/module/particles/index.js.map +1 -0
  117. package/lib/module/particles/sampling.js +121 -0
  118. package/lib/module/particles/sampling.js.map +1 -0
  119. package/lib/module/particles/types.js +4 -0
  120. package/lib/module/particles/types.js.map +1 -0
  121. package/lib/module/particles.js +4 -0
  122. package/lib/module/particles.js.map +1 -0
  123. package/lib/module/react/GameButtonPad.js +344 -0
  124. package/lib/module/react/GameButtonPad.js.map +1 -0
  125. package/lib/module/react/GamePointerInput.js +74 -16
  126. package/lib/module/react/GamePointerInput.js.map +1 -1
  127. package/lib/module/react/GameView.js +139 -60
  128. package/lib/module/react/GameView.js.map +1 -1
  129. package/lib/module/react/assets/createGameAssetStore.js +145 -95
  130. package/lib/module/react/assets/createGameAssetStore.js.map +1 -1
  131. package/lib/module/react/assets/useGameAssets.js +60 -35
  132. package/lib/module/react/assets/useGameAssets.js.map +1 -1
  133. package/lib/module/react/bindAppLifecycle.js +46 -17
  134. package/lib/module/react/bindAppLifecycle.js.map +1 -1
  135. package/lib/module/react/bindGameSession.js +13 -2
  136. package/lib/module/react/bindGameSession.js.map +1 -1
  137. package/lib/module/react/camera2d/GameLayer2D.js +50 -0
  138. package/lib/module/react/camera2d/GameLayer2D.js.map +1 -0
  139. package/lib/module/react/camera2d/defineGameCamera2D.js +30 -0
  140. package/lib/module/react/camera2d/defineGameCamera2D.js.map +1 -0
  141. package/lib/module/react/camera2d/usePresentedCameraBinding.js +177 -0
  142. package/lib/module/react/camera2d/usePresentedCameraBinding.js.map +1 -0
  143. package/lib/module/react/cleanupList.js +38 -0
  144. package/lib/module/react/cleanupList.js.map +1 -0
  145. package/lib/module/react/lifecycleSource.js +49 -0
  146. package/lib/module/react/lifecycleSource.js.map +1 -0
  147. package/lib/module/react/particles/ParticleView.js +308 -0
  148. package/lib/module/react/particles/ParticleView.js.map +1 -0
  149. package/lib/module/react/particles/culling.js +115 -0
  150. package/lib/module/react/particles/culling.js.map +1 -0
  151. package/lib/module/react/particles/index.js +7 -0
  152. package/lib/module/react/particles/index.js.map +1 -0
  153. package/lib/module/react/particles/spriteXForm.js +45 -0
  154. package/lib/module/react/particles/spriteXForm.js.map +1 -0
  155. package/lib/module/react/particles/useParticlePresentation.js +204 -0
  156. package/lib/module/react/particles/useParticlePresentation.js.map +1 -0
  157. package/lib/module/react/pointerBinding.js +55 -17
  158. package/lib/module/react/pointerBinding.js.map +1 -1
  159. package/lib/module/react/pointerCamera.js +28 -0
  160. package/lib/module/react/pointerCamera.js.map +1 -0
  161. package/lib/module/react/pointerCoalescer.js +16 -9
  162. package/lib/module/react/pointerCoalescer.js.map +1 -1
  163. package/lib/module/react/sprites/GameSprite.js +5 -17
  164. package/lib/module/react/sprites/GameSprite.js.map +1 -1
  165. package/lib/module/react/sprites/GameWorld2D.js +112 -9
  166. package/lib/module/react/sprites/GameWorld2D.js.map +1 -1
  167. package/lib/module/react/sprites/Sprite.js +48 -63
  168. package/lib/module/react/sprites/Sprite.js.map +1 -1
  169. package/lib/module/react/sprites/SpriteBatch.js +53 -28
  170. package/lib/module/react/sprites/SpriteBatch.js.map +1 -1
  171. package/lib/module/react/sprites/batchVisibility.js +58 -0
  172. package/lib/module/react/sprites/batchVisibility.js.map +1 -0
  173. package/lib/module/react/sprites/spriteSelection.js +103 -0
  174. package/lib/module/react/sprites/spriteSelection.js.map +1 -0
  175. package/lib/module/react/sprites/spriteTransform.js +46 -25
  176. package/lib/module/react/sprites/spriteTransform.js.map +1 -1
  177. package/lib/module/react/tilemap/TileMapLayer2D.js +217 -0
  178. package/lib/module/react/tilemap/TileMapLayer2D.js.map +1 -0
  179. package/lib/module/react/tilemap/tilePresentation.js +374 -0
  180. package/lib/module/react/tilemap/tilePresentation.js.map +1 -0
  181. package/lib/module/react/useGameSession.js +70 -0
  182. package/lib/module/react/useGameSession.js.map +1 -0
  183. package/lib/module/react/useGameSessionStatus.js +46 -0
  184. package/lib/module/react/useGameSessionStatus.js.map +1 -0
  185. package/lib/module/react/viewportBinding.js +5 -1
  186. package/lib/module/react/viewportBinding.js.map +1 -1
  187. package/lib/module/react.js +12 -1
  188. package/lib/module/react.js.map +1 -1
  189. package/lib/module/scene/defineScene.js +17 -0
  190. package/lib/module/scene/defineScene.js.map +1 -1
  191. package/lib/module/sprites/sampleSpriteClip.js +66 -6
  192. package/lib/module/sprites/sampleSpriteClip.js.map +1 -1
  193. package/lib/module/sprites/spriteAnimationState.js +10 -20
  194. package/lib/module/sprites/spriteAnimationState.js.map +1 -1
  195. package/lib/module/sprites.js +11 -0
  196. package/lib/module/sprites.js.map +1 -0
  197. package/lib/module/storage/adapters/asyncStorage.js +57 -0
  198. package/lib/module/storage/adapters/asyncStorage.js.map +1 -0
  199. package/lib/module/storage/adapters/memory.js +50 -0
  200. package/lib/module/storage/adapters/memory.js.map +1 -0
  201. package/lib/module/storage/errors.js +34 -0
  202. package/lib/module/storage/errors.js.map +1 -0
  203. package/lib/module/storage/index.js +11 -0
  204. package/lib/module/storage/index.js.map +1 -0
  205. package/lib/module/storage/schema.js +151 -0
  206. package/lib/module/storage/schema.js.map +1 -0
  207. package/lib/module/storage/serialization.js +249 -0
  208. package/lib/module/storage/serialization.js.map +1 -0
  209. package/lib/module/storage/store.js +387 -0
  210. package/lib/module/storage/store.js.map +1 -0
  211. package/lib/module/storage/types.js +16 -0
  212. package/lib/module/storage/types.js.map +1 -0
  213. package/lib/module/storage/validation.js +111 -0
  214. package/lib/module/storage/validation.js.map +1 -0
  215. package/lib/module/storage.js +4 -0
  216. package/lib/module/storage.js.map +1 -0
  217. package/lib/module/testing.js +4 -0
  218. package/lib/module/testing.js.map +1 -1
  219. package/lib/module/tilemap/chunkStats.js +27 -0
  220. package/lib/module/tilemap/chunkStats.js.map +1 -0
  221. package/lib/module/tilemap/definitions.js +308 -0
  222. package/lib/module/tilemap/definitions.js.map +1 -0
  223. package/lib/module/tilemap/errors.js +13 -0
  224. package/lib/module/tilemap/errors.js.map +1 -0
  225. package/lib/module/tilemap/index.js +10 -0
  226. package/lib/module/tilemap/index.js.map +1 -0
  227. package/lib/module/tilemap/movement.js +379 -0
  228. package/lib/module/tilemap/movement.js.map +1 -0
  229. package/lib/module/tilemap/queries.js +114 -0
  230. package/lib/module/tilemap/queries.js.map +1 -0
  231. package/lib/module/tilemap/tiledAdapter.js +141 -0
  232. package/lib/module/tilemap/tiledAdapter.js.map +1 -0
  233. package/lib/module/tilemap/types.js +4 -0
  234. package/lib/module/tilemap/types.js.map +1 -0
  235. package/lib/module/tilemap.js +4 -0
  236. package/lib/module/tilemap.js.map +1 -0
  237. package/lib/typescript/src/assets/defineAssets.d.ts +1 -1
  238. package/lib/typescript/src/assets/defineAssets.d.ts.map +1 -1
  239. package/lib/typescript/src/assets.d.ts +11 -0
  240. package/lib/typescript/src/assets.d.ts.map +1 -0
  241. package/lib/typescript/src/audio/createGameAudio.d.ts +5 -0
  242. package/lib/typescript/src/audio/createGameAudio.d.ts.map +1 -0
  243. package/lib/typescript/src/audio/errors.d.ts +6 -0
  244. package/lib/typescript/src/audio/errors.d.ts.map +1 -0
  245. package/lib/typescript/src/audio/index.d.ts +4 -0
  246. package/lib/typescript/src/audio/index.d.ts.map +1 -0
  247. package/lib/typescript/src/audio/resolver.d.ts +44 -0
  248. package/lib/typescript/src/audio/resolver.d.ts.map +1 -0
  249. package/lib/typescript/src/audio/types.d.ts +42 -0
  250. package/lib/typescript/src/audio/types.d.ts.map +1 -0
  251. package/lib/typescript/src/audio.d.ts +8 -0
  252. package/lib/typescript/src/audio.d.ts.map +1 -0
  253. package/lib/typescript/src/camera2d/bounds.d.ts +25 -0
  254. package/lib/typescript/src/camera2d/bounds.d.ts.map +1 -0
  255. package/lib/typescript/src/camera2d/extents.d.ts +17 -0
  256. package/lib/typescript/src/camera2d/extents.d.ts.map +1 -0
  257. package/lib/typescript/src/camera2d/follow.d.ts +24 -0
  258. package/lib/typescript/src/camera2d/follow.d.ts.map +1 -0
  259. package/lib/typescript/src/camera2d/index.d.ts +19 -0
  260. package/lib/typescript/src/camera2d/index.d.ts.map +1 -0
  261. package/lib/typescript/src/camera2d/interpolation.d.ts +17 -0
  262. package/lib/typescript/src/camera2d/interpolation.d.ts.map +1 -0
  263. package/lib/typescript/src/camera2d/shake.d.ts +20 -0
  264. package/lib/typescript/src/camera2d/shake.d.ts.map +1 -0
  265. package/lib/typescript/src/camera2d/transform.d.ts +44 -0
  266. package/lib/typescript/src/camera2d/transform.d.ts.map +1 -0
  267. package/lib/typescript/src/camera2d/types.d.ts +74 -0
  268. package/lib/typescript/src/camera2d/types.d.ts.map +1 -0
  269. package/lib/typescript/src/camera2d/validation.d.ts +30 -0
  270. package/lib/typescript/src/camera2d/validation.d.ts.map +1 -0
  271. package/lib/typescript/src/camera2d/visibility.d.ts +47 -0
  272. package/lib/typescript/src/camera2d/visibility.d.ts.map +1 -0
  273. package/lib/typescript/src/camera2d.d.ts +7 -0
  274. package/lib/typescript/src/camera2d.d.ts.map +1 -0
  275. package/lib/typescript/src/collision2d/colliders.d.ts +120 -0
  276. package/lib/typescript/src/collision2d/colliders.d.ts.map +1 -0
  277. package/lib/typescript/src/collision2d/debug.d.ts +67 -0
  278. package/lib/typescript/src/collision2d/debug.d.ts.map +1 -0
  279. package/lib/typescript/src/collision2d/filters.d.ts +28 -0
  280. package/lib/typescript/src/collision2d/filters.d.ts.map +1 -0
  281. package/lib/typescript/src/collision2d/index.d.ts +17 -0
  282. package/lib/typescript/src/collision2d/index.d.ts.map +1 -0
  283. package/lib/typescript/src/collision2d/intersections.d.ts +24 -0
  284. package/lib/typescript/src/collision2d/intersections.d.ts.map +1 -0
  285. package/lib/typescript/src/collision2d/manifolds.d.ts +39 -0
  286. package/lib/typescript/src/collision2d/manifolds.d.ts.map +1 -0
  287. package/lib/typescript/src/collision2d/segments.d.ts +24 -0
  288. package/lib/typescript/src/collision2d/segments.d.ts.map +1 -0
  289. package/lib/typescript/src/collision2d/spatialHash.d.ts +50 -0
  290. package/lib/typescript/src/collision2d/spatialHash.d.ts.map +1 -0
  291. package/lib/typescript/src/collision2d/sweeps.d.ts +60 -0
  292. package/lib/typescript/src/collision2d/sweeps.d.ts.map +1 -0
  293. package/lib/typescript/src/collision2d.d.ts +7 -0
  294. package/lib/typescript/src/collision2d.d.ts.map +1 -0
  295. package/lib/typescript/src/core/input/buttonPad.d.ts +59 -0
  296. package/lib/typescript/src/core/input/buttonPad.d.ts.map +1 -0
  297. package/lib/typescript/src/core/input/createInputBuffer.d.ts +1 -1
  298. package/lib/typescript/src/core/input/createInputBuffer.d.ts.map +1 -1
  299. package/lib/typescript/src/core/input/types.d.ts +7 -0
  300. package/lib/typescript/src/core/input/types.d.ts.map +1 -1
  301. package/lib/typescript/src/core/session/createGameSession.d.ts +4 -2
  302. package/lib/typescript/src/core/session/createGameSession.d.ts.map +1 -1
  303. package/lib/typescript/src/core/session/deepFreeze.d.ts +21 -1
  304. package/lib/typescript/src/core/session/deepFreeze.d.ts.map +1 -1
  305. package/lib/typescript/src/core/session/diagnostics.d.ts +2 -0
  306. package/lib/typescript/src/core/session/diagnostics.d.ts.map +1 -1
  307. package/lib/typescript/src/core/session/types.d.ts +69 -4
  308. package/lib/typescript/src/core/session/types.d.ts.map +1 -1
  309. package/lib/typescript/src/definition/defineGame.d.ts +12 -1
  310. package/lib/typescript/src/definition/defineGame.d.ts.map +1 -1
  311. package/lib/typescript/src/definition/types.d.ts +10 -1
  312. package/lib/typescript/src/definition/types.d.ts.map +1 -1
  313. package/lib/typescript/src/events/defineGameEvents.d.ts +26 -0
  314. package/lib/typescript/src/events/defineGameEvents.d.ts.map +1 -0
  315. package/lib/typescript/src/events/errors.d.ts +12 -0
  316. package/lib/typescript/src/events/errors.d.ts.map +1 -0
  317. package/lib/typescript/src/events/index.d.ts +6 -0
  318. package/lib/typescript/src/events/index.d.ts.map +1 -0
  319. package/lib/typescript/src/events/payload.d.ts +21 -0
  320. package/lib/typescript/src/events/payload.d.ts.map +1 -0
  321. package/lib/typescript/src/events/seed.d.ts +3 -0
  322. package/lib/typescript/src/events/seed.d.ts.map +1 -0
  323. package/lib/typescript/src/events/types.d.ts +42 -0
  324. package/lib/typescript/src/events/types.d.ts.map +1 -0
  325. package/lib/typescript/src/events.d.ts +12 -0
  326. package/lib/typescript/src/events.d.ts.map +1 -0
  327. package/lib/typescript/src/geometry/helpers.d.ts +35 -0
  328. package/lib/typescript/src/geometry/helpers.d.ts.map +1 -0
  329. package/lib/typescript/src/geometry/index.d.ts +4 -0
  330. package/lib/typescript/src/geometry/index.d.ts.map +1 -0
  331. package/lib/typescript/src/geometry/types.d.ts +49 -0
  332. package/lib/typescript/src/geometry/types.d.ts.map +1 -1
  333. package/lib/typescript/src/geometry/validation.d.ts +44 -0
  334. package/lib/typescript/src/geometry/validation.d.ts.map +1 -0
  335. package/lib/typescript/src/geometry.d.ts +7 -0
  336. package/lib/typescript/src/geometry.d.ts.map +1 -0
  337. package/lib/typescript/src/haptics/createGameHaptics.d.ts +3 -0
  338. package/lib/typescript/src/haptics/createGameHaptics.d.ts.map +1 -0
  339. package/lib/typescript/src/haptics/errors.d.ts +6 -0
  340. package/lib/typescript/src/haptics/errors.d.ts.map +1 -0
  341. package/lib/typescript/src/haptics/index.d.ts +4 -0
  342. package/lib/typescript/src/haptics/index.d.ts.map +1 -0
  343. package/lib/typescript/src/haptics/resolver.d.ts +22 -0
  344. package/lib/typescript/src/haptics/resolver.d.ts.map +1 -0
  345. package/lib/typescript/src/haptics/types.d.ts +37 -0
  346. package/lib/typescript/src/haptics/types.d.ts.map +1 -0
  347. package/lib/typescript/src/haptics.d.ts +8 -0
  348. package/lib/typescript/src/haptics.d.ts.map +1 -0
  349. package/lib/typescript/src/index.d.ts +10 -2
  350. package/lib/typescript/src/index.d.ts.map +1 -1
  351. package/lib/typescript/src/particles/createParticleSystem.d.ts +5 -0
  352. package/lib/typescript/src/particles/createParticleSystem.d.ts.map +1 -0
  353. package/lib/typescript/src/particles/defineParticleEffect.d.ts +3 -0
  354. package/lib/typescript/src/particles/defineParticleEffect.d.ts.map +1 -0
  355. package/lib/typescript/src/particles/errors.d.ts +5 -0
  356. package/lib/typescript/src/particles/errors.d.ts.map +1 -0
  357. package/lib/typescript/src/particles/index.d.ts +6 -0
  358. package/lib/typescript/src/particles/index.d.ts.map +1 -0
  359. package/lib/typescript/src/particles/sampling.d.ts +54 -0
  360. package/lib/typescript/src/particles/sampling.d.ts.map +1 -0
  361. package/lib/typescript/src/particles/types.d.ts +292 -0
  362. package/lib/typescript/src/particles/types.d.ts.map +1 -0
  363. package/lib/typescript/src/particles.d.ts +2 -0
  364. package/lib/typescript/src/particles.d.ts.map +1 -0
  365. package/lib/typescript/src/react/GameButtonPad.d.ts +84 -0
  366. package/lib/typescript/src/react/GameButtonPad.d.ts.map +1 -0
  367. package/lib/typescript/src/react/GamePointerInput.d.ts.map +1 -1
  368. package/lib/typescript/src/react/GameView.d.ts +27 -1
  369. package/lib/typescript/src/react/GameView.d.ts.map +1 -1
  370. package/lib/typescript/src/react/assets/createGameAssetStore.d.ts.map +1 -1
  371. package/lib/typescript/src/react/assets/useGameAssets.d.ts.map +1 -1
  372. package/lib/typescript/src/react/bindAppLifecycle.d.ts +7 -1
  373. package/lib/typescript/src/react/bindAppLifecycle.d.ts.map +1 -1
  374. package/lib/typescript/src/react/bindGameSession.d.ts.map +1 -1
  375. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts +24 -0
  376. package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts.map +1 -0
  377. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts +44 -0
  378. package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts.map +1 -0
  379. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts +22 -0
  380. package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts.map +1 -0
  381. package/lib/typescript/src/react/cleanupList.d.ts +21 -0
  382. package/lib/typescript/src/react/cleanupList.d.ts.map +1 -0
  383. package/lib/typescript/src/react/instrumentation.d.ts +33 -3
  384. package/lib/typescript/src/react/instrumentation.d.ts.map +1 -1
  385. package/lib/typescript/src/react/lifecycleSource.d.ts +21 -0
  386. package/lib/typescript/src/react/lifecycleSource.d.ts.map +1 -0
  387. package/lib/typescript/src/react/particles/ParticleView.d.ts +65 -0
  388. package/lib/typescript/src/react/particles/ParticleView.d.ts.map +1 -0
  389. package/lib/typescript/src/react/particles/culling.d.ts +70 -0
  390. package/lib/typescript/src/react/particles/culling.d.ts.map +1 -0
  391. package/lib/typescript/src/react/particles/index.d.ts +7 -0
  392. package/lib/typescript/src/react/particles/index.d.ts.map +1 -0
  393. package/lib/typescript/src/react/particles/spriteXForm.d.ts +28 -0
  394. package/lib/typescript/src/react/particles/spriteXForm.d.ts.map +1 -0
  395. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts +48 -0
  396. package/lib/typescript/src/react/particles/useParticlePresentation.d.ts.map +1 -0
  397. package/lib/typescript/src/react/pointerBinding.d.ts +38 -8
  398. package/lib/typescript/src/react/pointerBinding.d.ts.map +1 -1
  399. package/lib/typescript/src/react/pointerCamera.d.ts +20 -0
  400. package/lib/typescript/src/react/pointerCamera.d.ts.map +1 -0
  401. package/lib/typescript/src/react/pointerCoalescer.d.ts +17 -1
  402. package/lib/typescript/src/react/pointerCoalescer.d.ts.map +1 -1
  403. package/lib/typescript/src/react/sprites/GameSprite.d.ts +3 -10
  404. package/lib/typescript/src/react/sprites/GameSprite.d.ts.map +1 -1
  405. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts +51 -6
  406. package/lib/typescript/src/react/sprites/GameWorld2D.d.ts.map +1 -1
  407. package/lib/typescript/src/react/sprites/Sprite.d.ts.map +1 -1
  408. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts +22 -1
  409. package/lib/typescript/src/react/sprites/SpriteBatch.d.ts.map +1 -1
  410. package/lib/typescript/src/react/sprites/batchVisibility.d.ts +28 -0
  411. package/lib/typescript/src/react/sprites/batchVisibility.d.ts.map +1 -0
  412. package/lib/typescript/src/react/sprites/spriteSelection.d.ts +58 -0
  413. package/lib/typescript/src/react/sprites/spriteSelection.d.ts.map +1 -0
  414. package/lib/typescript/src/react/sprites/spriteTransform.d.ts +27 -12
  415. package/lib/typescript/src/react/sprites/spriteTransform.d.ts.map +1 -1
  416. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts +69 -0
  417. package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts.map +1 -0
  418. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts +217 -0
  419. package/lib/typescript/src/react/tilemap/tilePresentation.d.ts.map +1 -0
  420. package/lib/typescript/src/react/useGameSession.d.ts +48 -0
  421. package/lib/typescript/src/react/useGameSession.d.ts.map +1 -0
  422. package/lib/typescript/src/react/useGameSessionStatus.d.ts +23 -0
  423. package/lib/typescript/src/react/useGameSessionStatus.d.ts.map +1 -0
  424. package/lib/typescript/src/react/viewportBinding.d.ts +5 -1
  425. package/lib/typescript/src/react/viewportBinding.d.ts.map +1 -1
  426. package/lib/typescript/src/react.d.ts +18 -1
  427. package/lib/typescript/src/react.d.ts.map +1 -1
  428. package/lib/typescript/src/scene/defineScene.d.ts +22 -2
  429. package/lib/typescript/src/scene/defineScene.d.ts.map +1 -1
  430. package/lib/typescript/src/scene/types.d.ts +24 -4
  431. package/lib/typescript/src/scene/types.d.ts.map +1 -1
  432. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts +26 -2
  433. package/lib/typescript/src/sprites/sampleSpriteClip.d.ts.map +1 -1
  434. package/lib/typescript/src/sprites/spriteAnimationState.d.ts +6 -7
  435. package/lib/typescript/src/sprites/spriteAnimationState.d.ts.map +1 -1
  436. package/lib/typescript/src/sprites.d.ts +10 -0
  437. package/lib/typescript/src/sprites.d.ts.map +1 -0
  438. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts +18 -0
  439. package/lib/typescript/src/storage/adapters/asyncStorage.d.ts.map +1 -0
  440. package/lib/typescript/src/storage/adapters/memory.d.ts +16 -0
  441. package/lib/typescript/src/storage/adapters/memory.d.ts.map +1 -0
  442. package/lib/typescript/src/storage/errors.d.ts +37 -0
  443. package/lib/typescript/src/storage/errors.d.ts.map +1 -0
  444. package/lib/typescript/src/storage/index.d.ts +11 -0
  445. package/lib/typescript/src/storage/index.d.ts.map +1 -0
  446. package/lib/typescript/src/storage/schema.d.ts +22 -0
  447. package/lib/typescript/src/storage/schema.d.ts.map +1 -0
  448. package/lib/typescript/src/storage/serialization.d.ts +23 -0
  449. package/lib/typescript/src/storage/serialization.d.ts.map +1 -0
  450. package/lib/typescript/src/storage/store.d.ts +3 -0
  451. package/lib/typescript/src/storage/store.d.ts.map +1 -0
  452. package/lib/typescript/src/storage/types.d.ts +69 -0
  453. package/lib/typescript/src/storage/types.d.ts.map +1 -0
  454. package/lib/typescript/src/storage/validation.d.ts +24 -0
  455. package/lib/typescript/src/storage/validation.d.ts.map +1 -0
  456. package/lib/typescript/src/storage.d.ts +2 -0
  457. package/lib/typescript/src/storage.d.ts.map +1 -0
  458. package/lib/typescript/src/testing.d.ts +1 -0
  459. package/lib/typescript/src/testing.d.ts.map +1 -1
  460. package/lib/typescript/src/tilemap/chunkStats.d.ts +14 -0
  461. package/lib/typescript/src/tilemap/chunkStats.d.ts.map +1 -0
  462. package/lib/typescript/src/tilemap/definitions.d.ts +38 -0
  463. package/lib/typescript/src/tilemap/definitions.d.ts.map +1 -0
  464. package/lib/typescript/src/tilemap/errors.d.ts +7 -0
  465. package/lib/typescript/src/tilemap/errors.d.ts.map +1 -0
  466. package/lib/typescript/src/tilemap/index.d.ts +8 -0
  467. package/lib/typescript/src/tilemap/index.d.ts.map +1 -0
  468. package/lib/typescript/src/tilemap/movement.d.ts +52 -0
  469. package/lib/typescript/src/tilemap/movement.d.ts.map +1 -0
  470. package/lib/typescript/src/tilemap/queries.d.ts +21 -0
  471. package/lib/typescript/src/tilemap/queries.d.ts.map +1 -0
  472. package/lib/typescript/src/tilemap/tiledAdapter.d.ts +32 -0
  473. package/lib/typescript/src/tilemap/tiledAdapter.d.ts.map +1 -0
  474. package/lib/typescript/src/tilemap/types.d.ts +127 -0
  475. package/lib/typescript/src/tilemap/types.d.ts.map +1 -0
  476. package/lib/typescript/src/tilemap.d.ts +2 -0
  477. package/lib/typescript/src/tilemap.d.ts.map +1 -0
  478. package/package.json +94 -4
  479. package/src/assets/defineAssets.ts +31 -5
  480. package/src/assets.ts +27 -0
  481. package/src/audio/createGameAudio.ts +749 -0
  482. package/src/audio/errors.ts +12 -0
  483. package/src/audio/index.ts +9 -0
  484. package/src/audio/resolver.ts +74 -0
  485. package/src/audio/types.ts +47 -0
  486. package/src/audio.ts +13 -0
  487. package/src/camera2d/bounds.ts +69 -0
  488. package/src/camera2d/extents.ts +25 -0
  489. package/src/camera2d/follow.ts +165 -0
  490. package/src/camera2d/index.ts +29 -0
  491. package/src/camera2d/interpolation.ts +113 -0
  492. package/src/camera2d/shake.ts +90 -0
  493. package/src/camera2d/transform.ts +148 -0
  494. package/src/camera2d/types.ts +73 -0
  495. package/src/camera2d/validation.ts +126 -0
  496. package/src/camera2d/visibility.ts +181 -0
  497. package/src/camera2d.ts +6 -0
  498. package/src/collision2d/colliders.ts +292 -0
  499. package/src/collision2d/debug.ts +133 -0
  500. package/src/collision2d/filters.ts +48 -0
  501. package/src/collision2d/index.ts +74 -0
  502. package/src/collision2d/intersections.ts +82 -0
  503. package/src/collision2d/manifolds.ts +191 -0
  504. package/src/collision2d/segments.ts +176 -0
  505. package/src/collision2d/spatialHash.ts +211 -0
  506. package/src/collision2d/sweeps.ts +269 -0
  507. package/src/collision2d.ts +6 -0
  508. package/src/core/input/buttonPad.ts +235 -0
  509. package/src/core/input/createInputBuffer.ts +95 -14
  510. package/src/core/input/types.ts +7 -0
  511. package/src/core/session/createGameSession.ts +480 -53
  512. package/src/core/session/deepFreeze.ts +104 -3
  513. package/src/core/session/diagnostics.ts +2 -0
  514. package/src/core/session/types.ts +77 -4
  515. package/src/definition/defineGame.ts +61 -3
  516. package/src/definition/types.ts +10 -0
  517. package/src/events/defineGameEvents.ts +46 -0
  518. package/src/events/errors.ts +14 -0
  519. package/src/events/index.ts +14 -0
  520. package/src/events/payload.ts +234 -0
  521. package/src/events/seed.ts +33 -0
  522. package/src/events/types.ts +53 -0
  523. package/src/events.ts +20 -0
  524. package/src/geometry/helpers.ts +136 -0
  525. package/src/geometry/index.ts +14 -0
  526. package/src/geometry/types.ts +54 -0
  527. package/src/geometry/validation.ts +131 -0
  528. package/src/geometry.ts +6 -0
  529. package/src/haptics/createGameHaptics.ts +214 -0
  530. package/src/haptics/errors.ts +12 -0
  531. package/src/haptics/index.ts +3 -0
  532. package/src/haptics/resolver.ts +58 -0
  533. package/src/haptics/types.ts +48 -0
  534. package/src/haptics.ts +7 -0
  535. package/src/index.ts +37 -1
  536. package/src/particles/createParticleSystem.ts +505 -0
  537. package/src/particles/defineParticleEffect.ts +164 -0
  538. package/src/particles/errors.ts +6 -0
  539. package/src/particles/index.ts +5 -0
  540. package/src/particles/sampling.ts +141 -0
  541. package/src/particles/types.ts +327 -0
  542. package/src/particles.ts +1 -0
  543. package/src/react/GameButtonPad.tsx +436 -0
  544. package/src/react/GamePointerInput.tsx +73 -8
  545. package/src/react/GameView.tsx +160 -61
  546. package/src/react/assets/createGameAssetStore.ts +140 -107
  547. package/src/react/assets/useGameAssets.ts +63 -31
  548. package/src/react/bindAppLifecycle.ts +55 -19
  549. package/src/react/bindGameSession.ts +12 -2
  550. package/src/react/camera2d/GameLayer2D.tsx +43 -0
  551. package/src/react/camera2d/defineGameCamera2D.ts +59 -0
  552. package/src/react/camera2d/usePresentedCameraBinding.ts +185 -0
  553. package/src/react/cleanupList.ts +48 -0
  554. package/src/react/instrumentation.ts +31 -3
  555. package/src/react/lifecycleSource.ts +58 -0
  556. package/src/react/particles/ParticleView.tsx +358 -0
  557. package/src/react/particles/culling.ts +145 -0
  558. package/src/react/particles/index.ts +6 -0
  559. package/src/react/particles/spriteXForm.ts +72 -0
  560. package/src/react/particles/useParticlePresentation.ts +261 -0
  561. package/src/react/pointerBinding.ts +74 -16
  562. package/src/react/pointerCamera.ts +33 -0
  563. package/src/react/pointerCoalescer.ts +36 -10
  564. package/src/react/sprites/GameSprite.tsx +4 -33
  565. package/src/react/sprites/GameWorld2D.tsx +113 -7
  566. package/src/react/sprites/Sprite.tsx +51 -72
  567. package/src/react/sprites/SpriteBatch.tsx +74 -22
  568. package/src/react/sprites/batchVisibility.ts +76 -0
  569. package/src/react/sprites/spriteSelection.ts +133 -0
  570. package/src/react/sprites/spriteTransform.ts +46 -26
  571. package/src/react/tilemap/TileMapLayer2D.tsx +274 -0
  572. package/src/react/tilemap/tilePresentation.ts +491 -0
  573. package/src/react/useGameSession.ts +90 -0
  574. package/src/react/useGameSessionStatus.ts +53 -0
  575. package/src/react/viewportBinding.ts +5 -1
  576. package/src/react.ts +18 -1
  577. package/src/scene/defineScene.ts +47 -5
  578. package/src/scene/types.ts +37 -3
  579. package/src/sprites/sampleSpriteClip.ts +82 -14
  580. package/src/sprites/spriteAnimationState.ts +29 -25
  581. package/src/sprites.ts +22 -0
  582. package/src/storage/adapters/asyncStorage.ts +77 -0
  583. package/src/storage/adapters/memory.ts +58 -0
  584. package/src/storage/errors.ts +88 -0
  585. package/src/storage/index.ts +18 -0
  586. package/src/storage/schema.ts +147 -0
  587. package/src/storage/serialization.ts +248 -0
  588. package/src/storage/store.ts +380 -0
  589. package/src/storage/types.ts +76 -0
  590. package/src/storage/validation.ts +102 -0
  591. package/src/storage.ts +1 -0
  592. package/src/testing.ts +4 -0
  593. package/src/tilemap/chunkStats.ts +24 -0
  594. package/src/tilemap/definitions.ts +327 -0
  595. package/src/tilemap/errors.ts +11 -0
  596. package/src/tilemap/index.ts +10 -0
  597. package/src/tilemap/movement.ts +368 -0
  598. package/src/tilemap/queries.ts +136 -0
  599. package/src/tilemap/tiledAdapter.ts +165 -0
  600. package/src/tilemap/types.ts +119 -0
  601. package/src/tilemap.ts +1 -0
@@ -1,12 +1,16 @@
1
1
  /**
2
- * `GameWorld2D` — the viewport transform group (T7.6).
2
+ * `GameWorld2D` — the viewport + camera transform group (T7.6, T12.5).
3
3
  *
4
- * Applies the resolved viewport offset/scale exactly once to all child
5
- * sprites. It adds no camera state, subscribes no React per frame, and is
6
- * not a camera API. Raw Skia nodes may be nested inside.
4
+ * Applies the resolved viewport offset/scale to all child sprites, and —
5
+ * when the game opts into a camera — composes the presented camera
6
+ * transform BEFORE the viewport. The group's element list maps world ->
7
+ * surface directly; `GameLayer2D` children consume the same camera through
8
+ * the world context and apply only their parallax correction, so layers
9
+ * never double-apply the camera.
7
10
  */
8
- import type { ReactNode } from 'react';
11
+ import { type ReactNode } from 'react';
9
12
  import { type SharedValue } from 'react-native-reanimated';
13
+ import type { CameraCut2D } from '../../camera2d.js';
10
14
  import type { ResolvedViewport2D } from '../../viewport2d/types.js';
11
15
  /**
12
16
  * The viewport transform as a Skia element list:
@@ -21,9 +25,50 @@ export declare function viewportTransform(viewport: ResolvedViewport2D | undefin
21
25
  } | {
22
26
  readonly scaleY: number;
23
27
  })[];
24
- export declare function GameWorld2D({ viewport, children, }: {
28
+ /**
29
+ * The composed camera + viewport transform (T12.5).
30
+ *
31
+ * Skia applies the element list last-first, so the list below is the
32
+ * forward mapping `surface = viewport(L + rotate(P - C, -R) * Z)`:
33
+ * translate(-C) -> scale(Z) -> rotate(-R) -> translate(L) -> viewport.
34
+ */
35
+ export declare function cameraViewportTransform2D(camera: CameraCut2D | undefined, viewport: ResolvedViewport2D | undefined): readonly ({
36
+ readonly translateX: number;
37
+ } | {
38
+ readonly translateY: number;
39
+ } | {
40
+ readonly scaleX: number;
41
+ } | {
42
+ readonly scaleY: number;
43
+ } | {
44
+ readonly rotate: number;
45
+ })[];
46
+ /**
47
+ * The parallax correction for one layer (T12.5).
48
+ *
49
+ * A layer with factor p draws with the camera whose effective center is
50
+ * `C' = L + (C - L) * p` per axis. Since zoom and rotation apply fully at
51
+ * every factor, the correction relative to the parent camera is exactly a
52
+ * translation by `(C - L) * (1 - p)` in world units.
53
+ */
54
+ export declare function layerParallaxTransform2D(camera: CameraCut2D | undefined, viewport: ResolvedViewport2D | undefined, parallaxX: number, parallaxY: number): readonly ({
55
+ readonly translateX: number;
56
+ } | {
57
+ readonly translateY: number;
58
+ })[];
59
+ /** The camera + viewport context provided by `GameWorld2D`. */
60
+ export interface GameWorldContextValue {
61
+ readonly viewport: SharedValue<ResolvedViewport2D | undefined>;
62
+ readonly camera: SharedValue<CameraCut2D | undefined> | undefined;
63
+ }
64
+ export declare const GameWorldContext: import("react").Context<GameWorldContextValue | null>;
65
+ export declare function GameWorld2D({ viewport, camera, children, }: {
25
66
  /** The resolved viewport shared value supplied to the renderer. */
26
67
  readonly viewport: SharedValue<ResolvedViewport2D | undefined>;
68
+ /** The presented camera shared value (T12.5); absent keeps the viewport-only path. */
69
+ readonly camera?: SharedValue<CameraCut2D | undefined> | undefined;
27
70
  readonly children: ReactNode;
28
71
  }): import("react").JSX.Element;
72
+ /** Consume the world context; throws outside `GameWorld2D`. */
73
+ export declare function useGameWorldContext(): GameWorldContextValue;
29
74
  //# sourceMappingURL=GameWorld2D.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GameWorld2D.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/GameWorld2D.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAAwB,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS,CAClF;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAC9B,EAAE,CAWF;AAED,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,QAAQ,GACT,EAAE;IACD,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC/D,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B,+BAGA"}
1
+ {"version":3,"file":"GameWorld2D.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/GameWorld2D.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAA6B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAElE,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAAwB,CAAC;AAEjE;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GAAG,SAAS,CAClF;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAC9B,EAAE,CAWF;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,kBAAkB,GAAG,SAAS,GACvC,SAAS,CACR;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAC9B,EAAE,CAsBF;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,kBAAkB,GAAG,SAAS,EACxC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,SAAS,CAAC;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,EAAE,CAkBhF;AAED,+DAA+D;AAC/D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC/D,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;CACnE;AAED,eAAO,MAAM,gBAAgB,uDAAoD,CAAC;AAElF,wBAAgB,WAAW,CAAC,EAC1B,QAAQ,EACR,MAAM,EACN,QAAQ,GACT,EAAE;IACD,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;IAC/D,sFAAsF;IACtF,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,WAAW,GAAG,SAAS,CAAC,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B,+BAYA;AAED,+DAA+D;AAC/D,wBAAgB,mBAAmB,IAAI,qBAAqB,CAM3D"}
@@ -1 +1 @@
1
- {"version":3,"file":"Sprite.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/Sprite.tsx"],"names":[],"mappings":"AAYA,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAoB,CAAC;AAQzE,OAAO,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEjF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAAC;IACjD;yEACqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,sBAAsB,GAAG,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1E,kEAAkE;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,uCAAuC;IACvC,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;IACzC,yBAAyB;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,SAAa,EACb,CAAK,EACL,CAAK,EACL,QAAY,EACZ,KAAS,EACT,MAAuB,EACvB,KAAa,EACb,KAAa,EACb,OAAW,EACX,IAAI,EACJ,QAAQ,EACR,OAAc,GACf,EAAE,WAAW,+BAmHb"}
1
+ {"version":3,"file":"Sprite.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/Sprite.tsx"],"names":[],"mappings":"AAYA,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC9F,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAoB,CAAC;AAWzE,OAAO,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEjF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAC5D,MAAM,MAAM,uBAAuB,GAAG,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;AACrE,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;AAElE,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAAC;IACjD;yEACqE;IACrE,QAAQ,CAAC,KAAK,CAAC,EAAE,sBAAsB,GAAG,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAC1E,kEAAkE;IAClE,QAAQ,CAAC,IAAI,CAAC,EAAE,sBAAsB,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,gBAAgB,CAAC;IACtC,uCAAuC;IACvC,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC9B,QAAQ,CAAC,CAAC,CAAC,EAAE,gBAAgB,CAAC;IAC9B,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,uCAAuC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,KAAK,CAAC,EAAE,uBAAuB,CAAC;IACzC,yBAAyB;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC;IACpC,+CAA+C;IAC/C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC;IACpC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,uBAAuB,CAAC;CAC5C;AAED,wBAAgB,MAAM,CAAC,EACrB,MAAM,EACN,KAAK,EACL,IAAI,EACJ,SAAa,EACb,CAAK,EACL,CAAK,EACL,QAAY,EACZ,KAAS,EACT,MAAuB,EACvB,KAAa,EACb,KAAa,EACb,OAAW,EACX,IAAI,EACJ,QAAQ,EACR,OAAc,GACf,EAAE,WAAW,+BA2Fb"}
@@ -1,5 +1,10 @@
1
1
  import { type SharedValue } from 'react-native-reanimated';
2
+ import type { CameraCut2D } from '../../camera2d.js';
3
+ import type { Aabb2D } from '../../geometry/types.js';
2
4
  import type { CommitFrame } from '../../core/session/types.js';
5
+ import { batchVisibleBounds2D, intersectsBounds2D } from './batchVisibility.js';
6
+ import type { ResolvedViewport2D } from '../../viewport2d/types.js';
7
+ export { batchVisibleBounds2D, intersectsBounds2D };
3
8
  import type { SceneSnapshot } from '../../scene/types.js';
4
9
  import type { SceneMap } from '../../definition/types.js';
5
10
  import type { LoadedImage, LoadedSpriteSheet } from '../../assets/types.js';
@@ -36,6 +41,22 @@ export interface SpriteBatchProps<TScenes extends SceneMap, TSceneName extends E
36
41
  readonly x: number;
37
42
  readonly y: number;
38
43
  };
44
+ /**
45
+ * Optional camera culling (T12.6): items whose authored world bounds fall
46
+ * outside the conservative visible region are hidden (zero-size slots)
47
+ * instead of drawn. Slot identity and capacity are unchanged; the
48
+ * simulation never knows culling happened. `bounds` maps an item to its
49
+ * world AABB and runs as a worklet on the UI runtime. A bounds record
50
+ * with non-finite values hides the item (fail-safe: invalid geometry is
51
+ * never drawn); padding must be finite and nonnegative (T12-F5).
52
+ */
53
+ readonly cull?: {
54
+ readonly camera: SharedValue<CameraCut2D | undefined>;
55
+ readonly viewport: SharedValue<ResolvedViewport2D | undefined>;
56
+ readonly bounds: (item: TItem) => Aabb2D;
57
+ /** Optional world-space padding around the visible region. */
58
+ readonly padding?: number;
59
+ };
39
60
  }
40
- export declare function SpriteBatch<TScenes extends SceneMap, TSceneName extends Extract<keyof TScenes, string>, TItem>({ scene, commit, alpha, source, capacity, select, write, anchor, }: SpriteBatchProps<TScenes, TSceneName, TItem>): import("react").JSX.Element;
61
+ export declare function SpriteBatch<TScenes extends SceneMap, TSceneName extends Extract<keyof TScenes, string>, TItem>({ scene, commit, alpha, source, capacity, select, write, anchor, cull, }: SpriteBatchProps<TScenes, TSceneName, TItem>): import("react").JSX.Element;
41
62
  //# sourceMappingURL=SpriteBatch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SpriteBatch.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/SpriteBatch.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAG5E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA0B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAAwB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAoB,CAAC;AAIzE,wEAAwE;AACxE,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,GAAG,EAAE,CACZ,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,OAAO,KACd,IAAI,CAAC;CACX;AAED,MAAM,WAAW,gBAAgB,CAC/B,OAAO,SAAS,QAAQ,EACxB,UAAU,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,EACjD,KAAK;IAEL,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IACnD,yCAAyC;IACzC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,iBAAiB,CAAC;IACjD,iDAAiD;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;QACzB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,KAAK,SAAS,KAAK,EAAE,CAAC;IACvB,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,gBAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9E,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9D;AAcD,wBAAgB,WAAW,CACzB,OAAO,SAAS,QAAQ,EACxB,UAAU,SAAS,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,EACjD,KAAK,EACL,EACA,KAAK,EACL,MAAM,EACN,KAAK,EACL,MAAM,EACN,QAAQ,EACR,MAAM,EACN,KAAK,EACL,MAAuB,GACxB,EAAE,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,+BAuH9C"}
1
+ {"version":3,"file":"SpriteBatch.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/SpriteBatch.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Batch culling math (T12.6, T12-F5) — pure and worklet-safe, with no React
3
+ * imports, so the benchmark and headless tests can import them directly.
4
+ */
5
+ import type { CameraCut2D } from '../../camera2d.js';
6
+ import type { Aabb2D } from '../../geometry/types.js';
7
+ import type { ResolvedViewport2D } from '../../viewport2d/types.js';
8
+ /**
9
+ * Conservative visible bounds for batch culling (T12.6).
10
+ *
11
+ * Worklet-safe inline version of the headless `paddedCameraBounds2D` —
12
+ * the presented camera is already validated at the public boundary, so the
13
+ * per-frame path allocates nothing and validates nothing.
14
+ */
15
+ export declare function batchVisibleBounds2D(camera: CameraCut2D | undefined, viewport: ResolvedViewport2D | undefined, padding: number): Aabb2D | undefined;
16
+ /** Axis-aligned intersection test, worklet-safe (no validation).
17
+ *
18
+ * Inclusive comparisons, matching the public `intersectsAabbAabb2D`
19
+ * contract (T12-F5): exact boundary contact IS an intersection, so a
20
+ * sprite touching the camera edge is never culled.
21
+ *
22
+ * T12-RF6 malformed-bounds fail-safe: any non-finite field or negative
23
+ * size in EITHER rect hides the item (returns false) before the
24
+ * intersection test — invalid geometry is never drawn. Scalar and
25
+ * allocation-free; no structured error construction on the UI path.
26
+ */
27
+ export declare function intersectsBounds2D(first: Aabb2D, second: Aabb2D): boolean;
28
+ //# sourceMappingURL=batchVisibility.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchVisibility.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/batchVisibility.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAgB,CAAC;AAElD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAAwB,CAAC;AAEjE;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,kBAAkB,GAAG,SAAS,EACxC,OAAO,EAAE,MAAM,GACd,MAAM,GAAG,SAAS,CAmBpB;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAWzE"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Shared sprite frame selection (GS-ANIMATION-01).
3
+ *
4
+ * The single headless selection contract behind `Sprite`'s rect modifier
5
+ * and `GameSprite`'s frame-name derivation: an explicit frame wins,
6
+ * otherwise clip + elapsed time resolve through the pure sampler. Absent
7
+ * selection (nothing chosen yet) presents nothing without throwing;
8
+ * invalid clips and frames fail clearly instead of masking bad data.
9
+ *
10
+ * Headless-safe: only type imports plus the pure sampler, so the same
11
+ * functions execute identically in tests and on the UI runtime. Every
12
+ * function carries the worklet directive for UI execution; the reachable
13
+ * call graph is plain arithmetic plus plain `Error` construction
14
+ * (GS-ANIMATION-02).
15
+ */
16
+ import type { LoadedImage, LoadedSpriteSheet } from '../../assets/types.js';
17
+ import type { SpriteFrameRect } from './spriteTransform.js';
18
+ import type { SharedValue } from 'react-native-reanimated';
19
+ /** A static value or a UI-runtime shared value carrying it. Shared-value
20
+ * payloads list both the exact and the undefined-extended shapes because
21
+ * shared values are invariant in their payload. */
22
+ export type SpriteSelectable<T> = T | SharedValue<T>;
23
+ /** Selection props as the Sprite/GameSprite call sites declare them. */
24
+ export type SpriteFrameProp = string | SharedValue<string> | SharedValue<string | undefined> | undefined;
25
+ export type SpriteClipProp = string | SharedValue<string> | undefined;
26
+ /** The discrete selection inputs for one sprite (all optional). */
27
+ export interface SpriteSelection {
28
+ /** The exact frame name; overrides clip + elapsedMs. */
29
+ readonly frame?: string;
30
+ /** The clip to select from the sprite sheet. */
31
+ readonly clip?: string;
32
+ /** Elapsed time within the clip in milliseconds. */
33
+ readonly elapsedMs?: number;
34
+ }
35
+ /**
36
+ * Resolve the source rectangle for a selection.
37
+ *
38
+ * Returns `undefined` for absent selection (present nothing); throws for
39
+ * unknown clips and frames.
40
+ */
41
+ export declare function selectSpriteFrameRect(source: LoadedImage | LoadedSpriteSheet, selection: SpriteSelection): SpriteFrameRect | undefined;
42
+ /**
43
+ * Materialize mixed static/shared selection props into one plain selection
44
+ * (GS-SPRITE-03): every worklet that resolves frames — rect, transform, and
45
+ * Group correction — starts from this single helper, so clip-driven frame
46
+ * changes reach every consumer coherently.
47
+ */
48
+ export declare function materializeSpriteSelection(frame: SpriteFrameProp, clip: SpriteClipProp, elapsedMs: SpriteSelectable<number> | undefined): SpriteSelection;
49
+ /** A Skia rect-buffer entry (structural: only `setXYWH` is used). */
50
+ export interface SpriteRectBuffer {
51
+ setXYWH(x: number, y: number, width: number, height: number): void;
52
+ }
53
+ /**
54
+ * Apply a selection to a rect-buffer entry: the component callback logic
55
+ * behind `Sprite`'s modifier, executed here so tests observe it directly.
56
+ */
57
+ export declare function applySpriteFrameSelection(rect: SpriteRectBuffer, source: LoadedImage | LoadedSpriteSheet, selection: SpriteSelection): void;
58
+ //# sourceMappingURL=spriteSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spriteSelection.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/spriteSelection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAoB,CAAC;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,sBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;mDAEmD;AACnD,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AAErD,wEAAwE;AACxE,MAAM,MAAM,eAAe,GACvB,MAAM,GACN,WAAW,CAAC,MAAM,CAAC,GACnB,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,GAC/B,SAAS,CAAC;AACd,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC;AAEtE,mEAAmE;AACnE,MAAM,WAAW,eAAe;IAC9B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,gDAAgD;IAChD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,oDAAoD;IACpD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,WAAW,GAAG,iBAAiB,EACvC,SAAS,EAAE,eAAe,GACzB,eAAe,GAAG,SAAS,CAyB7B;AAED;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,cAAc,EACpB,SAAS,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,SAAS,GAC9C,eAAe,CAoBjB;AAED,qEAAqE;AACrE,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACpE;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,WAAW,GAAG,iBAAiB,EACvC,SAAS,EAAE,eAAe,GACzB,IAAI,CAQN"}
@@ -22,12 +22,19 @@ export declare function resolveSpriteFrameRect(source: LoadedImage | LoadedSprit
22
22
  * `[0, 0, frameWidth, frameHeight]` in local space and the documented pivot
23
23
  * order is:
24
24
  *
25
- * M = T(x, y) · R(rotation) · T(anchor) · S(scaleX, scaleY) · T(-anchor)
25
+ * M = T(x, y) · R(rotation) · S(scaleX, scaleY) · T(-anchor)
26
26
  *
27
- * i.e. scale and explicit flips happen around the anchor, then the frame
28
- * rotates around the anchor at the world position. The RSXform carries the
29
- * rotation + position (its 2x2 cannot express flips or non-uniform scale);
30
- * the wrapping Group applies the scale/flip part around the anchor.
27
+ * i.e. uniform scale and explicit flips happen around the anchor in the
28
+ * local frame, then the frame rotates around the anchor at the world
29
+ * position. The invariant: the anchor maps to `(x, y)` under every scale,
30
+ * rotation, and flip (GS-SPRITE-01).
31
+ *
32
+ * Split across Skia's retained primitives (the Atlas RSXform is innermost,
33
+ * the wrapping Group is outermost): the RSXform carries `T·R·S` with the
34
+ * pivot pre-compensated, so no-flip sprites need no Group transform at
35
+ * all; reflection — which an RSXform cannot express — is isolated in the
36
+ * Group as a mirror that fixes the world anchor
37
+ * (`T(x,y)·R·F·R⁻¹·T(−x,−y)`).
31
38
  */
32
39
  import type { SharedValue } from 'react-native-reanimated';
33
40
  /** A sprite's presentation input; numbers or UI-runtime animated values. */
@@ -56,7 +63,7 @@ export interface SpriteRsxform {
56
63
  readonly tx: number;
57
64
  readonly ty: number;
58
65
  }
59
- /** A Skia-compatible 3x3 transform element list. */
66
+ /** A Skia-compatible 3x3 transform element list (rotation in radians). */
60
67
  export type SkiaTransformElement = {
61
68
  readonly translateX: number;
62
69
  } | {
@@ -65,17 +72,25 @@ export type SkiaTransformElement = {
65
72
  readonly scaleX: number;
66
73
  } | {
67
74
  readonly scaleY: number;
75
+ } | {
76
+ readonly rotate: number;
68
77
  };
69
78
  /**
70
- * The RSXform for the atlas path: rotation + position with the pivot
71
- * compensated (`tx = x - pivotX·cos + pivotY·sin`). Scale and flips are
72
- * applied by the wrapping Group (`spriteGroupCorrection`).
79
+ * The RSXform for the atlas path: `T(x,y)·R·S` with the pivot
80
+ * pre-compensated (`t = p − s·R·pivot`), so the anchor lands exactly on
81
+ * `(x, y)` (GS-SPRITE-01/02). Uniform scale is encoded in the
82
+ * coefficients; the batch path shares this helper and needs no Group.
73
83
  */
74
84
  export declare function computeSpriteRsxform(input: SpriteTransformInput): SpriteRsxform;
75
85
  /**
76
- * The scale/flip part around the anchor as a Skia transform element list:
77
- * `T(anchor) · S(scaleX, scaleY) · T(-anchor)` (the first element is the
78
- * outermost).
86
+ * The reflection part as a Skia transform element list, outermost first.
87
+ *
88
+ * Without flips the RSXform alone carries the transform, so the correction
89
+ * is empty (identity). With flips it is the anchor-fixing mirror
90
+ * `T(x,y)·R·F·R⁻¹·T(−x,−y)`: mirroring about the rotated anchor axes while
91
+ * the world anchor stays fixed. Depends on position and rotation (not just
92
+ * the pivot), so callers must derive it on the UI runtime from live values
93
+ * — never memoize it from stale React-render reads (GS-SPRITE-01).
79
94
  */
80
95
  export declare function spriteGroupCorrection(input: SpriteTransformInput): readonly SkiaTransformElement[];
81
96
  /** World position of the anchor point (for debugging and overlays). */
@@ -1 +1 @@
1
- {"version":3,"file":"spriteTransform.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/spriteTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAoB,CAAC;AAEzE,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,GAAG,iBAAiB,EACvC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,CAwBjB;AAED;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,oDAAoD;AACpD,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAYhC;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAe/E;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,oBAAoB,EAAE,CAelG;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG;IAC9D,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB,CAMA"}
1
+ {"version":3,"file":"spriteTransform.d.ts","sourceRoot":"","sources":["../../../../../src/react/sprites/spriteTransform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,uBAAoB,CAAC;AAEzE,6DAA6D;AAC7D,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,WAAW,GAAG,iBAAiB,EACvC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,eAAe,CAwBjB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,4EAA4E;AAC5E,MAAM,WAAW,oBAAoB;IACnC,uCAAuC;IACvC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,6CAA6C;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,uCAAuC;IACvC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,0CAA0C;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IAC/C,kEAAkE;IAClE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0EAA0E;IAC1E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACrB;AAED,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAYhC;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAgB/E;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,oBAAoB,GAAG,SAAS,oBAAoB,EAAE,CAoBlG;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,oBAAoB,GAAG;IAC9D,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;CACpB,CAMA"}
@@ -0,0 +1,69 @@
1
+ import type { SkImage } from '@shopify/react-native-skia';
2
+ import type { TileMap2D } from '../../tilemap/types.js';
3
+ export interface TileMapLayer2DProps {
4
+ /** The normalized immutable map. */
5
+ readonly map: TileMap2D;
6
+ /** Which layer to draw. */
7
+ readonly layer: string;
8
+ /**
9
+ * Decoded sheet plus resolved frame rectangles — resolve ONCE at bind
10
+ * time via the asset store. Frame dimensions must equal the map cell
11
+ * dimensions in v1.
12
+ */
13
+ readonly source: {
14
+ readonly image: SkImage;
15
+ readonly frames: Readonly<Record<string, {
16
+ x: number;
17
+ y: number;
18
+ width: number;
19
+ height: number;
20
+ }>>;
21
+ };
22
+ /** Surface size: px for screen space, world units for world space. */
23
+ readonly width: number;
24
+ readonly height: number;
25
+ /** Extra visible cells around the camera bounds. Default 1. */
26
+ readonly overscan?: number;
27
+ /**
28
+ * Coherent parallax contract (T16-RF2): ONE factor drives BOTH the visual
29
+ * correction applied to this layer's Atlas AND the culling bounds —
30
+ * callers never wrap this component in an outer GameLayer2D to duplicate
31
+ * the factor.
32
+ */
33
+ readonly parallax?: {
34
+ readonly x: number;
35
+ y: number;
36
+ };
37
+ /**
38
+ * Bounded zoom-out contract (T16-RF2): the slot buffer is sized for a
39
+ * camera zoomed out to AT MOST `1 / minZoom`. Presented cameras zooming
40
+ * below this bound are rejected — every slot hides and a one-shot RN-side
41
+ * diagnostic fires — rather than silently returning a partially filled
42
+ * region. Default 1 (no zoom-out headroom).
43
+ */
44
+ readonly minZoom?: number;
45
+ }
46
+ /**
47
+ * Stable-topology Atlas tile layer (T16.4, reworked per T16-F3/F4/RF1/RF2).
48
+ *
49
+ * One React node per layer. The slot buffer is sized from the passed
50
+ * surface bounds + minZoom + overscan + cell size — NOT from map
51
+ * dimensions. The worklet never touches the map value, `layer.data`, or a
52
+ * JS `Map`:
53
+ *
54
+ * - Frame rectangles are pre-resolved into a flat numeric table at bind
55
+ * time (validated: missing frames and cell/frame size mismatches throw
56
+ * structured bind errors).
57
+ * - A bounded window snapshot (ids sized by slot capacity) is built on JS
58
+ * and transferred via a shared value ONLY when the visible cell span
59
+ * outgrows the current window; requests cross to React through
60
+ * `scheduleOnRN` (Reanimated 4 / react-native-worklets), and camera
61
+ * interpolation inside the window is allocation-free scalar math.
62
+ * - Culling bounds derive from the presented camera (center/zoom/rotation)
63
+ * with the SAME parallax factor applied to the visual transform and the
64
+ * bounds; without a presented camera the viewport-only world path applies.
65
+ * - Culling here can never affect simulation: collision queries read full
66
+ * layer data through the private chunk index regardless of visibility.
67
+ */
68
+ export declare function TileMapLayer2D({ map, layer, source, width, height, overscan, parallax, minZoom, }: TileMapLayer2DProps): import("react").JSX.Element;
69
+ //# sourceMappingURL=TileMapLayer2D.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TileMapLayer2D.d.ts","sourceRoot":"","sources":["../../../../../src/react/tilemap/TileMapLayer2D.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAK1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAqB,CAAC;AAWrD,MAAM,WAAW,mBAAmB;IAClC,oCAAoC;IACpC,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,2BAA2B;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;QACxB,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC,CAAC;KACpG,CAAC;IACF,sEAAsE;IACtE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACtD;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,cAAc,CAAC,EAC7B,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAY,EAAE,QAAQ,EAAE,OAAW,GACvE,EAAE,mBAAmB,+BA4LrB"}
@@ -0,0 +1,217 @@
1
+ import type { TileMap2D, TileSet2D } from '../../tilemap/types.js';
2
+ /**
3
+ * Tile presentation binding (T16-F3/F4).
4
+ *
5
+ * Pure module shared between the JS thread and UI-runtime worklets:
6
+ *
7
+ * - `buildFrameTable` runs ONCE on JS at bind time and produces a flat,
8
+ * worklet-safe numeric lookup (`frameFlat[id*4..id*4+3]`) — no `Map`,
9
+ * no objects, no per-frame lookups on the UI runtime.
10
+ * - `buildTileWindowSnapshot` runs on JS whenever the visible cell window
11
+ * or source binding changes and produces a BOUNDED snapshot sized by the
12
+ * viewport capacity, never by map dimensions.
13
+ * - `writeLayerVisibleBounds` / `fillTileSlots` are worklet-callable and
14
+ * allocation-free: camera interpolation inside the transferred window
15
+ * only reads scalars and pre-transferred arrays.
16
+ *
17
+ * Full map authority stays on the simulation side; the UI runtime never
18
+ * sees `layer.data`, the chunk index, or the map value itself.
19
+ */
20
+ /** Flat numeric frame lookup: frameFlat[tileId*4] = x, [+1]=y, [+2]=w, [+3]=h. */
21
+ export type TileFrameTable = readonly number[];
22
+ /**
23
+ * Resolve every declared tile to sheet-frame rectangles ONCE at bind time.
24
+ *
25
+ * Throws a structured error when a referenced frame is missing from the
26
+ * bound sheet OR when its size differs from the map cell — v1 requires
27
+ * frame dimensions to equal cell dimensions (T16-F3).
28
+ */
29
+ export declare function buildFrameTable(tileset: TileSet2D, frames: Readonly<Record<string, {
30
+ x: number;
31
+ y: number;
32
+ width: number;
33
+ height: number;
34
+ }>>, cellWidth: number, cellHeight: number): TileFrameTable;
35
+ /** Bounded visible-window snapshot transferred to the UI runtime. */
36
+ export interface TileWindowSnapshot {
37
+ /** Window origin in cell coordinates. */
38
+ readonly x0: number;
39
+ readonly y0: number;
40
+ /** Window extent in cells (ids.length === w*h). */
41
+ readonly w: number;
42
+ readonly h: number;
43
+ /** Row-major tile ids for the window; 0 = empty. */
44
+ readonly ids: readonly number[];
45
+ /** Flat frame lookup shared by all windows of one binding. */
46
+ readonly frameFlat: readonly number[];
47
+ /**
48
+ * Binding generation that published this window (GS-TILE-01). Stamp
49
+ * applied by the binding when it publishes; snapshots built directly
50
+ * (tests, initial empty) carry no generation and never satisfy a bound
51
+ * update. A generation mismatch means a same-size replacement or a
52
+ * remount happened: the window is ignored, never displayed.
53
+ */
54
+ readonly gen?: number;
55
+ }
56
+ export declare const EMPTY_TILE_WINDOW: TileWindowSnapshot;
57
+ /**
58
+ * Build a bounded snapshot for the inclusive cell range [x0..x1]×[y0..y1].
59
+ * The range is clamped to the layer; the result size depends ONLY on the
60
+ * requested range (bounded by viewport capacity), never on map size.
61
+ */
62
+ export declare function buildTileWindowSnapshot(map: TileMap2D, layerId: string, x0: number, y0: number, x1: number, y1: number, frameFlat: TileFrameTable): TileWindowSnapshot;
63
+ /** Whether the snapshot fully covers the inclusive cell range. */
64
+ export declare function windowCovers(snap: TileWindowSnapshot, x0: number, y0: number, x1: number, y1: number): boolean;
65
+ interface SharedLike<T> {
66
+ readonly value?: T;
67
+ }
68
+ export type SharedCameraRef = SharedLike<{
69
+ camera?: {
70
+ center: {
71
+ x: number;
72
+ y: number;
73
+ };
74
+ zoom: number;
75
+ rotationRadians: number;
76
+ };
77
+ } | undefined>;
78
+ export type SharedViewportRef = SharedLike<{
79
+ visibleLogicalBounds?: {
80
+ x: number;
81
+ y: number;
82
+ width: number;
83
+ height: number;
84
+ };
85
+ } | undefined>;
86
+ export interface LayerBounds {
87
+ minX: number;
88
+ minY: number;
89
+ maxX: number;
90
+ maxY: number;
91
+ }
92
+ /**
93
+ * Write the conservative world-space bounds visible through the PRESENTED
94
+ * camera into `out` (T16-F3, reworked per T16-RF2).
95
+ *
96
+ * - With a presented camera: the logical view rect is rotated/zoomed by the
97
+ * camera, so its axis-aligned world bounds are the center plus rotated
98
+ * half-extents; the GameLayer2D parallax model applies ONCE afterwards
99
+ * (effective layer center C′ = L + (C − L)·p; zoom and rotation apply
100
+ * fully at every factor). Padding is world units.
101
+ * - WITHOUT a presented camera, GameWorld2D's viewport-only path applies:
102
+ * the bounds are `viewport.visibleLogicalBounds` expanded by the padding.
103
+ *
104
+ * Worklet-callable and allocation-free on the steady path: scalars only,
105
+ * results written into the caller-owned `out` scratch object. Returns false
106
+ * when no viewport bounds exist yet.
107
+ */
108
+ export declare function writeLayerVisibleBounds(camera: SharedCameraRef | null, viewport: SharedViewportRef | null, parallaxX: number, parallaxY: number, paddingWorld: number): LayerBounds | null;
109
+ /** Slot-buffer contract shared by the component and tests. */
110
+ export interface TileSlotBuffers {
111
+ readonly rects: readonly (SlotRect | undefined)[];
112
+ readonly xforms: readonly (SlotXform | undefined)[];
113
+ }
114
+ export interface SlotRect {
115
+ setXYWH(x: number, y: number, w: number, h: number): void;
116
+ }
117
+ export interface SlotXform {
118
+ set(scos: number, ssin: number, tx: number, ty: number): void;
119
+ }
120
+ export interface FillParams {
121
+ readonly cw: number;
122
+ readonly ch: number;
123
+ readonly originX: number;
124
+ readonly originY: number;
125
+ readonly layerWidth: number;
126
+ readonly layerHeight: number;
127
+ readonly capacity: number;
128
+ }
129
+ /**
130
+ * Fill Atlas slot buffers from the transferred window for the currently
131
+ * visible cell span (worklet-callable, T16-F3/F4).
132
+ *
133
+ * - Cell range derives from `bounds` (already camera+parallax+padding).
134
+ * - Tiles place UNROTATED at their CELL TOP-LEFT: the RSXform translation
135
+ * is the cell's world top-left corner.
136
+ * - Stale slots past the filled count are hidden atomically (zero-size).
137
+ * - Returns the filled slot count on success; returns -1 when the window
138
+ * does not cover the visible span (caller should request a new window)
139
+ * and -2 when the visible span exceeds the fixed capacity (caller must
140
+ * hide the whole layer and never claim partial success) — T16-SF2.
141
+ */
142
+ export declare function fillTileSlots(snap: TileWindowSnapshot, bounds: LayerBounds, rects: readonly (SlotRect | undefined)[], xforms: readonly (SlotXform | undefined)[], params: FillParams): number;
143
+ /**
144
+ * Mint (or recall) the generation for one binding identity object. The
145
+ * component creates a fresh identity per binding-affecting prop change, so
146
+ * each binding gets a distinct generation with no counters in React state.
147
+ */
148
+ export declare function bindingGeneration(binding: object): number;
149
+ /** Shared-value mirrors kept structural so headless fakes can drive updates. */
150
+ export interface TileWindowShared {
151
+ value: TileWindowSnapshot;
152
+ }
153
+ export interface TileNumberShared {
154
+ value: number;
155
+ }
156
+ export interface TileBooleanShared {
157
+ value: boolean;
158
+ }
159
+ /**
160
+ * Inputs for one tile-layer UI update (GS-TILE-01).
161
+ *
162
+ * Everything the update may touch is listed here: scalars, shared values,
163
+ * buffers, and callbacks. Map, layer, and frame-table objects are
164
+ * deliberately absent — the UI closure provably cannot capture layer data
165
+ * because it is never passed (scalar layer dims travel in `layerWidth` /
166
+ * `layerHeight`). The binding `generation` gates every window and request.
167
+ */
168
+ export interface TileLayerUIParams {
169
+ readonly camera: SharedCameraRef | null;
170
+ readonly viewport: SharedViewportRef | null;
171
+ readonly window: TileWindowShared;
172
+ /** Generation of the in-flight request, or -1 when none is pending. */
173
+ readonly pendingGen: TileNumberShared;
174
+ readonly warnedCapacity: TileBooleanShared;
175
+ readonly capacityWarnPending: TileBooleanShared;
176
+ readonly rects: {
177
+ value: readonly (SlotRect | undefined)[];
178
+ };
179
+ readonly xforms: {
180
+ value: readonly (SlotXform | undefined)[];
181
+ };
182
+ /**
183
+ * Publish a window for `gen` (JS side). Stale deliveries whose `gen`
184
+ * predates the publisher's binding are rejected before publishing; the
185
+ * update additionally refuses to display any window whose stamp differs
186
+ * from the live generation.
187
+ */
188
+ readonly requestWindow: (gen: number, x0: number, y0: number, x1: number, y1: number) => void;
189
+ /** Bridge crossing to the JS side (scheduleOnRN in production). */
190
+ readonly scheduleOnRN: (fn: () => void) => void;
191
+ readonly onBeyondCapacity: () => void;
192
+ readonly generation: number;
193
+ readonly capacity: number;
194
+ readonly originX: number;
195
+ readonly originY: number;
196
+ readonly cw: number;
197
+ readonly ch: number;
198
+ readonly layerWidth: number;
199
+ readonly layerHeight: number;
200
+ readonly padWorld: number;
201
+ readonly px: number;
202
+ readonly py: number;
203
+ readonly minZoom: number;
204
+ }
205
+ /**
206
+ * One tile-layer UI update: the body of the layer's derived value,
207
+ * extracted so binding identity, stale-request rejection, and capacity
208
+ * policy execute identically in tests and on the UI runtime (GS-TILE-01).
209
+ *
210
+ * Returns the filled slot count; -1 when a window was requested, -2 when
211
+ * the span exceeds capacity or zoom left the declared bounds, 0 when
212
+ * nothing is visible. A window whose generation stamp differs from the
213
+ * live binding is treated exactly like a missing window.
214
+ */
215
+ export declare function updateTileLayerUI(params: TileLayerUIParams): number;
216
+ export {};
217
+ //# sourceMappingURL=tilePresentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tilePresentation.d.ts","sourceRoot":"","sources":["../../../../../src/react/tilemap/tilePresentation.ts"],"names":[],"mappings":"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"}