@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,204 @@
|
|
|
1
|
+
// D-Z2 (docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md) — the standalone manifest-mount
|
|
2
|
+
// helper: an ENGINE-side generalization of `examples/tri-world/src/main.ts`'s
|
|
3
|
+
// hand-built `WorldMountSpec[]`.
|
|
4
|
+
//
|
|
5
|
+
// `resolveAllWorlds`/`resolveWorldAdapter` (`packages/editor/src/
|
|
6
|
+
// adapter-resolver.ts`) already do this translation for the EDITOR, but they
|
|
7
|
+
// are Vite-coupled by construction (`/@fs/` dynamic imports of project files
|
|
8
|
+
// through the dev server, §0.1/§0.5 of the design doc) — unusable from a
|
|
9
|
+
// plain static build. This module mirrors their per-kind dispatch
|
|
10
|
+
// (`default-three`/`default-pixi`/`default-react`, `{ module }`, `{ ingest }`)
|
|
11
|
+
// but never imports a project file itself: the caller's OWN bundler already
|
|
12
|
+
// resolved whatever module graph the manifest's worlds need, and hands the
|
|
13
|
+
// already-built pieces in via `entries` (keyed by world id) — no `/@fs/`, no
|
|
14
|
+
// dev server, no editor import.
|
|
15
|
+
//
|
|
16
|
+
// Engine-core react/pixi-free discipline (§0.6, mirrored from
|
|
17
|
+
// `create-runtime.ts`'s own documented rule for its `Pixi2DGameAdapter`/
|
|
18
|
+
// `ReactWorldAdapter` type-only imports): this file never value-imports
|
|
19
|
+
// `pixi.js`, `world2d/pixi-game-adapter.ts`, `react`, or `react-dom` — a
|
|
20
|
+
// pixijs or react world's adapter is ALWAYS supplied already-constructed via
|
|
21
|
+
// `entries[id].adapter` (the caller's own module graph built it, exactly like
|
|
22
|
+
// `tri-world`'s original hand-mount built `new PixiSceneGameAdapter(...)` and
|
|
23
|
+
// a hand-rolled `ReactWorldAdapter` itself). Threejs is different: `three`/
|
|
24
|
+
// `VgaiSceneGameAdapter` are already unconditional dependencies of every
|
|
25
|
+
// caller of `createGameRuntime`'s legacy path (this same file's sibling,
|
|
26
|
+
// immediately below in this directory), so building a `VgaiSceneGameAdapter`
|
|
27
|
+
// here for the common scene-driven/`setup`-driven cases adds no NEW bundle
|
|
28
|
+
// weight — only pixi/react are avoided.
|
|
29
|
+
import { fromSetup, VgaiSceneGameAdapter } from '../adapter';
|
|
30
|
+
import { assertNever } from '../adapter/world-kind';
|
|
31
|
+
import { loadGameManifest, } from '../manifest/load';
|
|
32
|
+
import { createGameRuntime, } from './create-runtime';
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// Raw-vs-resolved manifest detection
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
/**
|
|
37
|
+
* Distinguish an already-`loadGameManifest`d {@link ResolvedGameManifest}
|
|
38
|
+
* from a raw (pre-Zod-parse) manifest value. The two shapes differ in
|
|
39
|
+
* exactly one load-bearing way for this check: a `ResolvedWorldEntry.adapter`
|
|
40
|
+
* is `{ type: 'default' | 'module' | 'ingest', identity, ... }`, while a raw
|
|
41
|
+
* `WorldEntry.adapter` is the literal string `'default'` or a bare `{module}`/
|
|
42
|
+
* `{ingest}` object with NO `type`/`identity` fields (`schema.ts`'s
|
|
43
|
+
* `WorldAdapterSchema`). An empty `worlds` array is treated as "not resolved"
|
|
44
|
+
* (falls through to `loadGameManifest`, whose own Zod validation reports the
|
|
45
|
+
* empty-array error, if any, more precisely than a guess here could).
|
|
46
|
+
*/
|
|
47
|
+
function looksAlreadyResolved(value) {
|
|
48
|
+
if (typeof value !== 'object' || value === null)
|
|
49
|
+
return false;
|
|
50
|
+
const worlds = value.worlds;
|
|
51
|
+
if (!Array.isArray(worlds) || worlds.length === 0)
|
|
52
|
+
return false;
|
|
53
|
+
return worlds.every((world) => {
|
|
54
|
+
if (typeof world !== 'object' || world === null)
|
|
55
|
+
return false;
|
|
56
|
+
const adapter = world.adapter;
|
|
57
|
+
if (typeof adapter !== 'object' || adapter === null)
|
|
58
|
+
return false;
|
|
59
|
+
const type = adapter.type;
|
|
60
|
+
return type === 'default' || type === 'module' || type === 'ingest';
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Exported (E4, docs/unified-world-editor/27-visual-react-editing.md §7) so
|
|
65
|
+
* `mount-game.ts`'s `mountGameFromManifest` composer can share this exact
|
|
66
|
+
* raw-vs-resolved detection instead of re-implementing it — the two modules
|
|
67
|
+
* must always agree on what "already resolved" means.
|
|
68
|
+
*/
|
|
69
|
+
export function resolveManifest(raw) {
|
|
70
|
+
if (looksAlreadyResolved(raw))
|
|
71
|
+
return raw;
|
|
72
|
+
return loadGameManifest(raw);
|
|
73
|
+
}
|
|
74
|
+
// ---------------------------------------------------------------------------
|
|
75
|
+
// Per-kind entry -> adapter resolution (mirrors `resolveWorldAdapter`'s
|
|
76
|
+
// per-identity dispatch, `packages/editor/src/adapter-resolver.ts`)
|
|
77
|
+
// ---------------------------------------------------------------------------
|
|
78
|
+
function resolveThreeAdapter(world, entry) {
|
|
79
|
+
if (entry?.adapter)
|
|
80
|
+
return entry.adapter;
|
|
81
|
+
if (world.adapter.type === 'module') {
|
|
82
|
+
throw new Error(`mountManifestWorlds: world "${world.id}" (threejs) declares a { module } adapter ` +
|
|
83
|
+
`("${world.adapter.module}") — mountManifestWorlds never imports an arbitrary module ` +
|
|
84
|
+
'path itself (no `/@fs/`, no dev server). Import the module yourself and supply the ' +
|
|
85
|
+
`constructed adapter via entries["${world.id}"] = { kind: 'threejs', adapter }.`);
|
|
86
|
+
}
|
|
87
|
+
if (world.adapter.type === 'ingest') {
|
|
88
|
+
throw new Error(`mountManifestWorlds: world "${world.id}" (threejs) declares an { ingest } adapter — ` +
|
|
89
|
+
"ingest worlds require the editor's dev-server-backed mount machinery (an EditorStore " +
|
|
90
|
+
"plus iframe/DOM capture, see adapter-resolver.ts's resolveIngestThreeAdapter) and are " +
|
|
91
|
+
'not supported by mountManifestWorlds (docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md D-Z7 — no ' +
|
|
92
|
+
'porting aids, no hosted ingest routes).');
|
|
93
|
+
}
|
|
94
|
+
// type === 'default'
|
|
95
|
+
if (world.entry !== undefined) {
|
|
96
|
+
if (!entry?.setup) {
|
|
97
|
+
throw new Error(`mountManifestWorlds: world "${world.id}" (threejs) declares \`entry\` "${world.entry}" ` +
|
|
98
|
+
`— supply entries["${world.id}"] = { kind: 'threejs', setup } (the entry module's ` +
|
|
99
|
+
"exported `setup` function) or { kind: 'threejs', adapter } for full control. Got " +
|
|
100
|
+
`${entry === undefined ? 'no entry at all' : 'an entry with neither `setup` nor `adapter`'}.`);
|
|
101
|
+
}
|
|
102
|
+
return fromSetup(world.id, entry.setup);
|
|
103
|
+
}
|
|
104
|
+
if (world.scene !== undefined) {
|
|
105
|
+
return new VgaiSceneGameAdapter({
|
|
106
|
+
id: world.id,
|
|
107
|
+
scenePath: world.scene,
|
|
108
|
+
componentRegistry: entry?.componentRegistry,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// Unreachable in practice: `load.ts`'s `checkAdapterSceneEntryRules`
|
|
112
|
+
// requires `scene` or `entry` for every 'default' adapter world at
|
|
113
|
+
// manifest-load time — see `resolveDefaultThreeAdapter`'s identical guard.
|
|
114
|
+
throw new Error(`mountManifestWorlds: world "${world.id}" is default-three with neither \`scene\` nor ` +
|
|
115
|
+
'`entry` — this should have been rejected by manifest validation.');
|
|
116
|
+
}
|
|
117
|
+
function resolvePixiAdapter(world, entry) {
|
|
118
|
+
if (entry?.adapter)
|
|
119
|
+
return entry.adapter;
|
|
120
|
+
throw new Error(`mountManifestWorlds: world "${world.id}" (pixijs) has no entries["${world.id}"] — a pixijs ` +
|
|
121
|
+
'world always needs a caller-supplied, already-constructed adapter ' +
|
|
122
|
+
`(entries["${world.id}"] = { kind: 'pixijs', adapter }, e.g. \`new PixiSceneGameAdapter(...)\` ` +
|
|
123
|
+
"built from your own already-imported '@engine/world2d') — mountManifestWorlds never " +
|
|
124
|
+
"value-imports pixi.js (mirrors create-runtime.ts's own pixi-free-core discipline).");
|
|
125
|
+
}
|
|
126
|
+
function resolveReactAdapter(world, entry) {
|
|
127
|
+
if (entry?.adapter)
|
|
128
|
+
return entry.adapter;
|
|
129
|
+
throw new Error(`mountManifestWorlds: world "${world.id}" (react) has no entries["${world.id}"] — a react ` +
|
|
130
|
+
'world always needs a caller-supplied, already-constructed `ReactWorldAdapter` ' +
|
|
131
|
+
`(entries["${world.id}"] = { kind: 'react', adapter }, mounting via your own already-imported ` +
|
|
132
|
+
'react-dom `createRoot` + your own `<GameProvider>`) — mountManifestWorlds never ' +
|
|
133
|
+
"value-imports react/react-dom (mirrors create-runtime.ts's own react-free-core discipline; " +
|
|
134
|
+
'see docs/REACT-STATE-BRIDGE.md §2-3).');
|
|
135
|
+
}
|
|
136
|
+
function buildWorldMountSpec(world, entry) {
|
|
137
|
+
if (entry !== undefined && entry.kind !== world.kind) {
|
|
138
|
+
throw new Error(`mountManifestWorlds: entries["${world.id}"] declares kind "${entry.kind}" but the ` +
|
|
139
|
+
`manifest's world "${world.id}" is kind "${world.kind}" — fix the entries key (or the ` +
|
|
140
|
+
'manifest) so the two agree.');
|
|
141
|
+
}
|
|
142
|
+
const base = {
|
|
143
|
+
id: world.id,
|
|
144
|
+
zOrder: world.zOrder,
|
|
145
|
+
pausable: world.pausable,
|
|
146
|
+
loop: world.loop,
|
|
147
|
+
};
|
|
148
|
+
// `entry`'s `kind` is guaranteed to agree with `world.kind` past the guard
|
|
149
|
+
// above (or `entry` is `undefined`) — TS can't narrow a `Record` lookup
|
|
150
|
+
// through that runtime check, so each branch casts to its own entry shape;
|
|
151
|
+
// the actual safety comes from the mismatch guard, not from the cast.
|
|
152
|
+
if (world.kind === 'threejs') {
|
|
153
|
+
const threeEntry = entry;
|
|
154
|
+
return { ...base, kind: 'threejs', adapter: resolveThreeAdapter(world, threeEntry) };
|
|
155
|
+
}
|
|
156
|
+
if (world.kind === 'pixijs') {
|
|
157
|
+
const pixiEntry = entry;
|
|
158
|
+
return { ...base, kind: 'pixijs', adapter: resolvePixiAdapter(world, pixiEntry) };
|
|
159
|
+
}
|
|
160
|
+
if (world.kind === 'react') {
|
|
161
|
+
const reactEntry = entry;
|
|
162
|
+
return { ...base, kind: 'react', adapter: resolveReactAdapter(world, reactEntry) };
|
|
163
|
+
}
|
|
164
|
+
// Exhaustiveness guard (§7.4-2, same idiom as `resolveAllWorlds`'s own
|
|
165
|
+
// dispatch loop): `world.kind` is the closed `WorldEntry['kind']` union
|
|
166
|
+
// (`z.enum(['threejs','pixijs','react'])`), so a hypothetical 4th kind
|
|
167
|
+
// must fail to compile here, not silently fall through.
|
|
168
|
+
return assertNever(world.kind, 'mountManifestWorlds');
|
|
169
|
+
}
|
|
170
|
+
// ---------------------------------------------------------------------------
|
|
171
|
+
// Entry point
|
|
172
|
+
// ---------------------------------------------------------------------------
|
|
173
|
+
/**
|
|
174
|
+
* Mount every world declared by a `vgai.game.json` manifest onto `container`,
|
|
175
|
+
* standalone — no editor, no dev server. The generalization of
|
|
176
|
+
* `examples/tri-world/src/main.ts`'s hand-built `WorldMountSpec[]` (D-Z2,
|
|
177
|
+
* docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md). Reuses the pure `loadGameManifest`
|
|
178
|
+
* + `createGameRuntime({ worlds })` and mirrors `resolveAllWorlds`'s per-kind
|
|
179
|
+
* dispatch — but every entry the manifest needs beyond what a `default`-
|
|
180
|
+
* adapter scene/entry can express on its own comes from the caller's OWN
|
|
181
|
+
* already-imported module graph (`opts.entries`), never a dynamic import
|
|
182
|
+
* this file performs itself.
|
|
183
|
+
*
|
|
184
|
+
* Degrades loudly (docs/WAVE3-ADAPTER-PLUMBING-DESIGN.md D-Z2): a missing
|
|
185
|
+
* entry, a kind/shape mismatch, a `{ module }`/`{ ingest }` adapter with no
|
|
186
|
+
* caller-supplied adapter, or an empty manifest all throw a named `Error`
|
|
187
|
+
* identifying the world id, its kind, and what was expected — never a silent
|
|
188
|
+
* skip or a partially-mounted session.
|
|
189
|
+
*/
|
|
190
|
+
export async function mountManifestWorlds(opts) {
|
|
191
|
+
const manifest = resolveManifest(opts.manifest);
|
|
192
|
+
if (manifest.worlds.length === 0) {
|
|
193
|
+
throw new Error('mountManifestWorlds: manifest declares no worlds — nothing to mount.');
|
|
194
|
+
}
|
|
195
|
+
const entries = opts.entries ?? {};
|
|
196
|
+
const worlds = manifest.worlds.map((world) => buildWorldMountSpec(world, entries[world.id]));
|
|
197
|
+
return createGameRuntime({
|
|
198
|
+
container: opts.container,
|
|
199
|
+
worlds,
|
|
200
|
+
width: opts.width ?? manifest.resolution?.width,
|
|
201
|
+
height: opts.height ?? manifest.resolution?.height,
|
|
202
|
+
headless: opts.headless,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render-mode AUDIO control seam (I6, `docs/AI-NATIVE-AUTHORING-
|
|
3
|
+
* IMPLEMENTATION-SPEC.md` §15 I6 "Encode and Mux" + the audio-capture half of
|
|
4
|
+
* §13 G4). This is `render-control.ts`'s sibling for the audio side: where
|
|
5
|
+
* that module publishes `window.__vgaiRender` (exact-time seeks + composited
|
|
6
|
+
* frame passes), THIS module publishes `window.__vgaiRenderAudio` — an
|
|
7
|
+
* OPT-IN surface a render-mode page installs only when it declares a Tone
|
|
8
|
+
* score, so `vgai render-cinematic` (`packages/vgai-cli/src/render-
|
|
9
|
+
* cinematic.ts`) can detect "this cinematic has a deterministic audio track"
|
|
10
|
+
* with a single property check (`__vgaiRenderAudio?.hasAudio === true`)
|
|
11
|
+
* rather than needing a schema field threaded through every fixture.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately a SEPARATE global from `__vgaiRender`/`VgaiRenderHarness`
|
|
14
|
+
* (`render-control.ts`), not an extra method bolted onto that interface:
|
|
15
|
+
* every existing render-mode page (I0's `render-cinematic` fixture, I8's
|
|
16
|
+
* `reference-cinematic`) has no Tone score at all, and this keeps their
|
|
17
|
+
* bundles/tests completely untouched — `render-control.ts` itself is not
|
|
18
|
+
* modified by this unit.
|
|
19
|
+
*
|
|
20
|
+
* ## Why `renderAudio` takes `(start, end)` and `compose` is a FACTORY
|
|
21
|
+
*
|
|
22
|
+
* `Tone.Offline` (via `audio/tone-offline-render.ts`) gives the composition
|
|
23
|
+
* callback LOCAL time 0 at whatever `start` was requested — an offline
|
|
24
|
+
* render of `[10, 10.72)` schedules its first event at LOCAL time 0, not
|
|
25
|
+
* absolute time 10 (see that module's own doc comment). A render-mode page
|
|
26
|
+
* authors its score in ABSOLUTE/canonical time (e.g. "a note at the same
|
|
27
|
+
* t=1.2s the video's Director cut happens"), so the actual Tone-native
|
|
28
|
+
* compose callback passed to `renderToneOffline` must subtract the
|
|
29
|
+
* requested range's `start` from every scheduled event time. Rather than
|
|
30
|
+
* have every fixture re-derive that subtraction inline, this module's
|
|
31
|
+
* {@link RenderAudioControlOptions.compose} is a FACTORY: called once per
|
|
32
|
+
* `renderAudio(start, end)` invocation with `start`, returning the actual
|
|
33
|
+
* `Tone.Offline`-native callback closed over that offset. This is the
|
|
34
|
+
* concrete fix for the G12 review follow-up named in this unit's build
|
|
35
|
+
* brief ("renderToneOffline gives the composition LOCAL time 0 at `start`,
|
|
36
|
+
* so your composition must close over the range/offset").
|
|
37
|
+
*
|
|
38
|
+
* ## Wire format — why WAV bytes cross as base64, not a raw sample array
|
|
39
|
+
*
|
|
40
|
+
* `page.evaluate`'s return value is JSON-serialized; a `Float32Array`/
|
|
41
|
+
* typed-array result would either fail to serialize or be coerced into a
|
|
42
|
+
* verbose `{ "0": ..., "1": ... }` object, and a plain JS number array of
|
|
43
|
+
* (potentially) hundreds of thousands of floats is slow to serialize and
|
|
44
|
+
* bloats the IPC payload. Encoding the FULL WAV file (header + 16-bit PCM
|
|
45
|
+
* data, `audio/wav-encode.ts`) to a single base64 string in-page keeps the
|
|
46
|
+
* Node-side capture driver (`render-cinematic.ts`) to one
|
|
47
|
+
* `Buffer.from(wavBase64, 'base64')` + one `writeFile` — no PCM assembly
|
|
48
|
+
* logic duplicated on the Node side at all.
|
|
49
|
+
*/
|
|
50
|
+
import { type ToneOfflineComposeFn } from '../audio/tone-offline-render';
|
|
51
|
+
/** Builds the actual `Tone.Offline`-native compose callback for a render
|
|
52
|
+
* starting at `rangeStart` (absolute/canonical seconds) — see the module
|
|
53
|
+
* doc's "closes over the range/offset" section above. */
|
|
54
|
+
export type RenderAudioComposeFactory = (rangeStart: number) => ToneOfflineComposeFn;
|
|
55
|
+
export interface RenderAudioControlOptions {
|
|
56
|
+
/** See {@link RenderAudioComposeFactory}. */
|
|
57
|
+
readonly compose: RenderAudioComposeFactory;
|
|
58
|
+
/** Output channel count. Default 2 (stereo) — same default as `tone-offline-render.ts`. */
|
|
59
|
+
readonly channels?: number;
|
|
60
|
+
/** Output sample rate. Default 44100 — same default as `tone-offline-render.ts`. */
|
|
61
|
+
readonly sampleRate?: number;
|
|
62
|
+
/** Where to publish the harness. Defaults to the real `window` — override in a unit test. */
|
|
63
|
+
readonly target?: Record<string, unknown>;
|
|
64
|
+
/** Where to read `?vgai-render=1` from. Defaults to `window.location`. */
|
|
65
|
+
readonly location?: {
|
|
66
|
+
readonly search: string;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/** One offline audio render, encoded as a complete WAV file — the exact
|
|
70
|
+
* shape `render-cinematic.ts`'s capture driver reads back via `page.evaluate`. */
|
|
71
|
+
export interface RenderAudioResult {
|
|
72
|
+
/** Base64 of a complete little-endian 16-bit-PCM RIFF/WAVE file (see
|
|
73
|
+
* `audio/wav-encode.ts`) — decode with `Buffer.from(wavBase64, 'base64')`. */
|
|
74
|
+
readonly wavBase64: string;
|
|
75
|
+
readonly sampleRate: number;
|
|
76
|
+
readonly channels: number;
|
|
77
|
+
readonly durationSeconds: number;
|
|
78
|
+
/** RMS/peak over the raw PCM, BEFORE 16-bit quantization — lets a caller
|
|
79
|
+
* assert "genuinely non-silent audio, not a muxed-in silent track"
|
|
80
|
+
* without re-decoding the WAV it just received. */
|
|
81
|
+
readonly rms: number;
|
|
82
|
+
readonly peak: number;
|
|
83
|
+
}
|
|
84
|
+
/** The `window.__vgaiRenderAudio` surface. Presence of this global (guarded
|
|
85
|
+
* by `hasAudio: true`, never a bare `undefined`/`false` value on a present
|
|
86
|
+
* object) IS the "this cinematic declares a Tone score" signal `render-
|
|
87
|
+
* cinematic.ts` checks — see this module's own top doc comment. */
|
|
88
|
+
export interface VgaiRenderAudioHarness {
|
|
89
|
+
readonly hasAudio: true;
|
|
90
|
+
/** Render `[start, end)` (absolute/canonical seconds, exactly the same
|
|
91
|
+
* range `window.__vgaiRender`'s frame walk covers) offline via
|
|
92
|
+
* `Tone.Offline`, returning a complete WAV file. Deterministic: identical
|
|
93
|
+
* `(start, end)` on an unchanged score produces byte-identical
|
|
94
|
+
* `wavBase64` every call (the same `Tone.Offline` determinism
|
|
95
|
+
* `tone-offline-render.ts`/G2 already proves — this module adds no
|
|
96
|
+
* additional source of nondeterminism). */
|
|
97
|
+
renderAudio(start: number, end: number): Promise<RenderAudioResult>;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Build (and, when render mode is actually requested, publish) the
|
|
101
|
+
* `window.__vgaiRenderAudio` harness — same AC-4-shaped production
|
|
102
|
+
* protection as `installRenderControlHarness`: even called unconditionally
|
|
103
|
+
* on every boot, this only ever constructs/attaches the harness when
|
|
104
|
+
* `isRenderModeRequested(location)` is true, so a normal production gameplay
|
|
105
|
+
* page never gets `window.__vgaiRenderAudio` (and normal play never
|
|
106
|
+
* re-renders its music through an offline context — that would be a
|
|
107
|
+
* separate, much stranger bug).
|
|
108
|
+
*/
|
|
109
|
+
export declare function installRenderAudioHarness(opts: RenderAudioControlOptions): VgaiRenderAudioHarness | undefined;
|
|
110
|
+
//# sourceMappingURL=render-audio-control.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render-audio-control.d.ts","sourceRoot":"","sources":["../../src/runtime/render-audio-control.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDG;AAEH,OAAO,EAAqB,KAAK,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAI5F;;0DAE0D;AAC1D,MAAM,MAAM,yBAAyB,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,oBAAoB,CAAC;AAErF,MAAM,WAAW,yBAAyB;IACxC,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,EAAE,yBAAyB,CAAC;IAC5C,2FAA2F;IAC3F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC1C,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CACjD;AAED;mFACmF;AACnF,MAAM,WAAW,iBAAiB;IAChC;mFAC+E;IAC/E,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC;;wDAEoD;IACpD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED;;;oEAGoE;AACpE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB;;;;;;gDAM4C;IAC5C,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrE;AAED;;;;;;;;;GASG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,yBAAyB,GAC9B,sBAAsB,GAAG,SAAS,CAoCpC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render-mode AUDIO control seam (I6, `docs/AI-NATIVE-AUTHORING-
|
|
3
|
+
* IMPLEMENTATION-SPEC.md` §15 I6 "Encode and Mux" + the audio-capture half of
|
|
4
|
+
* §13 G4). This is `render-control.ts`'s sibling for the audio side: where
|
|
5
|
+
* that module publishes `window.__vgaiRender` (exact-time seeks + composited
|
|
6
|
+
* frame passes), THIS module publishes `window.__vgaiRenderAudio` — an
|
|
7
|
+
* OPT-IN surface a render-mode page installs only when it declares a Tone
|
|
8
|
+
* score, so `vgai render-cinematic` (`packages/vgai-cli/src/render-
|
|
9
|
+
* cinematic.ts`) can detect "this cinematic has a deterministic audio track"
|
|
10
|
+
* with a single property check (`__vgaiRenderAudio?.hasAudio === true`)
|
|
11
|
+
* rather than needing a schema field threaded through every fixture.
|
|
12
|
+
*
|
|
13
|
+
* Deliberately a SEPARATE global from `__vgaiRender`/`VgaiRenderHarness`
|
|
14
|
+
* (`render-control.ts`), not an extra method bolted onto that interface:
|
|
15
|
+
* every existing render-mode page (I0's `render-cinematic` fixture, I8's
|
|
16
|
+
* `reference-cinematic`) has no Tone score at all, and this keeps their
|
|
17
|
+
* bundles/tests completely untouched — `render-control.ts` itself is not
|
|
18
|
+
* modified by this unit.
|
|
19
|
+
*
|
|
20
|
+
* ## Why `renderAudio` takes `(start, end)` and `compose` is a FACTORY
|
|
21
|
+
*
|
|
22
|
+
* `Tone.Offline` (via `audio/tone-offline-render.ts`) gives the composition
|
|
23
|
+
* callback LOCAL time 0 at whatever `start` was requested — an offline
|
|
24
|
+
* render of `[10, 10.72)` schedules its first event at LOCAL time 0, not
|
|
25
|
+
* absolute time 10 (see that module's own doc comment). A render-mode page
|
|
26
|
+
* authors its score in ABSOLUTE/canonical time (e.g. "a note at the same
|
|
27
|
+
* t=1.2s the video's Director cut happens"), so the actual Tone-native
|
|
28
|
+
* compose callback passed to `renderToneOffline` must subtract the
|
|
29
|
+
* requested range's `start` from every scheduled event time. Rather than
|
|
30
|
+
* have every fixture re-derive that subtraction inline, this module's
|
|
31
|
+
* {@link RenderAudioControlOptions.compose} is a FACTORY: called once per
|
|
32
|
+
* `renderAudio(start, end)` invocation with `start`, returning the actual
|
|
33
|
+
* `Tone.Offline`-native callback closed over that offset. This is the
|
|
34
|
+
* concrete fix for the G12 review follow-up named in this unit's build
|
|
35
|
+
* brief ("renderToneOffline gives the composition LOCAL time 0 at `start`,
|
|
36
|
+
* so your composition must close over the range/offset").
|
|
37
|
+
*
|
|
38
|
+
* ## Wire format — why WAV bytes cross as base64, not a raw sample array
|
|
39
|
+
*
|
|
40
|
+
* `page.evaluate`'s return value is JSON-serialized; a `Float32Array`/
|
|
41
|
+
* typed-array result would either fail to serialize or be coerced into a
|
|
42
|
+
* verbose `{ "0": ..., "1": ... }` object, and a plain JS number array of
|
|
43
|
+
* (potentially) hundreds of thousands of floats is slow to serialize and
|
|
44
|
+
* bloats the IPC payload. Encoding the FULL WAV file (header + 16-bit PCM
|
|
45
|
+
* data, `audio/wav-encode.ts`) to a single base64 string in-page keeps the
|
|
46
|
+
* Node-side capture driver (`render-cinematic.ts`) to one
|
|
47
|
+
* `Buffer.from(wavBase64, 'base64')` + one `writeFile` — no PCM assembly
|
|
48
|
+
* logic duplicated on the Node side at all.
|
|
49
|
+
*/
|
|
50
|
+
import { renderToneOffline } from '../audio/tone-offline-render';
|
|
51
|
+
import { encodeWav16, pcmStats } from '../audio/wav-encode';
|
|
52
|
+
import { isRenderModeRequested } from './render-control';
|
|
53
|
+
/**
|
|
54
|
+
* Build (and, when render mode is actually requested, publish) the
|
|
55
|
+
* `window.__vgaiRenderAudio` harness — same AC-4-shaped production
|
|
56
|
+
* protection as `installRenderControlHarness`: even called unconditionally
|
|
57
|
+
* on every boot, this only ever constructs/attaches the harness when
|
|
58
|
+
* `isRenderModeRequested(location)` is true, so a normal production gameplay
|
|
59
|
+
* page never gets `window.__vgaiRenderAudio` (and normal play never
|
|
60
|
+
* re-renders its music through an offline context — that would be a
|
|
61
|
+
* separate, much stranger bug).
|
|
62
|
+
*/
|
|
63
|
+
export function installRenderAudioHarness(opts) {
|
|
64
|
+
const location = opts.location ?? window.location;
|
|
65
|
+
if (!isRenderModeRequested(location))
|
|
66
|
+
return undefined;
|
|
67
|
+
const target = opts.target ?? window;
|
|
68
|
+
const { compose, channels, sampleRate } = opts;
|
|
69
|
+
const harness = {
|
|
70
|
+
hasAudio: true,
|
|
71
|
+
async renderAudio(start, end) {
|
|
72
|
+
const rendered = await renderToneOffline({
|
|
73
|
+
start,
|
|
74
|
+
end,
|
|
75
|
+
...(channels !== undefined ? { channels } : {}),
|
|
76
|
+
...(sampleRate !== undefined ? { sampleRate } : {}),
|
|
77
|
+
compose: compose(start),
|
|
78
|
+
});
|
|
79
|
+
const channelData = [];
|
|
80
|
+
for (let ch = 0; ch < rendered.buffer.numberOfChannels; ch++) {
|
|
81
|
+
channelData.push(rendered.buffer.getChannelData(ch));
|
|
82
|
+
}
|
|
83
|
+
const wavBytes = encodeWav16({ channelData, sampleRate: rendered.buffer.sampleRate });
|
|
84
|
+
const stats = pcmStats(channelData);
|
|
85
|
+
return {
|
|
86
|
+
wavBase64: uint8ArrayToBase64(wavBytes),
|
|
87
|
+
sampleRate: rendered.buffer.sampleRate,
|
|
88
|
+
channels: rendered.buffer.numberOfChannels,
|
|
89
|
+
durationSeconds: rendered.durationSeconds,
|
|
90
|
+
rms: stats.rms,
|
|
91
|
+
peak: stats.peak,
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
target['__vgaiRenderAudio'] = harness;
|
|
96
|
+
return harness;
|
|
97
|
+
}
|
|
98
|
+
/** Browser-native base64 encode (`btoa`) over a `Uint8Array`, chunked so a
|
|
99
|
+
* multi-second stereo WAV doesn't blow `String.fromCharCode`'s argument-count
|
|
100
|
+
* limit in one call. Node has no `btoa` for arbitrary bytes reliably across
|
|
101
|
+
* versions, but this module only ever runs in the browser (render-mode
|
|
102
|
+
* pages), matching `tone-offline-render.ts`'s own "browser-only" contract. */
|
|
103
|
+
function uint8ArrayToBase64(bytes) {
|
|
104
|
+
const CHUNK_SIZE = 0x8000;
|
|
105
|
+
let binary = '';
|
|
106
|
+
for (let i = 0; i < bytes.length; i += CHUNK_SIZE) {
|
|
107
|
+
const chunk = bytes.subarray(i, i + CHUNK_SIZE);
|
|
108
|
+
binary += String.fromCharCode(...chunk);
|
|
109
|
+
}
|
|
110
|
+
return btoa(binary);
|
|
111
|
+
}
|