@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,111 @@
|
|
|
1
|
+
import type { ISequence } from '@theatre/core';
|
|
2
|
+
import type { SystemPhaseName } from '../core/types';
|
|
3
|
+
import type { AnimationClock, ClockEvaluatorHandle } from './animation-clock';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* D2 — bind the canonical `AnimationClock` to a Theatre sequence's playhead
|
|
7
|
+
* (spec §10 D2, §5.3, §3.2).
|
|
8
|
+
*
|
|
9
|
+
* This is VGAI's ENTIRE glue for Theatre integration on the clock side:
|
|
10
|
+
* games import and configure `@theatre/core` with its own native vocabulary
|
|
11
|
+
* (`getProject`/`types`/`sheet`/`object`, spec §5.3) — there is no renamed
|
|
12
|
+
* Theatre API here. The only thing VGAI owns is *who drives time*: the
|
|
13
|
+
* canonical clock is the single source of truth, and this binding seeks
|
|
14
|
+
* Theatre's sequence position to match it every time the clock moves. Theatre
|
|
15
|
+
* must never be left to drive its own `requestAnimationFrame` loop — see the
|
|
16
|
+
* module doc on `animation-clock.ts` for why (deterministic export, offline
|
|
17
|
+
* scrubbing, no wall-clock dependency).
|
|
18
|
+
*
|
|
19
|
+
* ## Why setting `sequence.position` is enough (no `sequence.play()`)
|
|
20
|
+
*
|
|
21
|
+
* Theatre's `ISequence.position` setter synchronously updates every bound
|
|
22
|
+
* `SheetObject`'s pull-based `.value` (proven against the real `@theatre/core`
|
|
23
|
+
* runtime in `packages/engine/test/theatre-binding.test.ts` — setting
|
|
24
|
+
* `position` and immediately reading `.value` reflects the new keyframe
|
|
25
|
+
* interpolation with no `requestAnimationFrame`/ticker wait, which is exactly
|
|
26
|
+
* what makes this safe to drive from a synchronous, wall-clock-free
|
|
27
|
+
* `AnimationClock.seek()`/`advance()` call, including headlessly in Node for
|
|
28
|
+
* the render/export seam, I2). Theatre's *push* notification channel
|
|
29
|
+
* (`onValuesChange`/`onChange`) is batched on its own internal raf-driven
|
|
30
|
+
* ticker — it is not delivered 1:1 with each programmatic `position` write,
|
|
31
|
+
* so a subscriber can observe several coalesced position writes as a single
|
|
32
|
+
* notification, or (in a headless/no-raf context) none at all — so object
|
|
33
|
+
* bindings (`theatre-object-binding.ts`) deliberately read `sheetObject.value`
|
|
34
|
+
* (pull) after this binding has run, rather than subscribing to Theatre's
|
|
35
|
+
* push channel, to stay exactly in lockstep with the clock.
|
|
36
|
+
*
|
|
37
|
+
* ## Phase choice
|
|
38
|
+
*
|
|
39
|
+
* Note on phase semantics: `phase` here orders evaluators WITHIN a single
|
|
40
|
+
* clock `emit()` — i.e. within one `seek()`/`advance()` call — using the
|
|
41
|
+
* engine's `SystemPhaseName` vocabulary purely as a shared, familiar naming
|
|
42
|
+
* convention (`animation-clock.ts`'s module doc). It does NOT mean an
|
|
43
|
+
* evaluator registered at, say, `'preRender'` executes during the live
|
|
44
|
+
* engine's own `system-runner` `preRender` phase call within a running RAF
|
|
45
|
+
* frame — the `AnimationClock` is independent of the live game loop's phase
|
|
46
|
+
* execution, and during offline export/scrub there is no RAF frame at all.
|
|
47
|
+
* `phase` only orders same-emit evaluators relative to each other (e.g.
|
|
48
|
+
* guaranteeing this clock-to-sequence binding runs before an object binding
|
|
49
|
+
* reads the sequence on the same crossing), never relative to unrelated
|
|
50
|
+
* engine systems that happen to run in a same-named phase during a live
|
|
51
|
+
* frame.
|
|
52
|
+
*
|
|
53
|
+
* Registered by default at the `'animation'` phase — the same phase
|
|
54
|
+
* XState-bound `AnimationMixer` playback ticks in (see `ARCHITECTURE.md`'s
|
|
55
|
+
* phase table: `... gameLogic → animation → preRender → render`). Object
|
|
56
|
+
* bindings (`bindObject3DTransform`/`bindCameraLens`) default to `'preRender'`
|
|
57
|
+
* (the documented home for camera placement/material tick) specifically so
|
|
58
|
+
* `PHASE_ORDER` — not registration order — guarantees they observe the
|
|
59
|
+
* position this binding just set, regardless of which binding a caller sets
|
|
60
|
+
* up first.
|
|
61
|
+
*/
|
|
62
|
+
|
|
63
|
+
export interface TheatreClockBindingOptions {
|
|
64
|
+
/**
|
|
65
|
+
* Which `AnimationClock` phase to seek the sequence in. Defaults to
|
|
66
|
+
* `'animation'`. Any object binding reading this sheet's objects should use
|
|
67
|
+
* a phase that runs no earlier (see module doc above) — `'preRender'`, the
|
|
68
|
+
* default for `bindObject3DTransform`/`bindCameraLens`, always qualifies.
|
|
69
|
+
*/
|
|
70
|
+
phase?: SystemPhaseName;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface TheatreClockBinding {
|
|
74
|
+
/** Removes the clock evaluator. No further `sequence.position` writes occur after this. */
|
|
75
|
+
dispose(): void;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Subscribe `sequence.position = clock.time` to every crossing of `clock` in
|
|
80
|
+
* the given phase (default `'animation'`). Returns a disposer; call it to
|
|
81
|
+
* stop driving the sequence (e.g. on `GameCleanup.dispose()` or before
|
|
82
|
+
* rebinding on hot reload — this is what keeps HMR from accumulating
|
|
83
|
+
* duplicate listeners, since re-running `setup()` disposes the old binding
|
|
84
|
+
* before creating a new one).
|
|
85
|
+
*
|
|
86
|
+
* Multiple sheets/sequences can each get their own binding with no shared
|
|
87
|
+
* mutable state on VGAI's side — collision avoidance for the underlying
|
|
88
|
+
* Theatre project/sheet identity is Theatre's own `getProject(id)`/
|
|
89
|
+
* `project.sheet(id)` namespacing (spec §5.3), which this function does not
|
|
90
|
+
* touch or wrap.
|
|
91
|
+
*/
|
|
92
|
+
export function bindClockToTheatreSequence(
|
|
93
|
+
clock: AnimationClock,
|
|
94
|
+
sequence: ISequence,
|
|
95
|
+
options: TheatreClockBindingOptions = {},
|
|
96
|
+
): TheatreClockBinding {
|
|
97
|
+
const phase = options.phase ?? 'animation';
|
|
98
|
+
|
|
99
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
100
|
+
sequence.position = clock.time;
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
let disposed = false;
|
|
104
|
+
return {
|
|
105
|
+
dispose(): void {
|
|
106
|
+
if (disposed) return;
|
|
107
|
+
disposed = true;
|
|
108
|
+
handle.dispose();
|
|
109
|
+
},
|
|
110
|
+
};
|
|
111
|
+
}
|
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
import type { ISheetObject, UnknownShorthandCompoundProps } from '@theatre/core';
|
|
2
|
+
import type { SystemPhaseName } from '../core/types';
|
|
3
|
+
import type { AnimationClock, ClockEvaluatorHandle } from './animation-clock';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* D4 — the Theatre "Director" convention (spec §10 D4, §5.3, §3.2).
|
|
7
|
+
*
|
|
8
|
+
* A `Director` is an ordinary Theatre Sheet Object, authored with Theatre's
|
|
9
|
+
* NATIVE `types.stringLiteral`/`types.boolean` vocabulary exactly as shown in
|
|
10
|
+
* spec §5.3 — this module never wraps or renames that API. It is a
|
|
11
|
+
* *convention* (a documented, stable shape) plus a thin binding, not a new
|
|
12
|
+
* animation format:
|
|
13
|
+
*
|
|
14
|
+
* ```ts
|
|
15
|
+
* import { types } from '@theatre/core';
|
|
16
|
+
* const director = sheet.object('Director', {
|
|
17
|
+
* activeCamera: types.stringLiteral('wide', { wide: 'wide', close: 'close', gameplay: 'gameplay' }),
|
|
18
|
+
* shot: types.stringLiteral('opening', { opening: 'opening', reveal: 'reveal', ending: 'ending' }),
|
|
19
|
+
* letterbox: types.boolean(false),
|
|
20
|
+
* // extensible: any additional directorial prop is carried through verbatim
|
|
21
|
+
* // as `DirectorState.extras`, e.g.:
|
|
22
|
+
* blendSeconds: types.number(0, { range: [0, Infinity] }),
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*
|
|
26
|
+
* `activeCamera`/`shot`/`letterbox` are required by the convention (spec §10
|
|
27
|
+
* D4 AC: "covers active camera, shot ID, letterbox, and optional directorial
|
|
28
|
+
* properties"). Anything else declared on the same Theatre object (exposure,
|
|
29
|
+
* grade, a blend-duration prop, ...) is an "optional directorial property" —
|
|
30
|
+
* it is read and surfaced verbatim through `DirectorState.extras`, never
|
|
31
|
+
* hardcoded here, which is what keeps the convention extensible without
|
|
32
|
+
* VGAI inventing a schema for it.
|
|
33
|
+
*
|
|
34
|
+
* ## Binding: pull-based, same lockstep pattern as D2/D3
|
|
35
|
+
*
|
|
36
|
+
* `bindDirectorToClock` follows exactly the `theatre-clock-binding.ts` /
|
|
37
|
+
* `theatre-object-binding.ts` pattern: it reads the Director object's
|
|
38
|
+
* pull-based `sheetObject.value` on every canonical-clock crossing (never
|
|
39
|
+
* Theatre's own batched `onValuesChange` push channel — see those modules'
|
|
40
|
+
* doc comments for why that would desync from a synchronous `clock.seek()`).
|
|
41
|
+
* Default phase is `'preRender'`, the same default `bindObject3DTransform`/
|
|
42
|
+
* `bindCameraLens` use, so — via `PHASE_ORDER`, not registration order — the
|
|
43
|
+
* Director always reads a sequence position that `bindClockToTheatreSequence`
|
|
44
|
+
* (registered at `'animation'`, which runs earlier) has already set for this
|
|
45
|
+
* crossing, regardless of which binding a caller sets up first.
|
|
46
|
+
*
|
|
47
|
+
* ## Seeking updates Director without firing gameplay cues
|
|
48
|
+
*
|
|
49
|
+
* This binding has NO concept of "seek" vs "advance" — unlike
|
|
50
|
+
* `CueRunner` (D5, `cinematic-cues.ts`), which deliberately distinguishes the
|
|
51
|
+
* two (via its own `seek()`/`advance()` wrapper methods) so a
|
|
52
|
+
* `firesDuringSeek: false` cue can be skipped on scrub. A Director value is
|
|
53
|
+
* *visual/directorial state*, not a gameplay consequence (spec §3.2: "Theatre
|
|
54
|
+
* carries visual/directorial values; ordinary TypeScript cues carry gameplay
|
|
55
|
+
* consequences") — it should always reflect the clock's current time,
|
|
56
|
+
* however the clock got there. Composing the two on the SAME
|
|
57
|
+
* `AnimationClock` (Director bound directly to the clock; cues bound through
|
|
58
|
+
* a `CueRunner` wrapping the same clock) is exactly what makes "seek updates
|
|
59
|
+
* Director but does not spuriously fire gameplay cues" fall out for free: a
|
|
60
|
+
* `CueRunner.seek(t)` call moves the one shared clock, which both this
|
|
61
|
+
* binding (always reacts) and the cue runner (gates on `firesDuringSeek`)
|
|
62
|
+
* observe on the same crossing. See `theatre-director.test.ts`'s
|
|
63
|
+
* "composes with D5" suite for the proof.
|
|
64
|
+
*
|
|
65
|
+
* ## Camera-ownership hook — the D6 seam
|
|
66
|
+
*
|
|
67
|
+
* Discrete `activeCamera` changes are exactly the moments a *camera
|
|
68
|
+
* ownership* system (D6, not built in this unit) needs to know about, to cut
|
|
69
|
+
* or blend the live gameplay camera to the Director's declared shot. This
|
|
70
|
+
* module does not own or perform any camera mutation — it only DETECTS a
|
|
71
|
+
* change in the Director's `activeCamera` value across successive
|
|
72
|
+
* evaluations and reports it through `onActiveCameraChange`
|
|
73
|
+
* (`CameraOwnershipHook`), a minimal, one-directional seam:
|
|
74
|
+
*
|
|
75
|
+
* - fired once per detected `activeCamera` transition (never for a
|
|
76
|
+
* no-op/unchanged evaluation, including a re-seek to the same time or a
|
|
77
|
+
* seek that stays within the same shot's camera);
|
|
78
|
+
* - the FIRST evaluation after bind is treated as an "assignment", not a
|
|
79
|
+
* "cut from something" — `previousCameraKey` is `null` and `mode` is
|
|
80
|
+
* forced to `'cut'` (there is nothing to blend FROM yet; D6 is expected
|
|
81
|
+
* to use this event to perform its initial camera capture/placement);
|
|
82
|
+
* - `mode`/`blendSeconds` are derived from an optional extra numeric prop on
|
|
83
|
+
* the SAME Director object (`blendSecondsKey`, default `'blendSeconds'`)
|
|
84
|
+
* — a positive value at the moment of the transition means `'blend'`
|
|
85
|
+
* (with that duration), anything else means `'cut'`. This is the "expose
|
|
86
|
+
* enough for a consumer to cut or blend" seam named in the D4 AC; the
|
|
87
|
+
* ACTUAL blend implementation (interpolating the live camera pose over
|
|
88
|
+
* `blendSeconds`) is D6's job, not this module's.
|
|
89
|
+
*
|
|
90
|
+
* ### `blendSeconds` MUST be authored as HOLD keyframes
|
|
91
|
+
*
|
|
92
|
+
* `blendSeconds` is read at the EXACT moment `activeCamera` is detected to
|
|
93
|
+
* change, whatever clock time that happens to land on. If `blendSeconds` is
|
|
94
|
+
* authored as an ordinary interpolating (bezier) track, a transition
|
|
95
|
+
* detected at a time that isn't exactly a keyframe position reads whatever
|
|
96
|
+
* partially-interpolated value the bezier curve has reached AT THAT MOMENT —
|
|
97
|
+
* not the value actually authored FOR that transition. Concretely: a cut
|
|
98
|
+
* authored at `t=3` with `blendSeconds=0`, followed by a blend authored at
|
|
99
|
+
* `t=6` with `blendSeconds=1.5`, makes the track interpolate from `0` to
|
|
100
|
+
* `1.5` across `[3, 6)`. If the `activeCamera` transition at `t=3` is first
|
|
101
|
+
* *observed* at some later non-keyframe time inside that span (e.g. a coarse
|
|
102
|
+
* seek from `t=2` straight to `t=4.5`, skipping past `t=3` without an
|
|
103
|
+
* intermediate evaluation), `blendSeconds` at `t=4.5` reads a nonzero,
|
|
104
|
+
* partially-interpolated value — misreporting an authored CUT as a partial
|
|
105
|
+
* BLEND.
|
|
106
|
+
*
|
|
107
|
+
* The fix is to author `blendSeconds` keyframes as Theatre HOLD keyframes
|
|
108
|
+
* (`connectedRight: false`, optionally also `type: 'hold'`) rather than the
|
|
109
|
+
* default interpolating bezier keyframes. `connectedRight: false` makes
|
|
110
|
+
* Theatre's own sequence evaluator hold the LEFT keyframe's value constant
|
|
111
|
+
* across the entire span up to (not including) the next keyframe, then snap
|
|
112
|
+
* — never partially interpolate. With `blendSeconds` authored this way, its
|
|
113
|
+
* value at ANY time within `[3, 6)` reads exactly `0` (the cut authored at
|
|
114
|
+
* `t=3`), and only reads `1.5` once the clock reaches `t=6` (the blend
|
|
115
|
+
* authored there) — correct regardless of which non-keyframe time a
|
|
116
|
+
* transition happens to first be observed at. See
|
|
117
|
+
* `fixtures/theatre-director-proof.theatre-project.json` (its `blendSeconds`
|
|
118
|
+
* track uses `connectedRight: false` on every keyframe) and
|
|
119
|
+
* `theatre-director.test.ts`'s "playback grid" suite, which proves this by
|
|
120
|
+
* evaluating a fine-grained, non-keyframe-aligned time grid across the whole
|
|
121
|
+
* span and asserting the reported `mode` never drifts from what was
|
|
122
|
+
* authored at the keyframe that produced the transition.
|
|
123
|
+
*
|
|
124
|
+
* D6 will most likely implement `CameraOwnershipHook` as (roughly) "capture
|
|
125
|
+
* gameplay camera pose once on the first `mode: 'cut'` event; on each
|
|
126
|
+
* subsequent event, cut or blend the owned camera to the shot named by
|
|
127
|
+
* `cameraKey`". Nothing above depends on that implementation existing —
|
|
128
|
+
* `onActiveCameraChange` is optional and this module works with no hook
|
|
129
|
+
* attached at all (Director values are still readable via `getState()`).
|
|
130
|
+
*
|
|
131
|
+
* ## Read API (SDK/CLI seam, B5)
|
|
132
|
+
*
|
|
133
|
+
* `readDirectorState` is a pure, synchronous read of whatever a Director
|
|
134
|
+
* Theatre object's CURRENT value is — no clock/binding required. It is what
|
|
135
|
+
* a later `cinematic.*` SDK/CLI operation (B5) would call to inspect Director
|
|
136
|
+
* state (e.g. "what shot is authored at time t") without needing to spin up
|
|
137
|
+
* a full runtime binding. `TheatreDirectorBinding.getState()` is the
|
|
138
|
+
* clock-driven equivalent — it returns the value read at bind time until the
|
|
139
|
+
* FIRST clock crossing occurs (not "the most recent crossing" — before any
|
|
140
|
+
* crossing there IS no crossing yet), and the value as of the most recent
|
|
141
|
+
* crossing thereafter.
|
|
142
|
+
*
|
|
143
|
+
* Authoring `Director` keyframes in Theatre Studio is a dev-only workflow
|
|
144
|
+
* (spec §10 D2: "Theatre Studio is available only in authoring/development
|
|
145
|
+
* contexts"); the committed project-state JSON is the source of truth this
|
|
146
|
+
* module reads in production — nothing here imports the Theatre Studio
|
|
147
|
+
* package (see `theatre-binding.test.ts`'s repo-wide grep proof of that).
|
|
148
|
+
*/
|
|
149
|
+
|
|
150
|
+
/** Thrown when a Theatre object does not conform to the Director convention. */
|
|
151
|
+
export class TheatreDirectorError extends Error {
|
|
152
|
+
constructor(
|
|
153
|
+
message: string,
|
|
154
|
+
readonly objectKey: string,
|
|
155
|
+
) {
|
|
156
|
+
super(message);
|
|
157
|
+
this.name = 'TheatreDirectorError';
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** The Director convention's three required props, plus everything else verbatim. */
|
|
162
|
+
export interface DirectorState {
|
|
163
|
+
readonly activeCamera: string;
|
|
164
|
+
readonly shot: string;
|
|
165
|
+
readonly letterbox: boolean;
|
|
166
|
+
/**
|
|
167
|
+
* Any additional directorial props declared on the same Theatre object
|
|
168
|
+
* (e.g. `exposure`, `grade`, `blendSeconds`), captured verbatim from
|
|
169
|
+
* `sheetObject.value`. The Director convention is deliberately extensible
|
|
170
|
+
* here — VGAI does not enumerate or validate extras beyond the three
|
|
171
|
+
* required props.
|
|
172
|
+
*/
|
|
173
|
+
readonly extras: Readonly<Record<string, unknown>>;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
const REQUIRED_DIRECTOR_KEYS = new Set(['activeCamera', 'shot', 'letterbox']);
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Pure, synchronous read of a Director Theatre object's CURRENT value.
|
|
180
|
+
* No clock/binding involved — suitable for one-shot inspection (the later
|
|
181
|
+
* SDK/CLI read path, B5) as well as being the function
|
|
182
|
+
* `bindDirectorToClock` itself calls on every crossing.
|
|
183
|
+
*
|
|
184
|
+
* @throws {TheatreDirectorError} if the object's value does not conform to
|
|
185
|
+
* the Director convention (missing/mistyped `activeCamera`/`shot`/`letterbox`).
|
|
186
|
+
*/
|
|
187
|
+
export function readDirectorState<Props extends UnknownShorthandCompoundProps>(
|
|
188
|
+
sheetObject: ISheetObject<Props>,
|
|
189
|
+
): DirectorState {
|
|
190
|
+
const raw = sheetObject.value as Record<string, unknown>;
|
|
191
|
+
const objectKey = sheetObject.address.objectKey;
|
|
192
|
+
|
|
193
|
+
const activeCamera = raw['activeCamera'];
|
|
194
|
+
if (typeof activeCamera !== 'string') {
|
|
195
|
+
throw new TheatreDirectorError(
|
|
196
|
+
`[readDirectorState] Director object "${objectKey}" is missing a string "activeCamera" prop — ` +
|
|
197
|
+
`declare it with types.stringLiteral(...) (spec §5.3/§10 D4)`,
|
|
198
|
+
objectKey,
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const shot = raw['shot'];
|
|
203
|
+
if (typeof shot !== 'string') {
|
|
204
|
+
throw new TheatreDirectorError(
|
|
205
|
+
`[readDirectorState] Director object "${objectKey}" is missing a string "shot" prop — ` +
|
|
206
|
+
`declare it with types.stringLiteral(...) (spec §5.3/§10 D4)`,
|
|
207
|
+
objectKey,
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const letterbox = raw['letterbox'];
|
|
212
|
+
if (typeof letterbox !== 'boolean') {
|
|
213
|
+
throw new TheatreDirectorError(
|
|
214
|
+
`[readDirectorState] Director object "${objectKey}" is missing a boolean "letterbox" prop — ` +
|
|
215
|
+
`declare it with types.boolean(...) (spec §5.3/§10 D4)`,
|
|
216
|
+
objectKey,
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
const extras: Record<string, unknown> = {};
|
|
221
|
+
for (const key of Object.keys(raw)) {
|
|
222
|
+
if (!REQUIRED_DIRECTOR_KEYS.has(key)) extras[key] = raw[key];
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return { activeCamera, shot, letterbox, extras: Object.freeze(extras) };
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/** Whether a reported `activeCamera` transition should be a hard cut or a blend. */
|
|
229
|
+
export type CameraCutMode = 'cut' | 'blend';
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* One detected `activeCamera` transition. This is the entire payload the
|
|
233
|
+
* D6 camera-ownership system needs to decide what to do — it carries no
|
|
234
|
+
* camera object or mutation itself (that stays entirely on the consumer's
|
|
235
|
+
* side, matching "no arbitrary unsafe property-path evaluator" / "thin
|
|
236
|
+
* integration code" throughout D2-D5).
|
|
237
|
+
*/
|
|
238
|
+
export interface CameraOwnershipChangeEvent {
|
|
239
|
+
/** The Director's new `activeCamera` value. */
|
|
240
|
+
readonly cameraKey: string;
|
|
241
|
+
/** The Director's previous `activeCamera` value, or `null` on the first (assignment) event. */
|
|
242
|
+
readonly previousCameraKey: string | null;
|
|
243
|
+
/** `'cut'` unless a positive blend duration was authored for this transition. */
|
|
244
|
+
readonly mode: CameraCutMode;
|
|
245
|
+
/** Blend duration in seconds; `0` for a `'cut'`. */
|
|
246
|
+
readonly blendSeconds: number;
|
|
247
|
+
/** The Director's `shot` value at the moment of this transition, for convenience. */
|
|
248
|
+
readonly shot: string;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* D6 seam: implemented fully by the camera-ownership/restoration system
|
|
253
|
+
* (spec §10 D6). This module only detects and reports discrete
|
|
254
|
+
* `activeCamera` transitions — it performs no camera capture, cut, blend, or
|
|
255
|
+
* restoration itself.
|
|
256
|
+
*/
|
|
257
|
+
export type CameraOwnershipHook = (event: CameraOwnershipChangeEvent) => void;
|
|
258
|
+
|
|
259
|
+
export interface TheatreDirectorBindingOptions {
|
|
260
|
+
/**
|
|
261
|
+
* Which `AnimationClock` phase to evaluate the Director in. Defaults to
|
|
262
|
+
* `'preRender'` (see module doc — guaranteed by `PHASE_ORDER` to observe a
|
|
263
|
+
* sequence position `bindClockToTheatreSequence`'s `'animation'`-phase
|
|
264
|
+
* default has already set for this crossing).
|
|
265
|
+
*/
|
|
266
|
+
phase?: SystemPhaseName;
|
|
267
|
+
/** Camera-ownership seam (D6) — see module doc. Optional; omit to just read state. */
|
|
268
|
+
onActiveCameraChange?: CameraOwnershipHook;
|
|
269
|
+
/**
|
|
270
|
+
* Name of an optional extra numeric Director prop that carries the blend
|
|
271
|
+
* duration (seconds) for the transition landing on the CURRENT
|
|
272
|
+
* evaluation. Defaults to `'blendSeconds'`. Absent, non-numeric, or
|
|
273
|
+
* non-positive at the moment of a transition reports `mode: 'cut'`.
|
|
274
|
+
*/
|
|
275
|
+
blendSecondsKey?: string;
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export interface TheatreDirectorBinding {
|
|
279
|
+
/**
|
|
280
|
+
* Current Director state (D4 AC: inspectable read API). Before the first
|
|
281
|
+
* clock crossing, this is the bind-time value (`readDirectorState` called
|
|
282
|
+
* once at bind); from the first crossing onward, it is the value as of the
|
|
283
|
+
* most recent crossing.
|
|
284
|
+
*/
|
|
285
|
+
getState(): DirectorState;
|
|
286
|
+
/** Removes the clock evaluator. No further evaluation (or hook calls) occurs after this. */
|
|
287
|
+
dispose(): void;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Bind a Director Theatre Sheet Object to `clock`: on every crossing, read
|
|
292
|
+
* its current value (`readDirectorState`) and, if `activeCamera` changed
|
|
293
|
+
* since the last evaluation, report the transition through
|
|
294
|
+
* `onActiveCameraChange` (the D6 seam). Returns a disposer and a `getState()`
|
|
295
|
+
* read API. See the module doc comment for the full contract.
|
|
296
|
+
*/
|
|
297
|
+
export function bindDirectorToClock<Props extends UnknownShorthandCompoundProps>(
|
|
298
|
+
clock: AnimationClock,
|
|
299
|
+
sheetObject: ISheetObject<Props>,
|
|
300
|
+
options: TheatreDirectorBindingOptions = {},
|
|
301
|
+
): TheatreDirectorBinding {
|
|
302
|
+
const phase = options.phase ?? 'preRender';
|
|
303
|
+
const blendSecondsKey = options.blendSecondsKey ?? 'blendSeconds';
|
|
304
|
+
|
|
305
|
+
let state: DirectorState = readDirectorState(sheetObject);
|
|
306
|
+
let previousCameraKey: string | null = null;
|
|
307
|
+
let hasEvaluatedOnClock = false;
|
|
308
|
+
|
|
309
|
+
function evaluate(): void {
|
|
310
|
+
state = readDirectorState(sheetObject);
|
|
311
|
+
|
|
312
|
+
const changed = !hasEvaluatedOnClock || state.activeCamera !== previousCameraKey;
|
|
313
|
+
if (changed) {
|
|
314
|
+
const blendRaw = state.extras[blendSecondsKey];
|
|
315
|
+
const blendSeconds =
|
|
316
|
+
hasEvaluatedOnClock && typeof blendRaw === 'number' && blendRaw > 0 ? blendRaw : 0;
|
|
317
|
+
const mode: CameraCutMode = blendSeconds > 0 ? 'blend' : 'cut';
|
|
318
|
+
|
|
319
|
+
options.onActiveCameraChange?.({
|
|
320
|
+
cameraKey: state.activeCamera,
|
|
321
|
+
previousCameraKey: hasEvaluatedOnClock ? previousCameraKey : null,
|
|
322
|
+
mode,
|
|
323
|
+
blendSeconds,
|
|
324
|
+
shot: state.shot,
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
previousCameraKey = state.activeCamera;
|
|
328
|
+
hasEvaluatedOnClock = true;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
333
|
+
evaluate();
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
let disposed = false;
|
|
337
|
+
return {
|
|
338
|
+
getState(): DirectorState {
|
|
339
|
+
return state;
|
|
340
|
+
},
|
|
341
|
+
dispose(): void {
|
|
342
|
+
if (disposed) return;
|
|
343
|
+
disposed = true;
|
|
344
|
+
handle.dispose();
|
|
345
|
+
},
|
|
346
|
+
};
|
|
347
|
+
}
|