@vgai/engine 0.2.0 → 0.3.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/README.md +3 -1
- package/dist/adapter/authoring.d.ts +404 -0
- package/dist/adapter/authoring.d.ts.map +1 -0
- package/dist/adapter/authoring.js +22 -0
- package/dist/adapter/colyseus-networking-adapter.d.ts +43 -0
- package/dist/adapter/colyseus-networking-adapter.d.ts.map +1 -0
- package/dist/adapter/colyseus-networking-adapter.js +38 -0
- package/dist/adapter/first-party-systems.d.ts +38 -0
- package/dist/adapter/first-party-systems.d.ts.map +1 -0
- package/dist/adapter/first-party-systems.js +77 -0
- package/dist/adapter/game-adapter.d.ts +133 -0
- package/dist/adapter/game-adapter.d.ts.map +1 -0
- package/dist/adapter/game-adapter.js +10 -0
- package/dist/adapter/host-context.d.ts +73 -0
- package/dist/adapter/host-context.d.ts.map +1 -0
- package/dist/adapter/host-context.js +16 -0
- package/dist/adapter/index.d.ts +22 -0
- package/dist/adapter/index.d.ts.map +1 -0
- package/dist/adapter/index.js +15 -0
- package/dist/adapter/ingest/game-contract.d.ts +53 -0
- package/dist/adapter/ingest/game-contract.d.ts.map +1 -0
- package/dist/adapter/ingest/game-contract.js +30 -0
- package/dist/adapter/ingest/overlay-applier.d.ts +118 -0
- package/dist/adapter/ingest/overlay-applier.d.ts.map +1 -0
- package/dist/adapter/ingest/overlay-applier.js +132 -0
- package/dist/adapter/ingest/overlay-apply.d.ts +60 -0
- package/dist/adapter/ingest/overlay-apply.d.ts.map +1 -0
- package/dist/adapter/ingest/overlay-apply.js +101 -0
- package/dist/adapter/ingest/overlay-file.d.ts +79 -0
- package/dist/adapter/ingest/overlay-file.d.ts.map +1 -0
- package/dist/adapter/ingest/overlay-file.js +66 -0
- package/dist/adapter/ingest/overlay-report.d.ts +113 -0
- package/dist/adapter/ingest/overlay-report.d.ts.map +1 -0
- package/dist/adapter/ingest/overlay-report.js +103 -0
- package/dist/adapter/ingest/scene-capture.d.ts +97 -0
- package/dist/adapter/ingest/scene-capture.d.ts.map +1 -0
- package/dist/adapter/ingest/scene-capture.js +248 -0
- package/dist/adapter/ingest/upstream-pin.d.ts +47 -0
- package/dist/adapter/ingest/upstream-pin.d.ts.map +1 -0
- package/dist/adapter/ingest/upstream-pin.js +50 -0
- package/dist/adapter/loop-gate-report.d.ts +34 -0
- package/dist/adapter/loop-gate-report.d.ts.map +1 -0
- package/dist/adapter/loop-gate-report.js +37 -0
- package/dist/adapter/rapier-physics-adapter.d.ts +12 -0
- package/dist/adapter/rapier-physics-adapter.d.ts.map +1 -0
- package/dist/adapter/rapier-physics-adapter.js +46 -0
- package/dist/adapter/system-adapter.d.ts +133 -0
- package/dist/adapter/system-adapter.d.ts.map +1 -0
- package/dist/adapter/system-adapter.js +13 -0
- package/dist/adapter/transform.d.ts +18 -0
- package/dist/adapter/transform.d.ts.map +1 -0
- package/dist/adapter/transform.js +1 -0
- package/dist/adapter/vgai-scene-game-adapter.d.ts +116 -0
- package/dist/adapter/vgai-scene-game-adapter.d.ts.map +1 -0
- package/dist/adapter/vgai-scene-game-adapter.js +714 -0
- package/dist/adapter/world-kind.d.ts +30 -0
- package/dist/adapter/world-kind.d.ts.map +1 -0
- package/dist/adapter/world-kind.js +18 -0
- package/dist/ai/navigation.d.ts +64 -0
- package/dist/ai/navigation.d.ts.map +1 -0
- package/dist/ai/navigation.js +133 -0
- package/dist/animation/anim-graph-types.d.ts +25 -0
- package/dist/animation/anim-graph-types.d.ts.map +1 -0
- package/dist/animation/anim-graph-types.js +1 -0
- package/dist/animation/animation-clock.d.ts +213 -0
- package/dist/animation/animation-clock.d.ts.map +1 -0
- package/dist/animation/animation-clock.js +301 -0
- package/dist/animation/blend-node.d.ts +22 -0
- package/dist/animation/blend-node.d.ts.map +1 -0
- package/dist/animation/blend-node.js +97 -0
- package/dist/animation/camera-ownership.d.ts +250 -0
- package/dist/animation/camera-ownership.d.ts.map +1 -0
- package/dist/animation/camera-ownership.js +169 -0
- package/dist/animation/cinematic-cues.d.ts +200 -0
- package/dist/animation/cinematic-cues.d.ts.map +1 -0
- package/dist/animation/cinematic-cues.js +213 -0
- package/dist/animation/clip-map.d.ts +12 -0
- package/dist/animation/clip-map.d.ts.map +1 -0
- package/dist/animation/clip-map.js +37 -0
- package/dist/animation/gsap-registration.d.ts +119 -0
- package/dist/animation/gsap-registration.d.ts.map +1 -0
- package/dist/animation/gsap-registration.js +92 -0
- package/dist/animation/theatre-clock-binding.d.ts +89 -0
- package/dist/animation/theatre-clock-binding.d.ts.map +1 -0
- package/dist/animation/theatre-clock-binding.js +29 -0
- package/dist/animation/theatre-director.d.ts +242 -0
- package/dist/animation/theatre-director.d.ts.map +1 -0
- package/dist/animation/theatre-director.js +235 -0
- package/dist/animation/theatre-object-binding.d.ts +305 -0
- package/dist/animation/theatre-object-binding.d.ts.map +1 -0
- package/dist/animation/theatre-object-binding.js +351 -0
- package/dist/animation/xstate-animation-binding.d.ts +111 -0
- package/dist/animation/xstate-animation-binding.d.ts.map +1 -0
- package/dist/animation/xstate-animation-binding.js +307 -0
- package/dist/animation/xstate-animation-meta.d.ts +228 -0
- package/dist/animation/xstate-animation-meta.d.ts.map +1 -0
- package/dist/animation/xstate-animation-meta.js +221 -0
- package/dist/assets.d.ts +26 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +55 -0
- package/dist/audio/index.d.ts +4 -0
- package/dist/audio/index.d.ts.map +1 -0
- package/dist/audio/index.js +24 -0
- package/dist/audio/tone-clock-binding.d.ts +75 -0
- package/dist/audio/tone-clock-binding.d.ts.map +1 -0
- package/dist/audio/tone-clock-binding.js +29 -0
- package/dist/audio/tone-context.d.ts +114 -0
- package/dist/audio/tone-context.d.ts.map +1 -0
- package/dist/audio/tone-context.js +39 -0
- package/dist/audio/tone-offline-render.d.ts +90 -0
- package/dist/audio/tone-offline-render.d.ts.map +1 -0
- package/dist/audio/tone-offline-render.js +56 -0
- package/dist/audio/wav-encode.d.ts +38 -0
- package/dist/audio/wav-encode.d.ts.map +1 -0
- package/dist/audio/wav-encode.js +97 -0
- package/dist/core/game-loop.d.ts +21 -0
- package/dist/core/game-loop.d.ts.map +1 -0
- package/dist/core/game-loop.js +130 -0
- package/dist/core/system-runner.d.ts +120 -0
- package/dist/core/system-runner.d.ts.map +1 -0
- package/dist/core/system-runner.js +286 -0
- package/dist/core/types.d.ts +58 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +25 -0
- package/dist/data/data-asset.d.ts +101 -0
- package/dist/data/data-asset.d.ts.map +1 -0
- package/dist/data/data-asset.js +122 -0
- package/dist/data/data-check-core.d.ts +110 -0
- package/dist/data/data-check-core.d.ts.map +1 -0
- package/dist/data/data-check-core.js +178 -0
- package/dist/data/data-ref.d.ts +79 -0
- package/dist/data/data-ref.d.ts.map +1 -0
- package/dist/data/data-ref.js +130 -0
- package/dist/data/vite-plugin-data.d.ts +79 -0
- package/dist/data/vite-plugin-data.d.ts.map +1 -0
- package/dist/data/vite-plugin-data.js +217 -0
- package/dist/dev/console-bridge.d.ts +22 -0
- package/dist/dev/console-bridge.d.ts.map +1 -0
- package/dist/dev/console-bridge.js +71 -0
- package/dist/dev/debug-draw.d.ts +24 -0
- package/dist/dev/debug-draw.d.ts.map +1 -0
- package/dist/dev/debug-draw.js +73 -0
- package/dist/dev/logger.d.ts +30 -0
- package/dist/dev/logger.d.ts.map +1 -0
- package/dist/dev/logger.js +90 -0
- package/dist/ecs/component-manager.d.ts +189 -0
- package/dist/ecs/component-manager.d.ts.map +1 -0
- package/dist/ecs/component-manager.js +676 -0
- package/dist/ecs/game-component.d.ts +97 -0
- package/dist/ecs/game-component.d.ts.map +1 -0
- package/dist/ecs/game-component.js +80 -0
- package/dist/ecs/hmr-swap-report.d.ts +53 -0
- package/dist/ecs/hmr-swap-report.d.ts.map +1 -0
- package/dist/ecs/hmr-swap-report.js +55 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/input/input-manager.d.ts +596 -0
- package/dist/input/input-manager.d.ts.map +1 -0
- package/dist/input/input-manager.js +1564 -0
- package/dist/input/input-types.d.ts +171 -0
- package/dist/input/input-types.d.ts.map +1 -0
- package/dist/input/input-types.js +1 -0
- package/dist/input/prompt-labels.d.ts +21 -0
- package/dist/input/prompt-labels.d.ts.map +1 -0
- package/dist/input/prompt-labels.js +121 -0
- package/dist/input/rebind-controller.d.ts +59 -0
- package/dist/input/rebind-controller.d.ts.map +1 -0
- package/dist/input/rebind-controller.js +85 -0
- package/dist/input/schema.d.ts +16 -0
- package/dist/input/schema.d.ts.map +1 -0
- package/dist/input/schema.js +228 -0
- package/dist/loader.d.ts +43 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +59 -0
- package/dist/manifest/index.d.ts +5 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +8 -0
- package/dist/manifest/load-file.d.ts +4 -0
- package/dist/manifest/load-file.d.ts.map +1 -0
- package/dist/manifest/load-file.js +14 -0
- package/dist/manifest/load.d.ts +117 -0
- package/dist/manifest/load.d.ts.map +1 -0
- package/dist/manifest/load.js +255 -0
- package/dist/manifest/schema.d.ts +173 -0
- package/dist/manifest/schema.d.ts.map +1 -0
- package/dist/manifest/schema.js +302 -0
- package/dist/physics/collision-system.d.ts +41 -0
- package/dist/physics/collision-system.d.ts.map +1 -0
- package/dist/physics/collision-system.js +64 -0
- package/dist/physics/physics-registry.d.ts +45 -0
- package/dist/physics/physics-registry.d.ts.map +1 -0
- package/dist/physics/physics-registry.js +65 -0
- package/dist/physics/transform-writer.d.ts +16 -0
- package/dist/physics/transform-writer.d.ts.map +1 -0
- package/dist/physics/transform-writer.js +38 -0
- package/dist/physics/trigger-dispatch.d.ts +24 -0
- package/dist/physics/trigger-dispatch.d.ts.map +1 -0
- package/dist/physics/trigger-dispatch.js +80 -0
- package/dist/react/game-state.d.ts +105 -0
- package/dist/react/game-state.d.ts.map +1 -0
- package/dist/react/game-state.js +144 -0
- package/dist/react/use-data.d.ts +60 -0
- package/dist/react/use-data.d.ts.map +1 -0
- package/dist/react/use-data.js +96 -0
- package/dist/react/use-selection.d.ts +75 -0
- package/dist/react/use-selection.d.ts.map +1 -0
- package/dist/react/use-selection.js +90 -0
- package/dist/render/auto-batcher.d.ts +34 -0
- package/dist/render/auto-batcher.d.ts.map +1 -0
- package/dist/render/auto-batcher.js +140 -0
- package/dist/render/render-batch-system.d.ts +33 -0
- package/dist/render/render-batch-system.d.ts.map +1 -0
- package/dist/render/render-batch-system.js +230 -0
- package/dist/render/render-features.d.ts +47 -0
- package/dist/render/render-features.d.ts.map +1 -0
- package/dist/render/render-features.js +105 -0
- package/dist/render/render-settings.d.ts +36 -0
- package/dist/render/render-settings.d.ts.map +1 -0
- package/dist/render/render-settings.js +51 -0
- package/dist/runtime/create-runtime.d.ts +280 -0
- package/dist/runtime/create-runtime.d.ts.map +1 -0
- package/dist/runtime/create-runtime.js +795 -0
- package/dist/runtime/frame-selector-cache.d.ts +41 -0
- package/dist/runtime/frame-selector-cache.d.ts.map +1 -0
- package/dist/runtime/frame-selector-cache.js +65 -0
- package/dist/runtime/game.d.ts +433 -0
- package/dist/runtime/game.d.ts.map +1 -0
- package/dist/runtime/game.js +569 -0
- package/dist/runtime/input-router.d.ts +78 -0
- package/dist/runtime/input-router.d.ts.map +1 -0
- package/dist/runtime/input-router.js +171 -0
- package/dist/runtime/mount-game.d.ts +129 -0
- package/dist/runtime/mount-game.d.ts.map +1 -0
- package/dist/runtime/mount-game.js +152 -0
- package/dist/runtime/mount-manifest.d.ts +119 -0
- package/dist/runtime/mount-manifest.d.ts.map +1 -0
- package/dist/runtime/mount-manifest.js +204 -0
- package/dist/runtime/render-audio-control.d.ts +110 -0
- package/dist/runtime/render-audio-control.d.ts.map +1 -0
- package/dist/runtime/render-audio-control.js +111 -0
- package/dist/runtime/render-control.d.ts +291 -0
- package/dist/runtime/render-control.d.ts.map +1 -0
- package/dist/runtime/render-control.js +264 -0
- package/dist/runtime/render-seed.d.ts +57 -0
- package/dist/runtime/render-seed.d.ts.map +1 -0
- package/dist/runtime/render-seed.js +74 -0
- package/dist/runtime/scene-ui-bridge.d.ts +69 -0
- package/dist/runtime/scene-ui-bridge.d.ts.map +1 -0
- package/dist/runtime/scene-ui-bridge.js +23 -0
- package/dist/runtime/scene-ui-data.d.ts +13 -0
- package/dist/runtime/scene-ui-data.d.ts.map +1 -0
- package/dist/runtime/scene-ui-data.js +92 -0
- package/dist/runtime/state-bridge.d.ts +47 -0
- package/dist/runtime/state-bridge.d.ts.map +1 -0
- package/dist/runtime/state-bridge.js +53 -0
- package/dist/runtime/types.d.ts +179 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/runtime/types.js +1 -0
- package/dist/scene/asset-loaders.d.ts +79 -0
- package/dist/scene/asset-loaders.d.ts.map +1 -0
- package/dist/scene/asset-loaders.js +141 -0
- package/dist/scene/asset-paths.d.ts +11 -0
- package/dist/scene/asset-paths.d.ts.map +1 -0
- package/dist/scene/asset-paths.js +108 -0
- package/dist/scene/asset-ref-check.d.ts +88 -0
- package/dist/scene/asset-ref-check.d.ts.map +1 -0
- package/dist/scene/asset-ref-check.js +214 -0
- package/dist/scene/asset-registry.d.ts +30 -0
- package/dist/scene/asset-registry.d.ts.map +1 -0
- package/dist/scene/asset-registry.js +50 -0
- package/dist/scene/collider-dimensions.d.ts +63 -0
- package/dist/scene/collider-dimensions.d.ts.map +1 -0
- package/dist/scene/collider-dimensions.js +98 -0
- package/dist/scene/component-registry.d.ts +17 -0
- package/dist/scene/component-registry.d.ts.map +1 -0
- package/dist/scene/component-registry.js +28 -0
- package/dist/scene/defaults.d.ts +252 -0
- package/dist/scene/defaults.d.ts.map +1 -0
- package/dist/scene/defaults.js +151 -0
- package/dist/scene/geometries/index.d.ts +8 -0
- package/dist/scene/geometries/index.d.ts.map +1 -0
- package/dist/scene/geometries/index.js +7 -0
- package/dist/scene/geometries/terrain.d.ts +2 -0
- package/dist/scene/geometries/terrain.d.ts.map +1 -0
- package/dist/scene/geometries/terrain.js +37 -0
- package/dist/scene/geometry-registry.d.ts +24 -0
- package/dist/scene/geometry-registry.d.ts.map +1 -0
- package/dist/scene/geometry-registry.js +20 -0
- package/dist/scene/instance-registry.d.ts +36 -0
- package/dist/scene/instance-registry.d.ts.map +1 -0
- package/dist/scene/instance-registry.js +55 -0
- package/dist/scene/instancers/grid.d.ts +2 -0
- package/dist/scene/instancers/grid.d.ts.map +1 -0
- package/dist/scene/instancers/grid.js +36 -0
- package/dist/scene/instancers/index.d.ts +8 -0
- package/dist/scene/instancers/index.d.ts.map +1 -0
- package/dist/scene/instancers/index.js +7 -0
- package/dist/scene/light-camera-factory.d.ts +23 -0
- package/dist/scene/light-camera-factory.d.ts.map +1 -0
- package/dist/scene/light-camera-factory.js +68 -0
- package/dist/scene/material-factory.d.ts +17 -0
- package/dist/scene/material-factory.d.ts.map +1 -0
- package/dist/scene/material-factory.js +197 -0
- package/dist/scene/material-registry.d.ts +40 -0
- package/dist/scene/material-registry.d.ts.map +1 -0
- package/dist/scene/material-registry.js +44 -0
- package/dist/scene/materials/index.d.ts +8 -0
- package/dist/scene/materials/index.d.ts.map +1 -0
- package/dist/scene/materials/index.js +7 -0
- package/dist/scene/materials/water.d.ts +2 -0
- package/dist/scene/materials/water.d.ts.map +1 -0
- package/dist/scene/materials/water.js +54 -0
- package/dist/scene/parse.d.ts +23 -0
- package/dist/scene/parse.d.ts.map +1 -0
- package/dist/scene/parse.js +179 -0
- package/dist/scene/particles-factory.d.ts +33 -0
- package/dist/scene/particles-factory.d.ts.map +1 -0
- package/dist/scene/particles-factory.js +282 -0
- package/dist/scene/scene-apply.d.ts +109 -0
- package/dist/scene/scene-apply.d.ts.map +1 -0
- package/dist/scene/scene-apply.js +326 -0
- package/dist/scene/scene-diff-schema.d.ts +285 -0
- package/dist/scene/scene-diff-schema.d.ts.map +1 -0
- package/dist/scene/scene-diff-schema.js +92 -0
- package/dist/scene/scene-diff-types.d.ts +40 -0
- package/dist/scene/scene-diff-types.d.ts.map +1 -0
- package/dist/scene/scene-diff-types.js +14 -0
- package/dist/scene/scene-loader.d.ts +177 -0
- package/dist/scene/scene-loader.d.ts.map +1 -0
- package/dist/scene/scene-loader.js +1213 -0
- package/dist/scene/scene-query.d.ts +11 -0
- package/dist/scene/scene-query.d.ts.map +1 -0
- package/dist/scene/scene-query.js +63 -0
- package/dist/scene/scene-types.d.ts +10 -0
- package/dist/scene/scene-types.d.ts.map +1 -0
- package/dist/scene/scene-types.js +8 -0
- package/dist/scene/scene-version.d.ts +26 -0
- package/dist/scene/scene-version.d.ts.map +1 -0
- package/dist/scene/scene-version.js +34 -0
- package/dist/scene/schema/animation.d.ts +8 -0
- package/dist/scene/schema/animation.d.ts.map +1 -0
- package/dist/scene/schema/animation.js +42 -0
- package/dist/scene/schema/audio.d.ts +13 -0
- package/dist/scene/schema/audio.d.ts.map +1 -0
- package/dist/scene/schema/audio.js +22 -0
- package/dist/scene/schema/camera.d.ts +28 -0
- package/dist/scene/schema/camera.d.ts.map +1 -0
- package/dist/scene/schema/camera.js +17 -0
- package/dist/scene/schema/collider.d.ts +40 -0
- package/dist/scene/schema/collider.d.ts.map +1 -0
- package/dist/scene/schema/collider.js +55 -0
- package/dist/scene/schema/entity-ref.d.ts +31 -0
- package/dist/scene/schema/entity-ref.d.ts.map +1 -0
- package/dist/scene/schema/entity-ref.js +61 -0
- package/dist/scene/schema/entity.d.ts +1036 -0
- package/dist/scene/schema/entity.d.ts.map +1 -0
- package/dist/scene/schema/entity.js +153 -0
- package/dist/scene/schema/environment.d.ts +425 -0
- package/dist/scene/schema/environment.d.ts.map +1 -0
- package/dist/scene/schema/environment.js +357 -0
- package/dist/scene/schema/index.d.ts +39 -0
- package/dist/scene/schema/index.d.ts.map +1 -0
- package/dist/scene/schema/index.js +20 -0
- package/dist/scene/schema/instances.d.ts +14 -0
- package/dist/scene/schema/instances.d.ts.map +1 -0
- package/dist/scene/schema/instances.js +28 -0
- package/dist/scene/schema/joint.d.ts +23 -0
- package/dist/scene/schema/joint.d.ts.map +1 -0
- package/dist/scene/schema/joint.js +23 -0
- package/dist/scene/schema/light.d.ts +38 -0
- package/dist/scene/schema/light.d.ts.map +1 -0
- package/dist/scene/schema/light.js +26 -0
- package/dist/scene/schema/material.d.ts +199 -0
- package/dist/scene/schema/material.d.ts.map +1 -0
- package/dist/scene/schema/material.js +99 -0
- package/dist/scene/schema/mesh.d.ts +48 -0
- package/dist/scene/schema/mesh.d.ts.map +1 -0
- package/dist/scene/schema/mesh.js +82 -0
- package/dist/scene/schema/particles.d.ts +2178 -0
- package/dist/scene/schema/particles.d.ts.map +1 -0
- package/dist/scene/schema/particles.js +321 -0
- package/dist/scene/schema/physics.d.ts +56 -0
- package/dist/scene/schema/physics.d.ts.map +1 -0
- package/dist/scene/schema/physics.js +37 -0
- package/dist/scene/schema/scene-file.d.ts +304 -0
- package/dist/scene/schema/scene-file.d.ts.map +1 -0
- package/dist/scene/schema/scene-file.js +262 -0
- package/dist/scene/schema/shadow.d.ts +28 -0
- package/dist/scene/schema/shadow.d.ts.map +1 -0
- package/dist/scene/schema/shadow.js +20 -0
- package/dist/scene/schema/spline.d.ts +25 -0
- package/dist/scene/schema/spline.d.ts.map +1 -0
- package/dist/scene/schema/spline.js +15 -0
- package/dist/scene/schema/tuples.d.ts +12 -0
- package/dist/scene/schema/tuples.d.ts.map +1 -0
- package/dist/scene/schema/tuples.js +14 -0
- package/dist/scene/schema/ui.d.ts +880 -0
- package/dist/scene/schema/ui.d.ts.map +1 -0
- package/dist/scene/schema/ui.js +506 -0
- package/dist/scene/user-data.d.ts +171 -0
- package/dist/scene/user-data.d.ts.map +1 -0
- package/dist/scene/user-data.js +137 -0
- package/dist/setup/setup-audio.d.ts +20 -0
- package/dist/setup/setup-audio.d.ts.map +1 -0
- package/dist/setup/setup-audio.js +41 -0
- package/dist/setup/setup-particles.d.ts +17 -0
- package/dist/setup/setup-particles.d.ts.map +1 -0
- package/dist/setup/setup-particles.js +16 -0
- package/dist/setup/setup-physics.d.ts +25 -0
- package/dist/setup/setup-physics.d.ts.map +1 -0
- package/dist/setup/setup-physics.js +51 -0
- package/dist/setup/setup-renderer.d.ts +69 -0
- package/dist/setup/setup-renderer.d.ts.map +1 -0
- package/dist/setup/setup-renderer.js +363 -0
- package/dist/tools/define-tool.d.ts +105 -0
- package/dist/tools/define-tool.d.ts.map +1 -0
- package/dist/tools/define-tool.js +82 -0
- package/dist/world2d/authoring-2d.d.ts +76 -0
- package/dist/world2d/authoring-2d.d.ts.map +1 -0
- package/dist/world2d/authoring-2d.js +176 -0
- package/dist/world2d/capture-to-scene2d.d.ts +5 -0
- package/dist/world2d/capture-to-scene2d.d.ts.map +1 -0
- package/dist/world2d/capture-to-scene2d.js +49 -0
- package/dist/world2d/collision-2d.d.ts +52 -0
- package/dist/world2d/collision-2d.d.ts.map +1 -0
- package/dist/world2d/collision-2d.js +70 -0
- package/dist/world2d/components-2d.d.ts +47 -0
- package/dist/world2d/components-2d.d.ts.map +1 -0
- package/dist/world2d/components-2d.js +77 -0
- package/dist/world2d/index.d.ts +34 -0
- package/dist/world2d/index.d.ts.map +1 -0
- package/dist/world2d/index.js +32 -0
- package/dist/world2d/ingest-iframe-2d.d.ts +82 -0
- package/dist/world2d/ingest-iframe-2d.d.ts.map +1 -0
- package/dist/world2d/ingest-iframe-2d.js +166 -0
- package/dist/world2d/ingest2d.d.ts +97 -0
- package/dist/world2d/ingest2d.d.ts.map +1 -0
- package/dist/world2d/ingest2d.js +40 -0
- package/dist/world2d/physics2d-registry.d.ts +24 -0
- package/dist/world2d/physics2d-registry.d.ts.map +1 -0
- package/dist/world2d/physics2d-registry.js +38 -0
- package/dist/world2d/pixi-game-adapter.d.ts +107 -0
- package/dist/world2d/pixi-game-adapter.d.ts.map +1 -0
- package/dist/world2d/pixi-game-adapter.js +211 -0
- package/dist/world2d/pixi-surface.d.ts +39 -0
- package/dist/world2d/pixi-surface.d.ts.map +1 -0
- package/dist/world2d/pixi-surface.js +47 -0
- package/dist/world2d/scene-capture-2d.d.ts +43 -0
- package/dist/world2d/scene-capture-2d.d.ts.map +1 -0
- package/dist/world2d/scene-capture-2d.js +92 -0
- package/dist/world2d/scene2d-loader.d.ts +27 -0
- package/dist/world2d/scene2d-loader.d.ts.map +1 -0
- package/dist/world2d/scene2d-loader.js +274 -0
- package/dist/world2d/schema/entity2d.d.ts +102 -0
- package/dist/world2d/schema/entity2d.d.ts.map +1 -0
- package/dist/world2d/schema/entity2d.js +119 -0
- package/dist/world2d/schema/physics2d.d.ts +46 -0
- package/dist/world2d/schema/physics2d.d.ts.map +1 -0
- package/dist/world2d/schema/physics2d.js +45 -0
- package/dist/world2d/schema/sprite.d.ts +42 -0
- package/dist/world2d/schema/sprite.d.ts.map +1 -0
- package/dist/world2d/schema/sprite.js +63 -0
- package/dist/world2d/schema/tilemap.d.ts +15 -0
- package/dist/world2d/schema/tilemap.d.ts.map +1 -0
- package/dist/world2d/schema/tilemap.js +19 -0
- package/dist/world2d/schema/tuples2d.d.ts +20 -0
- package/dist/world2d/schema/tuples2d.d.ts.map +1 -0
- package/dist/world2d/schema/tuples2d.js +19 -0
- package/dist/world2d/system-adapters-2d.d.ts +16 -0
- package/dist/world2d/system-adapters-2d.d.ts.map +1 -0
- package/dist/world2d/system-adapters-2d.js +37 -0
- package/dist/world2d/transform-writer-2d.d.ts +16 -0
- package/dist/world2d/transform-writer-2d.d.ts.map +1 -0
- package/dist/world2d/transform-writer-2d.js +22 -0
- package/dist/world2d/types.d.ts +53 -0
- package/dist/world2d/types.d.ts.map +1 -0
- package/dist/world2d/types.js +1 -0
- package/package.json +18 -4
- package/src/adapter/authoring.ts +10 -0
- package/src/adapter/first-party-systems.ts +23 -34
- package/src/adapter/index.ts +1 -3
- package/src/adapter/system-adapter.ts +15 -22
- package/src/adapter/vgai-scene-game-adapter.ts +5 -14
- package/src/animation/anim-graph-types.ts +12 -43
- package/src/animation/animation-clock.ts +479 -0
- package/src/animation/camera-ownership.ts +467 -0
- package/src/animation/cinematic-cues.ts +451 -0
- package/src/animation/clip-map.ts +41 -0
- package/src/animation/gsap-registration.ts +184 -0
- package/src/animation/theatre-clock-binding.ts +111 -0
- package/src/animation/theatre-director.ts +347 -0
- package/src/animation/theatre-object-binding.ts +661 -0
- package/src/animation/xstate-animation-binding.ts +398 -0
- package/src/animation/xstate-animation-meta.ts +282 -0
- package/src/audio/index.ts +39 -7
- package/src/audio/tone-clock-binding.ts +98 -0
- package/src/audio/tone-context.ts +129 -0
- package/src/audio/tone-offline-render.ts +167 -0
- package/src/audio/wav-encode.ts +119 -0
- package/src/core/game-loop.ts +17 -0
- package/src/core/types.ts +13 -0
- package/src/data/data-asset.ts +167 -0
- package/src/data/data-check-core.ts +242 -0
- package/src/data/data-ref.ts +145 -0
- package/src/data/vite-plugin-data.ts +290 -0
- package/src/index.ts +48 -0
- package/src/input/input-manager.ts +1206 -32
- package/src/input/input-types.ts +155 -3
- package/src/input/prompt-labels.ts +122 -0
- package/src/input/rebind-controller.ts +105 -0
- package/src/input/schema.ts +206 -52
- package/src/react/use-data.ts +114 -0
- package/src/react/use-selection.tsx +135 -0
- package/src/runtime/create-runtime.ts +30 -9
- package/src/runtime/render-audio-control.ts +168 -0
- package/src/runtime/render-control.ts +522 -0
- package/src/runtime/render-seed.ts +79 -0
- package/src/runtime/types.ts +0 -5
- package/src/scene/asset-loaders.ts +10 -36
- package/src/scene/asset-paths.ts +0 -2
- package/src/scene/asset-ref-check.ts +248 -0
- package/src/scene/parse.ts +133 -0
- package/src/scene/scene-loader.ts +81 -96
- package/src/scene/schema/animation.ts +30 -79
- package/src/scene/schema/entity.ts +20 -0
- package/src/scene/schema/index.ts +2 -12
- package/src/scene/user-data.ts +8 -9
- package/src/setup/setup-renderer.ts +9 -2
- package/src/tools/define-tool.ts +152 -0
- package/src/animation/anim-graph.ts +0 -406
- package/src/animation/anim-system.ts +0 -28
- package/src/animation/property-track.ts +0 -178
- package/src/animation/schema.ts +0 -204
- package/src/audio/ambient.ts +0 -300
- package/src/audio/impacts.ts +0 -212
- package/src/audio/movement.ts +0 -140
- package/src/audio/musical.ts +0 -200
- package/src/audio/ui-sounds.ts +0 -171
- package/src/audio/vehicle.ts +0 -235
- package/src/audio/weapons.ts +0 -152
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { SystemPhaseName } from '../core/types';
|
|
2
|
+
import type { AnimationClock } from './animation-clock';
|
|
3
|
+
/**
|
|
4
|
+
* D7 — register a native, paused GSAP timeline on the canonical
|
|
5
|
+
* `AnimationClock` (spec §10 D7, §5.5 GSAP Contract, §3.2).
|
|
6
|
+
*
|
|
7
|
+
* Mirrors `theatre-clock-binding.ts` (D2)'s shape: VGAI's entire GSAP
|
|
8
|
+
* integration is "who drives time". Games build GSAP timelines with GSAP's
|
|
9
|
+
* own native, un-renamed API (`gsap.timeline()`, `.to()`, `.from()`, …,
|
|
10
|
+
* spec §5.5) — this module never wraps or renames the tween-building API. It
|
|
11
|
+
* only stores the native `gsap.core.Timeline` and seeks it every time the
|
|
12
|
+
* clock moves, exactly like the Theatre sequence binding seeks
|
|
13
|
+
* `sequence.position`.
|
|
14
|
+
*
|
|
15
|
+
* ## Unregistered GSAP is unaffected (§5.5 contract)
|
|
16
|
+
*
|
|
17
|
+
* `gsap.to(enemy.position, { … })` called anywhere in game code — without
|
|
18
|
+
* ever touching this module — keeps running on GSAP's own real-time,
|
|
19
|
+
* `requestAnimationFrame`-driven global ticker exactly as GSAP ships it. This
|
|
20
|
+
* module does not touch `gsap.ticker`, `gsap.globalTimeline`, or any other
|
|
21
|
+
* global GSAP state, precisely so it cannot perturb that ordinary real-time
|
|
22
|
+
* code path. Only a timeline explicitly passed to `registerGsap` — and
|
|
23
|
+
* created paused — participates in deterministic scrub/export.
|
|
24
|
+
*
|
|
25
|
+
* ## Why a PAUSED timeline seeked with `.time()` is deterministic
|
|
26
|
+
*
|
|
27
|
+
* GSAP's global ticker only auto-advances animations that are actually
|
|
28
|
+
* playing; a timeline created with `{ paused: true }` (and never resumed) is
|
|
29
|
+
* never touched by the ticker's rAF-driven `dt` accumulation, so wall-clock
|
|
30
|
+
* elapsed time, dropped frames, and GSAP's lag-smoothing heuristics (which
|
|
31
|
+
* exist purely to compensate a *playing* animation for an irregular ticker
|
|
32
|
+
* `dt`) cannot affect it. The only thing that ever moves a registered
|
|
33
|
+
* timeline's playhead is this module's own `timeline.time(clock.time)` call,
|
|
34
|
+
* driven synchronously off the clock — same story as `theatre-clock-binding`
|
|
35
|
+
* driving `sequence.position` off the clock instead of Theatre's own raf
|
|
36
|
+
* loop. This is proven directly against the real `gsap` runtime in
|
|
37
|
+
* `packages/engine/test/gsap-registration.test.ts` (including a real
|
|
38
|
+
* wall-clock `setTimeout` wait between two `clock.seek()` calls to the same
|
|
39
|
+
* time, asserting the sampled value is bit-for-bit identical — nothing
|
|
40
|
+
* "polished" the value while real time passed). `timeline.time(value)` (not
|
|
41
|
+
* `.seek(value)`) is used because it takes only a numeric offset in the
|
|
42
|
+
* clock's own second-denominated domain — `.seek()`'s label-string overload
|
|
43
|
+
* is irrelevant here and would only widen the accepted input past what a
|
|
44
|
+
* clock time actually is. Neither call resumes playback; both simply
|
|
45
|
+
* position an already-paused timeline, which is why this module never calls
|
|
46
|
+
* `.play()`/`.resume()`.
|
|
47
|
+
*
|
|
48
|
+
* ## Phase choice
|
|
49
|
+
*
|
|
50
|
+
* Registered by default at the `'animation'` phase — the same phase
|
|
51
|
+
* `bindClockToTheatreSequence` (D2) uses, and the same phase
|
|
52
|
+
* XState-bound `AnimationMixer` playback ticks in (see `ARCHITECTURE.md`'s
|
|
53
|
+
* phase table). A registered GSAP timeline commonly targets the same
|
|
54
|
+
* Object3D/material properties a Theatre-driven object binding also writes,
|
|
55
|
+
* so keeping both in the `'animation'` phase (ahead of `'preRender'`, where
|
|
56
|
+
* camera/material reads happen) avoids ordering surprises.
|
|
57
|
+
*/
|
|
58
|
+
export interface GsapRegistrationOptions {
|
|
59
|
+
/** Which `AnimationClock` phase to seek the timeline in. Defaults to `'animation'`. */
|
|
60
|
+
phase?: SystemPhaseName;
|
|
61
|
+
}
|
|
62
|
+
export interface GsapRegistration {
|
|
63
|
+
/**
|
|
64
|
+
* Removes the clock evaluator and stops driving the timeline (no further
|
|
65
|
+
* `timeline.time(...)` calls occur after this). Also frees this
|
|
66
|
+
* clock+timeline pair for re-registration (see `GsapRegistrationError`'s
|
|
67
|
+
* `'duplicate'` case below).
|
|
68
|
+
*/
|
|
69
|
+
dispose(): void;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Thrown by `registerGsap` when the input does not satisfy the D7 contract.
|
|
73
|
+
* `code` distinguishes the three rejection reasons so a caller can branch on
|
|
74
|
+
* it programmatically instead of string-matching `message`:
|
|
75
|
+
*
|
|
76
|
+
* - `'not-a-timeline'` — the second argument is not a real
|
|
77
|
+
* `gsap.core.Timeline` instance (e.g. a plain object, a single GSAP
|
|
78
|
+
* `Tween`, or `undefined`). Checked with `instanceof gsap.core.Timeline`
|
|
79
|
+
* against the actual installed GSAP runtime, not duck-typing, so a
|
|
80
|
+
* same-shaped fake cannot slip through.
|
|
81
|
+
* - `'not-paused'` — the timeline exists but was not created with
|
|
82
|
+
* `{ paused: true }` (or was later resumed) at registration time. This
|
|
83
|
+
* module deliberately REJECTS rather than silently force-pausing: a
|
|
84
|
+
* caller who already relies on the timeline advancing in real time (e.g.
|
|
85
|
+
* a UI polish tween that happens to also get registered by mistake) would
|
|
86
|
+
* otherwise have its behavior silently changed. Rejecting makes the fix
|
|
87
|
+
* (`gsap.timeline({ paused: true })`) obvious at the call site instead of
|
|
88
|
+
* producing a hard-to-notice runtime pause.
|
|
89
|
+
* - `'duplicate'` — this exact timeline is already registered against this
|
|
90
|
+
* exact clock. Detected per `(clock, timeline)` pair (not globally), so
|
|
91
|
+
* the same timeline may legitimately be registered against two
|
|
92
|
+
* independent clocks/cinematic contexts — mirroring D2's "multiple
|
|
93
|
+
* projects/sheets coexist" allowance — while registering it twice on the
|
|
94
|
+
* SAME clock (almost always a bug: a duplicate `useEffect` run, a missed
|
|
95
|
+
* disposer, …) is caught immediately instead of silently doubling the
|
|
96
|
+
* number of `.time()` writes per crossing.
|
|
97
|
+
*/
|
|
98
|
+
export declare class GsapRegistrationError extends Error {
|
|
99
|
+
readonly code: 'not-a-timeline' | 'not-paused' | 'duplicate';
|
|
100
|
+
constructor(message: string, code: 'not-a-timeline' | 'not-paused' | 'duplicate');
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Register a native, paused `gsap.core.Timeline` on `clock`: from now on,
|
|
104
|
+
* every clock crossing (`seek`, `advance`, idempotent re-seeks, `setRange`
|
|
105
|
+
* clamps — anything that fires a `ClockEvaluator`, per `animation-clock.ts`)
|
|
106
|
+
* positions the timeline at `clock.time` via `timeline.time(clock.time)`.
|
|
107
|
+
* The timeline is never played/resumed — it stays paused and is driven
|
|
108
|
+
* exclusively by the clock, both in live preview and in offline
|
|
109
|
+
* frame-by-frame export (whatever calls `clock.seek`/`clock.seekFrame`).
|
|
110
|
+
*
|
|
111
|
+
* Throws `GsapRegistrationError` if `timeline` is not a real
|
|
112
|
+
* `gsap.core.Timeline`, is not paused, or is already registered against this
|
|
113
|
+
* `clock` — see that class's doc comment for the exact policy on each case.
|
|
114
|
+
*
|
|
115
|
+
* Returns a `GsapRegistration` whose `dispose()` removes the clock evaluator
|
|
116
|
+
* (mirrors `bindClockToTheatreSequence`'s `TheatreClockBinding`).
|
|
117
|
+
*/
|
|
118
|
+
export declare function registerGsap(clock: AnimationClock, timeline: gsap.core.Timeline, options?: GsapRegistrationOptions): GsapRegistration;
|
|
119
|
+
//# sourceMappingURL=gsap-registration.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gsap-registration.d.ts","sourceRoot":"","sources":["../../src/animation/gsap-registration.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AAEH,MAAM,WAAW,uBAAuB;IACtC,uFAAuF;IACvF,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;IAG5C,QAAQ,CAAC,IAAI,EAAE,gBAAgB,GAAG,YAAY,GAAG,WAAW;gBAD5D,OAAO,EAAE,MAAM,EACN,IAAI,EAAE,gBAAgB,GAAG,YAAY,GAAG,WAAW;CAK/D;AAQD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAC5B,OAAO,GAAE,uBAA4B,GACpC,gBAAgB,CA6ClB"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import gsap from 'gsap';
|
|
2
|
+
/**
|
|
3
|
+
* Thrown by `registerGsap` when the input does not satisfy the D7 contract.
|
|
4
|
+
* `code` distinguishes the three rejection reasons so a caller can branch on
|
|
5
|
+
* it programmatically instead of string-matching `message`:
|
|
6
|
+
*
|
|
7
|
+
* - `'not-a-timeline'` — the second argument is not a real
|
|
8
|
+
* `gsap.core.Timeline` instance (e.g. a plain object, a single GSAP
|
|
9
|
+
* `Tween`, or `undefined`). Checked with `instanceof gsap.core.Timeline`
|
|
10
|
+
* against the actual installed GSAP runtime, not duck-typing, so a
|
|
11
|
+
* same-shaped fake cannot slip through.
|
|
12
|
+
* - `'not-paused'` — the timeline exists but was not created with
|
|
13
|
+
* `{ paused: true }` (or was later resumed) at registration time. This
|
|
14
|
+
* module deliberately REJECTS rather than silently force-pausing: a
|
|
15
|
+
* caller who already relies on the timeline advancing in real time (e.g.
|
|
16
|
+
* a UI polish tween that happens to also get registered by mistake) would
|
|
17
|
+
* otherwise have its behavior silently changed. Rejecting makes the fix
|
|
18
|
+
* (`gsap.timeline({ paused: true })`) obvious at the call site instead of
|
|
19
|
+
* producing a hard-to-notice runtime pause.
|
|
20
|
+
* - `'duplicate'` — this exact timeline is already registered against this
|
|
21
|
+
* exact clock. Detected per `(clock, timeline)` pair (not globally), so
|
|
22
|
+
* the same timeline may legitimately be registered against two
|
|
23
|
+
* independent clocks/cinematic contexts — mirroring D2's "multiple
|
|
24
|
+
* projects/sheets coexist" allowance — while registering it twice on the
|
|
25
|
+
* SAME clock (almost always a bug: a duplicate `useEffect` run, a missed
|
|
26
|
+
* disposer, …) is caught immediately instead of silently doubling the
|
|
27
|
+
* number of `.time()` writes per crossing.
|
|
28
|
+
*/
|
|
29
|
+
export class GsapRegistrationError extends Error {
|
|
30
|
+
code;
|
|
31
|
+
constructor(message, code) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.code = code;
|
|
34
|
+
this.name = 'GsapRegistrationError';
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Per-clock membership of already-registered timelines. A WeakMap keyed by
|
|
38
|
+
// clock (not a field on AnimationClock itself — D1 owns no knowledge of
|
|
39
|
+
// GSAP) holding a WeakSet keyed by timeline, so neither the clock nor a
|
|
40
|
+
// disposed/dropped timeline is kept alive by this module.
|
|
41
|
+
const registeredByClock = new WeakMap();
|
|
42
|
+
/**
|
|
43
|
+
* Register a native, paused `gsap.core.Timeline` on `clock`: from now on,
|
|
44
|
+
* every clock crossing (`seek`, `advance`, idempotent re-seeks, `setRange`
|
|
45
|
+
* clamps — anything that fires a `ClockEvaluator`, per `animation-clock.ts`)
|
|
46
|
+
* positions the timeline at `clock.time` via `timeline.time(clock.time)`.
|
|
47
|
+
* The timeline is never played/resumed — it stays paused and is driven
|
|
48
|
+
* exclusively by the clock, both in live preview and in offline
|
|
49
|
+
* frame-by-frame export (whatever calls `clock.seek`/`clock.seekFrame`).
|
|
50
|
+
*
|
|
51
|
+
* Throws `GsapRegistrationError` if `timeline` is not a real
|
|
52
|
+
* `gsap.core.Timeline`, is not paused, or is already registered against this
|
|
53
|
+
* `clock` — see that class's doc comment for the exact policy on each case.
|
|
54
|
+
*
|
|
55
|
+
* Returns a `GsapRegistration` whose `dispose()` removes the clock evaluator
|
|
56
|
+
* (mirrors `bindClockToTheatreSequence`'s `TheatreClockBinding`).
|
|
57
|
+
*/
|
|
58
|
+
export function registerGsap(clock, timeline, options = {}) {
|
|
59
|
+
if (!(timeline instanceof gsap.core.Timeline)) {
|
|
60
|
+
throw new GsapRegistrationError('[registerGsap] expected a native gsap.core.Timeline (e.g. gsap.timeline({ paused: true })), ' +
|
|
61
|
+
`got ${timeline === null ? 'null' : typeof timeline}`, 'not-a-timeline');
|
|
62
|
+
}
|
|
63
|
+
if (!timeline.paused()) {
|
|
64
|
+
throw new GsapRegistrationError('[registerGsap] timeline must be created paused — gsap.timeline({ paused: true }) — before ' +
|
|
65
|
+
'registration; a registered timeline is driven exclusively by the clock and must never also ' +
|
|
66
|
+
'be advancing under its own real-time playback', 'not-paused');
|
|
67
|
+
}
|
|
68
|
+
let seenForClock = registeredByClock.get(clock);
|
|
69
|
+
if (!seenForClock) {
|
|
70
|
+
seenForClock = new WeakSet();
|
|
71
|
+
registeredByClock.set(clock, seenForClock);
|
|
72
|
+
}
|
|
73
|
+
if (seenForClock.has(timeline)) {
|
|
74
|
+
throw new GsapRegistrationError('[registerGsap] this timeline is already registered against this clock — dispose() the prior ' +
|
|
75
|
+
'registration before registering it again', 'duplicate');
|
|
76
|
+
}
|
|
77
|
+
seenForClock.add(timeline);
|
|
78
|
+
const phase = options.phase ?? 'animation';
|
|
79
|
+
const handle = clock.subscribe(phase, () => {
|
|
80
|
+
timeline.time(clock.time);
|
|
81
|
+
});
|
|
82
|
+
let disposed = false;
|
|
83
|
+
return {
|
|
84
|
+
dispose() {
|
|
85
|
+
if (disposed)
|
|
86
|
+
return;
|
|
87
|
+
disposed = true;
|
|
88
|
+
handle.dispose();
|
|
89
|
+
seenForClock.delete(timeline);
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { ISequence } from '@theatre/core';
|
|
2
|
+
import type { SystemPhaseName } from '../core/types';
|
|
3
|
+
import type { AnimationClock } from './animation-clock';
|
|
4
|
+
/**
|
|
5
|
+
* D2 — bind the canonical `AnimationClock` to a Theatre sequence's playhead
|
|
6
|
+
* (spec §10 D2, §5.3, §3.2).
|
|
7
|
+
*
|
|
8
|
+
* This is VGAI's ENTIRE glue for Theatre integration on the clock side:
|
|
9
|
+
* games import and configure `@theatre/core` with its own native vocabulary
|
|
10
|
+
* (`getProject`/`types`/`sheet`/`object`, spec §5.3) — there is no renamed
|
|
11
|
+
* Theatre API here. The only thing VGAI owns is *who drives time*: the
|
|
12
|
+
* canonical clock is the single source of truth, and this binding seeks
|
|
13
|
+
* Theatre's sequence position to match it every time the clock moves. Theatre
|
|
14
|
+
* must never be left to drive its own `requestAnimationFrame` loop — see the
|
|
15
|
+
* module doc on `animation-clock.ts` for why (deterministic export, offline
|
|
16
|
+
* scrubbing, no wall-clock dependency).
|
|
17
|
+
*
|
|
18
|
+
* ## Why setting `sequence.position` is enough (no `sequence.play()`)
|
|
19
|
+
*
|
|
20
|
+
* Theatre's `ISequence.position` setter synchronously updates every bound
|
|
21
|
+
* `SheetObject`'s pull-based `.value` (proven against the real `@theatre/core`
|
|
22
|
+
* runtime in `packages/engine/test/theatre-binding.test.ts` — setting
|
|
23
|
+
* `position` and immediately reading `.value` reflects the new keyframe
|
|
24
|
+
* interpolation with no `requestAnimationFrame`/ticker wait, which is exactly
|
|
25
|
+
* what makes this safe to drive from a synchronous, wall-clock-free
|
|
26
|
+
* `AnimationClock.seek()`/`advance()` call, including headlessly in Node for
|
|
27
|
+
* the render/export seam, I2). Theatre's *push* notification channel
|
|
28
|
+
* (`onValuesChange`/`onChange`) is batched on its own internal raf-driven
|
|
29
|
+
* ticker — it is not delivered 1:1 with each programmatic `position` write,
|
|
30
|
+
* so a subscriber can observe several coalesced position writes as a single
|
|
31
|
+
* notification, or (in a headless/no-raf context) none at all — so object
|
|
32
|
+
* bindings (`theatre-object-binding.ts`) deliberately read `sheetObject.value`
|
|
33
|
+
* (pull) after this binding has run, rather than subscribing to Theatre's
|
|
34
|
+
* push channel, to stay exactly in lockstep with the clock.
|
|
35
|
+
*
|
|
36
|
+
* ## Phase choice
|
|
37
|
+
*
|
|
38
|
+
* Note on phase semantics: `phase` here orders evaluators WITHIN a single
|
|
39
|
+
* clock `emit()` — i.e. within one `seek()`/`advance()` call — using the
|
|
40
|
+
* engine's `SystemPhaseName` vocabulary purely as a shared, familiar naming
|
|
41
|
+
* convention (`animation-clock.ts`'s module doc). It does NOT mean an
|
|
42
|
+
* evaluator registered at, say, `'preRender'` executes during the live
|
|
43
|
+
* engine's own `system-runner` `preRender` phase call within a running RAF
|
|
44
|
+
* frame — the `AnimationClock` is independent of the live game loop's phase
|
|
45
|
+
* execution, and during offline export/scrub there is no RAF frame at all.
|
|
46
|
+
* `phase` only orders same-emit evaluators relative to each other (e.g.
|
|
47
|
+
* guaranteeing this clock-to-sequence binding runs before an object binding
|
|
48
|
+
* reads the sequence on the same crossing), never relative to unrelated
|
|
49
|
+
* engine systems that happen to run in a same-named phase during a live
|
|
50
|
+
* frame.
|
|
51
|
+
*
|
|
52
|
+
* Registered by default at the `'animation'` phase — the same phase
|
|
53
|
+
* XState-bound `AnimationMixer` playback ticks in (see `ARCHITECTURE.md`'s
|
|
54
|
+
* phase table: `... gameLogic → animation → preRender → render`). Object
|
|
55
|
+
* bindings (`bindObject3DTransform`/`bindCameraLens`) default to `'preRender'`
|
|
56
|
+
* (the documented home for camera placement/material tick) specifically so
|
|
57
|
+
* `PHASE_ORDER` — not registration order — guarantees they observe the
|
|
58
|
+
* position this binding just set, regardless of which binding a caller sets
|
|
59
|
+
* up first.
|
|
60
|
+
*/
|
|
61
|
+
export interface TheatreClockBindingOptions {
|
|
62
|
+
/**
|
|
63
|
+
* Which `AnimationClock` phase to seek the sequence in. Defaults to
|
|
64
|
+
* `'animation'`. Any object binding reading this sheet's objects should use
|
|
65
|
+
* a phase that runs no earlier (see module doc above) — `'preRender'`, the
|
|
66
|
+
* default for `bindObject3DTransform`/`bindCameraLens`, always qualifies.
|
|
67
|
+
*/
|
|
68
|
+
phase?: SystemPhaseName;
|
|
69
|
+
}
|
|
70
|
+
export interface TheatreClockBinding {
|
|
71
|
+
/** Removes the clock evaluator. No further `sequence.position` writes occur after this. */
|
|
72
|
+
dispose(): void;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Subscribe `sequence.position = clock.time` to every crossing of `clock` in
|
|
76
|
+
* the given phase (default `'animation'`). Returns a disposer; call it to
|
|
77
|
+
* stop driving the sequence (e.g. on `GameCleanup.dispose()` or before
|
|
78
|
+
* rebinding on hot reload — this is what keeps HMR from accumulating
|
|
79
|
+
* duplicate listeners, since re-running `setup()` disposes the old binding
|
|
80
|
+
* before creating a new one).
|
|
81
|
+
*
|
|
82
|
+
* Multiple sheets/sequences can each get their own binding with no shared
|
|
83
|
+
* mutable state on VGAI's side — collision avoidance for the underlying
|
|
84
|
+
* Theatre project/sheet identity is Theatre's own `getProject(id)`/
|
|
85
|
+
* `project.sheet(id)` namespacing (spec §5.3), which this function does not
|
|
86
|
+
* touch or wrap.
|
|
87
|
+
*/
|
|
88
|
+
export declare function bindClockToTheatreSequence(clock: AnimationClock, sequence: ISequence, options?: TheatreClockBindingOptions): TheatreClockBinding;
|
|
89
|
+
//# sourceMappingURL=theatre-clock-binding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theatre-clock-binding.d.ts","sourceRoot":"","sources":["../../src/animation/theatre-clock-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,2FAA2F;IAC3F,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,0BAA+B,GACvC,mBAAmB,CAerB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subscribe `sequence.position = clock.time` to every crossing of `clock` in
|
|
3
|
+
* the given phase (default `'animation'`). Returns a disposer; call it to
|
|
4
|
+
* stop driving the sequence (e.g. on `GameCleanup.dispose()` or before
|
|
5
|
+
* rebinding on hot reload — this is what keeps HMR from accumulating
|
|
6
|
+
* duplicate listeners, since re-running `setup()` disposes the old binding
|
|
7
|
+
* before creating a new one).
|
|
8
|
+
*
|
|
9
|
+
* Multiple sheets/sequences can each get their own binding with no shared
|
|
10
|
+
* mutable state on VGAI's side — collision avoidance for the underlying
|
|
11
|
+
* Theatre project/sheet identity is Theatre's own `getProject(id)`/
|
|
12
|
+
* `project.sheet(id)` namespacing (spec §5.3), which this function does not
|
|
13
|
+
* touch or wrap.
|
|
14
|
+
*/
|
|
15
|
+
export function bindClockToTheatreSequence(clock, sequence, options = {}) {
|
|
16
|
+
const phase = options.phase ?? 'animation';
|
|
17
|
+
const handle = clock.subscribe(phase, () => {
|
|
18
|
+
sequence.position = clock.time;
|
|
19
|
+
});
|
|
20
|
+
let disposed = false;
|
|
21
|
+
return {
|
|
22
|
+
dispose() {
|
|
23
|
+
if (disposed)
|
|
24
|
+
return;
|
|
25
|
+
disposed = true;
|
|
26
|
+
handle.dispose();
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
import type { ISheetObject, UnknownShorthandCompoundProps } from '@theatre/core';
|
|
2
|
+
import type { SystemPhaseName } from '../core/types';
|
|
3
|
+
import type { AnimationClock } from './animation-clock';
|
|
4
|
+
/**
|
|
5
|
+
* D4 — the Theatre "Director" convention (spec §10 D4, §5.3, §3.2).
|
|
6
|
+
*
|
|
7
|
+
* A `Director` is an ordinary Theatre Sheet Object, authored with Theatre's
|
|
8
|
+
* NATIVE `types.stringLiteral`/`types.boolean` vocabulary exactly as shown in
|
|
9
|
+
* spec §5.3 — this module never wraps or renames that API. It is a
|
|
10
|
+
* *convention* (a documented, stable shape) plus a thin binding, not a new
|
|
11
|
+
* animation format:
|
|
12
|
+
*
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { types } from '@theatre/core';
|
|
15
|
+
* const director = sheet.object('Director', {
|
|
16
|
+
* activeCamera: types.stringLiteral('wide', { wide: 'wide', close: 'close', gameplay: 'gameplay' }),
|
|
17
|
+
* shot: types.stringLiteral('opening', { opening: 'opening', reveal: 'reveal', ending: 'ending' }),
|
|
18
|
+
* letterbox: types.boolean(false),
|
|
19
|
+
* // extensible: any additional directorial prop is carried through verbatim
|
|
20
|
+
* // as `DirectorState.extras`, e.g.:
|
|
21
|
+
* blendSeconds: types.number(0, { range: [0, Infinity] }),
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* `activeCamera`/`shot`/`letterbox` are required by the convention (spec §10
|
|
26
|
+
* D4 AC: "covers active camera, shot ID, letterbox, and optional directorial
|
|
27
|
+
* properties"). Anything else declared on the same Theatre object (exposure,
|
|
28
|
+
* grade, a blend-duration prop, ...) is an "optional directorial property" —
|
|
29
|
+
* it is read and surfaced verbatim through `DirectorState.extras`, never
|
|
30
|
+
* hardcoded here, which is what keeps the convention extensible without
|
|
31
|
+
* VGAI inventing a schema for it.
|
|
32
|
+
*
|
|
33
|
+
* ## Binding: pull-based, same lockstep pattern as D2/D3
|
|
34
|
+
*
|
|
35
|
+
* `bindDirectorToClock` follows exactly the `theatre-clock-binding.ts` /
|
|
36
|
+
* `theatre-object-binding.ts` pattern: it reads the Director object's
|
|
37
|
+
* pull-based `sheetObject.value` on every canonical-clock crossing (never
|
|
38
|
+
* Theatre's own batched `onValuesChange` push channel — see those modules'
|
|
39
|
+
* doc comments for why that would desync from a synchronous `clock.seek()`).
|
|
40
|
+
* Default phase is `'preRender'`, the same default `bindObject3DTransform`/
|
|
41
|
+
* `bindCameraLens` use, so — via `PHASE_ORDER`, not registration order — the
|
|
42
|
+
* Director always reads a sequence position that `bindClockToTheatreSequence`
|
|
43
|
+
* (registered at `'animation'`, which runs earlier) has already set for this
|
|
44
|
+
* crossing, regardless of which binding a caller sets up first.
|
|
45
|
+
*
|
|
46
|
+
* ## Seeking updates Director without firing gameplay cues
|
|
47
|
+
*
|
|
48
|
+
* This binding has NO concept of "seek" vs "advance" — unlike
|
|
49
|
+
* `CueRunner` (D5, `cinematic-cues.ts`), which deliberately distinguishes the
|
|
50
|
+
* two (via its own `seek()`/`advance()` wrapper methods) so a
|
|
51
|
+
* `firesDuringSeek: false` cue can be skipped on scrub. A Director value is
|
|
52
|
+
* *visual/directorial state*, not a gameplay consequence (spec §3.2: "Theatre
|
|
53
|
+
* carries visual/directorial values; ordinary TypeScript cues carry gameplay
|
|
54
|
+
* consequences") — it should always reflect the clock's current time,
|
|
55
|
+
* however the clock got there. Composing the two on the SAME
|
|
56
|
+
* `AnimationClock` (Director bound directly to the clock; cues bound through
|
|
57
|
+
* a `CueRunner` wrapping the same clock) is exactly what makes "seek updates
|
|
58
|
+
* Director but does not spuriously fire gameplay cues" fall out for free: a
|
|
59
|
+
* `CueRunner.seek(t)` call moves the one shared clock, which both this
|
|
60
|
+
* binding (always reacts) and the cue runner (gates on `firesDuringSeek`)
|
|
61
|
+
* observe on the same crossing. See `theatre-director.test.ts`'s
|
|
62
|
+
* "composes with D5" suite for the proof.
|
|
63
|
+
*
|
|
64
|
+
* ## Camera-ownership hook — the D6 seam
|
|
65
|
+
*
|
|
66
|
+
* Discrete `activeCamera` changes are exactly the moments a *camera
|
|
67
|
+
* ownership* system (D6, not built in this unit) needs to know about, to cut
|
|
68
|
+
* or blend the live gameplay camera to the Director's declared shot. This
|
|
69
|
+
* module does not own or perform any camera mutation — it only DETECTS a
|
|
70
|
+
* change in the Director's `activeCamera` value across successive
|
|
71
|
+
* evaluations and reports it through `onActiveCameraChange`
|
|
72
|
+
* (`CameraOwnershipHook`), a minimal, one-directional seam:
|
|
73
|
+
*
|
|
74
|
+
* - fired once per detected `activeCamera` transition (never for a
|
|
75
|
+
* no-op/unchanged evaluation, including a re-seek to the same time or a
|
|
76
|
+
* seek that stays within the same shot's camera);
|
|
77
|
+
* - the FIRST evaluation after bind is treated as an "assignment", not a
|
|
78
|
+
* "cut from something" — `previousCameraKey` is `null` and `mode` is
|
|
79
|
+
* forced to `'cut'` (there is nothing to blend FROM yet; D6 is expected
|
|
80
|
+
* to use this event to perform its initial camera capture/placement);
|
|
81
|
+
* - `mode`/`blendSeconds` are derived from an optional extra numeric prop on
|
|
82
|
+
* the SAME Director object (`blendSecondsKey`, default `'blendSeconds'`)
|
|
83
|
+
* — a positive value at the moment of the transition means `'blend'`
|
|
84
|
+
* (with that duration), anything else means `'cut'`. This is the "expose
|
|
85
|
+
* enough for a consumer to cut or blend" seam named in the D4 AC; the
|
|
86
|
+
* ACTUAL blend implementation (interpolating the live camera pose over
|
|
87
|
+
* `blendSeconds`) is D6's job, not this module's.
|
|
88
|
+
*
|
|
89
|
+
* ### `blendSeconds` MUST be authored as HOLD keyframes
|
|
90
|
+
*
|
|
91
|
+
* `blendSeconds` is read at the EXACT moment `activeCamera` is detected to
|
|
92
|
+
* change, whatever clock time that happens to land on. If `blendSeconds` is
|
|
93
|
+
* authored as an ordinary interpolating (bezier) track, a transition
|
|
94
|
+
* detected at a time that isn't exactly a keyframe position reads whatever
|
|
95
|
+
* partially-interpolated value the bezier curve has reached AT THAT MOMENT —
|
|
96
|
+
* not the value actually authored FOR that transition. Concretely: a cut
|
|
97
|
+
* authored at `t=3` with `blendSeconds=0`, followed by a blend authored at
|
|
98
|
+
* `t=6` with `blendSeconds=1.5`, makes the track interpolate from `0` to
|
|
99
|
+
* `1.5` across `[3, 6)`. If the `activeCamera` transition at `t=3` is first
|
|
100
|
+
* *observed* at some later non-keyframe time inside that span (e.g. a coarse
|
|
101
|
+
* seek from `t=2` straight to `t=4.5`, skipping past `t=3` without an
|
|
102
|
+
* intermediate evaluation), `blendSeconds` at `t=4.5` reads a nonzero,
|
|
103
|
+
* partially-interpolated value — misreporting an authored CUT as a partial
|
|
104
|
+
* BLEND.
|
|
105
|
+
*
|
|
106
|
+
* The fix is to author `blendSeconds` keyframes as Theatre HOLD keyframes
|
|
107
|
+
* (`connectedRight: false`, optionally also `type: 'hold'`) rather than the
|
|
108
|
+
* default interpolating bezier keyframes. `connectedRight: false` makes
|
|
109
|
+
* Theatre's own sequence evaluator hold the LEFT keyframe's value constant
|
|
110
|
+
* across the entire span up to (not including) the next keyframe, then snap
|
|
111
|
+
* — never partially interpolate. With `blendSeconds` authored this way, its
|
|
112
|
+
* value at ANY time within `[3, 6)` reads exactly `0` (the cut authored at
|
|
113
|
+
* `t=3`), and only reads `1.5` once the clock reaches `t=6` (the blend
|
|
114
|
+
* authored there) — correct regardless of which non-keyframe time a
|
|
115
|
+
* transition happens to first be observed at. See
|
|
116
|
+
* `fixtures/theatre-director-proof.theatre-project.json` (its `blendSeconds`
|
|
117
|
+
* track uses `connectedRight: false` on every keyframe) and
|
|
118
|
+
* `theatre-director.test.ts`'s "playback grid" suite, which proves this by
|
|
119
|
+
* evaluating a fine-grained, non-keyframe-aligned time grid across the whole
|
|
120
|
+
* span and asserting the reported `mode` never drifts from what was
|
|
121
|
+
* authored at the keyframe that produced the transition.
|
|
122
|
+
*
|
|
123
|
+
* D6 will most likely implement `CameraOwnershipHook` as (roughly) "capture
|
|
124
|
+
* gameplay camera pose once on the first `mode: 'cut'` event; on each
|
|
125
|
+
* subsequent event, cut or blend the owned camera to the shot named by
|
|
126
|
+
* `cameraKey`". Nothing above depends on that implementation existing —
|
|
127
|
+
* `onActiveCameraChange` is optional and this module works with no hook
|
|
128
|
+
* attached at all (Director values are still readable via `getState()`).
|
|
129
|
+
*
|
|
130
|
+
* ## Read API (SDK/CLI seam, B5)
|
|
131
|
+
*
|
|
132
|
+
* `readDirectorState` is a pure, synchronous read of whatever a Director
|
|
133
|
+
* Theatre object's CURRENT value is — no clock/binding required. It is what
|
|
134
|
+
* a later `cinematic.*` SDK/CLI operation (B5) would call to inspect Director
|
|
135
|
+
* state (e.g. "what shot is authored at time t") without needing to spin up
|
|
136
|
+
* a full runtime binding. `TheatreDirectorBinding.getState()` is the
|
|
137
|
+
* clock-driven equivalent — it returns the value read at bind time until the
|
|
138
|
+
* FIRST clock crossing occurs (not "the most recent crossing" — before any
|
|
139
|
+
* crossing there IS no crossing yet), and the value as of the most recent
|
|
140
|
+
* crossing thereafter.
|
|
141
|
+
*
|
|
142
|
+
* Authoring `Director` keyframes in Theatre Studio is a dev-only workflow
|
|
143
|
+
* (spec §10 D2: "Theatre Studio is available only in authoring/development
|
|
144
|
+
* contexts"); the committed project-state JSON is the source of truth this
|
|
145
|
+
* module reads in production — nothing here imports the Theatre Studio
|
|
146
|
+
* package (see `theatre-binding.test.ts`'s repo-wide grep proof of that).
|
|
147
|
+
*/
|
|
148
|
+
/** Thrown when a Theatre object does not conform to the Director convention. */
|
|
149
|
+
export declare class TheatreDirectorError extends Error {
|
|
150
|
+
readonly objectKey: string;
|
|
151
|
+
constructor(message: string, objectKey: string);
|
|
152
|
+
}
|
|
153
|
+
/** The Director convention's three required props, plus everything else verbatim. */
|
|
154
|
+
export interface DirectorState {
|
|
155
|
+
readonly activeCamera: string;
|
|
156
|
+
readonly shot: string;
|
|
157
|
+
readonly letterbox: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* Any additional directorial props declared on the same Theatre object
|
|
160
|
+
* (e.g. `exposure`, `grade`, `blendSeconds`), captured verbatim from
|
|
161
|
+
* `sheetObject.value`. The Director convention is deliberately extensible
|
|
162
|
+
* here — VGAI does not enumerate or validate extras beyond the three
|
|
163
|
+
* required props.
|
|
164
|
+
*/
|
|
165
|
+
readonly extras: Readonly<Record<string, unknown>>;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Pure, synchronous read of a Director Theatre object's CURRENT value.
|
|
169
|
+
* No clock/binding involved — suitable for one-shot inspection (the later
|
|
170
|
+
* SDK/CLI read path, B5) as well as being the function
|
|
171
|
+
* `bindDirectorToClock` itself calls on every crossing.
|
|
172
|
+
*
|
|
173
|
+
* @throws {TheatreDirectorError} if the object's value does not conform to
|
|
174
|
+
* the Director convention (missing/mistyped `activeCamera`/`shot`/`letterbox`).
|
|
175
|
+
*/
|
|
176
|
+
export declare function readDirectorState<Props extends UnknownShorthandCompoundProps>(sheetObject: ISheetObject<Props>): DirectorState;
|
|
177
|
+
/** Whether a reported `activeCamera` transition should be a hard cut or a blend. */
|
|
178
|
+
export type CameraCutMode = 'cut' | 'blend';
|
|
179
|
+
/**
|
|
180
|
+
* One detected `activeCamera` transition. This is the entire payload the
|
|
181
|
+
* D6 camera-ownership system needs to decide what to do — it carries no
|
|
182
|
+
* camera object or mutation itself (that stays entirely on the consumer's
|
|
183
|
+
* side, matching "no arbitrary unsafe property-path evaluator" / "thin
|
|
184
|
+
* integration code" throughout D2-D5).
|
|
185
|
+
*/
|
|
186
|
+
export interface CameraOwnershipChangeEvent {
|
|
187
|
+
/** The Director's new `activeCamera` value. */
|
|
188
|
+
readonly cameraKey: string;
|
|
189
|
+
/** The Director's previous `activeCamera` value, or `null` on the first (assignment) event. */
|
|
190
|
+
readonly previousCameraKey: string | null;
|
|
191
|
+
/** `'cut'` unless a positive blend duration was authored for this transition. */
|
|
192
|
+
readonly mode: CameraCutMode;
|
|
193
|
+
/** Blend duration in seconds; `0` for a `'cut'`. */
|
|
194
|
+
readonly blendSeconds: number;
|
|
195
|
+
/** The Director's `shot` value at the moment of this transition, for convenience. */
|
|
196
|
+
readonly shot: string;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* D6 seam: implemented fully by the camera-ownership/restoration system
|
|
200
|
+
* (spec §10 D6). This module only detects and reports discrete
|
|
201
|
+
* `activeCamera` transitions — it performs no camera capture, cut, blend, or
|
|
202
|
+
* restoration itself.
|
|
203
|
+
*/
|
|
204
|
+
export type CameraOwnershipHook = (event: CameraOwnershipChangeEvent) => void;
|
|
205
|
+
export interface TheatreDirectorBindingOptions {
|
|
206
|
+
/**
|
|
207
|
+
* Which `AnimationClock` phase to evaluate the Director in. Defaults to
|
|
208
|
+
* `'preRender'` (see module doc — guaranteed by `PHASE_ORDER` to observe a
|
|
209
|
+
* sequence position `bindClockToTheatreSequence`'s `'animation'`-phase
|
|
210
|
+
* default has already set for this crossing).
|
|
211
|
+
*/
|
|
212
|
+
phase?: SystemPhaseName;
|
|
213
|
+
/** Camera-ownership seam (D6) — see module doc. Optional; omit to just read state. */
|
|
214
|
+
onActiveCameraChange?: CameraOwnershipHook;
|
|
215
|
+
/**
|
|
216
|
+
* Name of an optional extra numeric Director prop that carries the blend
|
|
217
|
+
* duration (seconds) for the transition landing on the CURRENT
|
|
218
|
+
* evaluation. Defaults to `'blendSeconds'`. Absent, non-numeric, or
|
|
219
|
+
* non-positive at the moment of a transition reports `mode: 'cut'`.
|
|
220
|
+
*/
|
|
221
|
+
blendSecondsKey?: string;
|
|
222
|
+
}
|
|
223
|
+
export interface TheatreDirectorBinding {
|
|
224
|
+
/**
|
|
225
|
+
* Current Director state (D4 AC: inspectable read API). Before the first
|
|
226
|
+
* clock crossing, this is the bind-time value (`readDirectorState` called
|
|
227
|
+
* once at bind); from the first crossing onward, it is the value as of the
|
|
228
|
+
* most recent crossing.
|
|
229
|
+
*/
|
|
230
|
+
getState(): DirectorState;
|
|
231
|
+
/** Removes the clock evaluator. No further evaluation (or hook calls) occurs after this. */
|
|
232
|
+
dispose(): void;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Bind a Director Theatre Sheet Object to `clock`: on every crossing, read
|
|
236
|
+
* its current value (`readDirectorState`) and, if `activeCamera` changed
|
|
237
|
+
* since the last evaluation, report the transition through
|
|
238
|
+
* `onActiveCameraChange` (the D6 seam). Returns a disposer and a `getState()`
|
|
239
|
+
* read API. See the module doc comment for the full contract.
|
|
240
|
+
*/
|
|
241
|
+
export declare function bindDirectorToClock<Props extends UnknownShorthandCompoundProps>(clock: AnimationClock, sheetObject: ISheetObject<Props>, options?: TheatreDirectorBindingOptions): TheatreDirectorBinding;
|
|
242
|
+
//# sourceMappingURL=theatre-director.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theatre-director.d.ts","sourceRoot":"","sources":["../../src/animation/theatre-director.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+IG;AAEH,gFAAgF;AAChF,qBAAa,oBAAqB,SAAQ,KAAK;IAG3C,QAAQ,CAAC,SAAS,EAAE,MAAM;gBAD1B,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,MAAM;CAK7B;AAED,qFAAqF;AACrF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACpD;AAID;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,6BAA6B,EAC3E,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,GAC/B,aAAa,CAqCf;AAED,oFAAoF;AACpF,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,OAAO,CAAC;AAE5C;;;;;;GAMG;AACH,MAAM,WAAW,0BAA0B;IACzC,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+FAA+F;IAC/F,QAAQ,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1C,iFAAiF;IACjF,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,KAAK,EAAE,0BAA0B,KAAK,IAAI,CAAC;AAE9E,MAAM,WAAW,6BAA6B;IAC5C;;;;;OAKG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,sFAAsF;IACtF,oBAAoB,CAAC,EAAE,mBAAmB,CAAC;IAC3C;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACrC;;;;;OAKG;IACH,QAAQ,IAAI,aAAa,CAAC;IAC1B,4FAA4F;IAC5F,OAAO,IAAI,IAAI,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,6BAA6B,EAC7E,KAAK,EAAE,cAAc,EACrB,WAAW,EAAE,YAAY,CAAC,KAAK,CAAC,EAChC,OAAO,GAAE,6BAAkC,GAC1C,sBAAsB,CA8CxB"}
|