@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,661 @@
|
|
|
1
|
+
import type { ISheetObject, UnknownShorthandCompoundProps } from '@theatre/core';
|
|
2
|
+
// Type-only import — matches `world2d/types.ts`'s own rule (the engine core
|
|
3
|
+
// never VALUE-imports `pixi.js`; a caller supplies the constructed
|
|
4
|
+
// Container/Sprite, this module only types against it).
|
|
5
|
+
import type { Container } from 'pixi.js';
|
|
6
|
+
// Type-only import of the SAME `postprocessing` package the engine's own
|
|
7
|
+
// composer pipeline uses directly (`setup-renderer.ts`) — no wrapper.
|
|
8
|
+
import type { BloomEffect, VignetteEffect } from 'postprocessing';
|
|
9
|
+
import type * as THREE from 'three';
|
|
10
|
+
import type { SystemPhaseName } from '../core/types';
|
|
11
|
+
import type { AnimationClock, ClockEvaluatorHandle } from './animation-clock';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* D3 — stable binding from a Theatre Sheet Object to a `THREE.Object3D`/
|
|
15
|
+
* camera (spec §10 D3, §5.3). This is the "thin integration code" the spec
|
|
16
|
+
* calls for: it reads a Theatre object's pull-based `.value` on every clock
|
|
17
|
+
* crossing and writes the (small, fixed) set of known sub-props straight
|
|
18
|
+
* onto the target's real Three.js properties. It is deliberately NOT a
|
|
19
|
+
* generic/arbitrary property-path evaluator — the only shapes understood are
|
|
20
|
+
* the ones declared below (`TransformProps`, `CameraLensProps`), matching
|
|
21
|
+
* "No arbitrary unsafe property-path evaluator is introduced" (D3 AC).
|
|
22
|
+
*
|
|
23
|
+
* Reads `sheetObject.value` rather than subscribing to Theatre's
|
|
24
|
+
* `onValuesChange` push channel — see `theatre-clock-binding.ts`'s module doc
|
|
25
|
+
* for why: `.value` is synchronously fresh immediately after
|
|
26
|
+
* `sequence.position` is set, while `onValuesChange` is batched on Theatre's
|
|
27
|
+
* own raf-driven ticker and is not delivered 1:1 with each synchronous clock
|
|
28
|
+
* seek (it may coalesce several writes into one notification, or — headless,
|
|
29
|
+
* no-raf — never fire at all).
|
|
30
|
+
*
|
|
31
|
+
* Object identity: a Theatre Sheet Object always carries both its stable,
|
|
32
|
+
* readable Theatre name (`sheetObject.address.objectKey`) and, since the
|
|
33
|
+
* caller supplies the bound `THREE.Object3D` directly, that object's own
|
|
34
|
+
* engine identity (`Object3D.uuid`/`.name`/`userData['entityId']`) — both are
|
|
35
|
+
* inspectable from the object references the binding already holds; nothing
|
|
36
|
+
* further to thread through.
|
|
37
|
+
*
|
|
38
|
+
* ## Remaining D3 channels: quaternion/material/light/post-processing/UI/Pixi
|
|
39
|
+
*
|
|
40
|
+
* The rest of the D3 AC's channel list (spec §10 D3: "Position,
|
|
41
|
+
* rotation/quaternion, scale, camera lens, material/light, post-processing,
|
|
42
|
+
* and selected UI properties have tested bindings") is implemented below,
|
|
43
|
+
* each as its own small, explicit, TYPED helper — never a generic
|
|
44
|
+
* property-path evaluator:
|
|
45
|
+
*
|
|
46
|
+
* - `bindObject3DQuaternion` — `Object3D.quaternion`, authored as a plain
|
|
47
|
+
* `{x,y,z,w}` compound (see `QuaternionProps`'s doc for the interpolation
|
|
48
|
+
* caveat and why the binding always normalizes).
|
|
49
|
+
* - `bindMaterialProperties` — `color`/`opacity`/`emissiveIntensity`/
|
|
50
|
+
* `roughness`/`metalness` on a real `THREE.Material`, feature-detecting
|
|
51
|
+
* which sub-props the concrete material subtype actually has.
|
|
52
|
+
* - `bindLightProperties` — `intensity`/`color` on a real `THREE.Light`.
|
|
53
|
+
* - `bindBloomEffect` / `bindVignetteEffect` — `intensity`/`opacity` and
|
|
54
|
+
* `offset`/`darkness` on real `postprocessing` `BloomEffect`/
|
|
55
|
+
* `VignetteEffect` instances (the SAME package `setup-renderer.ts` already
|
|
56
|
+
* wires into the engine's composer — no new post-processing stack).
|
|
57
|
+
* - `bindDomElementStyle` — `opacity`/`translateX`/`translateY` on a
|
|
58
|
+
* DOM-style-writable target (`DomStyleTarget`, a narrow structural
|
|
59
|
+
* interface a real `HTMLElement` satisfies with no adapter).
|
|
60
|
+
* - `bindPixiContainerTransform` — `x`/`y`/`rotation`/`scaleX`/`scaleY`/
|
|
61
|
+
* `alpha` on a real `PIXI.Container`/`PIXI.Sprite`.
|
|
62
|
+
*
|
|
63
|
+
* All of the above are proven against REAL target objects in
|
|
64
|
+
* `theatre-object-binding-d3.test.ts` — `BloomEffect`/`VignetteEffect`/
|
|
65
|
+
* `PIXI.Container`/`PIXI.Sprite` all construct and expose plain,
|
|
66
|
+
* synchronously-settable properties with no WebGL/canvas/renderer required,
|
|
67
|
+
* so nothing here is a mock of the underlying library. The one channel that
|
|
68
|
+
* genuinely cannot construct real headlessly in THIS repo's `environment:
|
|
69
|
+
* 'node'` vitest lane (`vitest.config.ts` — no DOM) is a real `HTMLElement`;
|
|
70
|
+
* `bindDomElementStyle` is typed against the narrow `DomStyleTarget`
|
|
71
|
+
* structural interface instead of full `HTMLElement`, and its test exercises
|
|
72
|
+
* a plain object literal shaped like one — the exact same binding code path
|
|
73
|
+
* a real `HTMLElement`/React-overlay ref runs through in a browser or a
|
|
74
|
+
* jsdom-backed test. Nothing here is deferred.
|
|
75
|
+
*/
|
|
76
|
+
|
|
77
|
+
/** Thrown when a binding is constructed with a missing/falsy target. */
|
|
78
|
+
export class TheatreBindingError extends Error {
|
|
79
|
+
constructor(
|
|
80
|
+
message: string,
|
|
81
|
+
readonly objectKey: string,
|
|
82
|
+
) {
|
|
83
|
+
super(message);
|
|
84
|
+
this.name = 'TheatreBindingError';
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface Vector3Like {
|
|
89
|
+
x: number;
|
|
90
|
+
y: number;
|
|
91
|
+
z: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* The fixed shape a Theatre object must expose (as a subset) to drive an
|
|
96
|
+
* `Object3D`'s transform. Author it with e.g.
|
|
97
|
+
* `sheet.object('Hero', { position: { x: 0, y: 0, z: 0 }, rotation: { x: 0, y: 0, z: 0 }, scale: { x: 1, y: 1, z: 1 } })`.
|
|
98
|
+
* `rotation` is Euler angles in radians, XYZ order (matches `THREE.Euler`'s default).
|
|
99
|
+
*/
|
|
100
|
+
export interface TransformProps {
|
|
101
|
+
position?: Vector3Like;
|
|
102
|
+
rotation?: Vector3Like;
|
|
103
|
+
scale?: Vector3Like;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface TheatreObjectBindingOptions {
|
|
107
|
+
/**
|
|
108
|
+
* Which `AnimationClock` phase to apply values in. Defaults to
|
|
109
|
+
* `'preRender'` — the documented home for camera placement/material tick
|
|
110
|
+
* (`ARCHITECTURE.md`), and guaranteed by `PHASE_ORDER` to run after the
|
|
111
|
+
* `'animation'`-phase default of `bindClockToTheatreSequence`, so the
|
|
112
|
+
* sheet's sequence position is always current by the time this reads
|
|
113
|
+
* `sheetObject.value`, regardless of registration order.
|
|
114
|
+
*/
|
|
115
|
+
phase?: SystemPhaseName;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface TheatreObjectBinding {
|
|
119
|
+
/** Removes the clock evaluator. The target keeps whatever value it last had. */
|
|
120
|
+
dispose(): void;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Shared disposer wiring for every binding below (same one-shot-dispose
|
|
125
|
+
* shape `bindObject3DTransform`/`bindCameraLens` each inline above) — pulled
|
|
126
|
+
* into one helper only because six more binding functions follow, to avoid
|
|
127
|
+
* repeating the identical five lines six more times. Behavior is identical
|
|
128
|
+
* to the inline version: idempotent `dispose()`, no further writes after.
|
|
129
|
+
*/
|
|
130
|
+
function toBinding(handle: ClockEvaluatorHandle): TheatreObjectBinding {
|
|
131
|
+
let disposed = false;
|
|
132
|
+
return {
|
|
133
|
+
dispose(): void {
|
|
134
|
+
if (disposed) return;
|
|
135
|
+
disposed = true;
|
|
136
|
+
handle.dispose();
|
|
137
|
+
},
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Bind a Theatre Sheet Object's `position`/`rotation`/`scale` sub-props (any
|
|
143
|
+
* subset) to a `THREE.Object3D`. Whichever of the three keys are present on
|
|
144
|
+
* `sheetObject.value` are applied; missing keys are left untouched on the
|
|
145
|
+
* target.
|
|
146
|
+
*
|
|
147
|
+
* @throws {TheatreBindingError} if `target` is null/undefined at bind time.
|
|
148
|
+
*/
|
|
149
|
+
export function bindObject3DTransform<Props extends UnknownShorthandCompoundProps>(
|
|
150
|
+
clock: AnimationClock,
|
|
151
|
+
sheetObject: ISheetObject<Props>,
|
|
152
|
+
target: THREE.Object3D | null | undefined,
|
|
153
|
+
options: TheatreObjectBindingOptions = {},
|
|
154
|
+
): TheatreObjectBinding {
|
|
155
|
+
if (!target) {
|
|
156
|
+
throw new TheatreBindingError(
|
|
157
|
+
`[bindObject3DTransform] missing target Object3D for Theatre object "${sheetObject.address.objectKey}"`,
|
|
158
|
+
sheetObject.address.objectKey,
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
const phase = options.phase ?? 'preRender';
|
|
163
|
+
|
|
164
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
165
|
+
const value = sheetObject.value as TransformProps;
|
|
166
|
+
if (value.position) {
|
|
167
|
+
target.position.set(value.position.x, value.position.y, value.position.z);
|
|
168
|
+
}
|
|
169
|
+
if (value.rotation) {
|
|
170
|
+
target.rotation.set(value.rotation.x, value.rotation.y, value.rotation.z);
|
|
171
|
+
}
|
|
172
|
+
if (value.scale) {
|
|
173
|
+
target.scale.set(value.scale.x, value.scale.y, value.scale.z);
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
|
|
177
|
+
let disposed = false;
|
|
178
|
+
return {
|
|
179
|
+
dispose(): void {
|
|
180
|
+
if (disposed) return;
|
|
181
|
+
disposed = true;
|
|
182
|
+
handle.dispose();
|
|
183
|
+
},
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* The fixed shape a Theatre object must expose (as a subset) to drive a
|
|
189
|
+
* `THREE.PerspectiveCamera`'s lens. Author it with e.g.
|
|
190
|
+
* `sheet.object('Lens', { fov: 50, near: 0.1, far: 1000 })`.
|
|
191
|
+
*/
|
|
192
|
+
export interface CameraLensProps {
|
|
193
|
+
fov?: number;
|
|
194
|
+
near?: number;
|
|
195
|
+
far?: number;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Bind a Theatre Sheet Object's `fov`/`near`/`far` sub-props (any subset) to
|
|
200
|
+
* a `THREE.PerspectiveCamera`'s lens, calling `updateProjectionMatrix()`
|
|
201
|
+
* whenever any of them change.
|
|
202
|
+
*
|
|
203
|
+
* @throws {TheatreBindingError} if `camera` is null/undefined at bind time.
|
|
204
|
+
*/
|
|
205
|
+
export function bindCameraLens<Props extends UnknownShorthandCompoundProps>(
|
|
206
|
+
clock: AnimationClock,
|
|
207
|
+
sheetObject: ISheetObject<Props>,
|
|
208
|
+
camera: THREE.PerspectiveCamera | null | undefined,
|
|
209
|
+
options: TheatreObjectBindingOptions = {},
|
|
210
|
+
): TheatreObjectBinding {
|
|
211
|
+
if (!camera) {
|
|
212
|
+
throw new TheatreBindingError(
|
|
213
|
+
`[bindCameraLens] missing target PerspectiveCamera for Theatre object "${sheetObject.address.objectKey}"`,
|
|
214
|
+
sheetObject.address.objectKey,
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
const phase = options.phase ?? 'preRender';
|
|
219
|
+
|
|
220
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
221
|
+
const value = sheetObject.value as CameraLensProps;
|
|
222
|
+
let changed = false;
|
|
223
|
+
if (typeof value.fov === 'number' && camera.fov !== value.fov) {
|
|
224
|
+
camera.fov = value.fov;
|
|
225
|
+
changed = true;
|
|
226
|
+
}
|
|
227
|
+
if (typeof value.near === 'number' && camera.near !== value.near) {
|
|
228
|
+
camera.near = value.near;
|
|
229
|
+
changed = true;
|
|
230
|
+
}
|
|
231
|
+
if (typeof value.far === 'number' && camera.far !== value.far) {
|
|
232
|
+
camera.far = value.far;
|
|
233
|
+
changed = true;
|
|
234
|
+
}
|
|
235
|
+
if (changed) camera.updateProjectionMatrix();
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
let disposed = false;
|
|
239
|
+
return {
|
|
240
|
+
dispose(): void {
|
|
241
|
+
if (disposed) return;
|
|
242
|
+
disposed = true;
|
|
243
|
+
handle.dispose();
|
|
244
|
+
},
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
249
|
+
// Quaternion rotation
|
|
250
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
251
|
+
|
|
252
|
+
export interface QuaternionLike {
|
|
253
|
+
x: number;
|
|
254
|
+
y: number;
|
|
255
|
+
z: number;
|
|
256
|
+
w: number;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* The fixed shape a Theatre object must expose to drive an `Object3D`'s
|
|
261
|
+
* rotation as a quaternion — an alternative to `TransformProps.rotation`'s
|
|
262
|
+
* Euler angles for cases that need to avoid gimbal lock or author a rotation
|
|
263
|
+
* that doesn't decompose cleanly into per-axis Euler angles. Author it with
|
|
264
|
+
* e.g. `sheet.object('Hero', { quaternion: { x: 0, y: 0, z: 0, w: 1 } })` —
|
|
265
|
+
* the authored shape is Theatre's plain shorthand-compound of the SAME four
|
|
266
|
+
* fields `THREE.Quaternion` itself exposes (`x`/`y`/`z`/`w`); there is no
|
|
267
|
+
* VGAI-invented quaternion encoding.
|
|
268
|
+
*
|
|
269
|
+
* Theatre has no native quaternion/slerp track type — it interpolates each
|
|
270
|
+
* of `x`/`y`/`z`/`w` LINEARLY and independently, so a value read strictly
|
|
271
|
+
* BETWEEN two authored keyframes is a component-wise lerp, not a slerp, and
|
|
272
|
+
* is not guaranteed to be exactly unit length. `bindObject3DQuaternion`
|
|
273
|
+
* always calls `.normalize()` immediately after `.set(...)`, so the applied
|
|
274
|
+
* rotation is never a scaled/denormalized quaternion even mid-interpolation
|
|
275
|
+
* — but normalizing a lerp is not the same curve a true slerp would trace.
|
|
276
|
+
* For continuous cinematic rotation, prefer authoring dense keyframes (exact
|
|
277
|
+
* at each keyframe, close between nearby ones), or use
|
|
278
|
+
* `TransformProps.rotation`'s Euler channel instead (also only lerped
|
|
279
|
+
* per-axis by Theatre, but with no unit-length concern at all).
|
|
280
|
+
*/
|
|
281
|
+
export interface QuaternionProps {
|
|
282
|
+
quaternion?: QuaternionLike;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Bind a Theatre Sheet Object's `quaternion` sub-prop to a `THREE.Object3D`'s
|
|
287
|
+
* `.quaternion`. See `QuaternionProps`'s doc for the authored shape and its
|
|
288
|
+
* interpolation caveat.
|
|
289
|
+
*
|
|
290
|
+
* @throws {TheatreBindingError} if `target` is null/undefined at bind time.
|
|
291
|
+
*/
|
|
292
|
+
export function bindObject3DQuaternion<Props extends UnknownShorthandCompoundProps>(
|
|
293
|
+
clock: AnimationClock,
|
|
294
|
+
sheetObject: ISheetObject<Props>,
|
|
295
|
+
target: THREE.Object3D | null | undefined,
|
|
296
|
+
options: TheatreObjectBindingOptions = {},
|
|
297
|
+
): TheatreObjectBinding {
|
|
298
|
+
if (!target) {
|
|
299
|
+
throw new TheatreBindingError(
|
|
300
|
+
`[bindObject3DQuaternion] missing target Object3D for Theatre object "${sheetObject.address.objectKey}"`,
|
|
301
|
+
sheetObject.address.objectKey,
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
const phase = options.phase ?? 'preRender';
|
|
306
|
+
|
|
307
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
308
|
+
const value = sheetObject.value as QuaternionProps;
|
|
309
|
+
if (value.quaternion) {
|
|
310
|
+
const { x, y, z, w } = value.quaternion;
|
|
311
|
+
target.quaternion.set(x, y, z, w);
|
|
312
|
+
target.quaternion.normalize();
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
return toBinding(handle);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
320
|
+
// Material properties
|
|
321
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
322
|
+
|
|
323
|
+
export interface ColorLike {
|
|
324
|
+
r: number;
|
|
325
|
+
g: number;
|
|
326
|
+
b: number;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* A small, fixed, TYPED subset of `THREE.Material` properties — NOT an
|
|
331
|
+
* arbitrary property-path evaluator. `color` mirrors Theatre's own native
|
|
332
|
+
* `types.rgba(...)` value shape (`{r,g,b,a}`, 0-1 floats) minus alpha (use
|
|
333
|
+
* the separate `opacity` field, which is what `THREE.Material.opacity`
|
|
334
|
+
* itself already is). `emissiveIntensity`/`roughness`/`metalness` only exist
|
|
335
|
+
* on `THREE.MeshStandardMaterial`-family materials; `bindMaterialProperties`
|
|
336
|
+
* feature-detects each with an `in` check and silently skips any sub-prop
|
|
337
|
+
* the target material doesn't have (mirroring `bindObject3DTransform`'s
|
|
338
|
+
* "whichever subset is present" contract) rather than throwing.
|
|
339
|
+
*/
|
|
340
|
+
export interface MaterialProps {
|
|
341
|
+
color?: ColorLike;
|
|
342
|
+
opacity?: number;
|
|
343
|
+
emissiveIntensity?: number;
|
|
344
|
+
roughness?: number;
|
|
345
|
+
metalness?: number;
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
type ExtendedMaterial = THREE.Material & {
|
|
349
|
+
color?: THREE.Color;
|
|
350
|
+
emissiveIntensity?: number;
|
|
351
|
+
roughness?: number;
|
|
352
|
+
metalness?: number;
|
|
353
|
+
};
|
|
354
|
+
|
|
355
|
+
/**
|
|
356
|
+
* Bind a Theatre Sheet Object's `color`/`opacity`/`emissiveIntensity`/
|
|
357
|
+
* `roughness`/`metalness` sub-props (any subset the target material
|
|
358
|
+
* supports) to a `THREE.Material`.
|
|
359
|
+
*
|
|
360
|
+
* @throws {TheatreBindingError} if `target` is null/undefined at bind time.
|
|
361
|
+
*/
|
|
362
|
+
export function bindMaterialProperties<Props extends UnknownShorthandCompoundProps>(
|
|
363
|
+
clock: AnimationClock,
|
|
364
|
+
sheetObject: ISheetObject<Props>,
|
|
365
|
+
target: THREE.Material | null | undefined,
|
|
366
|
+
options: TheatreObjectBindingOptions = {},
|
|
367
|
+
): TheatreObjectBinding {
|
|
368
|
+
if (!target) {
|
|
369
|
+
throw new TheatreBindingError(
|
|
370
|
+
`[bindMaterialProperties] missing target Material for Theatre object "${sheetObject.address.objectKey}"`,
|
|
371
|
+
sheetObject.address.objectKey,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
const material = target as ExtendedMaterial;
|
|
376
|
+
const phase = options.phase ?? 'preRender';
|
|
377
|
+
|
|
378
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
379
|
+
const value = sheetObject.value as MaterialProps;
|
|
380
|
+
if (value.color && material.color) {
|
|
381
|
+
material.color.setRGB(value.color.r, value.color.g, value.color.b);
|
|
382
|
+
}
|
|
383
|
+
if (typeof value.opacity === 'number') {
|
|
384
|
+
material.opacity = value.opacity;
|
|
385
|
+
}
|
|
386
|
+
if (typeof value.emissiveIntensity === 'number' && 'emissiveIntensity' in material) {
|
|
387
|
+
material.emissiveIntensity = value.emissiveIntensity;
|
|
388
|
+
}
|
|
389
|
+
if (typeof value.roughness === 'number' && 'roughness' in material) {
|
|
390
|
+
material.roughness = value.roughness;
|
|
391
|
+
}
|
|
392
|
+
if (typeof value.metalness === 'number' && 'metalness' in material) {
|
|
393
|
+
material.metalness = value.metalness;
|
|
394
|
+
}
|
|
395
|
+
});
|
|
396
|
+
|
|
397
|
+
return toBinding(handle);
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
401
|
+
// Light properties
|
|
402
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
403
|
+
|
|
404
|
+
/** A small, fixed, TYPED subset of `THREE.Light` properties. */
|
|
405
|
+
export interface LightProps {
|
|
406
|
+
intensity?: number;
|
|
407
|
+
color?: ColorLike;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Bind a Theatre Sheet Object's `intensity`/`color` sub-props (any subset)
|
|
412
|
+
* to a `THREE.Light`.
|
|
413
|
+
*
|
|
414
|
+
* @throws {TheatreBindingError} if `target` is null/undefined at bind time.
|
|
415
|
+
*/
|
|
416
|
+
export function bindLightProperties<Props extends UnknownShorthandCompoundProps>(
|
|
417
|
+
clock: AnimationClock,
|
|
418
|
+
sheetObject: ISheetObject<Props>,
|
|
419
|
+
target: THREE.Light | null | undefined,
|
|
420
|
+
options: TheatreObjectBindingOptions = {},
|
|
421
|
+
): TheatreObjectBinding {
|
|
422
|
+
if (!target) {
|
|
423
|
+
throw new TheatreBindingError(
|
|
424
|
+
`[bindLightProperties] missing target Light for Theatre object "${sheetObject.address.objectKey}"`,
|
|
425
|
+
sheetObject.address.objectKey,
|
|
426
|
+
);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
const phase = options.phase ?? 'preRender';
|
|
430
|
+
|
|
431
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
432
|
+
const value = sheetObject.value as LightProps;
|
|
433
|
+
if (typeof value.intensity === 'number') {
|
|
434
|
+
target.intensity = value.intensity;
|
|
435
|
+
}
|
|
436
|
+
if (value.color) {
|
|
437
|
+
target.color.setRGB(value.color.r, value.color.g, value.color.b);
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
|
|
441
|
+
return toBinding(handle);
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
445
|
+
// Post-processing (real `postprocessing` package effects — see module doc)
|
|
446
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
447
|
+
|
|
448
|
+
/** A small, fixed, TYPED subset of `postprocessing`'s `BloomEffect` properties. */
|
|
449
|
+
export interface BloomEffectProps {
|
|
450
|
+
intensity?: number;
|
|
451
|
+
/** Effect blend opacity (`BloomEffect.blendMode.opacity.value`), 0-1. */
|
|
452
|
+
opacity?: number;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
/**
|
|
456
|
+
* Bind a Theatre Sheet Object's `intensity`/`opacity` sub-props (any subset)
|
|
457
|
+
* to a real `postprocessing` `BloomEffect` — the SAME `postprocessing` npm
|
|
458
|
+
* package the engine's own composer pipeline already uses directly
|
|
459
|
+
* (`setup-renderer.ts`), not a new post-processing stack.
|
|
460
|
+
*
|
|
461
|
+
* @throws {TheatreBindingError} if `effect` is null/undefined at bind time.
|
|
462
|
+
*/
|
|
463
|
+
export function bindBloomEffect<Props extends UnknownShorthandCompoundProps>(
|
|
464
|
+
clock: AnimationClock,
|
|
465
|
+
sheetObject: ISheetObject<Props>,
|
|
466
|
+
effect: BloomEffect | null | undefined,
|
|
467
|
+
options: TheatreObjectBindingOptions = {},
|
|
468
|
+
): TheatreObjectBinding {
|
|
469
|
+
if (!effect) {
|
|
470
|
+
throw new TheatreBindingError(
|
|
471
|
+
`[bindBloomEffect] missing target BloomEffect for Theatre object "${sheetObject.address.objectKey}"`,
|
|
472
|
+
sheetObject.address.objectKey,
|
|
473
|
+
);
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
const phase = options.phase ?? 'preRender';
|
|
477
|
+
|
|
478
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
479
|
+
const value = sheetObject.value as BloomEffectProps;
|
|
480
|
+
if (typeof value.intensity === 'number') {
|
|
481
|
+
effect.intensity = value.intensity;
|
|
482
|
+
}
|
|
483
|
+
if (typeof value.opacity === 'number') {
|
|
484
|
+
effect.blendMode.opacity.value = value.opacity;
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
|
|
488
|
+
return toBinding(handle);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
/** A small, fixed, TYPED subset of `postprocessing`'s `VignetteEffect` properties. */
|
|
492
|
+
export interface VignetteEffectProps {
|
|
493
|
+
offset?: number;
|
|
494
|
+
darkness?: number;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
/**
|
|
498
|
+
* Bind a Theatre Sheet Object's `offset`/`darkness` sub-props (any subset) to
|
|
499
|
+
* a real `postprocessing` `VignetteEffect` — same package/no-wrapper note as
|
|
500
|
+
* `bindBloomEffect` above.
|
|
501
|
+
*
|
|
502
|
+
* @throws {TheatreBindingError} if `effect` is null/undefined at bind time.
|
|
503
|
+
*/
|
|
504
|
+
export function bindVignetteEffect<Props extends UnknownShorthandCompoundProps>(
|
|
505
|
+
clock: AnimationClock,
|
|
506
|
+
sheetObject: ISheetObject<Props>,
|
|
507
|
+
effect: VignetteEffect | null | undefined,
|
|
508
|
+
options: TheatreObjectBindingOptions = {},
|
|
509
|
+
): TheatreObjectBinding {
|
|
510
|
+
if (!effect) {
|
|
511
|
+
throw new TheatreBindingError(
|
|
512
|
+
`[bindVignetteEffect] missing target VignetteEffect for Theatre object "${sheetObject.address.objectKey}"`,
|
|
513
|
+
sheetObject.address.objectKey,
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
const phase = options.phase ?? 'preRender';
|
|
518
|
+
|
|
519
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
520
|
+
const value = sheetObject.value as VignetteEffectProps;
|
|
521
|
+
if (typeof value.offset === 'number') {
|
|
522
|
+
effect.offset = value.offset;
|
|
523
|
+
}
|
|
524
|
+
if (typeof value.darkness === 'number') {
|
|
525
|
+
effect.darkness = value.darkness;
|
|
526
|
+
}
|
|
527
|
+
});
|
|
528
|
+
|
|
529
|
+
return toBinding(handle);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
533
|
+
// Selected UI properties (DOM-style-writable target)
|
|
534
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
535
|
+
|
|
536
|
+
/**
|
|
537
|
+
* A minimal structural interface for a DOM-style-writable target — NOT the
|
|
538
|
+
* full `HTMLElement` API. A real `HTMLElement` (or a React ref's `.current`)
|
|
539
|
+
* satisfies this structurally with no adapter, since
|
|
540
|
+
* `CSSStyleDeclaration.opacity`/`.transform` are themselves plain strings.
|
|
541
|
+
* This repo's vitest lane runs `environment: 'node'` (`vitest.config.ts`,
|
|
542
|
+
* no DOM), so `theatre-object-binding-d3.test.ts` exercises
|
|
543
|
+
* `bindDomElementStyle` against a plain object literal shaped like `{
|
|
544
|
+
* style: { opacity: '', transform: '' } }` — the exact same binding code
|
|
545
|
+
* path a real `HTMLElement`/React-overlay ref runs through in a browser or a
|
|
546
|
+
* jsdom-backed test elsewhere in the stack.
|
|
547
|
+
*/
|
|
548
|
+
export interface DomStyleTarget {
|
|
549
|
+
style: {
|
|
550
|
+
opacity: string;
|
|
551
|
+
transform: string;
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
/**
|
|
556
|
+
* A small, fixed, TYPED set of DOM/React-overlay-friendly style properties:
|
|
557
|
+
* opacity plus a 2D translate. The two translate axes are combined into one
|
|
558
|
+
* CSS `transform` string, remembering whichever value was last authored on
|
|
559
|
+
* each axis so authoring only one axis doesn't reset the other to 0.
|
|
560
|
+
*/
|
|
561
|
+
export interface UIElementProps {
|
|
562
|
+
opacity?: number;
|
|
563
|
+
translateX?: number;
|
|
564
|
+
translateY?: number;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* Bind a Theatre Sheet Object's `opacity`/`translateX`/`translateY`
|
|
569
|
+
* sub-props (any subset) to a DOM-style-writable target's inline style. See
|
|
570
|
+
* `DomStyleTarget`'s doc for how this is proven without a real browser DOM.
|
|
571
|
+
*
|
|
572
|
+
* @throws {TheatreBindingError} if `target` is null/undefined at bind time.
|
|
573
|
+
*/
|
|
574
|
+
export function bindDomElementStyle<Props extends UnknownShorthandCompoundProps>(
|
|
575
|
+
clock: AnimationClock,
|
|
576
|
+
sheetObject: ISheetObject<Props>,
|
|
577
|
+
target: DomStyleTarget | null | undefined,
|
|
578
|
+
options: TheatreObjectBindingOptions = {},
|
|
579
|
+
): TheatreObjectBinding {
|
|
580
|
+
if (!target) {
|
|
581
|
+
throw new TheatreBindingError(
|
|
582
|
+
`[bindDomElementStyle] missing target DOM element for Theatre object "${sheetObject.address.objectKey}"`,
|
|
583
|
+
sheetObject.address.objectKey,
|
|
584
|
+
);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
const phase = options.phase ?? 'preRender';
|
|
588
|
+
let lastTranslateX = 0;
|
|
589
|
+
let lastTranslateY = 0;
|
|
590
|
+
|
|
591
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
592
|
+
const value = sheetObject.value as UIElementProps;
|
|
593
|
+
if (typeof value.opacity === 'number') {
|
|
594
|
+
target.style.opacity = String(value.opacity);
|
|
595
|
+
}
|
|
596
|
+
if (typeof value.translateX === 'number') lastTranslateX = value.translateX;
|
|
597
|
+
if (typeof value.translateY === 'number') lastTranslateY = value.translateY;
|
|
598
|
+
if (typeof value.translateX === 'number' || typeof value.translateY === 'number') {
|
|
599
|
+
target.style.transform = `translate(${lastTranslateX}px, ${lastTranslateY}px)`;
|
|
600
|
+
}
|
|
601
|
+
});
|
|
602
|
+
|
|
603
|
+
return toBinding(handle);
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
607
|
+
// Pixi binding helper
|
|
608
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* A small, fixed, TYPED subset of `PIXI.Container` (and, since `PIXI.Sprite
|
|
612
|
+
* extends Container`, `PIXI.Sprite` too) transform/alpha properties.
|
|
613
|
+
* `rotation` is in radians (matches `Container.rotation`'s own unit).
|
|
614
|
+
*/
|
|
615
|
+
export interface PixiTransformProps {
|
|
616
|
+
x?: number;
|
|
617
|
+
y?: number;
|
|
618
|
+
rotation?: number;
|
|
619
|
+
scaleX?: number;
|
|
620
|
+
scaleY?: number;
|
|
621
|
+
alpha?: number;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
/**
|
|
625
|
+
* Bind a Theatre Sheet Object's `x`/`y`/`rotation`/`scaleX`/`scaleY`/`alpha`
|
|
626
|
+
* sub-props (any subset) to a real `PIXI.Container`/`PIXI.Sprite` (reusing
|
|
627
|
+
* the world2d stack's own `pixi.js` dependency — see this module's
|
|
628
|
+
* type-only `pixi.js` import above and its doc note on why the engine core
|
|
629
|
+
* never value-imports it). Plain `Container`/`Sprite` construction needs no
|
|
630
|
+
* canvas/WebGL context, so this is proven against a REAL Pixi object in
|
|
631
|
+
* `theatre-object-binding-d3.test.ts`, not a stand-in.
|
|
632
|
+
*
|
|
633
|
+
* @throws {TheatreBindingError} if `target` is null/undefined at bind time.
|
|
634
|
+
*/
|
|
635
|
+
export function bindPixiContainerTransform<Props extends UnknownShorthandCompoundProps>(
|
|
636
|
+
clock: AnimationClock,
|
|
637
|
+
sheetObject: ISheetObject<Props>,
|
|
638
|
+
target: Container | null | undefined,
|
|
639
|
+
options: TheatreObjectBindingOptions = {},
|
|
640
|
+
): TheatreObjectBinding {
|
|
641
|
+
if (!target) {
|
|
642
|
+
throw new TheatreBindingError(
|
|
643
|
+
`[bindPixiContainerTransform] missing target PIXI.Container for Theatre object "${sheetObject.address.objectKey}"`,
|
|
644
|
+
sheetObject.address.objectKey,
|
|
645
|
+
);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
const phase = options.phase ?? 'preRender';
|
|
649
|
+
|
|
650
|
+
const handle: ClockEvaluatorHandle = clock.subscribe(phase, () => {
|
|
651
|
+
const value = sheetObject.value as PixiTransformProps;
|
|
652
|
+
if (typeof value.x === 'number') target.x = value.x;
|
|
653
|
+
if (typeof value.y === 'number') target.y = value.y;
|
|
654
|
+
if (typeof value.rotation === 'number') target.rotation = value.rotation;
|
|
655
|
+
if (typeof value.scaleX === 'number') target.scale.x = value.scaleX;
|
|
656
|
+
if (typeof value.scaleY === 'number') target.scale.y = value.scaleY;
|
|
657
|
+
if (typeof value.alpha === 'number') target.alpha = value.alpha;
|
|
658
|
+
});
|
|
659
|
+
|
|
660
|
+
return toBinding(handle);
|
|
661
|
+
}
|