@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
|
@@ -3,8 +3,7 @@ import * as THREE from 'three';
|
|
|
3
3
|
import { RGBELoader } from 'three/addons/loaders/RGBELoader.js';
|
|
4
4
|
import type { BatchedRenderer } from 'three.quarks';
|
|
5
5
|
import { initNavigation, NavMeshManager } from '../ai/navigation';
|
|
6
|
-
import {
|
|
7
|
-
import { PropertyTrackRunner } from '../animation/property-track';
|
|
6
|
+
import { buildClipMap } from '../animation/clip-map';
|
|
8
7
|
import { log } from '../dev/logger';
|
|
9
8
|
import type { ComponentManager } from '../ecs/component-manager';
|
|
10
9
|
import type { GameComponentClass } from '../ecs/game-component';
|
|
@@ -14,7 +13,6 @@ import { type RenderScope, resolveRenderSettings } from '../render/render-settin
|
|
|
14
13
|
import {
|
|
15
14
|
assetCacheSizes,
|
|
16
15
|
clearAssetCaches as clearSharedAssetCaches,
|
|
17
|
-
loadAnimGraphData,
|
|
18
16
|
loadGLTF,
|
|
19
17
|
resolveGltfNode,
|
|
20
18
|
} from './asset-loaders';
|
|
@@ -46,18 +44,18 @@ import {
|
|
|
46
44
|
import { isEntityRefSchema } from './schema/entity-ref';
|
|
47
45
|
import { getUserData, setUserData } from './user-data';
|
|
48
46
|
|
|
49
|
-
// GLTF / texture
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
47
|
+
// GLTF / texture load+cache logic lives in the shared ./asset-loaders module
|
|
48
|
+
// (A2) so the editor and runtime share one cache + one clone-safety contract.
|
|
49
|
+
// Only the IBL/skybox env-map cache stays here — it needs a WebGLRenderer
|
|
50
|
+
// (PMREM), which the shared module deliberately doesn't depend on.
|
|
53
51
|
const envTextureCache = new Map<string, THREE.Texture>();
|
|
54
52
|
let pmremGenerator: THREE.PMREMGenerator | null = null;
|
|
55
53
|
|
|
56
54
|
/**
|
|
57
|
-
* Clear module-level asset caches (textures, GLTF scenes,
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
55
|
+
* Clear module-level asset caches (textures, GLTF scenes, IBL env maps). Call
|
|
56
|
+
* on full runtime teardown to release cached GPU resources and avoid leaking
|
|
57
|
+
* across editor Play sessions. Delegates the GLTF/texture caches to
|
|
58
|
+
* {@link clearSharedAssetCaches} and additionally frees the local
|
|
61
59
|
* IBL env-map cache + PMREM generator.
|
|
62
60
|
*
|
|
63
61
|
* Lifetime / P1.8: these caches are intentionally module-level and persist
|
|
@@ -99,14 +97,12 @@ export function updateSceneLODs(scene: THREE.Scene, camera: THREE.Camera): void
|
|
|
99
97
|
export function __assetCacheSizesForTest(): {
|
|
100
98
|
textures: number;
|
|
101
99
|
gltf: number;
|
|
102
|
-
animGraphs: number;
|
|
103
100
|
env: number;
|
|
104
101
|
} {
|
|
105
102
|
const sizes = assetCacheSizes();
|
|
106
103
|
return {
|
|
107
104
|
textures: sizes.textures,
|
|
108
105
|
gltf: sizes.gltf,
|
|
109
|
-
animGraphs: sizes.animGraphs,
|
|
110
106
|
env: envTextureCache.size,
|
|
111
107
|
};
|
|
112
108
|
}
|
|
@@ -176,19 +172,6 @@ function createCurveFromSpline(spline: SceneSpline): THREE.CatmullRomCurve3 | nu
|
|
|
176
172
|
);
|
|
177
173
|
}
|
|
178
174
|
|
|
179
|
-
function buildClipMap(
|
|
180
|
-
animations: THREE.AnimationClip[],
|
|
181
|
-
aliases?: Record<string, string>,
|
|
182
|
-
): Map<string, THREE.AnimationClip> {
|
|
183
|
-
const clips = new Map<string, THREE.AnimationClip>();
|
|
184
|
-
for (const clip of animations) {
|
|
185
|
-
const raw = clip.name.split('|').pop()?.toLowerCase() ?? clip.name;
|
|
186
|
-
const name = aliases?.[raw] ?? raw;
|
|
187
|
-
clips.set(name, clip);
|
|
188
|
-
}
|
|
189
|
-
return clips;
|
|
190
|
-
}
|
|
191
|
-
|
|
192
175
|
export interface SceneLoadContext {
|
|
193
176
|
scene: THREE.Scene;
|
|
194
177
|
rapierWorld: RAPIER.World;
|
|
@@ -205,10 +188,6 @@ export interface SceneLoadContext {
|
|
|
205
188
|
instancesFileCache?: Map<string, InstancesFile>;
|
|
206
189
|
/** Supply an AudioListener (attached to camera) to enable audio entity spawning. */
|
|
207
190
|
audioListener?: THREE.AudioListener;
|
|
208
|
-
/** AnimGraph registry keyed by Object3D. If provided, loader registers created
|
|
209
|
-
* AnimGraphs here (and skips tickFns to avoid double-ticking with the global
|
|
210
|
-
* animationSystem). */
|
|
211
|
-
animGraphs?: Map<THREE.Object3D, AnimGraph>;
|
|
212
191
|
/** ComponentManager for instantiating GameComponent classes from scene data. */
|
|
213
192
|
componentManager?: ComponentManager;
|
|
214
193
|
/** three.quarks BatchedRenderer. If provided, particle systems declared on
|
|
@@ -351,15 +330,15 @@ function entityLabel(def: SceneEntity): string {
|
|
|
351
330
|
// ---------------------------------------------------------------------------
|
|
352
331
|
// T3.9 — bounded-concurrency asset prefetch.
|
|
353
332
|
//
|
|
354
|
-
// Child/asset fetches (prefab files, materials, GLTF models
|
|
355
|
-
//
|
|
333
|
+
// Child/asset fetches (prefab files, materials, GLTF models) used to only
|
|
334
|
+
// ever happen inline, one at a time, inside the fully-sequential
|
|
356
335
|
// `spawnEntity` recursion — fine at ~20 assets, product-breaking at hundreds
|
|
357
336
|
// (every fetch's network round-trip is paid serially). Rather than restructure
|
|
358
337
|
// the deterministic sequential spawn walk itself (which authored array order,
|
|
359
338
|
// tickFns/mixers order, and GameComponent registration order all depend on),
|
|
360
339
|
// this prefetch pass walks the WHOLE entity tree up front and warms the
|
|
361
|
-
// existing URL-keyed caches (asset-loaders.ts's module-level GLTF
|
|
362
|
-
//
|
|
340
|
+
// existing URL-keyed caches (asset-loaders.ts's module-level GLTF cache, and
|
|
341
|
+
// this module's ctx-level prefab/material file caches) with a
|
|
363
342
|
// small concurrency limiter. The sequential spawn pass below is completely
|
|
364
343
|
// unchanged — its `await`s just resolve instantly against a warm cache, so
|
|
365
344
|
// wall-clock time is bounded by ceil(assetCount / limit) round-trips instead
|
|
@@ -416,10 +395,6 @@ function collectPrefetchTasks(
|
|
|
416
395
|
const ref = def.materialRef;
|
|
417
396
|
tasks.push(() => loadMaterialFile(ref, ctx));
|
|
418
397
|
}
|
|
419
|
-
if (def.animation?.animGraph) {
|
|
420
|
-
const graph = def.animation.animGraph;
|
|
421
|
-
tasks.push(() => loadAnimGraphData(graph));
|
|
422
|
-
}
|
|
423
398
|
if (def.prefab && !ctx.prefabs?.has(def.prefab) && !seenPrefabUrls.has(def.prefab)) {
|
|
424
399
|
const prefabUrl = def.prefab;
|
|
425
400
|
seenPrefabUrls.add(prefabUrl);
|
|
@@ -502,6 +477,12 @@ async function instantiateScene(
|
|
|
502
477
|
ctx.scene.add(obj);
|
|
503
478
|
}
|
|
504
479
|
|
|
480
|
+
// Pass 1.5: animated attachments must resolve only after every entity and
|
|
481
|
+
// GLTF skeleton has spawned. Reparenting preserves the authored transform
|
|
482
|
+
// as the local socket offset; gameplay components remain on the same
|
|
483
|
+
// Object3D and therefore require no mirror or adapter entity.
|
|
484
|
+
resolveBoneAttachments(data.entities, idMap);
|
|
485
|
+
|
|
505
486
|
// Pass 2: create joints between physics bodies
|
|
506
487
|
createSceneJoints(data.entities, idMap, ctx);
|
|
507
488
|
|
|
@@ -714,40 +695,33 @@ async function spawnEntity(
|
|
|
714
695
|
wrapper.add(content);
|
|
715
696
|
object3d = wrapper;
|
|
716
697
|
|
|
717
|
-
// Set up animation if defined
|
|
698
|
+
// Set up animation if defined. Always build the mixer + clip map (and
|
|
699
|
+
// expose both via userData) whenever the entity has clips — not just
|
|
700
|
+
// when `autoplay` is set — so a GameComponent (e.g. an XState-driven
|
|
701
|
+
// character controller, E5's replacement for the removed AnimGraph) can
|
|
702
|
+
// pick up `_animMixer`/`_animClips` in its own `init()` and drive the
|
|
703
|
+
// SAME mixer via `bindXStateAnimation` (xstate-animation-binding.ts).
|
|
704
|
+
// Only `autoplay` self-ticks here (`tickFns`) — a component driving its
|
|
705
|
+
// own binding calls `mixer.update(dt)` itself (inside the binding's
|
|
706
|
+
// `tick`), so auto-ticking unconditionally would double-advance it.
|
|
718
707
|
if (def.animation && animations.length > 0) {
|
|
719
708
|
const clipMap = buildClipMap(animations, def.animation.clipAliases);
|
|
709
|
+
const mixer = new THREE.AnimationMixer(gltfScene);
|
|
710
|
+
setUserData(object3d, '_animMixer', mixer);
|
|
711
|
+
setUserData(object3d, '_animClips', clipMap);
|
|
712
|
+
setUserData(object3d, '_availableClips', [...clipMap.keys()]);
|
|
713
|
+
mixers.push(mixer);
|
|
720
714
|
|
|
721
|
-
if (def.animation.
|
|
722
|
-
// Full AnimGraph state machine
|
|
723
|
-
const graphData = await loadAnimGraphData(def.animation.animGraph);
|
|
724
|
-
const mixer = new THREE.AnimationMixer(gltfScene);
|
|
725
|
-
const graph = new AnimGraph(mixer, graphData, clipMap);
|
|
726
|
-
if (def.animation.parameters) {
|
|
727
|
-
for (const [key, value] of Object.entries(def.animation.parameters)) {
|
|
728
|
-
graph.setParameter(key, value);
|
|
729
|
-
}
|
|
730
|
-
}
|
|
731
|
-
if (ctx.animGraphs) {
|
|
732
|
-
// Register in global map (keyed by Object3D); animationSystem ticks it.
|
|
733
|
-
ctx.animGraphs.set(object3d, graph);
|
|
734
|
-
} else {
|
|
735
|
-
// Standalone: tick via scene instance update
|
|
736
|
-
tickFns.push((dt) => graph.update(dt));
|
|
737
|
-
}
|
|
738
|
-
mixers.push(mixer);
|
|
739
|
-
} else if (def.animation.autoplay) {
|
|
715
|
+
if (def.animation.autoplay) {
|
|
740
716
|
// Simple clip autoplay
|
|
741
717
|
const clip = clipMap.get(def.animation.autoplay);
|
|
742
718
|
if (clip) {
|
|
743
|
-
const mixer = new THREE.AnimationMixer(gltfScene);
|
|
744
719
|
const action = mixer.clipAction(clip);
|
|
745
720
|
const loop = def.animation.loop ?? DEFAULTS.animation.loop;
|
|
746
721
|
action.setLoop(loop ? THREE.LoopRepeat : THREE.LoopOnce, Infinity);
|
|
747
722
|
action.clampWhenFinished = !loop;
|
|
748
723
|
action.play();
|
|
749
724
|
tickFns.push((dt) => mixer.update(dt));
|
|
750
|
-
mixers.push(mixer);
|
|
751
725
|
}
|
|
752
726
|
}
|
|
753
727
|
}
|
|
@@ -914,17 +888,6 @@ async function spawnEntity(
|
|
|
914
888
|
// Visibility (mirrors editor: visible unless explicitly false)
|
|
915
889
|
object3d.visible = def.visible ?? DEFAULTS.entity.visible;
|
|
916
890
|
|
|
917
|
-
// F5 — declarative property tracks (docs/VSCN-STRUCTURAL-GAPS-DESIGN.md).
|
|
918
|
-
// Unlike gltf autoplay/animGraph above (clip-driven, gltf-only), tracks work
|
|
919
|
-
// on ANY entity — a box, a light, no gltf/clips required — so this lives
|
|
920
|
-
// OUTSIDE the gltf branch. Registered in the same tickFns list the
|
|
921
|
-
// AnimationMixers use, so it ticks on the same deterministic dt (honors
|
|
922
|
-
// pause/timeScale for free — no new clock).
|
|
923
|
-
if (def.animation?.tracks?.length) {
|
|
924
|
-
const runner = new PropertyTrackRunner(object3d, def.animation.tracks);
|
|
925
|
-
tickFns.push((dt) => runner.update(dt));
|
|
926
|
-
}
|
|
927
|
-
|
|
928
891
|
// Physics — stores {body, collider} in the physics registry keyed by object3d.
|
|
929
892
|
// T1.1: the body is created at the COMPOSED WORLD transform (ancestorCtx's
|
|
930
893
|
// world matrix × this entity's own local transform), not the raw authored
|
|
@@ -1161,6 +1124,42 @@ function walkEntities(entities: SceneEntity[], fn: (e: SceneEntity) => void): vo
|
|
|
1161
1124
|
}
|
|
1162
1125
|
}
|
|
1163
1126
|
|
|
1127
|
+
/** Reparent scene-authored entities to named bones/sockets in loaded GLTF skeletons. */
|
|
1128
|
+
function resolveBoneAttachments(entities: SceneEntity[], idMap: Map<string, THREE.Object3D>): void {
|
|
1129
|
+
walkEntities(entities, (def) => {
|
|
1130
|
+
const attachment = def.boneAttachment;
|
|
1131
|
+
if (!attachment || !def.id) return;
|
|
1132
|
+
|
|
1133
|
+
const object = idMap.get(def.id);
|
|
1134
|
+
if (!object) return;
|
|
1135
|
+
const target = idMap.get(attachment.target);
|
|
1136
|
+
if (!target) {
|
|
1137
|
+
throw new Error(
|
|
1138
|
+
`Bone attachment target "${attachment.target}" not found for entity "${entityLabel(def)}".`,
|
|
1139
|
+
);
|
|
1140
|
+
}
|
|
1141
|
+
if (target === object) {
|
|
1142
|
+
throw new Error(`Entity "${entityLabel(def)}" cannot attach to its own skeleton.`);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
const socket = target.getObjectByName(attachment.bone);
|
|
1146
|
+
if (!socket) {
|
|
1147
|
+
const available: string[] = [];
|
|
1148
|
+
target.traverse((node) => {
|
|
1149
|
+
if (node.name && node instanceof THREE.Bone) {
|
|
1150
|
+
available.push(node.name);
|
|
1151
|
+
}
|
|
1152
|
+
});
|
|
1153
|
+
const suffix = available.length > 0 ? ` Available bones: ${available.sort().join(', ')}` : '';
|
|
1154
|
+
throw new Error(
|
|
1155
|
+
`Bone/socket "${attachment.bone}" was not found on target "${attachment.target}" for entity "${entityLabel(def)}".${suffix}`,
|
|
1156
|
+
);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
socket.add(object);
|
|
1160
|
+
});
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1164
1163
|
/** Create Rapier joints for all entities that define them. */
|
|
1165
1164
|
function createSceneJoints(
|
|
1166
1165
|
entities: SceneEntity[],
|
|
@@ -1370,10 +1369,10 @@ export interface SpawnedPrefab {
|
|
|
1370
1369
|
/** The Object3D of the spawned prefab root (added to the scene). */
|
|
1371
1370
|
object3D: THREE.Object3D;
|
|
1372
1371
|
/**
|
|
1373
|
-
* Tick standalone
|
|
1374
|
-
*
|
|
1375
|
-
*
|
|
1376
|
-
*
|
|
1372
|
+
* Tick standalone `animation.autoplay` clips for this prefab. A GameComponent
|
|
1373
|
+
* that attaches its own XState-driven animation binding (E5 — see
|
|
1374
|
+
* `xstate-animation-binding.ts`) ticks that binding itself, so this is a
|
|
1375
|
+
* no-op for those. Call once per frame, mirroring SceneInstance.update.
|
|
1377
1376
|
*/
|
|
1378
1377
|
update(dt: number): void;
|
|
1379
1378
|
/** Stop any mixers this prefab created. */
|
|
@@ -1385,16 +1384,16 @@ export interface SpawnedPrefab {
|
|
|
1385
1384
|
*
|
|
1386
1385
|
* Returns a {@link SpawnedPrefab}. The previous version passed throwaway
|
|
1387
1386
|
* tickFns/mixers arrays, so a runtime-spawned prefab's `animation.autoplay`
|
|
1388
|
-
*
|
|
1389
|
-
*
|
|
1390
|
-
*
|
|
1387
|
+
* never advanced. Now the tick functions are captured and exposed via
|
|
1388
|
+
* `update()`, consistent with how loadScene's SceneInstance.update drives
|
|
1389
|
+
* animations.
|
|
1391
1390
|
*
|
|
1392
1391
|
* Usage:
|
|
1393
1392
|
* const crate = await spawnPrefab('/data/prefabs/crate.prefab.json', ctx, {
|
|
1394
1393
|
* transform: { position: [x, y, z] },
|
|
1395
1394
|
* components: { Health: { current: 50 } },
|
|
1396
1395
|
* });
|
|
1397
|
-
* // each frame (only needed for autoplay clips
|
|
1396
|
+
* // each frame (only needed for autoplay clips):
|
|
1398
1397
|
* crate.update(dt);
|
|
1399
1398
|
*/
|
|
1400
1399
|
export async function spawnPrefab(
|
|
@@ -1445,13 +1444,8 @@ export async function spawnPrefab(
|
|
|
1445
1444
|
// - mixers (THREE.AnimationMixer, simple `animation.autoplay` clips)
|
|
1446
1445
|
// DISPOSED — stopAllAction() on every mixer this spawn created
|
|
1447
1446
|
// (pre-existing).
|
|
1448
|
-
// - tickFns (standalone
|
|
1449
|
-
//
|
|
1450
|
-
// update() becomes a no-op (pre-existing).
|
|
1451
|
-
// - ctx.animGraphs (Object3D -> AnimGraph, when provided)
|
|
1452
|
-
// NEWLY-DISPOSED — every entry whose key is inside the spawned
|
|
1453
|
-
// subtree is deleted, so the global animationSystem stops ticking a
|
|
1454
|
-
// despawned graph (probe1: previously leaked forever).
|
|
1447
|
+
// - tickFns (standalone `animation.autoplay` mixer tick closures)
|
|
1448
|
+
// DISPOSED — array cleared so update() becomes a no-op (pre-existing).
|
|
1455
1449
|
// - ctx.particleRenderer (three.quarks BatchedRenderer, when provided)
|
|
1456
1450
|
// NEWLY-DISPOSED — every particle system tagged via the
|
|
1457
1451
|
// `_particleSystem` userData key (mirrors editor scene-sync's own
|
|
@@ -1469,7 +1463,7 @@ export async function spawnPrefab(
|
|
|
1469
1463
|
// tags on Object3Ds that get garbage-collected with the subtree once
|
|
1470
1464
|
// `ctx.scene.remove(object3D)` drops the last reference; there is no
|
|
1471
1465
|
// separate ctx-level registry entry to leak.
|
|
1472
|
-
// - GLTF/texture
|
|
1466
|
+
// - GLTF/texture asset caches (asset-loaders.ts, module-level)
|
|
1473
1467
|
// DELIBERATELY NOT DISPOSED — these are shared, URL-keyed caches
|
|
1474
1468
|
// across the whole runtime session (P1.8 contract: repeated
|
|
1475
1469
|
// spawns/loads of the same asset must NOT re-fetch or re-parse), not
|
|
@@ -1492,15 +1486,6 @@ export async function spawnPrefab(
|
|
|
1492
1486
|
ctx.rapierWorld.removeRigidBody(refs.body);
|
|
1493
1487
|
ctx.physics.remove(node);
|
|
1494
1488
|
});
|
|
1495
|
-
// Unregister any AnimGraphs this subtree registered into the shared,
|
|
1496
|
-
// Object3D-keyed ctx.animGraphs map — otherwise the global
|
|
1497
|
-
// animationSystem keeps ticking a despawned graph forever.
|
|
1498
|
-
if (ctx.animGraphs) {
|
|
1499
|
-
const animGraphs = ctx.animGraphs;
|
|
1500
|
-
object3D.traverse((node) => {
|
|
1501
|
-
animGraphs.delete(node);
|
|
1502
|
-
});
|
|
1503
|
-
}
|
|
1504
1489
|
// Unregister any particle systems this subtree registered with the
|
|
1505
1490
|
// shared BatchedRenderer — otherwise they keep simulating/rendering
|
|
1506
1491
|
// after the visual object is gone. `_particleSystem` is the same
|
|
@@ -1,94 +1,45 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
// Reuse the UI track easing vocabulary (S1) so there is ONE easing enum across
|
|
3
|
-
// the codebase — see F5 (docs/VSCN-STRUCTURAL-GAPS-DESIGN.md). Do NOT reuse
|
|
4
|
-
// UIKeyframeSchema itself: its `value` is `z.union([z.number(), z.string()])`,
|
|
5
|
-
// and property-track values MUST be numbers only (no expression/string-logic
|
|
6
|
-
// values — in-scene scripting is banned, G1).
|
|
7
|
-
import { UIEasingSchema } from './ui';
|
|
8
|
-
|
|
9
|
-
/** Validated at runtime against AnimGraph parameter definitions. */
|
|
10
|
-
const AnimParameterOverridesSchema = z.record(z.string(), z.union([z.number(), z.boolean()]));
|
|
11
2
|
|
|
12
3
|
// ---------------------------------------------------------------------------
|
|
13
|
-
//
|
|
4
|
+
// D8 — declarative property tracks (formerly F5,
|
|
5
|
+
// docs/VSCN-STRUCTURAL-GAPS-DESIGN.md) were REMOVED: Theatre
|
|
6
|
+
// (`@theatre/core`) is the sole authored continuous-animation source (spec
|
|
7
|
+
// §3.2, §10 D2-D4/D8). `PropertyTrackSchema`/`PropertyTrackRunner` and the
|
|
8
|
+
// `tracks` field are deleted, not deprecated-in-place — see
|
|
9
|
+
// packages/engine/src/scene/parse.ts (`assertNoRemovedPropertyTracks`) for
|
|
10
|
+
// the loud migration-error guard that rejects any `.vscn`/`.prefab.json`
|
|
11
|
+
// still authoring `animation.tracks`, since Zod would otherwise silently
|
|
12
|
+
// strip an unrecognized field rather than failing loudly (Global AC §6).
|
|
13
|
+
//
|
|
14
|
+
// E5 — the AnimGraph state-machine runtime, `.animgraph.json` format, and
|
|
15
|
+
// every consumer were removed (spec §3.3, §11 E5; XState + native Three
|
|
16
|
+
// `AnimationMixer` replace it — see `xstate-animation-binding.ts`). The
|
|
17
|
+
// `animGraph` field is deleted outright, not deprecated-in-place, for the
|
|
18
|
+
// same reason as `tracks` above: Zod's default object mode would otherwise
|
|
19
|
+
// silently STRIP an authored `animation.animGraph` rather than reporting it,
|
|
20
|
+
// violating Global AC §6 ("Removed formats fail with a concise migration/
|
|
21
|
+
// removal error rather than being partially read"). The raw-JSON guard
|
|
22
|
+
// (`assertNoRemovedAnimGraph` in packages/engine/src/scene/parse.ts) rejects
|
|
23
|
+
// any `.vscn`/`.prefab.json` still authoring it before Zod ever parses the
|
|
24
|
+
// data — see packages/engine/test/anim-graph-removed.test.ts.
|
|
14
25
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
26
|
+
// `parameters` is deleted alongside `animGraph`, though it isn't itself named
|
|
27
|
+
// in the spec/removal-inventory: its ONLY documented purpose was seeding an
|
|
28
|
+
// `AnimGraph`'s initial parameter values (its only readers were
|
|
29
|
+
// `scene-loader.ts`'s former animGraph branch, the editor's entity-factory.ts,
|
|
30
|
+
// and AnimationSection.tsx's parameter-row UI — all deleted with the runtime).
|
|
31
|
+
// Leaving it declared with zero remaining readers would violate this repo's
|
|
32
|
+
// "no schema field without a runtime reader" policy (CLAUDE.md).
|
|
21
33
|
// ---------------------------------------------------------------------------
|
|
22
34
|
|
|
23
|
-
export const PropertyTrackTargetSchema = z
|
|
24
|
-
.enum([
|
|
25
|
-
'position.x',
|
|
26
|
-
'position.y',
|
|
27
|
-
'position.z',
|
|
28
|
-
'rotation.x',
|
|
29
|
-
'rotation.y',
|
|
30
|
-
'rotation.z',
|
|
31
|
-
'scale.x',
|
|
32
|
-
'scale.y',
|
|
33
|
-
'scale.z',
|
|
34
|
-
'material.opacity',
|
|
35
|
-
'light.intensity',
|
|
36
|
-
])
|
|
37
|
-
.describe(
|
|
38
|
-
'The Object3D property this track drives. A FIXED allowlist, not an arbitrary property ' +
|
|
39
|
-
'path — an open path would let scene data address/mutate arbitrary runtime state, which ' +
|
|
40
|
-
'is in-scene scripting (banned, G1). Add new targets here deliberately, one at a time.',
|
|
41
|
-
);
|
|
42
|
-
export type PropertyTrackTarget = z.infer<typeof PropertyTrackTargetSchema>;
|
|
43
|
-
|
|
44
|
-
export const PropertyTrackKeyframeSchema = z
|
|
45
|
-
.object({
|
|
46
|
-
time: z.number().describe('Seconds from track start'),
|
|
47
|
-
value: z
|
|
48
|
-
.number()
|
|
49
|
-
.describe(
|
|
50
|
-
'Numeric value at this time — numbers only; no expressions/strings (in-scene scripting is banned)',
|
|
51
|
-
),
|
|
52
|
-
easing: UIEasingSchema.optional().describe(
|
|
53
|
-
'Easing of the segment after this keyframe (reuses the UI track easing vocabulary)',
|
|
54
|
-
),
|
|
55
|
-
})
|
|
56
|
-
.describe('A single keyframe (time + numeric value + optional easing) on a property track');
|
|
57
|
-
export type PropertyTrackKeyframe = z.infer<typeof PropertyTrackKeyframeSchema>;
|
|
58
|
-
|
|
59
|
-
export const PropertyTrackSchema = z
|
|
60
|
-
.object({
|
|
61
|
-
target: PropertyTrackTargetSchema,
|
|
62
|
-
keyframes: z.array(PropertyTrackKeyframeSchema).describe('Ordered by time'),
|
|
63
|
-
loop: z.boolean().optional().describe('Whether the track repeats after reaching `duration`'),
|
|
64
|
-
duration: z.number().describe('Track length in seconds'),
|
|
65
|
-
})
|
|
66
|
-
.describe('A deterministic keyframed timeline driving one allowlisted property');
|
|
67
|
-
export type PropertyTrack = z.infer<typeof PropertyTrackSchema>;
|
|
68
|
-
|
|
69
35
|
export const SceneAnimationSchema = z
|
|
70
36
|
.object({
|
|
71
|
-
|
|
72
|
-
parameters: AnimParameterOverridesSchema.optional().describe(
|
|
73
|
-
'Initial parameter values for the animation graph',
|
|
74
|
-
),
|
|
75
|
-
autoplay: z
|
|
76
|
-
.string()
|
|
77
|
-
.optional()
|
|
78
|
-
.describe('Clip name to play automatically on load (when no animGraph is set)'),
|
|
37
|
+
autoplay: z.string().optional().describe('Clip name to play automatically on load'),
|
|
79
38
|
loop: z.boolean().optional().describe('Whether the autoplay clip should loop'),
|
|
80
39
|
clipAliases: z
|
|
81
40
|
.record(z.string(), z.string())
|
|
82
41
|
.optional()
|
|
83
|
-
.describe('Map raw GLTF clip names to clean names
|
|
84
|
-
tracks: z
|
|
85
|
-
.array(PropertyTrackSchema)
|
|
86
|
-
.optional()
|
|
87
|
-
.describe(
|
|
88
|
-
'Deterministic keyframed property timelines (data, not behavior — pure function of ' +
|
|
89
|
-
'time; state-dependent motion stays a GameComponent). Runs in the animation phase, ' +
|
|
90
|
-
'honors pause/timeScale.',
|
|
91
|
-
),
|
|
42
|
+
.describe('Map raw GLTF clip names to clean names'),
|
|
92
43
|
})
|
|
93
44
|
.describe('Animation playback configuration');
|
|
94
45
|
|
|
@@ -13,6 +13,15 @@ import { SceneShadowOverrideSchema, SceneShadowSchema } from './shadow';
|
|
|
13
13
|
import { SceneSplineOverrideSchema, SceneSplineSchema } from './spline';
|
|
14
14
|
import { TransformSchema, Vec3Schema } from './tuples';
|
|
15
15
|
|
|
16
|
+
const BoneAttachmentSchema = z
|
|
17
|
+
.object({
|
|
18
|
+
target: z.string().describe('Entity ID whose animated skeleton owns the target bone'),
|
|
19
|
+
bone: z.string().describe('Exact name of the target bone or socket Object3D'),
|
|
20
|
+
})
|
|
21
|
+
.describe(
|
|
22
|
+
'Attach this entity to a named bone/socket after the complete scene has loaded. The entity transform becomes its local attachment offset',
|
|
23
|
+
);
|
|
24
|
+
|
|
16
25
|
/**
|
|
17
26
|
* User-defined ECS component data. Validated at runtime against ComponentRegistry.
|
|
18
27
|
*
|
|
@@ -65,6 +74,9 @@ const SharedEntityFields = {
|
|
|
65
74
|
.optional()
|
|
66
75
|
.describe('Path to shared .mat.json material asset. Mutually exclusive with inline material'),
|
|
67
76
|
transform: TransformSchema.optional().describe('Local transform relative to parent'),
|
|
77
|
+
boneAttachment: BoneAttachmentSchema.optional().describe(
|
|
78
|
+
'Animated bone/socket attachment. Use transform for the local position, rotation, and scale offset',
|
|
79
|
+
),
|
|
68
80
|
pivot: Vec3Schema.optional().describe(
|
|
69
81
|
'Local-space pivot point for rotation/scale. [0,0,0] = geometry center',
|
|
70
82
|
),
|
|
@@ -165,5 +177,13 @@ export const SceneEntitySchema: z.ZodType<SceneEntity> = z.lazy(() =>
|
|
|
165
177
|
path: ['material'],
|
|
166
178
|
});
|
|
167
179
|
}
|
|
180
|
+
if (entity.boneAttachment !== undefined && entity.physics !== undefined) {
|
|
181
|
+
ctx.addIssue({
|
|
182
|
+
code: z.ZodIssueCode.custom,
|
|
183
|
+
message:
|
|
184
|
+
'A bone-attached entity cannot declare physics. Attachments follow an animated transform; add gameplay collision to a separate entity.',
|
|
185
|
+
path: ['boneAttachment'],
|
|
186
|
+
});
|
|
187
|
+
}
|
|
168
188
|
}),
|
|
169
189
|
) as z.ZodType<SceneEntity>;
|
|
@@ -1,17 +1,7 @@
|
|
|
1
1
|
// Zod schemas
|
|
2
2
|
|
|
3
|
-
export type {
|
|
4
|
-
|
|
5
|
-
PropertyTrackKeyframe,
|
|
6
|
-
PropertyTrackTarget,
|
|
7
|
-
SceneAnimation,
|
|
8
|
-
} from './animation';
|
|
9
|
-
export {
|
|
10
|
-
PropertyTrackKeyframeSchema,
|
|
11
|
-
PropertyTrackSchema,
|
|
12
|
-
PropertyTrackTargetSchema,
|
|
13
|
-
SceneAnimationSchema,
|
|
14
|
-
} from './animation';
|
|
3
|
+
export type { SceneAnimation } from './animation';
|
|
4
|
+
export { SceneAnimationSchema } from './animation';
|
|
15
5
|
export type { SceneAudio } from './audio';
|
|
16
6
|
export { SceneAudioSchema } from './audio';
|
|
17
7
|
export type { SceneCamera } from './camera';
|
package/src/scene/user-data.ts
CHANGED
|
@@ -36,9 +36,12 @@
|
|
|
36
36
|
*
|
|
37
37
|
* Animation (load-bearing — ED5 disposal contract):
|
|
38
38
|
* - `_animMixer` — THREE.AnimationMixer driving this subtree's clips.
|
|
39
|
-
* - `
|
|
40
|
-
*
|
|
41
|
-
*
|
|
39
|
+
* - `_animClips` — Map<string, AnimationClip> discovered on the GLTF (E5 —
|
|
40
|
+
* lets a GameComponent build its own XState-driven
|
|
41
|
+
* binding via `bindXStateAnimation` over the SAME
|
|
42
|
+
* mixer; see xstate-animation-binding.ts).
|
|
43
|
+
* - `_availableClips` — string[] of clip names discovered on the GLTF
|
|
44
|
+
* (inspector dropdown; same names as `_animClips`' keys).
|
|
42
45
|
*
|
|
43
46
|
* Disposal contract:
|
|
44
47
|
* - `__sharedGeometry` — `true` when a mesh's geometry is shared/cached and MUST
|
|
@@ -81,8 +84,6 @@
|
|
|
81
84
|
|
|
82
85
|
import type * as THREE from 'three';
|
|
83
86
|
import type { ParticleSystem } from 'three.quarks';
|
|
84
|
-
import type { AnimGraph } from '../animation/anim-graph';
|
|
85
|
-
import type { AnimGraphFile } from '../animation/anim-graph-types';
|
|
86
87
|
import type { SceneEntity } from './scene-types';
|
|
87
88
|
|
|
88
89
|
/** The kinds of editor helper objects tagged via `editorHelperType`. */
|
|
@@ -112,8 +113,7 @@ export interface UserDataSchema {
|
|
|
112
113
|
_camera: THREE.Camera;
|
|
113
114
|
_particleSystem: ParticleSystem;
|
|
114
115
|
_animMixer: THREE.AnimationMixer;
|
|
115
|
-
|
|
116
|
-
_animGraphData: AnimGraphFile;
|
|
116
|
+
_animClips: Map<string, THREE.AnimationClip>;
|
|
117
117
|
_availableClips: string[];
|
|
118
118
|
__sharedGeometry: boolean;
|
|
119
119
|
__shadeOrig: THREE.Material | THREE.Material[];
|
|
@@ -152,8 +152,7 @@ export const UserDataKeys = {
|
|
|
152
152
|
_camera: '_camera',
|
|
153
153
|
_particleSystem: '_particleSystem',
|
|
154
154
|
_animMixer: '_animMixer',
|
|
155
|
-
|
|
156
|
-
_animGraphData: '_animGraphData',
|
|
155
|
+
_animClips: '_animClips',
|
|
157
156
|
_availableClips: '_availableClips',
|
|
158
157
|
__sharedGeometry: '__sharedGeometry',
|
|
159
158
|
__shadeOrig: '__shadeOrig',
|
|
@@ -86,6 +86,11 @@ export function createHostRenderer(
|
|
|
86
86
|
rendering?: RenderScope,
|
|
87
87
|
opts?: { alpha?: boolean; preserveDrawingBuffer?: boolean },
|
|
88
88
|
): THREE.WebGLRenderer {
|
|
89
|
+
// A newly-shown editor tab can report 0x0 for one layout frame. WebGL render
|
|
90
|
+
// targets cannot have zero-sized attachments, so boot at the smallest valid
|
|
91
|
+
// backing size and let the normal resize path apply the real dimensions.
|
|
92
|
+
const safeWidth = Math.max(1, width);
|
|
93
|
+
const safeHeight = Math.max(1, height);
|
|
89
94
|
const settings = resolveRenderSettings(rendering);
|
|
90
95
|
const renderer = new THREE.WebGLRenderer({
|
|
91
96
|
canvas,
|
|
@@ -94,7 +99,7 @@ export function createHostRenderer(
|
|
|
94
99
|
...(opts?.alpha ? { alpha: true } : {}),
|
|
95
100
|
...(opts?.preserveDrawingBuffer ? { preserveDrawingBuffer: true } : {}),
|
|
96
101
|
});
|
|
97
|
-
renderer.setSize(
|
|
102
|
+
renderer.setSize(safeWidth, safeHeight);
|
|
98
103
|
applyRendererSettings(renderer, rendering);
|
|
99
104
|
renderer.shadowMap.type = THREE.PCFSoftShadowMap;
|
|
100
105
|
renderer.toneMapping = toneMappingModes[DEFAULTS.toneMapping.mode] ?? THREE.ACESFilmicToneMapping;
|
|
@@ -112,12 +117,14 @@ export function createSceneView(
|
|
|
112
117
|
width = window.innerWidth,
|
|
113
118
|
height = window.innerHeight,
|
|
114
119
|
): { scene: THREE.Scene; camera: THREE.PerspectiveCamera; composer: EffectComposer } {
|
|
120
|
+
const safeWidth = Math.max(1, width);
|
|
121
|
+
const safeHeight = Math.max(1, height);
|
|
115
122
|
const scene = new THREE.Scene();
|
|
116
123
|
scene.background = new THREE.Color(0x1a1a2e);
|
|
117
124
|
|
|
118
125
|
const camera = new THREE.PerspectiveCamera(
|
|
119
126
|
DEFAULTS.camera.fov,
|
|
120
|
-
|
|
127
|
+
safeWidth / safeHeight,
|
|
121
128
|
DEFAULTS.camera.near,
|
|
122
129
|
DEFAULTS.camera.far,
|
|
123
130
|
);
|