@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,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overlay apply report — D9 (docs/DECISIONS-PENDING.md §D9): decide + surface
|
|
3
|
+
* what happens when a saved ingest overlay is reapplied onto a scene that may
|
|
4
|
+
* have moved on since the overlay was authored (a vendored game bump, or a
|
|
5
|
+
* dynamic subtree that never respawned). Two independent signals, either of
|
|
6
|
+
* which is worth a loud (never silent) structured warning:
|
|
7
|
+
* - a GAME-VERSION mismatch: the overlay's `authoredAgainst.gameVersion`
|
|
8
|
+
* (`./overlay-file.ts`'s envelope, stamped from the manifest's `version`
|
|
9
|
+
* at save time) disagrees with the currently-mounted game's version;
|
|
10
|
+
* - ORPHANED ids: structural-path ids in the overlay that resolved to
|
|
11
|
+
* nothing on the current scene walk (`./overlay-apply.ts`'s
|
|
12
|
+
* `applyOverlayToObjects`).
|
|
13
|
+
*
|
|
14
|
+
* Neither condition blocks mounting — the overlay still applies everything it
|
|
15
|
+
* CAN; this module only decides whether/how to report what it couldn't.
|
|
16
|
+
*
|
|
17
|
+
* This is the SEAM T3.8 (the runtime overlay applier, i.e. reapplying an
|
|
18
|
+
* ingest overlay against a shipped/played build rather than the editor)
|
|
19
|
+
* reuses: `./overlay-applier.ts`'s `applyVgaiOverlay` builds + logs this EXACT
|
|
20
|
+
* report shape, same as the editor does. Moved here from the editor-only
|
|
21
|
+
* module that used to own it (`packages/editor/src/authoring/overlay-report.ts`,
|
|
22
|
+
* which now re-exports everything below unchanged plus the editor-only
|
|
23
|
+
* "active report" banner slot) — kept dependency-free (no `editor-console`/
|
|
24
|
+
* `window` import) so it stays importable from a headless runtime context —
|
|
25
|
+
* same discipline as `../achieved-tier.ts`.
|
|
26
|
+
*
|
|
27
|
+
* R5 (docs/MASTER-ARCHITECTURE-REVIEW.md §4(c)/§7.1 item 9) adds a THIRD
|
|
28
|
+
* independent signal alongside version-mismatch/orphans: an UPSTREAM-PIN
|
|
29
|
+
* mismatch. `gameVersion` alone cannot catch a same-slot substitution after a
|
|
30
|
+
* re-vendor (structural ids are position+type+name; a re-vendor that keeps a
|
|
31
|
+
* slot's shape reapplies the overlay onto a semantically different object
|
|
32
|
+
* with `applied:1, orphanedIds:[]`, and every vendored game's manifest
|
|
33
|
+
* `version` is hand-set and need not change on a re-vendor). The upstream pin
|
|
34
|
+
* (`./upstream-pin.ts`, read from the vendored game's `UPSTREAM.md`) is bound
|
|
35
|
+
* to the thing that actually changes. Like the other two signals, a mismatch
|
|
36
|
+
* never blocks application — it's a report, not a block (matching orphan
|
|
37
|
+
* semantics) — so a re-vendor surfaces as an explicit "authored against pin
|
|
38
|
+
* X, applying onto pin Y" instead of silent success.
|
|
39
|
+
*/
|
|
40
|
+
/** Greppable prefix shared by every overlay-related log line (mirrors `achieved-tier.ts`'s `TIER_SHORTFALL_PREFIX`). */
|
|
41
|
+
export const OVERLAY_REPORT_PREFIX = 'overlay-report';
|
|
42
|
+
/** Build the report from a mount's raw findings — pure, no logging. */
|
|
43
|
+
export function buildOverlayApplyReport(args) {
|
|
44
|
+
const versionMismatch = args.authoredAgainst !== null &&
|
|
45
|
+
args.currentVersion !== null &&
|
|
46
|
+
args.authoredAgainst !== args.currentVersion;
|
|
47
|
+
const recorded = args.authoredUpstreamPin !== undefined;
|
|
48
|
+
const authoredPin = args.authoredUpstreamPin ?? null;
|
|
49
|
+
const currentPin = args.currentUpstreamPin ?? null;
|
|
50
|
+
const upstreamPinMismatch = recorded && authoredPin !== null && currentPin !== null && authoredPin !== currentPin;
|
|
51
|
+
return {
|
|
52
|
+
gameId: args.gameId,
|
|
53
|
+
authoredAgainst: args.authoredAgainst,
|
|
54
|
+
currentVersion: args.currentVersion,
|
|
55
|
+
applied: args.applied,
|
|
56
|
+
orphanedIds: args.orphanedIds,
|
|
57
|
+
versionMismatch,
|
|
58
|
+
upstreamPin: {
|
|
59
|
+
authored: authoredPin,
|
|
60
|
+
current: currentPin,
|
|
61
|
+
recorded,
|
|
62
|
+
mismatch: upstreamPinMismatch,
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Whether this report is worth surfacing (mismatch OR any orphan) — pure, no logging. */
|
|
67
|
+
export function overlayReportWarrants(report) {
|
|
68
|
+
return report.versionMismatch || report.orphanedIds.length > 0 || report.upstreamPin.mismatch;
|
|
69
|
+
}
|
|
70
|
+
/** The one shared message shape — greppable on the prefix, JSON-parseable on the trailing payload. */
|
|
71
|
+
export function formatOverlayApplyReportMessage(report) {
|
|
72
|
+
const parts = [];
|
|
73
|
+
if (report.versionMismatch) {
|
|
74
|
+
parts.push(`overlay authored against v${report.authoredAgainst}, game is v${report.currentVersion}`);
|
|
75
|
+
}
|
|
76
|
+
if (report.upstreamPin.mismatch) {
|
|
77
|
+
parts.push(`overlay authored against upstream pin ${report.upstreamPin.authored}, ` +
|
|
78
|
+
`game is vendored at pin ${report.upstreamPin.current}`);
|
|
79
|
+
}
|
|
80
|
+
if (report.orphanedIds.length > 0) {
|
|
81
|
+
parts.push(`${report.orphanedIds.length} orphaned overlay entr${report.orphanedIds.length === 1 ? 'y' : 'ies'}`);
|
|
82
|
+
}
|
|
83
|
+
return (`${OVERLAY_REPORT_PREFIX} game "${report.gameId}": ${parts.join('; ')} ` +
|
|
84
|
+
`(D9, docs/DECISIONS-PENDING.md §D9; upstream-pin check R5, ` +
|
|
85
|
+
`docs/MASTER-ARCHITECTURE-REVIEW.md §4(c)). ${OVERLAY_REPORT_PREFIX} ${JSON.stringify(report)}`);
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Emit the ONE structured `console.warn` this report warrants (mirroring the
|
|
89
|
+
* tier-shortfall pattern), or do nothing when neither signal fires. Returns
|
|
90
|
+
* whether it warned (callers that also want the panel-visible `editorConsole`
|
|
91
|
+
* echo, or the inline banner, use the return value / the report itself).
|
|
92
|
+
*/
|
|
93
|
+
export function logOverlayApplyReport(report) {
|
|
94
|
+
if (!overlayReportWarrants(report))
|
|
95
|
+
return false;
|
|
96
|
+
// The D9 AC requires this EXACT native console.warn (spied on directly in
|
|
97
|
+
// overlay-versioning.test.ts) — other deliberate native console.warn call sites in
|
|
98
|
+
// this codebase (e.g. editor-store.ts) are unsuppressed and already counted in the
|
|
99
|
+
// lint baseline; this one is suppressed to keep this task's diff at zero NEW warnings.
|
|
100
|
+
// biome-ignore lint/suspicious/noConsole: see comment above
|
|
101
|
+
console.warn(formatOverlayApplyReportMessage(report));
|
|
102
|
+
return true;
|
|
103
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene capture — the core primitive of unmodified-game ingestion.
|
|
3
|
+
*
|
|
4
|
+
* An external three.js game owns its own `WebGLRenderer`, `Scene`, camera, and
|
|
5
|
+
* render loop. To let the editor inspect/edit that live scene WITHOUT touching
|
|
6
|
+
* the game's code, we need a handle to the game's `Scene`+camera the moment it
|
|
7
|
+
* first renders. The robust way to obtain it is an **accessor trap** on
|
|
8
|
+
* `WebGLRenderer.prototype.render`:
|
|
9
|
+
*
|
|
10
|
+
* - `WebGLRenderer` assigns `this.render` as an OWN instance property inside
|
|
11
|
+
* its constructor (not on the prototype), and `THREE.WebGLRenderer` is a
|
|
12
|
+
* read-only module export (can't subclass-swap it). A naive "wrap render"
|
|
13
|
+
* hook therefore captures nothing.
|
|
14
|
+
* - Installing a getter/setter for `render` on the PROTOTYPE means the
|
|
15
|
+
* constructor's `this.render = realFn` hits our setter (the instance has no
|
|
16
|
+
* own `render` yet), we stash the real fn, and our getter returns a wrapper
|
|
17
|
+
* that captures `(scene, camera, renderer)` on the first real frame.
|
|
18
|
+
*
|
|
19
|
+
* This is the hardened, typed form of the `ingest-study` spike
|
|
20
|
+
* (`docs/ingest-study-spike/vgai-ingest-adapter.js`), proven against an
|
|
21
|
+
* unmodified `three.js/examples/games_fps` game.
|
|
22
|
+
*
|
|
23
|
+
* CRITICAL: the trap must be installed on the SAME `three` module instance the
|
|
24
|
+
* game uses. In a bundler/dev-server that dedupes `three` (one `node_modules/
|
|
25
|
+
* three`), an external ESM game's `import 'three'` resolves to that one instance,
|
|
26
|
+
* so passing the host's `THREE` here traps the game's renderer too. A game that
|
|
27
|
+
* bundles its own copy of `three` cannot be captured this way (see
|
|
28
|
+
* `docs/UNMODIFIED-GAME-INGESTION-STUDY.md` §4A — the module-identity gatekeeper).
|
|
29
|
+
*
|
|
30
|
+
* Wave 17 (`docs/WAVE17-F13-COMPOSER-RESIZE-FIX-DESIGN.md`) adds an OPTIONAL,
|
|
31
|
+
* ADDITIVE composer capture: a game rendering through its own three.js addon
|
|
32
|
+
* `EffectComposer` (`three/examples/jsm/postprocessing/EffectComposer.js`)
|
|
33
|
+
* still trips the `render` trap above (its `RenderPass` calls
|
|
34
|
+
* `renderer.render(scene,camera)` internally), but the renderer holds no
|
|
35
|
+
* reference back to the composer, so the host previously could not resize the
|
|
36
|
+
* composer's own (intentionally non-1:1, progressively-downsampled — see
|
|
37
|
+
* `UnrealBloomPass`) render targets when the host resizes the game's pane.
|
|
38
|
+
* Unlike `WebGLRenderer`, `EffectComposer` is a plain ES class whose methods
|
|
39
|
+
* (including `render`) live on the PROTOTYPE, not assigned as own instance
|
|
40
|
+
* properties in the constructor — so a direct method-wrapper (no getter/
|
|
41
|
+
* setter indirection) on `EffectComposer.prototype.render` is sufficient: it
|
|
42
|
+
* calls through to the real `render`, then — AFTER that call, so any nested
|
|
43
|
+
* `renderer.render()` the pass makes has already hit the trap above and set
|
|
44
|
+
* `captured` — records `this` (the composer instance) if its `.renderer` is
|
|
45
|
+
* the captured one. This is deduped/shared-trappable for the same reason
|
|
46
|
+
* `WebGLRenderer` is: `EffectComposer.js` is a FILE inside the same `three`
|
|
47
|
+
* package tree Vite's `resolve.dedupe: ['three', …]` already collapses to one
|
|
48
|
+
* instance — not a separate package with its own dedupe question. Proven
|
|
49
|
+
* live against the `bloom-composer` fixture
|
|
50
|
+
* (`docs/f13-bloom-composer-proof/record-fixed.mjs`).
|
|
51
|
+
*/
|
|
52
|
+
import type * as THREE from 'three';
|
|
53
|
+
/** A live runtime captured from an external game on its first rendered frame. */
|
|
54
|
+
export interface CapturedRuntime {
|
|
55
|
+
scene: THREE.Scene;
|
|
56
|
+
camera: THREE.Camera;
|
|
57
|
+
renderer: THREE.WebGLRenderer;
|
|
58
|
+
}
|
|
59
|
+
/** Handle returned by {@link installSceneCapture}. */
|
|
60
|
+
export interface SceneCaptureHandle {
|
|
61
|
+
/** The captured runtime, or null until the game renders its first frame. */
|
|
62
|
+
readonly captured: CapturedRuntime | null;
|
|
63
|
+
/** Resolve once a scene+camera is captured (rejects on timeout). */
|
|
64
|
+
waitForCapture(timeoutMs?: number): Promise<CapturedRuntime>;
|
|
65
|
+
/** Total `render()` calls observed through the trap (a liveness signal). */
|
|
66
|
+
getDrawCount(): number;
|
|
67
|
+
/** The game's last (non-null) `setAnimationLoop` callback for a renderer, so the
|
|
68
|
+
* host can pause (set null) and resume (re-set it) the game's own loop. */
|
|
69
|
+
getAnimationLoop(renderer: THREE.WebGLRenderer): ((time: number) => void) | null;
|
|
70
|
+
/**
|
|
71
|
+
* Wave 17 (D-C3): resize every captured `EffectComposer` that renders
|
|
72
|
+
* through the captured renderer to `w`×`h`, matching its pixel ratio to
|
|
73
|
+
* `renderer.getPixelRatio()` — the composer tracks whatever DPR policy the
|
|
74
|
+
* host already applies to the renderer; no separate knob. A no-op when no
|
|
75
|
+
* `effectComposerCtor` was passed to {@link installSceneCapture} (or no
|
|
76
|
+
* composer of that ctor has rendered through the captured renderer yet) —
|
|
77
|
+
* a non-composer game is unaffected.
|
|
78
|
+
*/
|
|
79
|
+
resizeComposers(w: number, h: number): void;
|
|
80
|
+
/** Remove the trap and restore the captured renderer's real `render`. */
|
|
81
|
+
uninstall(): void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Install the render accessor trap on `threeNamespace.WebGLRenderer.prototype`.
|
|
85
|
+
* Pass the host's `three` module so the game (which shares it) is trapped.
|
|
86
|
+
*
|
|
87
|
+
* `effectComposerCtor` is OPTIONAL (Wave 17, D-C2): pass the host's
|
|
88
|
+
* `EffectComposer` class (`three/examples/jsm/postprocessing/EffectComposer.js`)
|
|
89
|
+
* to also trap composer construction/rendering on that shared addon, so
|
|
90
|
+
* `resizeComposers()` can reach it. Omitting it (or a game never constructing
|
|
91
|
+
* one) leaves capture byte-identical to before this wave.
|
|
92
|
+
*
|
|
93
|
+
* Idempotent per call site is NOT guaranteed — install once per ingest session
|
|
94
|
+
* and `uninstall()` on teardown.
|
|
95
|
+
*/
|
|
96
|
+
export declare function installSceneCapture(threeNamespace: unknown, effectComposerCtor?: unknown): SceneCaptureHandle;
|
|
97
|
+
//# sourceMappingURL=scene-capture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-capture.d.ts","sourceRoot":"","sources":["../../../src/adapter/ingest/scene-capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAEH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AAEpC,iFAAiF;AACjF,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC;IACnB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC;CAC/B;AAED,sDAAsD;AACtD,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;IAC1C,oEAAoE;IACpE,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAC7D,4EAA4E;IAC5E,YAAY,IAAI,MAAM,CAAC;IACvB;gFAC4E;IAC5E,gBAAgB,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACjF;;;;;;;;OAQG;IACH,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,yEAAyE;IACzE,SAAS,IAAI,IAAI,CAAC;CACnB;AAsBD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,OAAO,EACvB,kBAAkB,CAAC,EAAE,OAAO,GAC3B,kBAAkB,CAwLpB"}
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scene capture — the core primitive of unmodified-game ingestion.
|
|
3
|
+
*
|
|
4
|
+
* An external three.js game owns its own `WebGLRenderer`, `Scene`, camera, and
|
|
5
|
+
* render loop. To let the editor inspect/edit that live scene WITHOUT touching
|
|
6
|
+
* the game's code, we need a handle to the game's `Scene`+camera the moment it
|
|
7
|
+
* first renders. The robust way to obtain it is an **accessor trap** on
|
|
8
|
+
* `WebGLRenderer.prototype.render`:
|
|
9
|
+
*
|
|
10
|
+
* - `WebGLRenderer` assigns `this.render` as an OWN instance property inside
|
|
11
|
+
* its constructor (not on the prototype), and `THREE.WebGLRenderer` is a
|
|
12
|
+
* read-only module export (can't subclass-swap it). A naive "wrap render"
|
|
13
|
+
* hook therefore captures nothing.
|
|
14
|
+
* - Installing a getter/setter for `render` on the PROTOTYPE means the
|
|
15
|
+
* constructor's `this.render = realFn` hits our setter (the instance has no
|
|
16
|
+
* own `render` yet), we stash the real fn, and our getter returns a wrapper
|
|
17
|
+
* that captures `(scene, camera, renderer)` on the first real frame.
|
|
18
|
+
*
|
|
19
|
+
* This is the hardened, typed form of the `ingest-study` spike
|
|
20
|
+
* (`docs/ingest-study-spike/vgai-ingest-adapter.js`), proven against an
|
|
21
|
+
* unmodified `three.js/examples/games_fps` game.
|
|
22
|
+
*
|
|
23
|
+
* CRITICAL: the trap must be installed on the SAME `three` module instance the
|
|
24
|
+
* game uses. In a bundler/dev-server that dedupes `three` (one `node_modules/
|
|
25
|
+
* three`), an external ESM game's `import 'three'` resolves to that one instance,
|
|
26
|
+
* so passing the host's `THREE` here traps the game's renderer too. A game that
|
|
27
|
+
* bundles its own copy of `three` cannot be captured this way (see
|
|
28
|
+
* `docs/UNMODIFIED-GAME-INGESTION-STUDY.md` §4A — the module-identity gatekeeper).
|
|
29
|
+
*
|
|
30
|
+
* Wave 17 (`docs/WAVE17-F13-COMPOSER-RESIZE-FIX-DESIGN.md`) adds an OPTIONAL,
|
|
31
|
+
* ADDITIVE composer capture: a game rendering through its own three.js addon
|
|
32
|
+
* `EffectComposer` (`three/examples/jsm/postprocessing/EffectComposer.js`)
|
|
33
|
+
* still trips the `render` trap above (its `RenderPass` calls
|
|
34
|
+
* `renderer.render(scene,camera)` internally), but the renderer holds no
|
|
35
|
+
* reference back to the composer, so the host previously could not resize the
|
|
36
|
+
* composer's own (intentionally non-1:1, progressively-downsampled — see
|
|
37
|
+
* `UnrealBloomPass`) render targets when the host resizes the game's pane.
|
|
38
|
+
* Unlike `WebGLRenderer`, `EffectComposer` is a plain ES class whose methods
|
|
39
|
+
* (including `render`) live on the PROTOTYPE, not assigned as own instance
|
|
40
|
+
* properties in the constructor — so a direct method-wrapper (no getter/
|
|
41
|
+
* setter indirection) on `EffectComposer.prototype.render` is sufficient: it
|
|
42
|
+
* calls through to the real `render`, then — AFTER that call, so any nested
|
|
43
|
+
* `renderer.render()` the pass makes has already hit the trap above and set
|
|
44
|
+
* `captured` — records `this` (the composer instance) if its `.renderer` is
|
|
45
|
+
* the captured one. This is deduped/shared-trappable for the same reason
|
|
46
|
+
* `WebGLRenderer` is: `EffectComposer.js` is a FILE inside the same `three`
|
|
47
|
+
* package tree Vite's `resolve.dedupe: ['three', …]` already collapses to one
|
|
48
|
+
* instance — not a separate package with its own dedupe question. Proven
|
|
49
|
+
* live against the `bloom-composer` fixture
|
|
50
|
+
* (`docs/f13-bloom-composer-proof/record-fixed.mjs`).
|
|
51
|
+
*/
|
|
52
|
+
/**
|
|
53
|
+
* Install the render accessor trap on `threeNamespace.WebGLRenderer.prototype`.
|
|
54
|
+
* Pass the host's `three` module so the game (which shares it) is trapped.
|
|
55
|
+
*
|
|
56
|
+
* `effectComposerCtor` is OPTIONAL (Wave 17, D-C2): pass the host's
|
|
57
|
+
* `EffectComposer` class (`three/examples/jsm/postprocessing/EffectComposer.js`)
|
|
58
|
+
* to also trap composer construction/rendering on that shared addon, so
|
|
59
|
+
* `resizeComposers()` can reach it. Omitting it (or a game never constructing
|
|
60
|
+
* one) leaves capture byte-identical to before this wave.
|
|
61
|
+
*
|
|
62
|
+
* Idempotent per call site is NOT guaranteed — install once per ingest session
|
|
63
|
+
* and `uninstall()` on teardown.
|
|
64
|
+
*/
|
|
65
|
+
export function installSceneCapture(threeNamespace, effectComposerCtor) {
|
|
66
|
+
const THREE_NS = threeNamespace;
|
|
67
|
+
const proto = THREE_NS.WebGLRenderer.prototype;
|
|
68
|
+
// Stash the real render fn per-instance under a unique symbol so multiple
|
|
69
|
+
// renderers (editor's + game's) never collide.
|
|
70
|
+
const REAL = Symbol('vgai.realRender');
|
|
71
|
+
let captured = null;
|
|
72
|
+
let drawCount = 0;
|
|
73
|
+
const waiters = [];
|
|
74
|
+
// Preserve any descriptor already on the prototype so uninstall can restore it.
|
|
75
|
+
const priorDescriptor = Object.getOwnPropertyDescriptor(proto, 'render');
|
|
76
|
+
// Trap setAnimationLoop to record each renderer's game loop callback, so the host
|
|
77
|
+
// can freeze (set null) and resume (re-set) the game's own rAF for stable editing.
|
|
78
|
+
// CRITICAL: like `render`, WebGLRenderer assigns `this.setAnimationLoop` as an OWN
|
|
79
|
+
// instance property in its constructor — NOT on the prototype. A naive value-wrapper
|
|
80
|
+
// on the prototype is therefore shadowed by the instance's own property and never
|
|
81
|
+
// runs (resume could never recover the callback). So we mirror the `render` trap: a
|
|
82
|
+
// prototype getter/setter. The constructor's `this.setAnimationLoop = realFn` hits
|
|
83
|
+
// our SETTER (the instance has no own property yet) and we stash realFn per-instance;
|
|
84
|
+
// the GETTER returns a wrapper that records each non-null callback before forwarding.
|
|
85
|
+
const REAL_SAL = Symbol('vgai.realSetAnimationLoop');
|
|
86
|
+
const loopCallbacks = new WeakMap();
|
|
87
|
+
const priorSAL = Object.getOwnPropertyDescriptor(proto, 'setAnimationLoop');
|
|
88
|
+
Object.defineProperty(proto, 'setAnimationLoop', {
|
|
89
|
+
configurable: true,
|
|
90
|
+
set(fn) {
|
|
91
|
+
this[REAL_SAL] = fn;
|
|
92
|
+
},
|
|
93
|
+
get() {
|
|
94
|
+
const self = this;
|
|
95
|
+
return function setAnimationLoop(cb) {
|
|
96
|
+
if (cb)
|
|
97
|
+
loopCallbacks.set(self, cb);
|
|
98
|
+
const real = self[REAL_SAL];
|
|
99
|
+
return typeof real === 'function'
|
|
100
|
+
? real.call(self, cb)
|
|
101
|
+
: undefined;
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
Object.defineProperty(proto, 'render', {
|
|
106
|
+
configurable: true,
|
|
107
|
+
set(fn) {
|
|
108
|
+
this[REAL] = fn;
|
|
109
|
+
},
|
|
110
|
+
get() {
|
|
111
|
+
const self = this;
|
|
112
|
+
return function render(...args) {
|
|
113
|
+
const [scene, camera] = args;
|
|
114
|
+
drawCount++;
|
|
115
|
+
if (!captured && scene && scene.isScene) {
|
|
116
|
+
captured = {
|
|
117
|
+
scene: scene,
|
|
118
|
+
camera: camera,
|
|
119
|
+
renderer: self,
|
|
120
|
+
};
|
|
121
|
+
for (const resolve of waiters.splice(0))
|
|
122
|
+
resolve(captured);
|
|
123
|
+
}
|
|
124
|
+
// Forward to the renderer's real render with the original args.
|
|
125
|
+
return self[REAL].apply(self, args);
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
// ---- Wave 17 (D-C2): additive composer capture, only when a composer ctor
|
|
130
|
+
// was passed. `EffectComposer` methods (including `render`) live on the
|
|
131
|
+
// PROTOTYPE (a plain ES class — the constructor never does `this.render =
|
|
132
|
+
// …`), so a direct method-wrapper suffices — no getter/setter indirection
|
|
133
|
+
// like the `render`/`setAnimationLoop` traps above need. ----
|
|
134
|
+
const composers = new Set();
|
|
135
|
+
let composerProto;
|
|
136
|
+
let priorComposerRender;
|
|
137
|
+
if (effectComposerCtor) {
|
|
138
|
+
const EC = effectComposerCtor;
|
|
139
|
+
composerProto = EC.prototype;
|
|
140
|
+
priorComposerRender = composerProto['render'];
|
|
141
|
+
composerProto['render'] = function (...args) {
|
|
142
|
+
// Call the real render FIRST: a composer's RenderPass calls
|
|
143
|
+
// `renderer.render(scene,camera)` internally, which is what actually
|
|
144
|
+
// sets `captured` (above) on the game's first frame. Checking after
|
|
145
|
+
// ensures a composer's very first render is still collected.
|
|
146
|
+
const result = priorComposerRender?.apply(this, args);
|
|
147
|
+
if (captured && this.renderer === captured.renderer) {
|
|
148
|
+
composers.add(this);
|
|
149
|
+
}
|
|
150
|
+
return result;
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
// Extracted so `uninstall()`'s own cognitive complexity doesn't grow with
|
|
154
|
+
// this additive Wave-17 restore step (biome's noExcessiveCognitiveComplexity).
|
|
155
|
+
function restoreComposerTrap() {
|
|
156
|
+
if (!composerProto)
|
|
157
|
+
return;
|
|
158
|
+
if (priorComposerRender)
|
|
159
|
+
composerProto['render'] = priorComposerRender;
|
|
160
|
+
else
|
|
161
|
+
delete composerProto['render'];
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
get captured() {
|
|
165
|
+
return captured;
|
|
166
|
+
},
|
|
167
|
+
getDrawCount() {
|
|
168
|
+
return drawCount;
|
|
169
|
+
},
|
|
170
|
+
getAnimationLoop(renderer) {
|
|
171
|
+
return loopCallbacks.get(renderer) ?? null;
|
|
172
|
+
},
|
|
173
|
+
resizeComposers(w, h) {
|
|
174
|
+
// No composer ctor passed (or none constructed yet) → no-op, and never
|
|
175
|
+
// touches `renderer.getPixelRatio()` — a non-composer game's captured
|
|
176
|
+
// renderer need not even expose that method for this to stay a no-op.
|
|
177
|
+
if (!captured || composers.size === 0)
|
|
178
|
+
return;
|
|
179
|
+
const pixelRatio = captured.renderer.getPixelRatio();
|
|
180
|
+
for (const composer of composers) {
|
|
181
|
+
composer.setSize(w, h);
|
|
182
|
+
composer.setPixelRatio(pixelRatio);
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
waitForCapture(timeoutMs = 10_000) {
|
|
186
|
+
if (captured)
|
|
187
|
+
return Promise.resolve(captured);
|
|
188
|
+
return new Promise((resolve, reject) => {
|
|
189
|
+
const timer = setTimeout(() => {
|
|
190
|
+
const i = waiters.indexOf(wrapped);
|
|
191
|
+
if (i >= 0)
|
|
192
|
+
waiters.splice(i, 1);
|
|
193
|
+
reject(new Error(`Scene capture timed out after ${timeoutMs}ms — the game never rendered, ` +
|
|
194
|
+
`or it bundles its own (un-shared) copy of three.`));
|
|
195
|
+
}, timeoutMs);
|
|
196
|
+
const wrapped = (rt) => {
|
|
197
|
+
clearTimeout(timer);
|
|
198
|
+
resolve(rt);
|
|
199
|
+
};
|
|
200
|
+
waiters.push(wrapped);
|
|
201
|
+
});
|
|
202
|
+
},
|
|
203
|
+
uninstall() {
|
|
204
|
+
// Restore the captured renderer's real render as an OWN property so its
|
|
205
|
+
// loop keeps working after the prototype trap is removed.
|
|
206
|
+
if (captured) {
|
|
207
|
+
const r = captured.renderer;
|
|
208
|
+
const real = r[REAL];
|
|
209
|
+
if (typeof real === 'function') {
|
|
210
|
+
Object.defineProperty(captured.renderer, 'render', {
|
|
211
|
+
configurable: true,
|
|
212
|
+
writable: true,
|
|
213
|
+
value: real,
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (priorDescriptor) {
|
|
218
|
+
Object.defineProperty(proto, 'render', priorDescriptor);
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
delete proto['render'];
|
|
222
|
+
}
|
|
223
|
+
// Restore the captured renderer's real setAnimationLoop as an OWN property (the
|
|
224
|
+
// prototype getter/setter intercepted the constructor's assignment, so the
|
|
225
|
+
// instance has none) — else removing the prototype trap would leave it without
|
|
226
|
+
// setAnimationLoop and freeze its loop.
|
|
227
|
+
if (captured) {
|
|
228
|
+
const r = captured.renderer;
|
|
229
|
+
const realSal = r[REAL_SAL];
|
|
230
|
+
if (typeof realSal === 'function') {
|
|
231
|
+
Object.defineProperty(captured.renderer, 'setAnimationLoop', {
|
|
232
|
+
configurable: true,
|
|
233
|
+
writable: true,
|
|
234
|
+
value: realSal,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
if (priorSAL)
|
|
239
|
+
Object.defineProperty(proto, 'setAnimationLoop', priorSAL);
|
|
240
|
+
else
|
|
241
|
+
delete proto['setAnimationLoop'];
|
|
242
|
+
// Wave 17: fully restore the composer addon's `render` (a plain
|
|
243
|
+
// prototype method — no per-instance own-property to restore, unlike
|
|
244
|
+
// the renderer/loop traps above).
|
|
245
|
+
restoreComposerTrap();
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstream-pin extraction — R5 (docs/MASTER-ARCHITECTURE-REVIEW.md §4(c)/
|
|
3
|
+
* §7.1 item 9): the fix for the overlay identity gap the structural-id +
|
|
4
|
+
* `authoredAgainst.gameVersion` scheme (T7.7/D9) does not close. A re-vendor
|
|
5
|
+
* of a vendored upstream game that keeps a slot's shape (index + three.js
|
|
6
|
+
* type + name unchanged) reapplies a saved overlay onto a semantically
|
|
7
|
+
* different object with `applied: 1, orphanedIds: []` — silent wrong-meaning
|
|
8
|
+
* success — because `authoredAgainst.gameVersion` is the MANIFEST's own
|
|
9
|
+
* `version` (hand-set by whoever wrote `vgai.game.json`, e.g. every
|
|
10
|
+
* `public/ingest/*` vendored game ships `"version": "0.1.0"` regardless of
|
|
11
|
+
* which upstream commit it vendors — see `public/ingest/{tanks,racing-game,
|
|
12
|
+
* simcity}/vgai.game.json`), never tied to the thing that actually changes on
|
|
13
|
+
* a re-vendor: the `UPSTREAM.md` pin.
|
|
14
|
+
*
|
|
15
|
+
* This module is the pure, dependency-free half (parse text -> pin, or
|
|
16
|
+
* `null`): NO file I/O here, so it is usable from any context (editor
|
|
17
|
+
* save/apply-time hooks over a fetched `/UPSTREAM.md`, a future Node-side
|
|
18
|
+
* CLI check, tests). READ-ONLY by construction — it has no writer; this
|
|
19
|
+
* codebase never generates or edits an `UPSTREAM.md` (the anti-shim rule:
|
|
20
|
+
* adapters never fabricate first-party data, and a game's own vendoring
|
|
21
|
+
* provenance is exactly that).
|
|
22
|
+
*
|
|
23
|
+
* Format (established convention, not invented here — see every
|
|
24
|
+
* `public/ingest/*\/UPSTREAM.md`'s `## Upstream` section, e.g.
|
|
25
|
+
* `public/ingest/tanks/UPSTREAM.md`):
|
|
26
|
+
*
|
|
27
|
+
* ## Upstream
|
|
28
|
+
*
|
|
29
|
+
* - Repo: https://github.com/colyseus/realtime-tanks-demo
|
|
30
|
+
* - Commit: **`6339493130b4b1d4d28f0f52d17b2fba738c7d47`**
|
|
31
|
+
*
|
|
32
|
+
* i.e. a Markdown bullet whose label is `Commit:` and whose value is a bold,
|
|
33
|
+
* backtick-code full (or abbreviated) git SHA. Every vendored game in this
|
|
34
|
+
* repo (`tanks`, `racing-game`, `simcity`) follows this exact shape.
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Extract the pinned upstream commit hash from a vendored game's
|
|
38
|
+
* `UPSTREAM.md` prose, or `null` if the file doesn't follow the convention
|
|
39
|
+
* (or wasn't found — the caller decides what a missing file means; this
|
|
40
|
+
* function only parses text it's handed). Never throws — an unparseable
|
|
41
|
+
* document is an honest `null`, not an error (anti-shim: no guessing, no
|
|
42
|
+
* fabricating a pin from a game folder that doesn't declare one, e.g. an
|
|
43
|
+
* externally-authored non-vendored project opened via the CLI-on-folder
|
|
44
|
+
* route).
|
|
45
|
+
*/
|
|
46
|
+
export declare function extractUpstreamPin(markdown: string): string | null;
|
|
47
|
+
//# sourceMappingURL=upstream-pin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upstream-pin.d.ts","sourceRoot":"","sources":["../../../src/adapter/ingest/upstream-pin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAKH;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAElE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Upstream-pin extraction — R5 (docs/MASTER-ARCHITECTURE-REVIEW.md §4(c)/
|
|
3
|
+
* §7.1 item 9): the fix for the overlay identity gap the structural-id +
|
|
4
|
+
* `authoredAgainst.gameVersion` scheme (T7.7/D9) does not close. A re-vendor
|
|
5
|
+
* of a vendored upstream game that keeps a slot's shape (index + three.js
|
|
6
|
+
* type + name unchanged) reapplies a saved overlay onto a semantically
|
|
7
|
+
* different object with `applied: 1, orphanedIds: []` — silent wrong-meaning
|
|
8
|
+
* success — because `authoredAgainst.gameVersion` is the MANIFEST's own
|
|
9
|
+
* `version` (hand-set by whoever wrote `vgai.game.json`, e.g. every
|
|
10
|
+
* `public/ingest/*` vendored game ships `"version": "0.1.0"` regardless of
|
|
11
|
+
* which upstream commit it vendors — see `public/ingest/{tanks,racing-game,
|
|
12
|
+
* simcity}/vgai.game.json`), never tied to the thing that actually changes on
|
|
13
|
+
* a re-vendor: the `UPSTREAM.md` pin.
|
|
14
|
+
*
|
|
15
|
+
* This module is the pure, dependency-free half (parse text -> pin, or
|
|
16
|
+
* `null`): NO file I/O here, so it is usable from any context (editor
|
|
17
|
+
* save/apply-time hooks over a fetched `/UPSTREAM.md`, a future Node-side
|
|
18
|
+
* CLI check, tests). READ-ONLY by construction — it has no writer; this
|
|
19
|
+
* codebase never generates or edits an `UPSTREAM.md` (the anti-shim rule:
|
|
20
|
+
* adapters never fabricate first-party data, and a game's own vendoring
|
|
21
|
+
* provenance is exactly that).
|
|
22
|
+
*
|
|
23
|
+
* Format (established convention, not invented here — see every
|
|
24
|
+
* `public/ingest/*\/UPSTREAM.md`'s `## Upstream` section, e.g.
|
|
25
|
+
* `public/ingest/tanks/UPSTREAM.md`):
|
|
26
|
+
*
|
|
27
|
+
* ## Upstream
|
|
28
|
+
*
|
|
29
|
+
* - Repo: https://github.com/colyseus/realtime-tanks-demo
|
|
30
|
+
* - Commit: **`6339493130b4b1d4d28f0f52d17b2fba738c7d47`**
|
|
31
|
+
*
|
|
32
|
+
* i.e. a Markdown bullet whose label is `Commit:` and whose value is a bold,
|
|
33
|
+
* backtick-code full (or abbreviated) git SHA. Every vendored game in this
|
|
34
|
+
* repo (`tanks`, `racing-game`, `simcity`) follows this exact shape.
|
|
35
|
+
*/
|
|
36
|
+
/** Matches `- Commit: **\`<sha>\`**` (any amount of internal whitespace, case-insensitive hex). */
|
|
37
|
+
const COMMIT_BULLET_RE = /-\s*Commit:\s*\*\*`([0-9a-fA-F]{7,40})`\*\*/;
|
|
38
|
+
/**
|
|
39
|
+
* Extract the pinned upstream commit hash from a vendored game's
|
|
40
|
+
* `UPSTREAM.md` prose, or `null` if the file doesn't follow the convention
|
|
41
|
+
* (or wasn't found — the caller decides what a missing file means; this
|
|
42
|
+
* function only parses text it's handed). Never throws — an unparseable
|
|
43
|
+
* document is an honest `null`, not an error (anti-shim: no guessing, no
|
|
44
|
+
* fabricating a pin from a game folder that doesn't declare one, e.g. an
|
|
45
|
+
* externally-authored non-vendored project opened via the CLI-on-folder
|
|
46
|
+
* route).
|
|
47
|
+
*/
|
|
48
|
+
export function extractUpstreamPin(markdown) {
|
|
49
|
+
return COMMIT_BULLET_RE.exec(markdown)?.[1] ?? null;
|
|
50
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-gate shortfall reporting (D10, T7.6) — the honesty half of the
|
|
3
|
+
* play-control contract. `docs/CAPABILITY-TIERS.md` §(d) draws the `loop` axis
|
|
4
|
+
* (`gated | self-driven`) as independent of capability tier: a `self-driven`
|
|
5
|
+
* world (an ingested game driving its own rAF/ticker) pauses for real ONLY if
|
|
6
|
+
* its adapter implements an explicit loop-gate capability
|
|
7
|
+
* (`MountedWorldBase.setPaused`/`step`) — otherwise it "honestly reports so"
|
|
8
|
+
* rather than a silent no-op (the D5/COMPOSITION-DESIGN.md §5.2 finding: gating
|
|
9
|
+
* a raw-rAF loop from outside was demonstrated and REJECTED). The audio seam
|
|
10
|
+
* (`SystemAdapters.AudioAdapter`) has the identical shape: absent or unable to
|
|
11
|
+
* silence a world's audio on pause must report, not pretend.
|
|
12
|
+
*
|
|
13
|
+
* Pure compute + message-formatting, same split as `achieved-tier.ts`
|
|
14
|
+
* (`packages/editor/src/achieved-tier.ts`) — callers own the actual
|
|
15
|
+
* `console.warn`/`editorConsole.warn` call; this module never logs.
|
|
16
|
+
*/
|
|
17
|
+
/** Greppable prefix for a loop-gate shortfall (pause requested, world's loop
|
|
18
|
+
* could not actually be gated). */
|
|
19
|
+
export declare const LOOP_GATE_PREFIX = "loop-gate";
|
|
20
|
+
/** Greppable prefix for an audio-gate shortfall (pause requested, world's
|
|
21
|
+
* audio could not actually be silenced). */
|
|
22
|
+
export declare const AUDIO_GATE_PREFIX = "audio-gate";
|
|
23
|
+
/** One shortfall instance: which world, and why the capability wasn't there. */
|
|
24
|
+
export interface CapabilityGateReport {
|
|
25
|
+
readonly worldId: string;
|
|
26
|
+
readonly reason: string;
|
|
27
|
+
}
|
|
28
|
+
/** Format a loop-gate shortfall message (a `self-driven` world with no
|
|
29
|
+
* working pause capability). */
|
|
30
|
+
export declare function formatLoopGateMessage(report: CapabilityGateReport): string;
|
|
31
|
+
/** Format an audio-gate shortfall message (a world with no `AudioAdapter`, or
|
|
32
|
+
* whose adapter cannot actually silence it). */
|
|
33
|
+
export declare function formatAudioGateMessage(report: CapabilityGateReport): string;
|
|
34
|
+
//# sourceMappingURL=loop-gate-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-gate-report.d.ts","sourceRoot":"","sources":["../../src/adapter/loop-gate-report.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH;oCACoC;AACpC,eAAO,MAAM,gBAAgB,cAAc,CAAC;AAE5C;6CAC6C;AAC7C,eAAO,MAAM,iBAAiB,eAAe,CAAC;AAE9C,gFAAgF;AAChF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAcD;iCACiC;AACjC,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAE1E;AAED;iDACiD;AACjD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAE3E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Capability-gate shortfall reporting (D10, T7.6) — the honesty half of the
|
|
3
|
+
* play-control contract. `docs/CAPABILITY-TIERS.md` §(d) draws the `loop` axis
|
|
4
|
+
* (`gated | self-driven`) as independent of capability tier: a `self-driven`
|
|
5
|
+
* world (an ingested game driving its own rAF/ticker) pauses for real ONLY if
|
|
6
|
+
* its adapter implements an explicit loop-gate capability
|
|
7
|
+
* (`MountedWorldBase.setPaused`/`step`) — otherwise it "honestly reports so"
|
|
8
|
+
* rather than a silent no-op (the D5/COMPOSITION-DESIGN.md §5.2 finding: gating
|
|
9
|
+
* a raw-rAF loop from outside was demonstrated and REJECTED). The audio seam
|
|
10
|
+
* (`SystemAdapters.AudioAdapter`) has the identical shape: absent or unable to
|
|
11
|
+
* silence a world's audio on pause must report, not pretend.
|
|
12
|
+
*
|
|
13
|
+
* Pure compute + message-formatting, same split as `achieved-tier.ts`
|
|
14
|
+
* (`packages/editor/src/achieved-tier.ts`) — callers own the actual
|
|
15
|
+
* `console.warn`/`editorConsole.warn` call; this module never logs.
|
|
16
|
+
*/
|
|
17
|
+
/** Greppable prefix for a loop-gate shortfall (pause requested, world's loop
|
|
18
|
+
* could not actually be gated). */
|
|
19
|
+
export const LOOP_GATE_PREFIX = 'loop-gate';
|
|
20
|
+
/** Greppable prefix for an audio-gate shortfall (pause requested, world's
|
|
21
|
+
* audio could not actually be silenced). */
|
|
22
|
+
export const AUDIO_GATE_PREFIX = 'audio-gate';
|
|
23
|
+
function formatGateMessage(prefix, capability, report) {
|
|
24
|
+
return (`${prefix} world "${report.worldId}": pause requested but ${capability} cannot be gated ` +
|
|
25
|
+
`(${report.reason}) — reporting honestly instead of silently no-op-ing ` +
|
|
26
|
+
`(docs/CAPABILITY-TIERS.md §d). ${prefix} ${JSON.stringify(report)}`);
|
|
27
|
+
}
|
|
28
|
+
/** Format a loop-gate shortfall message (a `self-driven` world with no
|
|
29
|
+
* working pause capability). */
|
|
30
|
+
export function formatLoopGateMessage(report) {
|
|
31
|
+
return formatGateMessage(LOOP_GATE_PREFIX, "this world's loop", report);
|
|
32
|
+
}
|
|
33
|
+
/** Format an audio-gate shortfall message (a world with no `AudioAdapter`, or
|
|
34
|
+
* whose adapter cannot actually silence it). */
|
|
35
|
+
export function formatAudioGateMessage(report) {
|
|
36
|
+
return formatGateMessage(AUDIO_GATE_PREFIX, "this world's audio", report);
|
|
37
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RapierPhysicsAdapter — the first-party `PhysicsAdapter` over the existing
|
|
3
|
+
* `PhysicsRegistry` (Object3D ↔ Rapier body/collider). This is the generalized,
|
|
4
|
+
* behind-the-interface form of the old `setEcsSyncTransform` teleport: it lets
|
|
5
|
+
* the editor freeze a body, apply a gizmo edit, and resume — without the editor
|
|
6
|
+
* knowing Rapier exists.
|
|
7
|
+
*/
|
|
8
|
+
import type * as THREE from 'three';
|
|
9
|
+
import type { PhysicsRegistry } from '../physics/physics-registry';
|
|
10
|
+
import type { PhysicsAdapter } from './system-adapter';
|
|
11
|
+
export declare function createRapierPhysicsAdapter(registry: PhysicsRegistry, debugMesh?: THREE.Object3D | null): PhysicsAdapter;
|
|
12
|
+
//# sourceMappingURL=rapier-physics-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rapier-physics-adapter.d.ts","sourceRoot":"","sources":["../../src/adapter/rapier-physics-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGvD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,eAAe,EACzB,SAAS,CAAC,EAAE,KAAK,CAAC,QAAQ,GAAG,IAAI,GAChC,cAAc,CAsChB"}
|