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.
- package/CHANGELOG.md +75 -0
- package/README.md +97 -16
- package/lib/module/assets/defineAssets.js +28 -3
- package/lib/module/assets/defineAssets.js.map +1 -1
- package/lib/module/assets.js +11 -0
- package/lib/module/assets.js.map +1 -0
- package/lib/module/audio/createGameAudio.js +784 -0
- package/lib/module/audio/createGameAudio.js.map +1 -0
- package/lib/module/audio/errors.js +12 -0
- package/lib/module/audio/errors.js.map +1 -0
- package/lib/module/audio/index.js +5 -0
- package/lib/module/audio/index.js.map +1 -0
- package/lib/module/audio/resolver.js +37 -0
- package/lib/module/audio/resolver.js.map +1 -0
- package/lib/module/audio/types.js +4 -0
- package/lib/module/audio/types.js.map +1 -0
- package/lib/module/audio.js +9 -0
- package/lib/module/audio.js.map +1 -0
- package/lib/module/camera2d/bounds.js +59 -0
- package/lib/module/camera2d/bounds.js.map +1 -0
- package/lib/module/camera2d/extents.js +25 -0
- package/lib/module/camera2d/extents.js.map +1 -0
- package/lib/module/camera2d/follow.js +138 -0
- package/lib/module/camera2d/follow.js.map +1 -0
- package/lib/module/camera2d/index.js +20 -0
- package/lib/module/camera2d/index.js.map +1 -0
- package/lib/module/camera2d/interpolation.js +98 -0
- package/lib/module/camera2d/interpolation.js.map +1 -0
- package/lib/module/camera2d/shake.js +85 -0
- package/lib/module/camera2d/shake.js.map +1 -0
- package/lib/module/camera2d/transform.js +151 -0
- package/lib/module/camera2d/transform.js.map +1 -0
- package/lib/module/camera2d/types.js +4 -0
- package/lib/module/camera2d/types.js.map +1 -0
- package/lib/module/camera2d/validation.js +98 -0
- package/lib/module/camera2d/validation.js.map +1 -0
- package/lib/module/camera2d/visibility.js +138 -0
- package/lib/module/camera2d/visibility.js.map +1 -0
- package/lib/module/camera2d.js +9 -0
- package/lib/module/camera2d.js.map +1 -0
- package/lib/module/collision2d/colliders.js +266 -0
- package/lib/module/collision2d/colliders.js.map +1 -0
- package/lib/module/collision2d/debug.js +105 -0
- package/lib/module/collision2d/debug.js.map +1 -0
- package/lib/module/collision2d/filters.js +40 -0
- package/lib/module/collision2d/filters.js.map +1 -0
- package/lib/module/collision2d/index.js +12 -0
- package/lib/module/collision2d/index.js.map +1 -0
- package/lib/module/collision2d/intersections.js +67 -0
- package/lib/module/collision2d/intersections.js.map +1 -0
- package/lib/module/collision2d/manifolds.js +218 -0
- package/lib/module/collision2d/manifolds.js.map +1 -0
- package/lib/module/collision2d/segments.js +187 -0
- package/lib/module/collision2d/segments.js.map +1 -0
- package/lib/module/collision2d/spatialHash.js +167 -0
- package/lib/module/collision2d/spatialHash.js.map +1 -0
- package/lib/module/collision2d/sweeps.js +255 -0
- package/lib/module/collision2d/sweeps.js.map +1 -0
- package/lib/module/collision2d.js +9 -0
- package/lib/module/collision2d.js.map +1 -0
- package/lib/module/core/input/buttonPad.js +214 -0
- package/lib/module/core/input/buttonPad.js.map +1 -0
- package/lib/module/core/input/createInputBuffer.js +66 -14
- package/lib/module/core/input/createInputBuffer.js.map +1 -1
- package/lib/module/core/session/createGameSession.js +454 -50
- package/lib/module/core/session/createGameSession.js.map +1 -1
- package/lib/module/core/session/deepFreeze.js +92 -2
- package/lib/module/core/session/deepFreeze.js.map +1 -1
- package/lib/module/core/session/types.js +12 -0
- package/lib/module/core/session/types.js.map +1 -1
- package/lib/module/definition/defineGame.js +23 -0
- package/lib/module/definition/defineGame.js.map +1 -1
- package/lib/module/events/defineGameEvents.js +46 -0
- package/lib/module/events/defineGameEvents.js.map +1 -0
- package/lib/module/events/errors.js +16 -0
- package/lib/module/events/errors.js.map +1 -0
- package/lib/module/events/index.js +7 -0
- package/lib/module/events/index.js.map +1 -0
- package/lib/module/events/payload.js +219 -0
- package/lib/module/events/payload.js.map +1 -0
- package/lib/module/events/seed.js +33 -0
- package/lib/module/events/seed.js.map +1 -0
- package/lib/module/events/types.js +4 -0
- package/lib/module/events/types.js.map +1 -0
- package/lib/module/events.js +13 -0
- package/lib/module/events.js.map +1 -0
- package/lib/module/geometry/helpers.js +140 -0
- package/lib/module/geometry/helpers.js.map +1 -0
- package/lib/module/geometry/index.js +5 -0
- package/lib/module/geometry/index.js.map +1 -0
- package/lib/module/geometry/validation.js +104 -0
- package/lib/module/geometry/validation.js.map +1 -0
- package/lib/module/geometry.js +9 -0
- package/lib/module/geometry.js.map +1 -0
- package/lib/module/haptics/createGameHaptics.js +214 -0
- package/lib/module/haptics/createGameHaptics.js.map +1 -0
- package/lib/module/haptics/errors.js +12 -0
- package/lib/module/haptics/errors.js.map +1 -0
- package/lib/module/haptics/index.js +5 -0
- package/lib/module/haptics/index.js.map +1 -0
- package/lib/module/haptics/resolver.js +37 -0
- package/lib/module/haptics/resolver.js.map +1 -0
- package/lib/module/haptics/types.js +4 -0
- package/lib/module/haptics/types.js.map +1 -0
- package/lib/module/haptics.js +9 -0
- package/lib/module/haptics.js.map +1 -0
- package/lib/module/index.js +8 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/particles/createParticleSystem.js +481 -0
- package/lib/module/particles/createParticleSystem.js.map +1 -0
- package/lib/module/particles/defineParticleEffect.js +178 -0
- package/lib/module/particles/defineParticleEffect.js.map +1 -0
- package/lib/module/particles/errors.js +9 -0
- package/lib/module/particles/errors.js.map +1 -0
- package/lib/module/particles/index.js +8 -0
- package/lib/module/particles/index.js.map +1 -0
- package/lib/module/particles/sampling.js +121 -0
- package/lib/module/particles/sampling.js.map +1 -0
- package/lib/module/particles/types.js +4 -0
- package/lib/module/particles/types.js.map +1 -0
- package/lib/module/particles.js +4 -0
- package/lib/module/particles.js.map +1 -0
- package/lib/module/react/GameButtonPad.js +344 -0
- package/lib/module/react/GameButtonPad.js.map +1 -0
- package/lib/module/react/GamePointerInput.js +74 -16
- package/lib/module/react/GamePointerInput.js.map +1 -1
- package/lib/module/react/GameView.js +139 -60
- package/lib/module/react/GameView.js.map +1 -1
- package/lib/module/react/assets/createGameAssetStore.js +145 -95
- package/lib/module/react/assets/createGameAssetStore.js.map +1 -1
- package/lib/module/react/assets/useGameAssets.js +60 -35
- package/lib/module/react/assets/useGameAssets.js.map +1 -1
- package/lib/module/react/bindAppLifecycle.js +46 -17
- package/lib/module/react/bindAppLifecycle.js.map +1 -1
- package/lib/module/react/bindGameSession.js +13 -2
- package/lib/module/react/bindGameSession.js.map +1 -1
- package/lib/module/react/camera2d/GameLayer2D.js +50 -0
- package/lib/module/react/camera2d/GameLayer2D.js.map +1 -0
- package/lib/module/react/camera2d/defineGameCamera2D.js +30 -0
- package/lib/module/react/camera2d/defineGameCamera2D.js.map +1 -0
- package/lib/module/react/camera2d/usePresentedCameraBinding.js +177 -0
- package/lib/module/react/camera2d/usePresentedCameraBinding.js.map +1 -0
- package/lib/module/react/cleanupList.js +38 -0
- package/lib/module/react/cleanupList.js.map +1 -0
- package/lib/module/react/lifecycleSource.js +49 -0
- package/lib/module/react/lifecycleSource.js.map +1 -0
- package/lib/module/react/particles/ParticleView.js +308 -0
- package/lib/module/react/particles/ParticleView.js.map +1 -0
- package/lib/module/react/particles/culling.js +115 -0
- package/lib/module/react/particles/culling.js.map +1 -0
- package/lib/module/react/particles/index.js +7 -0
- package/lib/module/react/particles/index.js.map +1 -0
- package/lib/module/react/particles/spriteXForm.js +45 -0
- package/lib/module/react/particles/spriteXForm.js.map +1 -0
- package/lib/module/react/particles/useParticlePresentation.js +204 -0
- package/lib/module/react/particles/useParticlePresentation.js.map +1 -0
- package/lib/module/react/pointerBinding.js +55 -17
- package/lib/module/react/pointerBinding.js.map +1 -1
- package/lib/module/react/pointerCamera.js +28 -0
- package/lib/module/react/pointerCamera.js.map +1 -0
- package/lib/module/react/pointerCoalescer.js +16 -9
- package/lib/module/react/pointerCoalescer.js.map +1 -1
- package/lib/module/react/sprites/GameSprite.js +5 -17
- package/lib/module/react/sprites/GameSprite.js.map +1 -1
- package/lib/module/react/sprites/GameWorld2D.js +112 -9
- package/lib/module/react/sprites/GameWorld2D.js.map +1 -1
- package/lib/module/react/sprites/Sprite.js +48 -63
- package/lib/module/react/sprites/Sprite.js.map +1 -1
- package/lib/module/react/sprites/SpriteBatch.js +53 -28
- package/lib/module/react/sprites/SpriteBatch.js.map +1 -1
- package/lib/module/react/sprites/batchVisibility.js +58 -0
- package/lib/module/react/sprites/batchVisibility.js.map +1 -0
- package/lib/module/react/sprites/spriteSelection.js +103 -0
- package/lib/module/react/sprites/spriteSelection.js.map +1 -0
- package/lib/module/react/sprites/spriteTransform.js +46 -25
- package/lib/module/react/sprites/spriteTransform.js.map +1 -1
- package/lib/module/react/tilemap/TileMapLayer2D.js +217 -0
- package/lib/module/react/tilemap/TileMapLayer2D.js.map +1 -0
- package/lib/module/react/tilemap/tilePresentation.js +374 -0
- package/lib/module/react/tilemap/tilePresentation.js.map +1 -0
- package/lib/module/react/useGameSession.js +70 -0
- package/lib/module/react/useGameSession.js.map +1 -0
- package/lib/module/react/useGameSessionStatus.js +46 -0
- package/lib/module/react/useGameSessionStatus.js.map +1 -0
- package/lib/module/react/viewportBinding.js +5 -1
- package/lib/module/react/viewportBinding.js.map +1 -1
- package/lib/module/react.js +12 -1
- package/lib/module/react.js.map +1 -1
- package/lib/module/scene/defineScene.js +17 -0
- package/lib/module/scene/defineScene.js.map +1 -1
- package/lib/module/sprites/sampleSpriteClip.js +66 -6
- package/lib/module/sprites/sampleSpriteClip.js.map +1 -1
- package/lib/module/sprites/spriteAnimationState.js +10 -20
- package/lib/module/sprites/spriteAnimationState.js.map +1 -1
- package/lib/module/sprites.js +11 -0
- package/lib/module/sprites.js.map +1 -0
- package/lib/module/storage/adapters/asyncStorage.js +57 -0
- package/lib/module/storage/adapters/asyncStorage.js.map +1 -0
- package/lib/module/storage/adapters/memory.js +50 -0
- package/lib/module/storage/adapters/memory.js.map +1 -0
- package/lib/module/storage/errors.js +34 -0
- package/lib/module/storage/errors.js.map +1 -0
- package/lib/module/storage/index.js +11 -0
- package/lib/module/storage/index.js.map +1 -0
- package/lib/module/storage/schema.js +151 -0
- package/lib/module/storage/schema.js.map +1 -0
- package/lib/module/storage/serialization.js +249 -0
- package/lib/module/storage/serialization.js.map +1 -0
- package/lib/module/storage/store.js +387 -0
- package/lib/module/storage/store.js.map +1 -0
- package/lib/module/storage/types.js +16 -0
- package/lib/module/storage/types.js.map +1 -0
- package/lib/module/storage/validation.js +111 -0
- package/lib/module/storage/validation.js.map +1 -0
- package/lib/module/storage.js +4 -0
- package/lib/module/storage.js.map +1 -0
- package/lib/module/testing.js +4 -0
- package/lib/module/testing.js.map +1 -1
- package/lib/module/tilemap/chunkStats.js +27 -0
- package/lib/module/tilemap/chunkStats.js.map +1 -0
- package/lib/module/tilemap/definitions.js +308 -0
- package/lib/module/tilemap/definitions.js.map +1 -0
- package/lib/module/tilemap/errors.js +13 -0
- package/lib/module/tilemap/errors.js.map +1 -0
- package/lib/module/tilemap/index.js +10 -0
- package/lib/module/tilemap/index.js.map +1 -0
- package/lib/module/tilemap/movement.js +379 -0
- package/lib/module/tilemap/movement.js.map +1 -0
- package/lib/module/tilemap/queries.js +114 -0
- package/lib/module/tilemap/queries.js.map +1 -0
- package/lib/module/tilemap/tiledAdapter.js +141 -0
- package/lib/module/tilemap/tiledAdapter.js.map +1 -0
- package/lib/module/tilemap/types.js +4 -0
- package/lib/module/tilemap/types.js.map +1 -0
- package/lib/module/tilemap.js +4 -0
- package/lib/module/tilemap.js.map +1 -0
- package/lib/typescript/src/assets/defineAssets.d.ts +1 -1
- package/lib/typescript/src/assets/defineAssets.d.ts.map +1 -1
- package/lib/typescript/src/assets.d.ts +11 -0
- package/lib/typescript/src/assets.d.ts.map +1 -0
- package/lib/typescript/src/audio/createGameAudio.d.ts +5 -0
- package/lib/typescript/src/audio/createGameAudio.d.ts.map +1 -0
- package/lib/typescript/src/audio/errors.d.ts +6 -0
- package/lib/typescript/src/audio/errors.d.ts.map +1 -0
- package/lib/typescript/src/audio/index.d.ts +4 -0
- package/lib/typescript/src/audio/index.d.ts.map +1 -0
- package/lib/typescript/src/audio/resolver.d.ts +44 -0
- package/lib/typescript/src/audio/resolver.d.ts.map +1 -0
- package/lib/typescript/src/audio/types.d.ts +42 -0
- package/lib/typescript/src/audio/types.d.ts.map +1 -0
- package/lib/typescript/src/audio.d.ts +8 -0
- package/lib/typescript/src/audio.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/bounds.d.ts +25 -0
- package/lib/typescript/src/camera2d/bounds.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/extents.d.ts +17 -0
- package/lib/typescript/src/camera2d/extents.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/follow.d.ts +24 -0
- package/lib/typescript/src/camera2d/follow.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/index.d.ts +19 -0
- package/lib/typescript/src/camera2d/index.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/interpolation.d.ts +17 -0
- package/lib/typescript/src/camera2d/interpolation.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/shake.d.ts +20 -0
- package/lib/typescript/src/camera2d/shake.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/transform.d.ts +44 -0
- package/lib/typescript/src/camera2d/transform.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/types.d.ts +74 -0
- package/lib/typescript/src/camera2d/types.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/validation.d.ts +30 -0
- package/lib/typescript/src/camera2d/validation.d.ts.map +1 -0
- package/lib/typescript/src/camera2d/visibility.d.ts +47 -0
- package/lib/typescript/src/camera2d/visibility.d.ts.map +1 -0
- package/lib/typescript/src/camera2d.d.ts +7 -0
- package/lib/typescript/src/camera2d.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/colliders.d.ts +120 -0
- package/lib/typescript/src/collision2d/colliders.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/debug.d.ts +67 -0
- package/lib/typescript/src/collision2d/debug.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/filters.d.ts +28 -0
- package/lib/typescript/src/collision2d/filters.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/index.d.ts +17 -0
- package/lib/typescript/src/collision2d/index.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/intersections.d.ts +24 -0
- package/lib/typescript/src/collision2d/intersections.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/manifolds.d.ts +39 -0
- package/lib/typescript/src/collision2d/manifolds.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/segments.d.ts +24 -0
- package/lib/typescript/src/collision2d/segments.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/spatialHash.d.ts +50 -0
- package/lib/typescript/src/collision2d/spatialHash.d.ts.map +1 -0
- package/lib/typescript/src/collision2d/sweeps.d.ts +60 -0
- package/lib/typescript/src/collision2d/sweeps.d.ts.map +1 -0
- package/lib/typescript/src/collision2d.d.ts +7 -0
- package/lib/typescript/src/collision2d.d.ts.map +1 -0
- package/lib/typescript/src/core/input/buttonPad.d.ts +59 -0
- package/lib/typescript/src/core/input/buttonPad.d.ts.map +1 -0
- package/lib/typescript/src/core/input/createInputBuffer.d.ts +1 -1
- package/lib/typescript/src/core/input/createInputBuffer.d.ts.map +1 -1
- package/lib/typescript/src/core/input/types.d.ts +7 -0
- package/lib/typescript/src/core/input/types.d.ts.map +1 -1
- package/lib/typescript/src/core/session/createGameSession.d.ts +4 -2
- package/lib/typescript/src/core/session/createGameSession.d.ts.map +1 -1
- package/lib/typescript/src/core/session/deepFreeze.d.ts +21 -1
- package/lib/typescript/src/core/session/deepFreeze.d.ts.map +1 -1
- package/lib/typescript/src/core/session/diagnostics.d.ts +2 -0
- package/lib/typescript/src/core/session/diagnostics.d.ts.map +1 -1
- package/lib/typescript/src/core/session/types.d.ts +69 -4
- package/lib/typescript/src/core/session/types.d.ts.map +1 -1
- package/lib/typescript/src/definition/defineGame.d.ts +12 -1
- package/lib/typescript/src/definition/defineGame.d.ts.map +1 -1
- package/lib/typescript/src/definition/types.d.ts +10 -1
- package/lib/typescript/src/definition/types.d.ts.map +1 -1
- package/lib/typescript/src/events/defineGameEvents.d.ts +26 -0
- package/lib/typescript/src/events/defineGameEvents.d.ts.map +1 -0
- package/lib/typescript/src/events/errors.d.ts +12 -0
- package/lib/typescript/src/events/errors.d.ts.map +1 -0
- package/lib/typescript/src/events/index.d.ts +6 -0
- package/lib/typescript/src/events/index.d.ts.map +1 -0
- package/lib/typescript/src/events/payload.d.ts +21 -0
- package/lib/typescript/src/events/payload.d.ts.map +1 -0
- package/lib/typescript/src/events/seed.d.ts +3 -0
- package/lib/typescript/src/events/seed.d.ts.map +1 -0
- package/lib/typescript/src/events/types.d.ts +42 -0
- package/lib/typescript/src/events/types.d.ts.map +1 -0
- package/lib/typescript/src/events.d.ts +12 -0
- package/lib/typescript/src/events.d.ts.map +1 -0
- package/lib/typescript/src/geometry/helpers.d.ts +35 -0
- package/lib/typescript/src/geometry/helpers.d.ts.map +1 -0
- package/lib/typescript/src/geometry/index.d.ts +4 -0
- package/lib/typescript/src/geometry/index.d.ts.map +1 -0
- package/lib/typescript/src/geometry/types.d.ts +49 -0
- package/lib/typescript/src/geometry/types.d.ts.map +1 -1
- package/lib/typescript/src/geometry/validation.d.ts +44 -0
- package/lib/typescript/src/geometry/validation.d.ts.map +1 -0
- package/lib/typescript/src/geometry.d.ts +7 -0
- package/lib/typescript/src/geometry.d.ts.map +1 -0
- package/lib/typescript/src/haptics/createGameHaptics.d.ts +3 -0
- package/lib/typescript/src/haptics/createGameHaptics.d.ts.map +1 -0
- package/lib/typescript/src/haptics/errors.d.ts +6 -0
- package/lib/typescript/src/haptics/errors.d.ts.map +1 -0
- package/lib/typescript/src/haptics/index.d.ts +4 -0
- package/lib/typescript/src/haptics/index.d.ts.map +1 -0
- package/lib/typescript/src/haptics/resolver.d.ts +22 -0
- package/lib/typescript/src/haptics/resolver.d.ts.map +1 -0
- package/lib/typescript/src/haptics/types.d.ts +37 -0
- package/lib/typescript/src/haptics/types.d.ts.map +1 -0
- package/lib/typescript/src/haptics.d.ts +8 -0
- package/lib/typescript/src/haptics.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +10 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/particles/createParticleSystem.d.ts +5 -0
- package/lib/typescript/src/particles/createParticleSystem.d.ts.map +1 -0
- package/lib/typescript/src/particles/defineParticleEffect.d.ts +3 -0
- package/lib/typescript/src/particles/defineParticleEffect.d.ts.map +1 -0
- package/lib/typescript/src/particles/errors.d.ts +5 -0
- package/lib/typescript/src/particles/errors.d.ts.map +1 -0
- package/lib/typescript/src/particles/index.d.ts +6 -0
- package/lib/typescript/src/particles/index.d.ts.map +1 -0
- package/lib/typescript/src/particles/sampling.d.ts +54 -0
- package/lib/typescript/src/particles/sampling.d.ts.map +1 -0
- package/lib/typescript/src/particles/types.d.ts +292 -0
- package/lib/typescript/src/particles/types.d.ts.map +1 -0
- package/lib/typescript/src/particles.d.ts +2 -0
- package/lib/typescript/src/particles.d.ts.map +1 -0
- package/lib/typescript/src/react/GameButtonPad.d.ts +84 -0
- package/lib/typescript/src/react/GameButtonPad.d.ts.map +1 -0
- package/lib/typescript/src/react/GamePointerInput.d.ts.map +1 -1
- package/lib/typescript/src/react/GameView.d.ts +27 -1
- package/lib/typescript/src/react/GameView.d.ts.map +1 -1
- package/lib/typescript/src/react/assets/createGameAssetStore.d.ts.map +1 -1
- package/lib/typescript/src/react/assets/useGameAssets.d.ts.map +1 -1
- package/lib/typescript/src/react/bindAppLifecycle.d.ts +7 -1
- package/lib/typescript/src/react/bindAppLifecycle.d.ts.map +1 -1
- package/lib/typescript/src/react/bindGameSession.d.ts.map +1 -1
- package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts +24 -0
- package/lib/typescript/src/react/camera2d/GameLayer2D.d.ts.map +1 -0
- package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts +44 -0
- package/lib/typescript/src/react/camera2d/defineGameCamera2D.d.ts.map +1 -0
- package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts +22 -0
- package/lib/typescript/src/react/camera2d/usePresentedCameraBinding.d.ts.map +1 -0
- package/lib/typescript/src/react/cleanupList.d.ts +21 -0
- package/lib/typescript/src/react/cleanupList.d.ts.map +1 -0
- package/lib/typescript/src/react/instrumentation.d.ts +33 -3
- package/lib/typescript/src/react/instrumentation.d.ts.map +1 -1
- package/lib/typescript/src/react/lifecycleSource.d.ts +21 -0
- package/lib/typescript/src/react/lifecycleSource.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/ParticleView.d.ts +65 -0
- package/lib/typescript/src/react/particles/ParticleView.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/culling.d.ts +70 -0
- package/lib/typescript/src/react/particles/culling.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/index.d.ts +7 -0
- package/lib/typescript/src/react/particles/index.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/spriteXForm.d.ts +28 -0
- package/lib/typescript/src/react/particles/spriteXForm.d.ts.map +1 -0
- package/lib/typescript/src/react/particles/useParticlePresentation.d.ts +48 -0
- package/lib/typescript/src/react/particles/useParticlePresentation.d.ts.map +1 -0
- package/lib/typescript/src/react/pointerBinding.d.ts +38 -8
- package/lib/typescript/src/react/pointerBinding.d.ts.map +1 -1
- package/lib/typescript/src/react/pointerCamera.d.ts +20 -0
- package/lib/typescript/src/react/pointerCamera.d.ts.map +1 -0
- package/lib/typescript/src/react/pointerCoalescer.d.ts +17 -1
- package/lib/typescript/src/react/pointerCoalescer.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/GameSprite.d.ts +3 -10
- package/lib/typescript/src/react/sprites/GameSprite.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/GameWorld2D.d.ts +51 -6
- package/lib/typescript/src/react/sprites/GameWorld2D.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/Sprite.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/SpriteBatch.d.ts +22 -1
- package/lib/typescript/src/react/sprites/SpriteBatch.d.ts.map +1 -1
- package/lib/typescript/src/react/sprites/batchVisibility.d.ts +28 -0
- package/lib/typescript/src/react/sprites/batchVisibility.d.ts.map +1 -0
- package/lib/typescript/src/react/sprites/spriteSelection.d.ts +58 -0
- package/lib/typescript/src/react/sprites/spriteSelection.d.ts.map +1 -0
- package/lib/typescript/src/react/sprites/spriteTransform.d.ts +27 -12
- package/lib/typescript/src/react/sprites/spriteTransform.d.ts.map +1 -1
- package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts +69 -0
- package/lib/typescript/src/react/tilemap/TileMapLayer2D.d.ts.map +1 -0
- package/lib/typescript/src/react/tilemap/tilePresentation.d.ts +217 -0
- package/lib/typescript/src/react/tilemap/tilePresentation.d.ts.map +1 -0
- package/lib/typescript/src/react/useGameSession.d.ts +48 -0
- package/lib/typescript/src/react/useGameSession.d.ts.map +1 -0
- package/lib/typescript/src/react/useGameSessionStatus.d.ts +23 -0
- package/lib/typescript/src/react/useGameSessionStatus.d.ts.map +1 -0
- package/lib/typescript/src/react/viewportBinding.d.ts +5 -1
- package/lib/typescript/src/react/viewportBinding.d.ts.map +1 -1
- package/lib/typescript/src/react.d.ts +18 -1
- package/lib/typescript/src/react.d.ts.map +1 -1
- package/lib/typescript/src/scene/defineScene.d.ts +22 -2
- package/lib/typescript/src/scene/defineScene.d.ts.map +1 -1
- package/lib/typescript/src/scene/types.d.ts +24 -4
- package/lib/typescript/src/scene/types.d.ts.map +1 -1
- package/lib/typescript/src/sprites/sampleSpriteClip.d.ts +26 -2
- package/lib/typescript/src/sprites/sampleSpriteClip.d.ts.map +1 -1
- package/lib/typescript/src/sprites/spriteAnimationState.d.ts +6 -7
- package/lib/typescript/src/sprites/spriteAnimationState.d.ts.map +1 -1
- package/lib/typescript/src/sprites.d.ts +10 -0
- package/lib/typescript/src/sprites.d.ts.map +1 -0
- package/lib/typescript/src/storage/adapters/asyncStorage.d.ts +18 -0
- package/lib/typescript/src/storage/adapters/asyncStorage.d.ts.map +1 -0
- package/lib/typescript/src/storage/adapters/memory.d.ts +16 -0
- package/lib/typescript/src/storage/adapters/memory.d.ts.map +1 -0
- package/lib/typescript/src/storage/errors.d.ts +37 -0
- package/lib/typescript/src/storage/errors.d.ts.map +1 -0
- package/lib/typescript/src/storage/index.d.ts +11 -0
- package/lib/typescript/src/storage/index.d.ts.map +1 -0
- package/lib/typescript/src/storage/schema.d.ts +22 -0
- package/lib/typescript/src/storage/schema.d.ts.map +1 -0
- package/lib/typescript/src/storage/serialization.d.ts +23 -0
- package/lib/typescript/src/storage/serialization.d.ts.map +1 -0
- package/lib/typescript/src/storage/store.d.ts +3 -0
- package/lib/typescript/src/storage/store.d.ts.map +1 -0
- package/lib/typescript/src/storage/types.d.ts +69 -0
- package/lib/typescript/src/storage/types.d.ts.map +1 -0
- package/lib/typescript/src/storage/validation.d.ts +24 -0
- package/lib/typescript/src/storage/validation.d.ts.map +1 -0
- package/lib/typescript/src/storage.d.ts +2 -0
- package/lib/typescript/src/storage.d.ts.map +1 -0
- package/lib/typescript/src/testing.d.ts +1 -0
- package/lib/typescript/src/testing.d.ts.map +1 -1
- package/lib/typescript/src/tilemap/chunkStats.d.ts +14 -0
- package/lib/typescript/src/tilemap/chunkStats.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/definitions.d.ts +38 -0
- package/lib/typescript/src/tilemap/definitions.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/errors.d.ts +7 -0
- package/lib/typescript/src/tilemap/errors.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/index.d.ts +8 -0
- package/lib/typescript/src/tilemap/index.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/movement.d.ts +52 -0
- package/lib/typescript/src/tilemap/movement.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/queries.d.ts +21 -0
- package/lib/typescript/src/tilemap/queries.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/tiledAdapter.d.ts +32 -0
- package/lib/typescript/src/tilemap/tiledAdapter.d.ts.map +1 -0
- package/lib/typescript/src/tilemap/types.d.ts +127 -0
- package/lib/typescript/src/tilemap/types.d.ts.map +1 -0
- package/lib/typescript/src/tilemap.d.ts +2 -0
- package/lib/typescript/src/tilemap.d.ts.map +1 -0
- package/package.json +100 -10
- package/src/assets/defineAssets.ts +31 -5
- package/src/assets.ts +27 -0
- package/src/audio/createGameAudio.ts +749 -0
- package/src/audio/errors.ts +12 -0
- package/src/audio/index.ts +9 -0
- package/src/audio/resolver.ts +74 -0
- package/src/audio/types.ts +47 -0
- package/src/audio.ts +13 -0
- package/src/camera2d/bounds.ts +69 -0
- package/src/camera2d/extents.ts +25 -0
- package/src/camera2d/follow.ts +165 -0
- package/src/camera2d/index.ts +29 -0
- package/src/camera2d/interpolation.ts +113 -0
- package/src/camera2d/shake.ts +90 -0
- package/src/camera2d/transform.ts +148 -0
- package/src/camera2d/types.ts +73 -0
- package/src/camera2d/validation.ts +126 -0
- package/src/camera2d/visibility.ts +181 -0
- package/src/camera2d.ts +6 -0
- package/src/collision2d/colliders.ts +292 -0
- package/src/collision2d/debug.ts +133 -0
- package/src/collision2d/filters.ts +48 -0
- package/src/collision2d/index.ts +74 -0
- package/src/collision2d/intersections.ts +82 -0
- package/src/collision2d/manifolds.ts +191 -0
- package/src/collision2d/segments.ts +176 -0
- package/src/collision2d/spatialHash.ts +211 -0
- package/src/collision2d/sweeps.ts +269 -0
- package/src/collision2d.ts +6 -0
- package/src/core/input/buttonPad.ts +235 -0
- package/src/core/input/createInputBuffer.ts +95 -14
- package/src/core/input/types.ts +7 -0
- package/src/core/session/createGameSession.ts +480 -53
- package/src/core/session/deepFreeze.ts +104 -3
- package/src/core/session/diagnostics.ts +2 -0
- package/src/core/session/types.ts +77 -4
- package/src/definition/defineGame.ts +61 -3
- package/src/definition/types.ts +10 -0
- package/src/events/defineGameEvents.ts +46 -0
- package/src/events/errors.ts +14 -0
- package/src/events/index.ts +14 -0
- package/src/events/payload.ts +234 -0
- package/src/events/seed.ts +33 -0
- package/src/events/types.ts +53 -0
- package/src/events.ts +20 -0
- package/src/geometry/helpers.ts +136 -0
- package/src/geometry/index.ts +14 -0
- package/src/geometry/types.ts +54 -0
- package/src/geometry/validation.ts +131 -0
- package/src/geometry.ts +6 -0
- package/src/haptics/createGameHaptics.ts +214 -0
- package/src/haptics/errors.ts +12 -0
- package/src/haptics/index.ts +3 -0
- package/src/haptics/resolver.ts +58 -0
- package/src/haptics/types.ts +48 -0
- package/src/haptics.ts +7 -0
- package/src/index.ts +37 -1
- package/src/particles/createParticleSystem.ts +505 -0
- package/src/particles/defineParticleEffect.ts +164 -0
- package/src/particles/errors.ts +6 -0
- package/src/particles/index.ts +5 -0
- package/src/particles/sampling.ts +141 -0
- package/src/particles/types.ts +327 -0
- package/src/particles.ts +1 -0
- package/src/react/GameButtonPad.tsx +436 -0
- package/src/react/GamePointerInput.tsx +73 -8
- package/src/react/GameView.tsx +160 -61
- package/src/react/assets/createGameAssetStore.ts +140 -107
- package/src/react/assets/useGameAssets.ts +63 -31
- package/src/react/bindAppLifecycle.ts +55 -19
- package/src/react/bindGameSession.ts +12 -2
- package/src/react/camera2d/GameLayer2D.tsx +43 -0
- package/src/react/camera2d/defineGameCamera2D.ts +59 -0
- package/src/react/camera2d/usePresentedCameraBinding.ts +185 -0
- package/src/react/cleanupList.ts +48 -0
- package/src/react/instrumentation.ts +31 -3
- package/src/react/lifecycleSource.ts +58 -0
- package/src/react/particles/ParticleView.tsx +358 -0
- package/src/react/particles/culling.ts +145 -0
- package/src/react/particles/index.ts +6 -0
- package/src/react/particles/spriteXForm.ts +72 -0
- package/src/react/particles/useParticlePresentation.ts +261 -0
- package/src/react/pointerBinding.ts +74 -16
- package/src/react/pointerCamera.ts +33 -0
- package/src/react/pointerCoalescer.ts +36 -10
- package/src/react/sprites/GameSprite.tsx +4 -33
- package/src/react/sprites/GameWorld2D.tsx +113 -7
- package/src/react/sprites/Sprite.tsx +51 -72
- package/src/react/sprites/SpriteBatch.tsx +74 -22
- package/src/react/sprites/batchVisibility.ts +76 -0
- package/src/react/sprites/spriteSelection.ts +133 -0
- package/src/react/sprites/spriteTransform.ts +46 -26
- package/src/react/tilemap/TileMapLayer2D.tsx +274 -0
- package/src/react/tilemap/tilePresentation.ts +491 -0
- package/src/react/useGameSession.ts +90 -0
- package/src/react/useGameSessionStatus.ts +53 -0
- package/src/react/viewportBinding.ts +5 -1
- package/src/react.ts +18 -1
- package/src/scene/defineScene.ts +47 -5
- package/src/scene/types.ts +37 -3
- package/src/sprites/sampleSpriteClip.ts +82 -14
- package/src/sprites/spriteAnimationState.ts +29 -25
- package/src/sprites.ts +22 -0
- package/src/storage/adapters/asyncStorage.ts +77 -0
- package/src/storage/adapters/memory.ts +58 -0
- package/src/storage/errors.ts +88 -0
- package/src/storage/index.ts +18 -0
- package/src/storage/schema.ts +147 -0
- package/src/storage/serialization.ts +248 -0
- package/src/storage/store.ts +380 -0
- package/src/storage/types.ts +76 -0
- package/src/storage/validation.ts +102 -0
- package/src/storage.ts +1 -0
- package/src/testing.ts +4 -0
- package/src/tilemap/chunkStats.ts +24 -0
- package/src/tilemap/definitions.ts +327 -0
- package/src/tilemap/errors.ts +11 -0
- package/src/tilemap/index.ts +10 -0
- package/src/tilemap/movement.ts +368 -0
- package/src/tilemap/queries.ts +136 -0
- package/src/tilemap/tiledAdapter.ts +165 -0
- package/src/tilemap/types.ts +119 -0
- 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
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
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,
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
119
|
-
//
|
|
120
|
-
//
|
|
121
|
-
|
|
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","
|
|
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
|
|
11
|
-
*
|
|
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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
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
|
|
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
|
-
|
|
78
|
-
|
|
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
|
|
115
|
-
// per
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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","
|
|
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":";;AAAA;AACA;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;AAK5E,SAASC,oBAAoB,EAAEC,kBAAkB,QAAQ,sBAAmB;AAE5E,SAASD,oBAAoB,EAAEC,kBAAkB;AAIjD,SAASC,oBAAoB,QAAQ,sBAAmB;AACxD,SAASC,qBAAqB,QAAQ,sBAAmB;AACzD,SAASC,iBAAiB,QAAQ,wBAAqB;;AAEvD;AAAA,SAAAC,GAAA,IAAAC,IAAA;AA6DA,SAASC,WAAWA,CAClBC,MAAuC,EACvCC,KAAa,EACwD;EACrE,SAAS;;EACT;EACA;EACA,MAAMC,QAAQ,GAAGP,qBAAqB,CAACK,MAAM,EAAE;IAAEC;EAAM,CAAC,CAAC;EACzD,IAAIC,QAAQ,KAAKC,SAAS,EAAE;IAC1B,MAAM,IAAIC,KAAK,CAAC,SAASC,IAAI,CAACC,SAAS,CAACL,KAAK,CAAC,uCAAuC,CAAC;EACxF;EACA,OAAOC,QAAQ;AACjB;AAEA,OAAO,SAASK,WAAWA,CAIzB;EACAC,KAAK;EACLC,MAAM;EACNC,KAAK;EACLV,MAAM;EACNW,QAAQ;EACRC,MAAM;EACNC,KAAK;EACLC,MAAM,GAAG;IAAEC,CAAC,EAAE,CAAC;IAAEC,CAAC,EAAE;EAAE,CAAC;EACvBC;AAC4C,CAAC,EAAE;EAC/C,MAAMC,KAAK,GAAGlB,MAAM,CAACkB,KAAgB;EACrC,IAAI,CAACC,MAAM,CAACC,SAAS,CAACT,QAAQ,CAAC,IAAIA,QAAQ,IAAI,CAAC,EAAE;IAChD,MAAM,IAAIP,KAAK,CACb,wDAAwDiB,MAAM,CAACV,QAAQ,CAAC,EAC1E,CAAC;EACH;EACA;EACA;EACA,MAAMW,WAAW,GAAGL,IAAI,EAAEM,OAAO,IAAI,CAAC;EACtC,IAAI,CAACJ,MAAM,CAACK,QAAQ,CAACF,WAAW,CAAC,IAAIA,WAAW,GAAG,CAAC,EAAE;IACpD,MAAM,IAAIG,UAAU,CAClB,qEAAqEJ,MAAM,CAACC,WAAW,CAAC,EAC1F,CAAC;EACH;EACA,MAAMI,KAAK,GAAGpC,aAAa,CAACqB,QAAQ,EAAGgB,IAAI,IAAK;IAC9C,SAAS;;IACTA,IAAI,CAACC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;EAC1B,CAAC,CAAC;EACF,MAAMC,MAAM,GAAGtC,gBAAgB,CAACoB,QAAQ,EAAGmB,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,GAAG7C,OAAO,CACxC,OAAO;IACL4C,GAAG,EAAEA,CAACE,KAAK,EAAEhC,KAAK,EAAEc,CAAC,EAAEC,CAAC,EAAEkB,QAAQ,EAAEC,KAAK,EAAEC,OAAO,GAAG,IAAI,KAAK;MAC5D,SAAS;;MACT;MACA;MACA,IAAI,CAACjB,MAAM,CAACC,SAAS,CAACa,KAAK,CAAC,IAAIA,KAAK,GAAG,CAAC,IAAIA,KAAK,IAAItB,QAAQ,EAAE;QAC9D,MAAM,IAAIP,KAAK,CACb,2BAA2BiB,MAAM,CAACY,KAAK,CAAC,4BAA4BtB,QAAQ,EAC9E,CAAC;MACH;MACA,MAAM0B,QAAQ,GAAGX,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;MACnC,MAAMM,SAAS,GAAGV,MAAM,CAACS,KAAK,CAACL,KAAK,CAAC;MACrC,IAAII,QAAQ,KAAKlC,SAAS,IAAIoC,SAAS,KAAKpC,SAAS,EAAE;QACrD;MACF;MACA,IAAI,CAACiC,OAAO,EAAE;QACZC,QAAQ,CAACT,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC5B;MACF;MACA,MAAMD,IAAI,GAAG5B,WAAW,CAACC,MAAM,EAAEC,KAAK,CAAC;MACvC,IAAI0B,IAAI,KAAKxB,SAAS,EAAE;QACtB,MAAM,IAAIC,KAAK,CACb,SAASC,IAAI,CAACC,SAAS,CAACL,KAAK,CAAC,uCAChC,CAAC;MACH;MACAoC,QAAQ,CAACT,OAAO,CAACD,IAAI,CAACZ,CAAC,EAAEY,IAAI,CAACX,CAAC,EAAEW,IAAI,CAACa,KAAK,EAAEb,IAAI,CAACc,MAAM,CAAC;MACzD,MAAMC,OAAO,GAAGhD,oBAAoB,CAAC;QACnCqB,CAAC;QACDC,CAAC;QACDkB,QAAQ;QACRC,KAAK;QACLQ,KAAK,EAAE,KAAK;QACZC,KAAK,EAAE,KAAK;QACZC,OAAO,EAAE/B,MAAM,CAACC,CAAC;QACjB+B,OAAO,EAAEhC,MAAM,CAACE,CAAC;QACjB+B,UAAU,EAAEpB,IAAI,CAACa,KAAK;QACtBQ,WAAW,EAAErB,IAAI,CAACc;MACpB,CAAC,CAAC;MACFF,SAAS,CAACR,GAAG,CAACW,OAAO,CAACO,IAAI,EAAEP,OAAO,CAACQ,IAAI,EAAER,OAAO,CAACS,EAAE,EAAET,OAAO,CAACU,EAAE,CAAC;IACnE;EACF,CAAC,CAAC;EACF;EACA,CAACzC,QAAQ,EAAEe,KAAK,EAAEG,MAAM,EAAE7B,MAAM,EAAEc,MAAM,CAACC,CAAC,EAAED,MAAM,CAACE,CAAC,CACtD,CAAC;;EAED;EACA;EACA;EACA;EACA;EACA;EACA,MAAMqC,WAAW,GAAGhE,eAAe,CAAC,MAAM;IACxC,SAAS;;IACT,MAAMiE,QAAQ,GAAG7C,MAAM,CAAC6B,KAAK;IAC7B,IAAIgB,QAAQ,CAAC9C,KAAK,KAAKA,KAAK,EAAE;MAC5B;MACA;MACA,KAAK,IAAIyB,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGtB,QAAQ,EAAEsB,KAAK,IAAI,CAAC,EAAE;QAChD,MAAMsB,IAAI,GAAG7B,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;QAC/B,IAAIsB,IAAI,KAAKpD,SAAS,EAAE;UACtBoD,IAAI,CAAC3B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1B;MACF;MACA,OAAO,CAAC;IACV;IACA,MAAM4B,KAAK,GAAG5C,MAAM,CAAC;MACnB6C,OAAO,EAAEH,QAAQ,CAACG,OAAsD;MACxE/C,KAAK,EAAEA,KAAK,CAAC4B;IACf,CAAC,CAAC;IACF,MAAMoB,MAAM,GAAG9D,iBAAiB,CAAC4D,KAAK,CAACG,MAAM,EAAEhD,QAAQ,EAAEiD,OAAO,CAAC;IACjE;IACA;IACA;IACA;IACA,MAAMC,KAAK,GAAGH,MAAM,CAACL,WAAW;IAChC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA,MAAMjB,OAAO,GACXnB,IAAI,KAAKd,SAAS,GACdA,SAAS,GACTX,oBAAoB,CAACyB,IAAI,CAAC6C,MAAM,CAACxB,KAAK,EAAErB,IAAI,CAAC8C,QAAQ,CAACzB,KAAK,EAAEhB,WAAW,CAAC;IAC/E,KAAK,IAAIW,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG4B,KAAK,EAAE5B,KAAK,IAAI,CAAC,EAAE;MAC7C,MAAM+B,IAAI,GAAGR,KAAK,CAACvB,KAAK,CAAC;MACzB,IAAI+B,IAAI,KAAK7D,SAAS,EAAE;QACtB;MACF;MACA,IAAIiC,OAAO,KAAKjC,SAAS,IAAI,CAACV,kBAAkB,CAACwB,IAAI,CAAEgD,MAAM,CAACD,IAAI,CAAC,EAAE5B,OAAO,CAAC,EAAE;QAC7E,MAAMmB,IAAI,GAAG7B,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;QAC/B,IAAIsB,IAAI,KAAKpD,SAAS,EAAE;UACtBoD,IAAI,CAAC3B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1B;QACA;MACF;MACAf,KAAK,CAACmB,QAAQ,EAAEgC,IAAI,EAAE/B,KAAK,CAAC;IAC9B;IACA;IACA,KAAK,IAAIA,KAAK,GAAG4B,KAAK,EAAE5B,KAAK,GAAGtB,QAAQ,EAAEsB,KAAK,IAAI,CAAC,EAAE;MACpD,MAAMsB,IAAI,GAAG7B,KAAK,CAACY,KAAK,CAACL,KAAK,CAAC;MAC/B,IAAIsB,IAAI,KAAKpD,SAAS,EAAE;QACtBoD,IAAI,CAAC3B,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAC1B;IACF;IACA,OAAOiC,KAAK;EACd,CAAC,EAAE,CAACpD,MAAM,EAAEC,KAAK,EAAEF,KAAK,EAAEI,MAAM,EAAEC,KAAK,EAAEmB,QAAQ,EAAEf,IAAI,EAAEK,WAAW,CAAC,CAAC;EAEtE,KAAK+B,WAAW;;EAEhB;EACA,MAAMa,QAAQ,GAAG/E,OAAO,CAAC,MAAM,SAAkB,EAAE,EAAE,CAAC;EACtD,oBACEW,IAAA,CAACV,KAAK;IAAC8B,KAAK,EAAEA,KAAM;IAACiD,OAAO,EAAEzC,KAAM;IAAC0C,UAAU,EAAEvC,MAAO;IAACqC,QAAQ,EAAEA;EAAkB,CAAE,CAAC;AAE5F","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":[]}
|