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.
- package/CHANGELOG.md +68 -0
- package/README.md +95 -14
- 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 +94 -4
- 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
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Contact manifolds (T11.2).
|
|
5
|
+
*
|
|
6
|
+
* A `CollisionHit2D` reports geometry only: the normal that moves the FIRST
|
|
7
|
+
* argument out of the SECOND, the nonnegative penetration depth, and a
|
|
8
|
+
* stable contact point. Applying `first += normal * depth` resolves an
|
|
9
|
+
* ordinary overlap within documented floating-point tolerance. Misses
|
|
10
|
+
* return `undefined` and allocate nothing.
|
|
11
|
+
*
|
|
12
|
+
* Conventions (locked in T11.0):
|
|
13
|
+
* - Boundary contact counts as intersection and may return a zero-depth hit.
|
|
14
|
+
* - Circle-AABB: the contact point is the closest point on the AABB to the
|
|
15
|
+
* circle center; when the center is inside the AABB, the minimum
|
|
16
|
+
* penetration face wins with ties in the order left, top, right, bottom.
|
|
17
|
+
* - Circle-circle: the contact point is on the first circle's boundary
|
|
18
|
+
* toward the second; coincident centers use the fallback normal `(0, 1)`
|
|
19
|
+
* (straight up the positive-y axis) with full overlap depth `r1 + r2`.
|
|
20
|
+
* - AABB-AABB: the contact point is the center of the overlap rectangle;
|
|
21
|
+
* exact corner ties use the normal `(0, 1)`.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { assertValidAabb2D, assertValidCircle2D } from "../geometry/validation.js";
|
|
25
|
+
import { closestPointOnAabb2D } from "./intersections.js";
|
|
26
|
+
|
|
27
|
+
/** One contact between two shapes, in the first shape's local resolution. */
|
|
28
|
+
|
|
29
|
+
/** Resolution tolerance used by tests: relative to the shape size. */
|
|
30
|
+
export const RESOLUTION_TOLERANCE = 1e-9;
|
|
31
|
+
|
|
32
|
+
/** AABB-AABB contact manifold. `undefined` when the shapes do not touch. */
|
|
33
|
+
export function collideAabbAabb2D(first, second) {
|
|
34
|
+
assertValidAabb2D(first, 'first');
|
|
35
|
+
assertValidAabb2D(second, 'second');
|
|
36
|
+
const firstMaxX = first.x + first.width;
|
|
37
|
+
const firstMaxY = first.y + first.height;
|
|
38
|
+
const secondMaxX = second.x + second.width;
|
|
39
|
+
const secondMaxY = second.y + second.height;
|
|
40
|
+
if (firstMaxX < second.x || first.x > secondMaxX || firstMaxY < second.y || first.y > secondMaxY) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Directional minimum translation (T11-F1): for each axis, the distance
|
|
45
|
+
// that fully separates the intervals in each direction. This resolves
|
|
46
|
+
// containment completely, not merely to a smaller intersection rectangle.
|
|
47
|
+
const exitLeft = firstMaxX - second.x;
|
|
48
|
+
const exitRight = secondMaxX - first.x;
|
|
49
|
+
const exitUp = firstMaxY - second.y;
|
|
50
|
+
const exitDown = secondMaxY - first.y;
|
|
51
|
+
const depthX = Math.min(exitLeft, exitRight);
|
|
52
|
+
const depthY = Math.min(exitUp, exitDown);
|
|
53
|
+
let normal;
|
|
54
|
+
let depth;
|
|
55
|
+
if (depthX === 0 && depthY === 0) {
|
|
56
|
+
// Exact corner touch: locked deterministic tie rule.
|
|
57
|
+
normal = Object.freeze({
|
|
58
|
+
x: 0,
|
|
59
|
+
y: 1
|
|
60
|
+
});
|
|
61
|
+
depth = 0;
|
|
62
|
+
} else if (depthX < depthY) {
|
|
63
|
+
normal = Object.freeze({
|
|
64
|
+
x: exitLeft <= exitRight ? -1 : 1,
|
|
65
|
+
y: 0
|
|
66
|
+
});
|
|
67
|
+
depth = depthX;
|
|
68
|
+
} else {
|
|
69
|
+
// Equal axes resolve on Y (locked tie rule); equal directions on the
|
|
70
|
+
// chosen axis resolve toward the negative direction.
|
|
71
|
+
normal = Object.freeze({
|
|
72
|
+
x: 0,
|
|
73
|
+
y: exitUp <= exitDown ? -1 : 1
|
|
74
|
+
});
|
|
75
|
+
depth = depthY;
|
|
76
|
+
}
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
normal,
|
|
79
|
+
depth,
|
|
80
|
+
point: Object.freeze({
|
|
81
|
+
x: (Math.max(first.x, second.x) + Math.min(firstMaxX, secondMaxX)) / 2,
|
|
82
|
+
y: (Math.max(first.y, second.y) + Math.min(firstMaxY, secondMaxY)) / 2
|
|
83
|
+
})
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/** Circle-circle contact manifold. `undefined` when the circles do not touch. */
|
|
88
|
+
export function collideCircleCircle2D(first, second) {
|
|
89
|
+
assertValidCircle2D(first, 'first');
|
|
90
|
+
assertValidCircle2D(second, 'second');
|
|
91
|
+
const dx = first.x - second.x;
|
|
92
|
+
const dy = first.y - second.y;
|
|
93
|
+
const radiusSum = first.radius + second.radius;
|
|
94
|
+
const distanceSquared = dx * dx + dy * dy;
|
|
95
|
+
if (distanceSquared > radiusSum * radiusSum) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
const distance = Math.sqrt(distanceSquared);
|
|
99
|
+
if (distance === 0) {
|
|
100
|
+
// Coincident centers: locked fallback normal (straight up), full
|
|
101
|
+
// overlap depth, contact point on the first circle's boundary along
|
|
102
|
+
// the normal.
|
|
103
|
+
return Object.freeze({
|
|
104
|
+
normal: Object.freeze({
|
|
105
|
+
x: 0,
|
|
106
|
+
y: 1
|
|
107
|
+
}),
|
|
108
|
+
depth: radiusSum,
|
|
109
|
+
point: Object.freeze({
|
|
110
|
+
x: first.x,
|
|
111
|
+
y: first.y + first.radius
|
|
112
|
+
})
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// From the second center toward the first: moves the first argument out
|
|
117
|
+
// of the second.
|
|
118
|
+
const normal = Object.freeze({
|
|
119
|
+
x: dx / distance,
|
|
120
|
+
y: dy / distance
|
|
121
|
+
});
|
|
122
|
+
// Contact point: on the first circle's boundary, on the side facing the
|
|
123
|
+
// second circle (opposite the push-out normal).
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
normal,
|
|
126
|
+
depth: radiusSum - distance,
|
|
127
|
+
point: Object.freeze({
|
|
128
|
+
x: first.x - normal.x * first.radius,
|
|
129
|
+
y: first.y - normal.y * first.radius
|
|
130
|
+
})
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/** Circle-AABB contact manifold. `undefined` when they do not touch. */
|
|
135
|
+
export function collideCircleAabb2D(circle, aabb) {
|
|
136
|
+
assertValidCircle2D(circle);
|
|
137
|
+
assertValidAabb2D(aabb);
|
|
138
|
+
const closest = closestPointOnAabb2D(circle, aabb);
|
|
139
|
+
const dx = circle.x - closest.x;
|
|
140
|
+
const dy = circle.y - closest.y;
|
|
141
|
+
const distanceSquared = dx * dx + dy * dy;
|
|
142
|
+
if (distanceSquared > circle.radius * circle.radius) {
|
|
143
|
+
return undefined;
|
|
144
|
+
}
|
|
145
|
+
if (distanceSquared === 0) {
|
|
146
|
+
// The circle center is inside the AABB: push out along the nearest
|
|
147
|
+
// face; ties resolve left, top, right, bottom (locked).
|
|
148
|
+
const left = circle.x - aabb.x;
|
|
149
|
+
const right = aabb.x + aabb.width - circle.x;
|
|
150
|
+
const top = circle.y - aabb.y;
|
|
151
|
+
const bottom = aabb.y + aabb.height - circle.y;
|
|
152
|
+
const minimum = Math.min(left, right, top, bottom);
|
|
153
|
+
let normal;
|
|
154
|
+
let point;
|
|
155
|
+
if (minimum === left) {
|
|
156
|
+
normal = Object.freeze({
|
|
157
|
+
x: -1,
|
|
158
|
+
y: 0
|
|
159
|
+
});
|
|
160
|
+
point = Object.freeze({
|
|
161
|
+
x: aabb.x,
|
|
162
|
+
y: circle.y
|
|
163
|
+
});
|
|
164
|
+
} else if (minimum === top) {
|
|
165
|
+
normal = Object.freeze({
|
|
166
|
+
x: 0,
|
|
167
|
+
y: -1
|
|
168
|
+
});
|
|
169
|
+
point = Object.freeze({
|
|
170
|
+
x: circle.x,
|
|
171
|
+
y: aabb.y
|
|
172
|
+
});
|
|
173
|
+
} else if (minimum === right) {
|
|
174
|
+
normal = Object.freeze({
|
|
175
|
+
x: 1,
|
|
176
|
+
y: 0
|
|
177
|
+
});
|
|
178
|
+
point = Object.freeze({
|
|
179
|
+
x: aabb.x + aabb.width,
|
|
180
|
+
y: circle.y
|
|
181
|
+
});
|
|
182
|
+
} else {
|
|
183
|
+
normal = Object.freeze({
|
|
184
|
+
x: 0,
|
|
185
|
+
y: 1
|
|
186
|
+
});
|
|
187
|
+
point = Object.freeze({
|
|
188
|
+
x: circle.x,
|
|
189
|
+
y: aabb.y + aabb.height
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
return Object.freeze({
|
|
193
|
+
normal,
|
|
194
|
+
depth: minimum + circle.radius,
|
|
195
|
+
point
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
const distance = Math.sqrt(distanceSquared);
|
|
199
|
+
// From the closest AABB point toward the circle center: moves the circle
|
|
200
|
+
// (the first argument) out of the AABB.
|
|
201
|
+
const normal = Object.freeze({
|
|
202
|
+
x: dx / distance,
|
|
203
|
+
y: dy / distance
|
|
204
|
+
});
|
|
205
|
+
return Object.freeze({
|
|
206
|
+
normal,
|
|
207
|
+
depth: circle.radius - distance,
|
|
208
|
+
// GS-COLLISION-01: copy-freeze the contact point at the public result
|
|
209
|
+
// boundary. `closest` is rebuilt per call, but copying keeps the hit
|
|
210
|
+
// independent of any future helper caching; sweeps reuse this object
|
|
211
|
+
// through hitFromManifold, so one fix covers every wrapper.
|
|
212
|
+
point: Object.freeze({
|
|
213
|
+
x: closest.x,
|
|
214
|
+
y: closest.y
|
|
215
|
+
})
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=manifolds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["assertValidAabb2D","assertValidCircle2D","closestPointOnAabb2D","RESOLUTION_TOLERANCE","collideAabbAabb2D","first","second","firstMaxX","x","width","firstMaxY","y","height","secondMaxX","secondMaxY","undefined","exitLeft","exitRight","exitUp","exitDown","depthX","Math","min","depthY","normal","depth","Object","freeze","point","max","collideCircleCircle2D","dx","dy","radiusSum","radius","distanceSquared","distance","sqrt","collideCircleAabb2D","circle","aabb","closest","left","right","top","bottom","minimum"],"sourceRoot":"../../../src","sources":["collision2d/manifolds.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Segment queries (T11.3).
|
|
5
|
+
*
|
|
6
|
+
* Return the earliest crossing of a directed segment with a shape, with
|
|
7
|
+
* `time` in `[0, 1]`. A segment starting inside a shape returns `time: 0`
|
|
8
|
+
* with the deterministic nearest-face normal (same tie rule as the
|
|
9
|
+
* manifolds: left, top, right, bottom for AABBs; the outward radial
|
|
10
|
+
* direction for circles with the `(0, 1)` fallback at the center).
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { assertValidAabb2D, assertValidCircle2D, assertValidSegment2D } from "../geometry/validation.js";
|
|
14
|
+
import { pointInAabb2D, pointInCircle2D } from "./intersections.js";
|
|
15
|
+
|
|
16
|
+
/** Earliest segment crossing of a shape. */
|
|
17
|
+
|
|
18
|
+
/** Earliest crossing of a segment with an AABB (slab method). */
|
|
19
|
+
export function intersectSegmentAabb2D(segment, aabb) {
|
|
20
|
+
assertValidSegment2D(segment);
|
|
21
|
+
assertValidAabb2D(aabb);
|
|
22
|
+
if (pointInAabb2D(segment.start, aabb)) {
|
|
23
|
+
return insideStart(segment.start, aabb);
|
|
24
|
+
}
|
|
25
|
+
const dx = segment.end.x - segment.start.x;
|
|
26
|
+
const dy = segment.end.y - segment.start.y;
|
|
27
|
+
const minX = aabb.x;
|
|
28
|
+
const maxX = aabb.x + aabb.width;
|
|
29
|
+
const minY = aabb.y;
|
|
30
|
+
const maxY = aabb.y + aabb.height;
|
|
31
|
+
let tMin = 0;
|
|
32
|
+
let tMax = 1;
|
|
33
|
+
let entryAxis;
|
|
34
|
+
let entrySign = 0;
|
|
35
|
+
for (const axis of ['x', 'y']) {
|
|
36
|
+
const origin = axis === 'x' ? segment.start.x : segment.start.y;
|
|
37
|
+
const delta = axis === 'x' ? dx : dy;
|
|
38
|
+
const min = axis === 'x' ? minX : minY;
|
|
39
|
+
const max = axis === 'x' ? maxX : maxY;
|
|
40
|
+
if (delta === 0) {
|
|
41
|
+
if (origin <= min || origin >= max) {
|
|
42
|
+
// Parallel and outside the slab, or grazing exactly along a
|
|
43
|
+
// boundary: neither is a crossing.
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
const tMinFace = (min - origin) / delta;
|
|
49
|
+
const tMaxFace = (max - origin) / delta;
|
|
50
|
+
const t1 = Math.min(tMinFace, tMaxFace);
|
|
51
|
+
const t2 = Math.max(tMinFace, tMaxFace);
|
|
52
|
+
if (t1 > tMin) {
|
|
53
|
+
tMin = t1;
|
|
54
|
+
entryAxis = axis;
|
|
55
|
+
// The outward normal of the face crossed first: the min face points
|
|
56
|
+
// -axis, the max face points +axis.
|
|
57
|
+
entrySign = t1 === tMinFace ? -1 : 1;
|
|
58
|
+
}
|
|
59
|
+
tMax = Math.min(tMax, t2);
|
|
60
|
+
if (tMax < tMin) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (entryAxis === undefined) {
|
|
65
|
+
return undefined; // The segment travels along the boundary without crossing.
|
|
66
|
+
}
|
|
67
|
+
const atX = segment.start.x + dx * tMin;
|
|
68
|
+
const atY = segment.start.y + dy * tMin;
|
|
69
|
+
const normal = entryAxis === 'x' ? Object.freeze({
|
|
70
|
+
x: entrySign,
|
|
71
|
+
y: 0
|
|
72
|
+
}) : Object.freeze({
|
|
73
|
+
x: 0,
|
|
74
|
+
y: entrySign
|
|
75
|
+
});
|
|
76
|
+
return Object.freeze({
|
|
77
|
+
time: tMin,
|
|
78
|
+
normal,
|
|
79
|
+
point: Object.freeze({
|
|
80
|
+
x: atX,
|
|
81
|
+
y: atY
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** A segment starting inside an AABB: time 0 with the nearest-face normal. */
|
|
87
|
+
function insideStart(point, aabb) {
|
|
88
|
+
const left = point.x - aabb.x;
|
|
89
|
+
const right = aabb.x + aabb.width - point.x;
|
|
90
|
+
const top = point.y - aabb.y;
|
|
91
|
+
const bottom = aabb.y + aabb.height - point.y;
|
|
92
|
+
const minimum = Math.min(left, right, top, bottom);
|
|
93
|
+
let normal;
|
|
94
|
+
if (minimum === left) {
|
|
95
|
+
normal = Object.freeze({
|
|
96
|
+
x: -1,
|
|
97
|
+
y: 0
|
|
98
|
+
});
|
|
99
|
+
} else if (minimum === top) {
|
|
100
|
+
normal = Object.freeze({
|
|
101
|
+
x: 0,
|
|
102
|
+
y: -1
|
|
103
|
+
});
|
|
104
|
+
} else if (minimum === right) {
|
|
105
|
+
normal = Object.freeze({
|
|
106
|
+
x: 1,
|
|
107
|
+
y: 0
|
|
108
|
+
});
|
|
109
|
+
} else {
|
|
110
|
+
normal = Object.freeze({
|
|
111
|
+
x: 0,
|
|
112
|
+
y: 1
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
return Object.freeze({
|
|
116
|
+
time: 0,
|
|
117
|
+
normal,
|
|
118
|
+
point: Object.freeze({
|
|
119
|
+
x: point.x,
|
|
120
|
+
y: point.y
|
|
121
|
+
})
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** Earliest crossing of a segment with a circle. */
|
|
126
|
+
export function intersectSegmentCircle2D(segment, circle) {
|
|
127
|
+
assertValidSegment2D(segment);
|
|
128
|
+
assertValidCircle2D(circle);
|
|
129
|
+
const dx = segment.end.x - segment.start.x;
|
|
130
|
+
const dy = segment.end.y - segment.start.y;
|
|
131
|
+
const fx = segment.start.x - circle.x;
|
|
132
|
+
const fy = segment.start.y - circle.y;
|
|
133
|
+
if (pointInCircle2D(segment.start, circle)) {
|
|
134
|
+
const distanceSquared = fx * fx + fy * fy;
|
|
135
|
+
const distance = Math.sqrt(distanceSquared);
|
|
136
|
+
// Outward radial: the normalized center-to-start vector. The (0, 1)
|
|
137
|
+
// fallback applies only at the exact center.
|
|
138
|
+
const normal = distance === 0 ? Object.freeze({
|
|
139
|
+
x: 0,
|
|
140
|
+
y: 1
|
|
141
|
+
}) : Object.freeze({
|
|
142
|
+
x: fx / distance,
|
|
143
|
+
y: fy / distance
|
|
144
|
+
});
|
|
145
|
+
return Object.freeze({
|
|
146
|
+
time: 0,
|
|
147
|
+
normal,
|
|
148
|
+
point: Object.freeze({
|
|
149
|
+
x: segment.start.x,
|
|
150
|
+
y: segment.start.y
|
|
151
|
+
})
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
const a = dx * dx + dy * dy;
|
|
155
|
+
const b = 2 * (fx * dx + fy * dy);
|
|
156
|
+
const c = fx * fx + fy * fy - circle.radius * circle.radius;
|
|
157
|
+
const discriminant = b * b - 4 * a * c;
|
|
158
|
+
if (discriminant < 0) {
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
const root = Math.sqrt(discriminant);
|
|
162
|
+
const t = (-b - root) / (2 * a);
|
|
163
|
+
if (t < 0 || t > 1) {
|
|
164
|
+
return undefined;
|
|
165
|
+
}
|
|
166
|
+
const atX = segment.start.x + dx * t;
|
|
167
|
+
const atY = segment.start.y + dy * t;
|
|
168
|
+
const outX = atX - circle.x;
|
|
169
|
+
const outY = atY - circle.y;
|
|
170
|
+
const outDistance = Math.hypot(outX, outY);
|
|
171
|
+
const normal = outDistance === 0 ? Object.freeze({
|
|
172
|
+
x: 0,
|
|
173
|
+
y: 1
|
|
174
|
+
}) : Object.freeze({
|
|
175
|
+
x: outX / outDistance,
|
|
176
|
+
y: outY / outDistance
|
|
177
|
+
});
|
|
178
|
+
return Object.freeze({
|
|
179
|
+
time: t,
|
|
180
|
+
normal,
|
|
181
|
+
point: Object.freeze({
|
|
182
|
+
x: atX,
|
|
183
|
+
y: atY
|
|
184
|
+
})
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=segments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["assertValidAabb2D","assertValidCircle2D","assertValidSegment2D","pointInAabb2D","pointInCircle2D","intersectSegmentAabb2D","segment","aabb","start","insideStart","dx","end","x","dy","y","minX","maxX","width","minY","maxY","height","tMin","tMax","entryAxis","entrySign","axis","origin","delta","min","max","undefined","tMinFace","tMaxFace","t1","Math","t2","atX","atY","normal","Object","freeze","time","point","left","right","top","bottom","minimum","intersectSegmentCircle2D","circle","fx","fy","distanceSquared","distance","sqrt","a","b","c","radius","discriminant","root","t","outX","outY","outDistance","hypot"],"sourceRoot":"../../../src","sources":["collision2d/segments.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Deterministic spatial hash broad phase (T11.5).
|
|
5
|
+
*
|
|
6
|
+
* `buildSpatialHash2D` validates and freezes a plain immutable index value;
|
|
7
|
+
* the per-cell buckets live in an internal WeakMap so callers can never
|
|
8
|
+
* mutate or depend on them. `querySpatialHash2D` visits only the query's
|
|
9
|
+
* cells and returns candidate ids deduplicated and in original insertion
|
|
10
|
+
* order. The broad phase is conservative: it returns candidates, never a
|
|
11
|
+
* narrow-phase collision claim.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import { assertValidAabb2D, GeometryError } from "../geometry/validation.js";
|
|
15
|
+
|
|
16
|
+
/** One indexed item with a stable identifier and AABB bounds. */
|
|
17
|
+
|
|
18
|
+
/** A frozen, immutable spatial-hash index. */
|
|
19
|
+
|
|
20
|
+
/** Options for building an index. */
|
|
21
|
+
|
|
22
|
+
/** Maximum cells an item or query may OCCUPY per axis (bounded execution). */
|
|
23
|
+
export const MAX_SPATIAL_HASH_SPAN_CELLS = 1024;
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Maximum cells visited by ONE item insert or ONE query (GS-COLLISION-02).
|
|
27
|
+
*
|
|
28
|
+
* The per-axis bound alone permits ~1M cell visits per operation (~38ms
|
|
29
|
+
* on desktop V8, multiples of that on mobile). The total budget fails
|
|
30
|
+
* clearly before such spans do any work. Ordinary game spans (a few
|
|
31
|
+
* hundred cells per axis at most) pass with wide headroom; aggregate build
|
|
32
|
+
* cost still scales with item count, so prefer an appropriate cell size
|
|
33
|
+
* and reuse static indexes instead of rebuilding per dynamic body per tick.
|
|
34
|
+
*/
|
|
35
|
+
export const MAX_SPATIAL_HASH_TOTAL_CELLS = 65_536;
|
|
36
|
+
|
|
37
|
+
/** Opaque per-index internal buckets and order, never exposed publicly. */
|
|
38
|
+
const internalState = new WeakMap();
|
|
39
|
+
|
|
40
|
+
/** Build a spatial-hash index over the given items. */
|
|
41
|
+
export function buildSpatialHash2D(options) {
|
|
42
|
+
const {
|
|
43
|
+
items,
|
|
44
|
+
cellSize
|
|
45
|
+
} = options;
|
|
46
|
+
if (!Number.isFinite(cellSize) || cellSize <= 0) {
|
|
47
|
+
throw new GeometryError('GEOMETRY_INVALID_NUMBER', 'cellSize', `expected a positive finite number, got ${String(cellSize)}`);
|
|
48
|
+
}
|
|
49
|
+
const seen = new Set();
|
|
50
|
+
const cells = new Map();
|
|
51
|
+
const order = new Map();
|
|
52
|
+
const frozenItems = [];
|
|
53
|
+
for (const item of items) {
|
|
54
|
+
if (seen.has(item.id)) {
|
|
55
|
+
throw new GeometryError('GEOMETRY_DUPLICATE_ID', 'items.id', `expected unique item ids, got duplicate "${item.id}"`);
|
|
56
|
+
}
|
|
57
|
+
seen.add(item.id);
|
|
58
|
+
assertValidAabb2D(item.bounds, `items.${item.id}.bounds`);
|
|
59
|
+
// Clone the caller's item and its bounds: the index must never freeze
|
|
60
|
+
// or retain caller-owned objects, and the private buckets must agree
|
|
61
|
+
// with the public `items` view.
|
|
62
|
+
const cloned = Object.freeze({
|
|
63
|
+
id: item.id,
|
|
64
|
+
bounds: Object.freeze({
|
|
65
|
+
...item.bounds
|
|
66
|
+
})
|
|
67
|
+
});
|
|
68
|
+
frozenItems.push(cloned);
|
|
69
|
+
order.set(item.id, frozenItems.length - 1);
|
|
70
|
+
for (const cell of cellsOf(cloned.bounds, cellSize)) {
|
|
71
|
+
const key = cellKey(cell.x, cell.y);
|
|
72
|
+
const bucket = cells.get(key);
|
|
73
|
+
if (bucket === undefined) {
|
|
74
|
+
cells.set(key, [item.id]);
|
|
75
|
+
} else {
|
|
76
|
+
bucket.push(item.id);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
const index = Object.freeze({
|
|
81
|
+
cellSize,
|
|
82
|
+
items: Object.freeze(frozenItems)
|
|
83
|
+
});
|
|
84
|
+
internalState.set(index, {
|
|
85
|
+
cells: new Map([...cells.entries()].map(([key, ids]) => [key, Object.freeze(ids)])),
|
|
86
|
+
// The local `order` map never escapes this function, so it is stored
|
|
87
|
+
// directly (GS-COLLISION-02): the extra copy served no ownership purpose.
|
|
88
|
+
order
|
|
89
|
+
});
|
|
90
|
+
return index;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Query candidates whose bounds share a cell with the query bounds. */
|
|
94
|
+
export function querySpatialHash2D(index, bounds) {
|
|
95
|
+
assertValidAabb2D(bounds, 'bounds');
|
|
96
|
+
const state = internalState.get(index);
|
|
97
|
+
if (state === undefined) {
|
|
98
|
+
throw new GeometryError('GEOMETRY_INVALID_NUMBER', 'index', 'expected an index built by buildSpatialHash2D');
|
|
99
|
+
}
|
|
100
|
+
const seen = new Set();
|
|
101
|
+
const collected = [];
|
|
102
|
+
for (const cell of cellsOf(bounds, index.cellSize)) {
|
|
103
|
+
const bucket = state.cells.get(cellKey(cell.x, cell.y));
|
|
104
|
+
if (bucket === undefined) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
for (const id of bucket) {
|
|
108
|
+
if (!seen.has(id)) {
|
|
109
|
+
seen.add(id);
|
|
110
|
+
collected.push(id);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Preserve original insertion order regardless of bucket order.
|
|
115
|
+
collected.sort((a, b) => state.order.get(a) - state.order.get(b));
|
|
116
|
+
// The public result is frozen (T11-FF5): the immutable contract is
|
|
117
|
+
// runtime-enforced, not only a type-level promise.
|
|
118
|
+
return Object.freeze(collected);
|
|
119
|
+
}
|
|
120
|
+
/** Every cell an AABB occupies, in deterministic order. */
|
|
121
|
+
function* cellsOf(bounds, cellSize) {
|
|
122
|
+
const minX = cellIndex(bounds.x, cellSize);
|
|
123
|
+
const maxX = cellIndex(bounds.x + bounds.width, cellSize);
|
|
124
|
+
const minY = cellIndex(bounds.y, cellSize);
|
|
125
|
+
const maxY = cellIndex(bounds.y + bounds.height, cellSize);
|
|
126
|
+
assertSpan(maxX - minX, 'x');
|
|
127
|
+
assertSpan(maxY - minY, 'y');
|
|
128
|
+
assertTotalCells(maxX - minX, maxY - minY);
|
|
129
|
+
for (let y = minY; y <= maxY; y += 1) {
|
|
130
|
+
for (let x = minX; x <= maxX; x += 1) {
|
|
131
|
+
yield {
|
|
132
|
+
x,
|
|
133
|
+
y
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** Validate a derived cell index as a finite safe integer. */
|
|
140
|
+
function cellIndex(coord, cellSize) {
|
|
141
|
+
const index = Math.floor(coord / cellSize);
|
|
142
|
+
if (!Number.isSafeInteger(index)) {
|
|
143
|
+
throw new GeometryError('GEOMETRY_SPATIAL_INDEX_RANGE', 'bounds', `coordinate ${coord} produces an unsafe cell index`);
|
|
144
|
+
}
|
|
145
|
+
return index;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Reject spans that would block the JS thread (bounded execution). */
|
|
149
|
+
function assertSpan(span, axis) {
|
|
150
|
+
const cells = span + 1; // The inclusive loop visits span + 1 cells.
|
|
151
|
+
if (cells > MAX_SPATIAL_HASH_SPAN_CELLS) {
|
|
152
|
+
throw new GeometryError('GEOMETRY_SPATIAL_INDEX_RANGE', `bounds.${axis}`, `bounds occupy ${cells} cells, exceeding the maximum of ${MAX_SPATIAL_HASH_SPAN_CELLS}`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Reject total occupied cells beyond the work budget (GS-COLLISION-02). */
|
|
157
|
+
function assertTotalCells(spanX, spanY) {
|
|
158
|
+
// Both axes already passed assertSpan, so the product cannot overflow.
|
|
159
|
+
const total = (spanX + 1) * (spanY + 1);
|
|
160
|
+
if (total > MAX_SPATIAL_HASH_TOTAL_CELLS) {
|
|
161
|
+
throw new GeometryError('GEOMETRY_SPATIAL_INDEX_RANGE', 'bounds', `bounds occupy ${total} cells, exceeding the total maximum of ${MAX_SPATIAL_HASH_TOTAL_CELLS}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function cellKey(x, y) {
|
|
165
|
+
return `${x},${y}`;
|
|
166
|
+
}
|
|
167
|
+
//# sourceMappingURL=spatialHash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["assertValidAabb2D","GeometryError","MAX_SPATIAL_HASH_SPAN_CELLS","MAX_SPATIAL_HASH_TOTAL_CELLS","internalState","WeakMap","buildSpatialHash2D","options","items","cellSize","Number","isFinite","String","seen","Set","cells","Map","order","frozenItems","item","has","id","add","bounds","cloned","Object","freeze","push","set","length","cell","cellsOf","key","cellKey","x","y","bucket","get","undefined","index","entries","map","ids","querySpatialHash2D","state","collected","sort","a","b","minX","cellIndex","maxX","width","minY","maxY","height","assertSpan","assertTotalCells","coord","Math","floor","isSafeInteger","span","axis","spanX","spanY","total"],"sourceRoot":"../../../src","sources":["collision2d/spatialHash.ts"],"mappings":"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","ignoreList":[]}
|