@downdraft/engine 0.1.1 → 0.1.2-alpha.5
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/app/README.md +11 -0
- package/app/src/renderer/bootstrap.ts +295 -19
- package/app/src/renderer/game-module.ts +60 -12
- package/app/src/renderer/hooks.ts +9 -1
- package/app/src/renderer/hot-reload.ts +9 -9
- package/app/src/renderer/mcp-harness.ts +2 -2
- package/app/src/renderer/standard-automation-tools.ts +104 -3
- package/app/src/shared/feature-log.ts +2 -1
- package/app/src/shared/mcp-discovery.ts +8 -3
- package/app/src/shared/mcp-proxy.ts +2 -2
- package/asset-bake/README.md +22 -0
- package/core/README.md +25 -0
- package/core/src/animation/skeleton-animator.ts +23 -5
- package/core/src/assets/manager.ts +4 -4
- package/core/src/ecs/events.ts +1 -1
- package/core/src/ecs/schedule.ts +1 -1
- package/core/src/ecs/world.ts +1 -1
- package/core/src/index.ts +3 -4
- package/core/src/library/host.ts +27 -13
- package/core/src/library/library.ts +13 -5
- package/core/src/module/cross-thread.ts +6 -0
- package/core/src/module/diagnostics.ts +10 -6
- package/core/src/module/host.ts +65 -18
- package/core/src/module/index.ts +1 -0
- package/core/src/module/module.ts +11 -5
- package/core/src/module/renderer-module.ts +15 -0
- package/core/src/physics/safety.ts +1 -1
- package/core/src/platform/bun-preload.ts +7 -2
- package/core/src/platform/glob-polyfill.ts +17 -8
- package/core/src/platform/pkg-root.ts +27 -0
- package/core/src/platform/runtime.ts +29 -0
- package/core/src/plugin/discovery.ts +1 -1
- package/core/src/plugin/extension-loaders.ts +6 -4
- package/core/src/plugin/host.ts +13 -13
- package/core/src/plugin/loader-asset.ts +5 -5
- package/core/src/plugin/loader-quickjs.ts +1 -1
- package/core/src/plugin/loader-wasm.ts +3 -3
- package/core/src/plugin/loader-worker.ts +1 -1
- package/core/src/plugin/manifest.ts +8 -3
- package/core/src/plugin/workshop.ts +3 -3
- package/core/src/profiling/index.ts +1 -1
- package/core/src/profiling/profiling-sab.ts +19 -0
- package/core/src/profiling/warnings.ts +1 -1
- package/core/src/profiling/worker-prelude.ts +1 -1
- package/core/src/render/bindless/frame-bindings.ts +1 -1
- package/core/src/render/bindless/material-manager.ts +2 -2
- package/core/src/render/bindless/texture-registry.ts +2 -2
- package/core/src/render/device.ts +5 -5
- package/core/src/render/frame-graph.ts +2 -2
- package/core/src/render/game-renderer.ts +42 -18
- package/core/src/render/hot-reload.ts +3 -3
- package/core/src/render/renderer-module-host.ts +32 -12
- package/core/src/render/shader-validator.ts +7 -7
- package/core/src/render/surface.ts +1 -1
- package/core/src/sab/errors.ts +1 -1
- package/core/src/sab/sab-polyfill.ts +1 -1
- package/core/src/save/migration-registry.ts +4 -4
- package/core/src/save/schema.ts +1 -1
- package/core/src/scene/prefab.ts +1 -1
- package/core/src/scene/scene-manager.ts +2 -2
- package/core/src/scene/scene.ts +4 -4
- package/core/src/scene/streaming.ts +2 -2
- package/core/src/scripting/hot-reload.ts +2 -2
- package/core/src/sim/hot-reload-pipeline.ts +30 -6
- package/core/src/sim/sim-state-helper.ts +1 -1
- package/core/src/sim/transient-state-registry.ts +1 -1
- package/core/src/sim/worker-loop.ts +2 -2
- package/core/src/telemetry/gpu-profiler.ts +3 -3
- package/core/src/util/index.ts +1 -1
- package/core/src/util/logger.ts +36 -5
- package/core/src/version.ts +13 -0
- package/core/src/worker/base-worker-host.ts +87 -25
- package/core/src/worker/buffer-sync.ts +1 -1
- package/core/src/worker/crash-recovery.ts +2 -2
- package/core/src/worker/instrumented-worker-host.ts +3 -3
- package/core/src/worker/rpc.ts +62 -11
- package/core/src/worker/sim-worker-base.ts +3 -8
- package/core/src/worker/task-pool.ts +2 -2
- package/dist/.dd-manifest.json +4119 -0
- package/dist/app/src/index.js +9 -0
- package/dist/app/src/renderer/bootstrap.js +446 -0
- package/dist/app/src/renderer/downdraft-base.css +93 -0
- package/dist/app/src/renderer/feature-log.js +180 -0
- package/dist/app/src/renderer/game-module.js +562 -0
- package/dist/app/src/renderer/hooks.js +82 -0
- package/dist/app/src/renderer/hot-reload.js +158 -0
- package/dist/app/src/renderer/import-cache.js +77 -0
- package/dist/app/src/renderer/index.js +149 -0
- package/dist/app/src/renderer/mcp-harness.js +112 -0
- package/dist/app/src/renderer/save-store-factory.js +180 -0
- package/dist/app/src/renderer/sim-bridge.js +138 -0
- package/dist/app/src/renderer/standard-automation-tools.js +720 -0
- package/dist/app/src/shared/feature-log.js +54 -0
- package/dist/app/src/shared/gpu-info.js +74 -0
- package/dist/app/src/shared/import-cache-store.js +123 -0
- package/dist/app/src/shared/index.js +4 -0
- package/dist/app/src/shared/mcp-discovery.js +55 -0
- package/dist/app/src/shared/mcp-proxy.js +71 -0
- package/dist/app/src/shared/types.js +13 -0
- package/dist/asset-bake/src/bake-audio.js +103 -0
- package/dist/asset-bake/src/bake-gltf.js +141 -0
- package/dist/asset-bake/src/bake.js +63 -0
- package/dist/asset-bake/src/cache.js +147 -0
- package/dist/asset-bake/src/config.js +93 -0
- package/dist/asset-bake/src/index.js +25 -0
- package/dist/core/src/animation/animation-event.js +24 -0
- package/dist/core/src/animation/bone-mask.js +103 -0
- package/dist/core/src/animation/clip.js +210 -0
- package/dist/core/src/animation/index.js +13 -0
- package/dist/core/src/animation/mixamo.js +78 -0
- package/dist/core/src/animation/morph-target.js +37 -0
- package/dist/core/src/animation/player.js +621 -0
- package/dist/core/src/animation/retarget.js +101 -0
- package/dist/core/src/animation/skeleton-animator.js +1361 -0
- package/dist/core/src/animation/skeleton.js +166 -0
- package/dist/core/src/animation/state-machine.js +252 -0
- package/dist/core/src/assets/blob-store.js +14 -0
- package/dist/core/src/assets/cache.js +168 -0
- package/dist/core/src/assets/cubemap-converter.js +129 -0
- package/dist/core/src/assets/environment-manager.js +84 -0
- package/dist/core/src/assets/import-cache.js +36 -0
- package/dist/core/src/assets/import-settings.js +34 -0
- package/dist/core/src/assets/importer.js +78 -0
- package/dist/core/src/assets/index.js +29 -0
- package/dist/core/src/assets/irradiance-generator.js +179 -0
- package/dist/core/src/assets/loader-audio.js +70 -0
- package/dist/core/src/assets/loader-cubemap.js +141 -0
- package/dist/core/src/assets/loader-dds.js +185 -0
- package/dist/core/src/assets/loader-hdr.js +430 -0
- package/dist/core/src/assets/loader-mesh.js +47 -0
- package/dist/core/src/assets/loader-shader.js +61 -0
- package/dist/core/src/assets/loader-texture.js +264 -0
- package/dist/core/src/assets/lod.js +150 -0
- package/dist/core/src/assets/manager.js +401 -0
- package/dist/core/src/assets/manifest.js +57 -0
- package/dist/core/src/assets/material-bridge.js +160 -0
- package/dist/core/src/assets/model-importer.js +32 -0
- package/dist/core/src/assets/model-normalizer.js +213 -0
- package/dist/core/src/assets/model-to-gpu.js +44 -0
- package/dist/core/src/assets/model-to-mesh.js +171 -0
- package/dist/core/src/assets/prefilter-generator.js +220 -0
- package/dist/core/src/audio/engine.js +153 -0
- package/dist/core/src/audio/interface.js +8 -0
- package/dist/core/src/audio/listener.js +19 -0
- package/dist/core/src/audio/mixer.js +124 -0
- package/dist/core/src/audio/registry.js +43 -0
- package/dist/core/src/audio/sab.js +74 -0
- package/dist/core/src/audio/source.js +60 -0
- package/dist/core/src/change-detection/atomics.js +1 -0
- package/dist/core/src/change-detection/tracker.js +26 -0
- package/dist/core/src/debug-draw/lines.js +27 -0
- package/dist/core/src/debug-draw/points.js +9 -0
- package/dist/core/src/debug-draw/queue.js +77 -0
- package/dist/core/src/debug-draw/text.js +12 -0
- package/dist/core/src/ecs/archetype.js +271 -0
- package/dist/core/src/ecs/component.js +109 -0
- package/dist/core/src/ecs/entity.js +11 -0
- package/dist/core/src/ecs/events.js +73 -0
- package/dist/core/src/ecs/hierarchy.js +104 -0
- package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
- package/dist/core/src/ecs/index.js +14 -0
- package/dist/core/src/ecs/query.js +110 -0
- package/dist/core/src/ecs/resource.js +3 -0
- package/dist/core/src/ecs/schedule.js +157 -0
- package/dist/core/src/ecs/system-params.js +45 -0
- package/dist/core/src/ecs/system.js +18 -0
- package/dist/core/src/ecs/world.js +292 -0
- package/dist/core/src/index.js +191 -0
- package/dist/core/src/input/context.js +69 -0
- package/dist/core/src/input/dom-handler.js +288 -0
- package/dist/core/src/input/local-player-manager.js +145 -0
- package/dist/core/src/input/mapping.js +36 -0
- package/dist/core/src/input/multi-sab-bridge.js +224 -0
- package/dist/core/src/input/multi-state.js +48 -0
- package/dist/core/src/input/sab-bridge.js +66 -0
- package/dist/core/src/input/state.js +108 -0
- package/dist/core/src/input/ui-router.js +76 -0
- package/dist/core/src/library/host.js +291 -0
- package/dist/core/src/library/index.js +1 -0
- package/dist/core/src/library/library.js +20 -0
- package/dist/core/src/material/compiler.js +73 -0
- package/dist/core/src/material/graph-bridge.js +119 -0
- package/dist/core/src/material/index.js +6 -0
- package/dist/core/src/material/library.js +414 -0
- package/dist/core/src/material/material.js +120 -0
- package/dist/core/src/material/variants.js +37 -0
- package/dist/core/src/math/mat4.js +198 -0
- package/dist/core/src/math/perlin-noise-2d.js +66 -0
- package/dist/core/src/math/perlin-noise-3d.js +76 -0
- package/dist/core/src/math/quat.js +29 -0
- package/dist/core/src/math/rng.js +25 -0
- package/dist/core/src/math/trig.js +42 -0
- package/dist/core/src/math/value-noise.js +49 -0
- package/dist/core/src/mesh/builder.js +137 -0
- package/dist/core/src/mesh/csg.js +250 -0
- package/dist/core/src/mesh/greased-line.js +102 -0
- package/dist/core/src/mesh/mesh.js +6 -0
- package/dist/core/src/mesh/parametric.js +392 -0
- package/dist/core/src/mesh/skinning.js +30 -0
- package/dist/core/src/mesh/vertex-layout.js +65 -0
- package/dist/core/src/module/cross-thread.js +126 -0
- package/dist/core/src/module/diagnostics.js +99 -0
- package/dist/core/src/module/host.js +449 -0
- package/dist/core/src/module/index.js +6 -0
- package/dist/core/src/module/module.js +1 -0
- package/dist/core/src/module/registry.js +83 -0
- package/dist/core/src/module/renderer-module.js +13 -0
- package/dist/core/src/module/ts-loader.js +20 -0
- package/dist/core/src/particles/compute-pass.js +329 -0
- package/dist/core/src/particles/emitter.js +113 -0
- package/dist/core/src/particles/index.js +7 -0
- package/dist/core/src/particles/particle-data.js +33 -0
- package/dist/core/src/particles/render-pass.js +338 -0
- package/dist/core/src/particles/simulator.js +224 -0
- package/dist/core/src/particles/system.js +157 -0
- package/dist/core/src/physics/body.js +25 -0
- package/dist/core/src/physics/ccd-heuristic.js +46 -0
- package/dist/core/src/physics/character.js +184 -0
- package/dist/core/src/physics/collider.js +36 -0
- package/dist/core/src/physics/collision-system.js +62 -0
- package/dist/core/src/physics/events.js +74 -0
- package/dist/core/src/physics/index.js +24 -0
- package/dist/core/src/physics/interface.js +14 -0
- package/dist/core/src/physics/interpolation-buffer.js +182 -0
- package/dist/core/src/physics/lifecycle.js +66 -0
- package/dist/core/src/physics/load-shedder.js +155 -0
- package/dist/core/src/physics/physics-accumulator.js +94 -0
- package/dist/core/src/physics/physics-system.js +142 -0
- package/dist/core/src/physics/ragdoll-presets.js +248 -0
- package/dist/core/src/physics/ragdoll-system.js +193 -0
- package/dist/core/src/physics/ragdoll.js +117 -0
- package/dist/core/src/physics/raycast.js +97 -0
- package/dist/core/src/physics/realm-manager.js +431 -0
- package/dist/core/src/physics/realm-worker-pool.js +181 -0
- package/dist/core/src/physics/realm-worker.js +91 -0
- package/dist/core/src/physics/realm.js +137 -0
- package/dist/core/src/physics/registry.js +43 -0
- package/dist/core/src/physics/safety.js +211 -0
- package/dist/core/src/physics/snapshot-manager.js +118 -0
- package/dist/core/src/physics/worker-protocol.js +1 -0
- package/dist/core/src/platform/bun-preload.js +175 -0
- package/dist/core/src/platform/css-stub.js +4 -0
- package/dist/core/src/platform/glob-polyfill.js +137 -0
- package/dist/core/src/platform/hidpi.js +52 -0
- package/dist/core/src/platform/pkg-root.js +27 -0
- package/dist/core/src/platform/render-surface.js +15 -0
- package/dist/core/src/platform/rpc.js +82 -0
- package/dist/core/src/platform/runtime.js +93 -0
- package/dist/core/src/plugin/context.js +144 -0
- package/dist/core/src/plugin/diagnostics.js +20 -0
- package/dist/core/src/plugin/discovery.js +124 -0
- package/dist/core/src/plugin/extension-loaders.js +111 -0
- package/dist/core/src/plugin/host.js +542 -0
- package/dist/core/src/plugin/index.js +19 -0
- package/dist/core/src/plugin/loader-asset.js +105 -0
- package/dist/core/src/plugin/loader-quickjs.js +67 -0
- package/dist/core/src/plugin/loader-wasm.js +385 -0
- package/dist/core/src/plugin/loader-worker.js +228 -0
- package/dist/core/src/plugin/manifest.js +424 -0
- package/dist/core/src/plugin/material-registry.js +44 -0
- package/dist/core/src/plugin/mcp-tools.js +147 -0
- package/dist/core/src/plugin/permissions.js +152 -0
- package/dist/core/src/plugin/quickjs-bridge.js +219 -0
- package/dist/core/src/plugin/registry.js +92 -0
- package/dist/core/src/plugin/sandbox-shim.js +79 -0
- package/dist/core/src/plugin/sandbox-worker.js +194 -0
- package/dist/core/src/plugin/wasm-abi.js +62 -0
- package/dist/core/src/plugin/wasm-worker.js +234 -0
- package/dist/core/src/plugin/workshop.js +131 -0
- package/dist/core/src/profiling/event-loop.js +164 -0
- package/dist/core/src/profiling/index.js +23 -0
- package/dist/core/src/profiling/iops/idb-patch.js +211 -0
- package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
- package/dist/core/src/profiling/profiling-sab.js +632 -0
- package/dist/core/src/profiling/task-latency.js +118 -0
- package/dist/core/src/profiling/thread-metrics.js +103 -0
- package/dist/core/src/profiling/trace-event-writer.js +165 -0
- package/dist/core/src/profiling/warnings.js +304 -0
- package/dist/core/src/profiling/worker-prelude.js +281 -0
- package/dist/core/src/render/bind-group.js +33 -0
- package/dist/core/src/render/bindless/bindless-struct.js +39 -0
- package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
- package/dist/core/src/render/bindless/frame-bindings.js +142 -0
- package/dist/core/src/render/bindless/index.js +6 -0
- package/dist/core/src/render/bindless/material-manager.js +182 -0
- package/dist/core/src/render/bindless/texture-registry.js +498 -0
- package/dist/core/src/render/buffer.js +74 -0
- package/dist/core/src/render/camera-2d.js +151 -0
- package/dist/core/src/render/camera-controller.js +370 -0
- package/dist/core/src/render/camera.js +332 -0
- package/dist/core/src/render/canvas-resize-watcher.js +36 -0
- package/dist/core/src/render/compute-kernel.js +130 -0
- package/dist/core/src/render/constants.js +2 -0
- package/dist/core/src/render/device.js +91 -0
- package/dist/core/src/render/frame-graph.js +594 -0
- package/dist/core/src/render/frustum.js +152 -0
- package/dist/core/src/render/fullscreen-vs.js +24 -0
- package/dist/core/src/render/g-buffer.js +156 -0
- package/dist/core/src/render/game-renderer.js +1165 -0
- package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
- package/dist/core/src/render/gpu-driven/hzb.js +183 -0
- package/dist/core/src/render/gpu-driven/index.js +6 -0
- package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
- package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
- package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
- package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
- package/dist/core/src/render/gpu-utils.js +72 -0
- package/dist/core/src/render/hdr.js +69 -0
- package/dist/core/src/render/hot-reload.js +236 -0
- package/dist/core/src/render/ibl-bind-group.js +232 -0
- package/dist/core/src/render/ibl.js +148 -0
- package/dist/core/src/render/index.js +86 -0
- package/dist/core/src/render/input-manager.js +224 -0
- package/dist/core/src/render/lighting/area-light.js +142 -0
- package/dist/core/src/render/lighting/cluster-grid.js +255 -0
- package/dist/core/src/render/lighting/cluster-types.js +87 -0
- package/dist/core/src/render/lighting/ies-parser.js +111 -0
- package/dist/core/src/render/lighting.js +300 -0
- package/dist/core/src/render/material-types/depth.wgsl +44 -0
- package/dist/core/src/render/material-types/line.wgsl +50 -0
- package/dist/core/src/render/material-types/matcap.wgsl +51 -0
- package/dist/core/src/render/material-types/normal.wgsl +41 -0
- package/dist/core/src/render/material-types/physical.wgsl +152 -0
- package/dist/core/src/render/material-types/sprite.wgsl +46 -0
- package/dist/core/src/render/material-types/sss.wgsl +79 -0
- package/dist/core/src/render/material-types/toon.wgsl +79 -0
- package/dist/core/src/render/passes/README.md +121 -0
- package/dist/core/src/render/passes/atmosphere.js +107 -0
- package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
- package/dist/core/src/render/passes/csm.js +338 -0
- package/dist/core/src/render/passes/cubemap-capture.js +93 -0
- package/dist/core/src/render/passes/debug-viz.js +248 -0
- package/dist/core/src/render/passes/debug.js +500 -0
- package/dist/core/src/render/passes/decal-mesh.js +86 -0
- package/dist/core/src/render/passes/decal-pass.js +344 -0
- package/dist/core/src/render/passes/deferred-lighting.js +406 -0
- package/dist/core/src/render/passes/depth-prepass.js +148 -0
- package/dist/core/src/render/passes/dome-360.js +68 -0
- package/dist/core/src/render/passes/fluid-render.js +116 -0
- package/dist/core/src/render/passes/gi-types.js +78 -0
- package/dist/core/src/render/passes/graph-compute.js +251 -0
- package/dist/core/src/render/passes/greased-line-pass.js +218 -0
- package/dist/core/src/render/passes/morph-target.js +35 -0
- package/dist/core/src/render/passes/opaque.js +966 -0
- package/dist/core/src/render/passes/point-light-shadow.js +221 -0
- package/dist/core/src/render/passes/procedural-texture.js +142 -0
- package/dist/core/src/render/passes/reflection-probe.js +100 -0
- package/dist/core/src/render/passes/rsm-pass.js +228 -0
- package/dist/core/src/render/passes/sdf-text.js +114 -0
- package/dist/core/src/render/passes/shadow-map.js +121 -0
- package/dist/core/src/render/passes/shadow.js +191 -0
- package/dist/core/src/render/passes/skinning-vs.js +102 -0
- package/dist/core/src/render/passes/skinning.js +282 -0
- package/dist/core/src/render/passes/sky-dome.js +380 -0
- package/dist/core/src/render/passes/skybox.js +146 -0
- package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
- package/dist/core/src/render/passes/terrain.js +303 -0
- package/dist/core/src/render/passes/transparent.js +323 -0
- package/dist/core/src/render/passes/underwater-fog.js +173 -0
- package/dist/core/src/render/passes/video-texture.js +58 -0
- package/dist/core/src/render/passes/volumetric-pass.js +278 -0
- package/dist/core/src/render/passes/volumetric-types.js +96 -0
- package/dist/core/src/render/passes/water.js +697 -0
- package/dist/core/src/render/pbr.js +257 -0
- package/dist/core/src/render/pipeline.js +49 -0
- package/dist/core/src/render/render-pass.js +13 -0
- package/dist/core/src/render/renderer-input-bus.js +176 -0
- package/dist/core/src/render/renderer-module-host.js +539 -0
- package/dist/core/src/render/resource-tracker.js +59 -0
- package/dist/core/src/render/sab-canvas-overlay.js +83 -0
- package/dist/core/src/render/shader-validator.js +172 -0
- package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
- package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
- package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
- package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
- package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
- package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
- package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
- package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
- package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
- package/dist/core/src/render/skybox.js +123 -0
- package/dist/core/src/render/splitscreen.js +60 -0
- package/dist/core/src/render/surface.js +63 -0
- package/dist/core/src/render/tonemap.js +171 -0
- package/dist/core/src/render/tracked-render-pass.js +115 -0
- package/dist/core/src/render/viewport.js +81 -0
- package/dist/core/src/render/wgsl-hmr.js +66 -0
- package/dist/core/src/sab/core-input-channel.js +22 -0
- package/dist/core/src/sab/define.js +127 -0
- package/dist/core/src/sab/errors.js +60 -0
- package/dist/core/src/sab/game-input.js +299 -0
- package/dist/core/src/sab/gamepad-devices.js +205 -0
- package/dist/core/src/sab/grid-buffer.js +91 -0
- package/dist/core/src/sab/input.js +38 -0
- package/dist/core/src/sab/layout.js +160 -0
- package/dist/core/src/sab/multi-input-channel.js +39 -0
- package/dist/core/src/sab/record-buffer.js +130 -0
- package/dist/core/src/sab/sab-polyfill.js +47 -0
- package/dist/core/src/sab/sim-channel.js +397 -0
- package/dist/core/src/sab/slot-buffer.js +140 -0
- package/dist/core/src/sab/types.js +1 -0
- package/dist/core/src/safety/bounds.js +71 -0
- package/dist/core/src/safety/json.js +70 -0
- package/dist/core/src/safety/path.js +151 -0
- package/dist/core/src/save/binary-format.js +95 -0
- package/dist/core/src/save/game-save-system.js +101 -0
- package/dist/core/src/save/grid-save-system.js +102 -0
- package/dist/core/src/save/migrate.js +35 -0
- package/dist/core/src/save/migration-registry.js +66 -0
- package/dist/core/src/save/persist-types.js +4 -0
- package/dist/core/src/save/schema.js +36 -0
- package/dist/core/src/save/serializer.js +139 -0
- package/dist/core/src/scene/builder.js +31 -0
- package/dist/core/src/scene/camera.js +118 -0
- package/dist/core/src/scene/checkpoint.js +84 -0
- package/dist/core/src/scene/game-loop.js +155 -0
- package/dist/core/src/scene/index.js +14 -0
- package/dist/core/src/scene/layer.js +7 -0
- package/dist/core/src/scene/prefab.js +97 -0
- package/dist/core/src/scene/scene-manager.js +141 -0
- package/dist/core/src/scene/scene.js +147 -0
- package/dist/core/src/scene/sky.js +179 -0
- package/dist/core/src/scene/spatial-grid.js +140 -0
- package/dist/core/src/scene/streaming.js +247 -0
- package/dist/core/src/scene/vegetation.js +107 -0
- package/dist/core/src/scene/world.js +66 -0
- package/dist/core/src/scripting/binding.js +85 -0
- package/dist/core/src/scripting/hot-reload.js +123 -0
- package/dist/core/src/scripting/script.js +68 -0
- package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
- package/dist/core/src/sim/sim-state-helper.js +40 -0
- package/dist/core/src/sim/transient-state-registry.js +63 -0
- package/dist/core/src/sim/types.js +4 -0
- package/dist/core/src/sim/worker-loop.js +168 -0
- package/dist/core/src/stores/game-store.js +81 -0
- package/dist/core/src/stores/hot-reload-store.js +19 -0
- package/dist/core/src/telemetry/collector.js +303 -0
- package/dist/core/src/telemetry/gc-controller.js +365 -0
- package/dist/core/src/telemetry/gc-profiler.js +82 -0
- package/dist/core/src/telemetry/gc-tracker.js +63 -0
- package/dist/core/src/telemetry/gpu-profiler.js +554 -0
- package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
- package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
- package/dist/core/src/telemetry/gpu-timer.js +117 -0
- package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
- package/dist/core/src/telemetry/reporter.js +56 -0
- package/dist/core/src/types/engine-types.js +21 -0
- package/dist/core/src/ui-font-scale.js +111 -0
- package/dist/core/src/util/broad-phase-grid.js +77 -0
- package/dist/core/src/util/feature-log.js +176 -0
- package/dist/core/src/util/index.js +4 -0
- package/dist/core/src/util/logger.js +596 -0
- package/dist/core/src/version.js +11 -0
- package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
- package/dist/core/src/worker/base-worker-host.js +212 -0
- package/dist/core/src/worker/buffer-sync.js +454 -0
- package/dist/core/src/worker/crash-recovery.js +153 -0
- package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
- package/dist/core/src/worker/instrumented-worker-host.js +139 -0
- package/dist/core/src/worker/rpc.js +244 -0
- package/dist/core/src/worker/sim-worker-base.js +558 -0
- package/dist/core/src/worker/sim-worker-host.js +271 -0
- package/dist/core/src/worker/task-pool.js +205 -0
- package/dist/core/src/worker/task-worker.js +77 -0
- package/dist/libraries/asset-browser/src/index.js +10 -0
- package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
- package/dist/libraries/audio-kira/src/backend.js +405 -0
- package/dist/libraries/audio-kira/src/index.js +4 -0
- package/dist/libraries/audio-kira/src/library.js +54 -0
- package/dist/libraries/blitz-ui/src/index.js +13 -0
- package/dist/libraries/blitz-ui/src/native-module.js +162 -0
- package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
- package/dist/libraries/blitz-ui/src/router.js +82 -0
- package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
- package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
- package/dist/libraries/character/src/character-animator.js +323 -0
- package/dist/libraries/character/src/customization.js +464 -0
- package/dist/libraries/character/src/index.js +19 -0
- package/dist/libraries/character/src/inspectable.js +77 -0
- package/dist/libraries/character/src/loader.js +336 -0
- package/dist/libraries/character/src/locomotion.js +84 -0
- package/dist/libraries/character/src/preview.js +280 -0
- package/dist/libraries/devtools/src/backend.js +449 -0
- package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
- package/dist/libraries/devtools/src/collectors.js +318 -0
- package/dist/libraries/devtools/src/index.js +31 -0
- package/dist/libraries/devtools/src/native-providers.js +749 -0
- package/dist/libraries/devtools/src/snapshot.js +35 -0
- package/dist/libraries/devtools/src/verify.js +139 -0
- package/dist/libraries/devtools/src/web/browser.js +94 -0
- package/dist/libraries/devtools/src/web/host.js +183 -0
- package/dist/libraries/devtools/src/web/mirror.js +26 -0
- package/dist/libraries/devtools/src/web/server.js +187 -0
- package/dist/libraries/entities/src/index.js +3 -0
- package/dist/libraries/entities/src/library.js +46 -0
- package/dist/libraries/entities/src/model-renderer.js +1307 -0
- package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
- package/dist/libraries/gamepad/src/feed-input.js +54 -0
- package/dist/libraries/gamepad/src/filters.js +44 -0
- package/dist/libraries/gamepad/src/glyphs.js +83 -0
- package/dist/libraries/gamepad/src/hub.js +164 -0
- package/dist/libraries/gamepad/src/index.js +10 -0
- package/dist/libraries/gamepad/src/library.js +56 -0
- package/dist/libraries/gamepad/src/source-sab.js +62 -0
- package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
- package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
- package/dist/libraries/gaussian-splats/src/index.js +8 -0
- package/dist/libraries/gaussian-splats/src/library.js +44 -0
- package/dist/libraries/gaussian-splats/src/parser.js +297 -0
- package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
- package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
- package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
- package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
- package/dist/libraries/gpu-kernels/src/index.js +8 -0
- package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
- package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
- package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
- package/dist/libraries/html-ui-kit/src/components.js +219 -0
- package/dist/libraries/html-ui-kit/src/index.js +17 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
- package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
- package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
- package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
- package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
- package/dist/libraries/html-ui-kit/src/theme.js +235 -0
- package/dist/libraries/inspectable/src/index.js +6 -0
- package/dist/libraries/inspectable/src/inspectable.js +205 -0
- package/dist/libraries/lighting/src/index.js +4 -0
- package/dist/libraries/lighting/src/library.js +48 -0
- package/dist/libraries/lighting/src/light-system.js +395 -0
- package/dist/libraries/lighting/src/lighting-system.js +57 -0
- package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
- package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
- package/dist/libraries/marching-cubes/src/deformation.js +41 -0
- package/dist/libraries/marching-cubes/src/generator.js +356 -0
- package/dist/libraries/marching-cubes/src/index.js +13 -0
- package/dist/libraries/marching-cubes/src/library.js +54 -0
- package/dist/libraries/marching-cubes/src/lod.js +95 -0
- package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
- package/dist/libraries/marching-cubes/src/sab.js +40 -0
- package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
- package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
- package/dist/libraries/marching-cubes/src/tables.js +314 -0
- package/dist/libraries/marching-cubes/src/types.js +1 -0
- package/dist/libraries/models/src/bake-node-transforms.js +146 -0
- package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
- package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
- package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
- package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
- package/dist/libraries/models/src/codecs/index.js +5 -0
- package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
- package/dist/libraries/models/src/codecs/registry.js +111 -0
- package/dist/libraries/models/src/dae.js +665 -0
- package/dist/libraries/models/src/default-part-selection.js +58 -0
- package/dist/libraries/models/src/dxf.js +235 -0
- package/dist/libraries/models/src/fbx/index.js +438 -0
- package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
- package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
- package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
- package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
- package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
- package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
- package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
- package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
- package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
- package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
- package/dist/libraries/models/src/fbx/types.js +88 -0
- package/dist/libraries/models/src/gltf-extensions.js +121 -0
- package/dist/libraries/models/src/gltf.js +724 -0
- package/dist/libraries/models/src/index.js +46 -0
- package/dist/libraries/models/src/library.js +44 -0
- package/dist/libraries/models/src/loader.js +218 -0
- package/dist/libraries/models/src/material-adapter.js +82 -0
- package/dist/libraries/models/src/mini-xml.js +145 -0
- package/dist/libraries/models/src/normalize.js +168 -0
- package/dist/libraries/models/src/obj.js +247 -0
- package/dist/libraries/models/src/off.js +94 -0
- package/dist/libraries/models/src/ply.js +329 -0
- package/dist/libraries/models/src/pose-sampler.js +183 -0
- package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
- package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
- package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
- package/dist/libraries/models/src/sidecar/resolver.js +112 -0
- package/dist/libraries/models/src/sidecar/types.js +8 -0
- package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
- package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
- package/dist/libraries/models/src/stl.js +129 -0
- package/dist/libraries/models/src/threeds.js +312 -0
- package/dist/libraries/models/src/threemf.js +203 -0
- package/dist/libraries/models/src/types.js +33 -0
- package/dist/libraries/models/src/vtk.js +242 -0
- package/dist/libraries/navmesh/src/crowd-system.js +207 -0
- package/dist/libraries/navmesh/src/debug-viz.js +52 -0
- package/dist/libraries/navmesh/src/index.js +7 -0
- package/dist/libraries/navmesh/src/library.js +47 -0
- package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
- package/dist/libraries/navmesh/src/navmesh.js +141 -0
- package/dist/libraries/navmesh/src/pathfinder.js +221 -0
- package/dist/libraries/navmesh/src/types.js +1 -0
- package/dist/libraries/networking/src/authority.js +107 -0
- package/dist/libraries/networking/src/connection.js +107 -0
- package/dist/libraries/networking/src/discovery.js +314 -0
- package/dist/libraries/networking/src/enhanced-replication.js +282 -0
- package/dist/libraries/networking/src/epic-adapter.js +101 -0
- package/dist/libraries/networking/src/index.js +16 -0
- package/dist/libraries/networking/src/library.js +45 -0
- package/dist/libraries/networking/src/lobby.js +84 -0
- package/dist/libraries/networking/src/platform-adapter.js +92 -0
- package/dist/libraries/networking/src/rcs-adapter.js +100 -0
- package/dist/libraries/networking/src/remote-input.js +162 -0
- package/dist/libraries/networking/src/replication.js +273 -0
- package/dist/libraries/networking/src/rpc.js +172 -0
- package/dist/libraries/networking/src/session.js +129 -0
- package/dist/libraries/networking/src/transport.js +156 -0
- package/dist/libraries/networking/src/webrtc.js +266 -0
- package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
- package/dist/libraries/pathfinding-2d/src/index.js +9 -0
- package/dist/libraries/persistence/src/autosave-manager.js +94 -0
- package/dist/libraries/persistence/src/binary-record-store.js +205 -0
- package/dist/libraries/persistence/src/browser.js +16 -0
- package/dist/libraries/persistence/src/file-save-store.js +507 -0
- package/dist/libraries/persistence/src/hash-utils.js +54 -0
- package/dist/libraries/persistence/src/index.js +17 -0
- package/dist/libraries/persistence/src/library.js +51 -0
- package/dist/libraries/persistence/src/mock-opfs.js +114 -0
- package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
- package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
- package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
- package/dist/libraries/persistence/src/save-worker.js +76 -0
- package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
- package/dist/libraries/physics-native/src/backend.js +960 -0
- package/dist/libraries/physics-native/src/broadphase.js +79 -0
- package/dist/libraries/physics-native/src/index.js +6 -0
- package/dist/libraries/physics-native/src/library.js +57 -0
- package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
- package/dist/libraries/physics-native/src/narrowphase.js +60 -0
- package/dist/libraries/physics-native/src/solver.js +105 -0
- package/dist/libraries/physics-native/src/types.js +4 -0
- package/dist/libraries/physics-rapier/src/api.js +352 -0
- package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
- package/dist/libraries/physics-rapier/src/backend.js +1066 -0
- package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
- package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
- package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
- package/dist/libraries/physics-rapier/src/index.js +9 -0
- package/dist/libraries/physics-rapier/src/library.js +71 -0
- package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
- package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
- package/dist/libraries/postfx/src/index.js +14 -0
- package/dist/libraries/postfx/src/library.js +207 -0
- package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
- package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
- package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
- package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
- package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
- package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
- package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
- package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
- package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
- package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
- package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
- package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
- package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
- package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
- package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
- package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
- package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
- package/dist/libraries/recast/src/backend.js +124 -0
- package/dist/libraries/recast/src/crowd-system.js +310 -0
- package/dist/libraries/recast/src/index.js +4 -0
- package/dist/libraries/recast/src/library.js +59 -0
- package/dist/libraries/recast/src/types.js +4 -0
- package/dist/libraries/sand/src/cell.js +32 -0
- package/dist/libraries/sand/src/fields.js +27 -0
- package/dist/libraries/sand/src/fluid-grid.js +267 -0
- package/dist/libraries/sand/src/grid-dims.js +47 -0
- package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
- package/dist/libraries/sand/src/index.js +20 -0
- package/dist/libraries/sand/src/library.js +67 -0
- package/dist/libraries/sand/src/materials.js +437 -0
- package/dist/libraries/sand/src/palette.js +87 -0
- package/dist/libraries/sand/src/particles.js +163 -0
- package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
- package/dist/libraries/sand/src/rng.js +44 -0
- package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
- package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
- package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
- package/dist/libraries/sand/src/rules/rule-types.js +27 -0
- package/dist/libraries/sand/src/sand-step-pool.js +458 -0
- package/dist/libraries/sand/src/sand-step-worker.js +101 -0
- package/dist/libraries/sand/src/sand-world.js +3382 -0
- package/dist/libraries/stickman/src/index.js +7 -0
- package/dist/libraries/stickman/src/library.js +44 -0
- package/dist/libraries/stickman/src/proportions.js +40 -0
- package/dist/libraries/stickman/src/shader.js +113 -0
- package/dist/libraries/stickman/src/skeleton.js +163 -0
- package/dist/libraries/stickman/src/stickman-pass.js +210 -0
- package/dist/libraries/stickman/src/thick-line.js +120 -0
- package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
- package/dist/libraries/surface-nets/src/deformation.js +29 -0
- package/dist/libraries/surface-nets/src/index.js +15 -0
- package/dist/libraries/surface-nets/src/library.js +41 -0
- package/dist/libraries/surface-nets/src/lod.js +6 -0
- package/dist/libraries/surface-nets/src/sab.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
- package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
- package/dist/libraries/surface-nets/src/types.js +1 -0
- package/dist/libraries/water/src/buoyancy.js +80 -0
- package/dist/libraries/water/src/index.js +12 -0
- package/dist/libraries/water/src/library.js +65 -0
- package/dist/libraries/water/src/shore-damping.js +70 -0
- package/dist/libraries/water/src/water-buffer.js +78 -0
- package/dist/libraries/water/src/water-chunks.js +5 -0
- package/dist/libraries/water/src/water-physics.js +315 -0
- package/dist/libraries/water/src/water-renderer.js +736 -0
- package/dist/libraries/water/src/water-sab.js +138 -0
- package/dist/libraries/water/src/wave-sources.js +45 -0
- package/dist/libraries/weather/src/index.js +5 -0
- package/dist/libraries/weather/src/library.js +48 -0
- package/dist/libraries/weather/src/types.js +29 -0
- package/dist/libraries/weather/src/weather-blend.js +108 -0
- package/dist/libraries/weather/src/weather-system.js +275 -0
- package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
- package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
- package/dist/libraries/weatherfx/src/index.js +4 -0
- package/dist/libraries/weatherfx/src/library.js +41 -0
- package/dist/libraries/weatherfx/src/particle-system.js +350 -0
- package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
- package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
- package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
- package/dist/mcp/src/client.js +669 -0
- package/dist/mcp/src/engine-context.js +99 -0
- package/dist/mcp/src/http-transport.js +423 -0
- package/dist/mcp/src/index.js +5 -0
- package/dist/mcp/src/prompts/add-entity.js +39 -0
- package/dist/mcp/src/prompts/create-scene.js +41 -0
- package/dist/mcp/src/prompts/debug-frame.js +36 -0
- package/dist/mcp/src/prompts/index.js +10 -0
- package/dist/mcp/src/resources/asset-list.js +28 -0
- package/dist/mcp/src/resources/checkpoint-list.js +29 -0
- package/dist/mcp/src/resources/entity-state.js +45 -0
- package/dist/mcp/src/resources/gpu-info.js +90 -0
- package/dist/mcp/src/resources/index.js +51 -0
- package/dist/mcp/src/resources/performance.js +33 -0
- package/dist/mcp/src/resources/scene-tree.js +37 -0
- package/dist/mcp/src/server.js +307 -0
- package/dist/mcp/src/tools/animation.js +102 -0
- package/dist/mcp/src/tools/asset.js +146 -0
- package/dist/mcp/src/tools/audio.js +80 -0
- package/dist/mcp/src/tools/build.js +128 -0
- package/dist/mcp/src/tools/camera.js +157 -0
- package/dist/mcp/src/tools/checkpoint.js +90 -0
- package/dist/mcp/src/tools/component.js +176 -0
- package/dist/mcp/src/tools/debug.js +273 -0
- package/dist/mcp/src/tools/entity.js +309 -0
- package/dist/mcp/src/tools/inspect.js +192 -0
- package/dist/mcp/src/tools/lighting.js +239 -0
- package/dist/mcp/src/tools/material.js +225 -0
- package/dist/mcp/src/tools/mesh.js +210 -0
- package/dist/mcp/src/tools/physics.js +251 -0
- package/dist/mcp/src/tools/scene.js +139 -0
- package/dist/mcp/src/tools/script.js +114 -0
- package/dist/mcp/src/types.js +9 -0
- package/dist/mcp/src/undo-redo.js +64 -0
- package/dist/modules/camera-controls/src/index.js +116 -0
- package/dist/modules/controller-ui/src/index.js +149 -0
- package/dist/modules/devtools/src/api.js +317 -0
- package/dist/modules/devtools/src/asset-utils.js +102 -0
- package/dist/modules/devtools/src/bind-debug-store.js +34 -0
- package/dist/modules/devtools/src/blitz/host.js +391 -0
- package/dist/modules/devtools/src/blitz/module.js +65 -0
- package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
- package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
- package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
- package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
- package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
- package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
- package/dist/modules/devtools/src/blitz/theme.js +167 -0
- package/dist/modules/devtools/src/data-bridge.js +247 -0
- package/dist/modules/devtools/src/debug-overlay.js +181 -0
- package/dist/modules/devtools/src/debug-raycast.js +296 -0
- package/dist/modules/devtools/src/debug-store.js +28 -0
- package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
- package/dist/modules/devtools/src/doctor-panel.js +163 -0
- package/dist/modules/devtools/src/gizmo-module.js +95 -0
- package/dist/modules/devtools/src/graph-model.js +387 -0
- package/dist/modules/devtools/src/grid-renderer.js +145 -0
- package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
- package/dist/modules/devtools/src/index.js +46 -0
- package/dist/modules/devtools/src/init.js +204 -0
- package/dist/modules/devtools/src/label-overlay.js +129 -0
- package/dist/modules/devtools/src/material-stats-panel.js +171 -0
- package/dist/modules/devtools/src/profiling-bridge.js +288 -0
- package/dist/modules/devtools/src/profiling-hooks.js +63 -0
- package/dist/modules/devtools/src/renderer-adapter.js +61 -0
- package/dist/modules/devtools/src/scene-inspector.js +571 -0
- package/dist/modules/devtools/src/scene-store.js +212 -0
- package/dist/modules/devtools/src/scene-sync.js +92 -0
- package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
- package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
- package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
- package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
- package/dist/modules/devtools/src/transform-gizmo.js +677 -0
- package/dist/modules/devtools/src/types.js +5 -0
- package/dist/modules/devtools/src/worker-expose.js +59 -0
- package/dist/modules/devtools/src/worker-sync.js +115 -0
- package/dist/modules/editor/src/commands/component.js +151 -0
- package/dist/modules/editor/src/commands/entity.js +253 -0
- package/dist/modules/editor/src/commands/hierarchy.js +79 -0
- package/dist/modules/editor/src/commands/index.js +57 -0
- package/dist/modules/editor/src/commands/prefab.js +149 -0
- package/dist/modules/editor/src/commands/registry.js +246 -0
- package/dist/modules/editor/src/commands/scene-io.js +206 -0
- package/dist/modules/editor/src/commands/selection.js +71 -0
- package/dist/modules/editor/src/commands/transform.js +88 -0
- package/dist/modules/editor/src/ddscene.js +189 -0
- package/dist/modules/editor/src/document.js +96 -0
- package/dist/modules/editor/src/editor-context.js +115 -0
- package/dist/modules/editor/src/index.js +11 -0
- package/dist/modules/editor/src/mcp.js +91 -0
- package/dist/modules/editor/src/module.js +115 -0
- package/dist/modules/editor/src/selection.js +60 -0
- package/dist/modules/editor/src/shell.js +397 -0
- package/dist/modules/editor/src/viewport.js +186 -0
- package/dist/modules/html-ui/src/composite.js +116 -0
- package/dist/modules/html-ui/src/create-html-ui.js +137 -0
- package/dist/modules/html-ui/src/doc-backend.js +518 -0
- package/dist/modules/html-ui/src/host.js +819 -0
- package/dist/modules/html-ui/src/index.js +5 -0
- package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
- package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
- package/dist/modules/html-ui/src/protocol.js +6 -0
- package/dist/modules/html-ui/src/ui-worker.js +10 -0
- package/dist/modules/mcp/src/index.js +62 -0
- package/dist/modules/movement-2d/src/grid-character.js +345 -0
- package/dist/modules/movement-2d/src/index.js +27 -0
- package/dist/modules/movement-3d/src/character-motor.js +166 -0
- package/dist/modules/movement-3d/src/index.js +27 -0
- package/dist/modules/native-osr/src/index.js +12 -0
- package/dist/modules/native-osr/src/input-router.js +335 -0
- package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
- package/dist/modules/native-osr/src/native-texture-source.js +66 -0
- package/dist/modules/native-osr/src/types.js +8 -0
- package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
- package/dist/modules/sailing/src/index.js +39 -0
- package/dist/modules/terrain/src/index.js +44 -0
- package/dist/modules/vitals/src/index.js +25 -0
- package/dist/modules/vitals/src/vitals.js +195 -0
- package/dist/modules/xr/src/camera-rig.js +119 -0
- package/dist/modules/xr/src/debug.js +45 -0
- package/dist/modules/xr/src/frame-loop.js +139 -0
- package/dist/modules/xr/src/index.js +10 -0
- package/dist/modules/xr/src/input.js +164 -0
- package/dist/modules/xr/src/layer.js +100 -0
- package/dist/modules/xr/src/session.js +133 -0
- package/dist/modules/xr/src/sim-module.js +21 -0
- package/dist/modules/xr/src/types.js +4 -0
- package/dist/modules/xr/src/webxr.d.ts +182 -0
- package/dist/modules/xr/src/xr-module.js +134 -0
- package/dist/shader-graph/src/chunks.js +340 -0
- package/dist/shader-graph/src/compiler.js +639 -0
- package/dist/shader-graph/src/compute-compiler.js +384 -0
- package/dist/shader-graph/src/compute-graph.js +55 -0
- package/dist/shader-graph/src/compute-profiles.js +39 -0
- package/dist/shader-graph/src/graph.js +38 -0
- package/dist/shader-graph/src/index.js +15 -0
- package/dist/shader-graph/src/profiles.js +305 -0
- package/dist/shader-graph/src/validator.js +42 -0
- package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
- package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
- package/dist/shader-graph/src/wgsl-struct.js +251 -0
- package/dist/test/src/index.js +1 -0
- package/dist/test/src/vision-test.js +228 -0
- package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
- package/libraries/audio-kira/src/backend.ts +2 -1
- package/libraries/blitz-ui/native/src/shell.rs +35 -1
- package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
- package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
- package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
- package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
- package/libraries/blitz-ui/src/router.ts +3 -1
- package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
- package/libraries/character/src/character-animator.ts +1 -1
- package/libraries/character/src/customization.ts +513 -0
- package/libraries/character/src/index.ts +6 -0
- package/libraries/character/src/inspectable.ts +111 -0
- package/libraries/character/src/loader.ts +38 -13
- package/libraries/character/src/locomotion.ts +13 -1
- package/libraries/character/src/preview.ts +94 -24
- package/libraries/devtools/README.md +16 -18
- package/libraries/devtools/src/backend.ts +505 -0
- package/libraries/devtools/src/cdp-bridge.ts +8 -8
- package/libraries/devtools/src/collectors.ts +41 -37
- package/libraries/devtools/src/index.ts +32 -14
- package/libraries/devtools/src/native-providers.ts +20 -12
- package/libraries/devtools/src/snapshot.ts +77 -0
- package/libraries/devtools/src/web/host.ts +11 -12
- package/libraries/devtools/src/web/mirror.ts +14 -405
- package/libraries/devtools/src/web/server.ts +4 -3
- package/libraries/entities/src/model-renderer.ts +96 -23
- package/libraries/gamepad/src/library.ts +2 -1
- package/libraries/inspectable/src/index.ts +11 -0
- package/libraries/inspectable/src/inspectable.ts +277 -0
- package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
- package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
- package/libraries/models/src/index.ts +1 -0
- package/libraries/models/src/types.ts +22 -0
- package/libraries/persistence/src/autosave-manager.ts +1 -1
- package/libraries/persistence/src/binary-record-store.ts +1 -1
- package/libraries/persistence/src/file-save-store.ts +4 -4
- package/libraries/persistence/src/library.ts +1 -1
- package/libraries/persistence/src/opfs-save-store.ts +5 -5
- package/libraries/persistence/src/save-worker.ts +13 -14
- package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
- package/libraries/postfx/src/post-process-stack.ts +1 -1
- package/libraries/sand/src/sand-step-pool.ts +5 -0
- package/libraries/water/src/water-renderer.ts +1 -1
- package/libraries/weatherfx/src/cloud-system.ts +3 -3
- package/mcp/README.md +20 -0
- package/mcp/src/client.ts +75 -22
- package/mcp/src/undo-redo.ts +2 -2
- package/modules/devtools/src/blitz/host.ts +430 -0
- package/modules/devtools/src/blitz/module.ts +101 -0
- package/modules/devtools/src/blitz/panels/console.ts +223 -0
- package/modules/devtools/src/blitz/panels/elements.ts +92 -0
- package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
- package/modules/devtools/src/blitz/panels/performance.ts +120 -0
- package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
- package/modules/devtools/src/blitz/panels/types.ts +120 -0
- package/modules/devtools/src/blitz/theme.ts +168 -0
- package/modules/devtools/src/data-bridge.ts +1 -1
- package/modules/devtools/src/index.ts +6 -0
- package/modules/devtools/src/profiling-bridge.ts +17 -13
- package/modules/devtools/src/profiling-hooks.ts +22 -13
- package/modules/devtools/src/scene-inspector.ts +1 -1
- package/modules/devtools/src/worker-sync.ts +9 -1
- package/modules/editor/src/commands/registry.ts +2 -2
- package/modules/editor/src/module.ts +1 -1
- package/modules/html-ui/src/composite.ts +1 -1
- package/modules/html-ui/src/create-html-ui.ts +21 -9
- package/modules/html-ui/src/doc-backend.ts +189 -10
- package/modules/html-ui/src/host.ts +354 -40
- package/modules/html-ui/src/index.ts +1 -1
- package/modules/html-ui/src/jsx-runtime.ts +1 -1
- package/modules/html-ui/src/protocol.ts +53 -6
- package/modules/mcp/README.md +6 -0
- package/modules/mcp/src/index.ts +70 -3
- package/modules/movement-3d/src/character-motor.ts +83 -10
- package/package.json +838 -165
- package/shader-graph/README.md +25 -0
- package/test/README.md +16 -0
- package/libraries/blitz-ui/native-osr-spike.ts +0 -70
- package/libraries/devtools/native/Cargo.toml +0 -12
- package/libraries/devtools/native/src/lib.rs +0 -1646
- package/libraries/devtools/native/src/panels/console.rs +0 -338
- package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
- package/libraries/devtools/native/src/panels/generic.rs +0 -317
- package/libraries/devtools/native/src/panels/gpu.rs +0 -107
- package/libraries/devtools/native/src/panels/input.rs +0 -88
- package/libraries/devtools/native/src/panels/mod.rs +0 -154
- package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
- package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
- package/libraries/devtools/native/src/panels/scene.rs +0 -72
- package/libraries/devtools/native/src/state.rs +0 -394
- package/libraries/devtools/src/egui-ffi.ts +0 -804
- package/libraries/devtools/src/egui-renderer.ts +0 -407
- package/libraries/devtools/src/host.ts +0 -363
- package/libraries/devtools/src/mirror.ts +0 -794
- package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
- package/libraries/models/test-fixtures/fbx/README.md +0 -46
- package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
- package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
- package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
- package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
- package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// installSimHotReload / restoreHotReloadState — shared dev-mode HMR wiring.
|
|
3
|
+
//
|
|
4
|
+
// Generalized from to-the-ocean's main.tsx. The vite plugin emits
|
|
5
|
+
// "sim:hot-reload" / "renderer:hot-reload" custom events when watched sim or
|
|
6
|
+
// renderer files change. These helpers own the standard response:
|
|
7
|
+
//
|
|
8
|
+
// sim:hot-reload → sim.hotReload(config, preserveState) — save/stop/
|
|
9
|
+
// respawn/restore inside the running page.
|
|
10
|
+
// renderer:hot-reload → save sim state (+ renderer meta) via the app bridge,
|
|
11
|
+
// set the "hot-reload-pending" session flag, reload.
|
|
12
|
+
//
|
|
13
|
+
// restoreHotReloadState() is the other half: call it during init to pick up
|
|
14
|
+
// the saved state after the page reload.
|
|
15
|
+
//
|
|
16
|
+
// Status is reported through the shared useHotReloadStore (devtools reads it).
|
|
17
|
+
// ============================================================================
|
|
18
|
+
import { isDevMode, useHotReloadStore } from "@downdraft/engine";
|
|
19
|
+
import { createLogger } from "@downdraft/engine/util/logger";
|
|
20
|
+
import { downdraft } from "./index.js";
|
|
21
|
+
const log = createLogger("info");
|
|
22
|
+
const PENDING_KEY = "hot-reload-pending";
|
|
23
|
+
const SLOT = "hot-reload";
|
|
24
|
+
/**
|
|
25
|
+
* Register the sim:hot-reload / renderer:hot-reload handlers.
|
|
26
|
+
* No-op outside dev mode or when import.meta.hot is absent.
|
|
27
|
+
* Call once from onReady (or equivalent) — safe to call again after HMR
|
|
28
|
+
* re-mount because import.meta.hot.on dedupes per-module.
|
|
29
|
+
*/
|
|
30
|
+
export function installSimHotReload(deps) {
|
|
31
|
+
if (!isDevMode || !import.meta.hot)
|
|
32
|
+
return;
|
|
33
|
+
const bridge = () => deps.downdraft ?? downdraft;
|
|
34
|
+
const getConfig = () => typeof deps.simConfig === "function" ? deps.simConfig() : deps.simConfig;
|
|
35
|
+
// Native dev shell: the in-runner runtime (@downdraft/platform-native
|
|
36
|
+
// dev/native-dev-runtime) owns the single sim:hot-reload / renderer:
|
|
37
|
+
// hot-reload handler set, fanning out over the __ddSession registry.
|
|
38
|
+
// Registering hot.on here too would fire the swap twice. Contribute the
|
|
39
|
+
// sim handle + renderer meta provider to the session instead.
|
|
40
|
+
const session = globalThis.__ddSession;
|
|
41
|
+
if (session) {
|
|
42
|
+
if (deps.sim?.hotReload && !session.hasSimFor?.(deps.sim)) {
|
|
43
|
+
session.registerSim?.({
|
|
44
|
+
label: "game-sim",
|
|
45
|
+
host: deps.sim,
|
|
46
|
+
hotReload: (preserve) => deps.sim.hotReload(getConfig(), preserve),
|
|
47
|
+
save: async () => (await deps.sim.save?.(SLOT))?.stateJson ?? null,
|
|
48
|
+
restore: (json) => deps.sim.restoreFromState?.(json),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (deps.renderer?.serializeRendererMeta) {
|
|
52
|
+
const renderer = deps.renderer;
|
|
53
|
+
session.registerMetaProvider?.({
|
|
54
|
+
serialize: () => renderer.serializeRendererMeta(),
|
|
55
|
+
restore: (meta) => renderer.restoreRendererMeta?.(meta),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
// Cast: bun-types' ImportMeta augmentation can shadow vite/client's HMR
|
|
61
|
+
// typing when both are in the program (node config). This code is
|
|
62
|
+
// Vite-specific, so pin the subset of the vite HMR surface we use.
|
|
63
|
+
const hot = import.meta.hot;
|
|
64
|
+
hot.on("sim:hot-reload", async (data) => {
|
|
65
|
+
const store = useHotReloadStore.getState();
|
|
66
|
+
if (!store.enabled)
|
|
67
|
+
return;
|
|
68
|
+
hot.send("sim:hot-reload:ack", {});
|
|
69
|
+
log.info("hmr", `Sim file changed: ${data.file}`);
|
|
70
|
+
store.setStatus("reloading");
|
|
71
|
+
const t0 = performance.now();
|
|
72
|
+
try {
|
|
73
|
+
await deps.sim.hotReload?.(getConfig(), store.preserveState);
|
|
74
|
+
const elapsed = (performance.now() - t0).toFixed(0);
|
|
75
|
+
log.info("hmr", `Sim worker swap complete (${elapsed}ms)`);
|
|
76
|
+
store.setStatus("ready");
|
|
77
|
+
store.setLastReload({ file: data.file, elapsed: Number(elapsed), timestamp: data.timestamp });
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
log.error("hmr", `Sim hot-reload failed: ${err.message}`);
|
|
81
|
+
store.setStatus("error", err.message);
|
|
82
|
+
log.warn("hmr", "Falling back to full reload");
|
|
83
|
+
if (!bridge().requestRestart?.("sim hot-reload failed")) {
|
|
84
|
+
window.location.reload();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
hot.on("renderer:hot-reload", async (data) => {
|
|
89
|
+
const store = useHotReloadStore.getState();
|
|
90
|
+
if (!store.enabled)
|
|
91
|
+
return;
|
|
92
|
+
hot.send("renderer:hot-reload:ack", {});
|
|
93
|
+
log.info("hmr", `Renderer file changed: ${data.file}`);
|
|
94
|
+
store.setStatus("reloading");
|
|
95
|
+
if (store.preserveState) {
|
|
96
|
+
try {
|
|
97
|
+
const result = await deps.sim.save?.(SLOT);
|
|
98
|
+
const dd = bridge();
|
|
99
|
+
if (result?.stateJson && dd?.saveGameState) {
|
|
100
|
+
const components = JSON.parse(result.stateJson);
|
|
101
|
+
if (deps.renderer?.serializeRendererMeta) {
|
|
102
|
+
components.renderer = { v: 1, data: deps.renderer.serializeRendererMeta() };
|
|
103
|
+
}
|
|
104
|
+
dd.saveGameState(SLOT, JSON.stringify(components));
|
|
105
|
+
sessionStorage.setItem(PENDING_KEY, "1");
|
|
106
|
+
log.info("hmr", "State saved, reloading page...");
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
log.warn("hmr", `State save failed, reloading without preservation: ${err}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
if (!bridge().requestRestart?.("renderer hot-reload")) {
|
|
114
|
+
window.location.reload();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Restore sim state saved by the renderer:hot-reload handler. Call during
|
|
120
|
+
* init (after the sim worker is started, before rendering). Returns true when
|
|
121
|
+
* a pending state was found and restored.
|
|
122
|
+
*/
|
|
123
|
+
export async function restoreHotReloadState(deps) {
|
|
124
|
+
// Native dev shell: state restore is pushed by the session tracker
|
|
125
|
+
// (notifySimStarted on sim start + registerMetaProvider for renderer
|
|
126
|
+
// meta). If this sim was already restored, report success without a
|
|
127
|
+
// second restore.
|
|
128
|
+
const session = globalThis.__ddSession;
|
|
129
|
+
if (session?.wasRestored?.(deps.sim))
|
|
130
|
+
return true;
|
|
131
|
+
if (!sessionStorage.getItem(PENDING_KEY))
|
|
132
|
+
return false;
|
|
133
|
+
sessionStorage.removeItem(PENDING_KEY);
|
|
134
|
+
const dd = deps.downdraft ?? downdraft;
|
|
135
|
+
if (!dd?.loadGameState)
|
|
136
|
+
return false;
|
|
137
|
+
try {
|
|
138
|
+
const stateJson = await dd.loadGameState(SLOT);
|
|
139
|
+
if (!stateJson)
|
|
140
|
+
return false;
|
|
141
|
+
await deps.sim.restoreFromState?.(stateJson);
|
|
142
|
+
try {
|
|
143
|
+
const components = JSON.parse(stateJson);
|
|
144
|
+
if (components.renderer?.data) {
|
|
145
|
+
deps.renderer?.restoreRendererMeta?.(components.renderer.data);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
catch { /* ignore */ }
|
|
149
|
+
log.info("hmr", "Restored state after page reload");
|
|
150
|
+
if (dd.deleteGameState)
|
|
151
|
+
dd.deleteGameState(SLOT);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
catch (err) {
|
|
155
|
+
log.error("hmr", `Failed to restore hot-reload state: ${err}. Starting fresh.`);
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Host Import Cache — renderer-side adapter for the host's SQLite cache
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// When a host bridge is installed, delegates to the host via `downdraft`
|
|
5
|
+
// (direct in-process calls on native). Without a host, falls back to an
|
|
6
|
+
// in-memory Map via MemoryImportCache.
|
|
7
|
+
//
|
|
8
|
+
import { MemoryImportCache } from "@downdraft/engine";
|
|
9
|
+
/**
|
|
10
|
+
* Create an ImportCache backed by the host SQLite database.
|
|
11
|
+
* Falls back to MemoryImportCache if the bridge is unavailable (browser-only mode).
|
|
12
|
+
*/
|
|
13
|
+
export function createHostImportCache(bridge) {
|
|
14
|
+
if (bridge?.importCacheGet && bridge.importCacheSet && bridge.importCacheInvalidate) {
|
|
15
|
+
return new HostImportCache(bridge);
|
|
16
|
+
}
|
|
17
|
+
return new MemoryImportCache();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* ImportCache implementation that delegates to the host's SQLite store.
|
|
21
|
+
*/
|
|
22
|
+
/** Marker for a confirmed-persisted miss — prevents refetching absent paths. */
|
|
23
|
+
const ABSENT = Symbol("absent");
|
|
24
|
+
class HostImportCache {
|
|
25
|
+
// Synchronous get/set are backed by an in-memory mirror, since the host
|
|
26
|
+
// calls are async. The async methods on the bridge are used for actual
|
|
27
|
+
// persistence. This is a pragmatic trade-off: the cache is eventually
|
|
28
|
+
// consistent with the SQLite store.
|
|
29
|
+
memory = new Map();
|
|
30
|
+
pending = new Set();
|
|
31
|
+
bridge;
|
|
32
|
+
constructor(bridge) {
|
|
33
|
+
this.bridge = bridge;
|
|
34
|
+
}
|
|
35
|
+
get(modelPath) {
|
|
36
|
+
const hit = this.memory.get(modelPath);
|
|
37
|
+
if (hit)
|
|
38
|
+
return hit === ABSENT ? null : hit;
|
|
39
|
+
// Sync interface over an async store: on a miss, hydrate the mirror in
|
|
40
|
+
// the background so a later get() sees the persisted entry. First-read
|
|
41
|
+
// after restart can still miss — callers treat null as "reimport". A
|
|
42
|
+
// negative result is cached so absent paths don't refire per get().
|
|
43
|
+
if (!this.pending.has(modelPath)) {
|
|
44
|
+
this.pending.add(modelPath);
|
|
45
|
+
this.bridge.importCacheGet?.(modelPath).then((entry) => {
|
|
46
|
+
// Only commit if the fetch is still pending — set()/invalidate()
|
|
47
|
+
// clear the marker, and an in-flight result must not resurrect an
|
|
48
|
+
// invalidated entry or clobber a fresher local write.
|
|
49
|
+
if (!this.pending.delete(modelPath))
|
|
50
|
+
return;
|
|
51
|
+
this.memory.set(modelPath, entry === null ? ABSENT : entry);
|
|
52
|
+
}).catch(() => { this.pending.delete(modelPath); });
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
set(modelPath, entry) {
|
|
57
|
+
this.pending.delete(modelPath);
|
|
58
|
+
this.memory.set(modelPath, entry);
|
|
59
|
+
// Persist to SQLite via the host bridge (fire-and-forget)
|
|
60
|
+
this.bridge.importCacheSet?.(modelPath, {
|
|
61
|
+
settings: entry.settings,
|
|
62
|
+
sourceMtime: entry.sourceMtime,
|
|
63
|
+
sidecarMtime: entry.sidecarMtime,
|
|
64
|
+
updatedAt: entry.updatedAt,
|
|
65
|
+
}).catch(() => {
|
|
66
|
+
// Host failures are non-fatal — the in-memory cache still works
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
invalidate(modelPath) {
|
|
70
|
+
this.pending.delete(modelPath);
|
|
71
|
+
this.memory.delete(modelPath);
|
|
72
|
+
this.bridge.importCacheInvalidate?.(modelPath).catch(() => { });
|
|
73
|
+
}
|
|
74
|
+
close() {
|
|
75
|
+
this.memory.clear();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// @downdraft/engine/app/renderer — typed accessor for globalThis.downdraft
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// Import `downdraft` from this module in game/bootstrap code instead of
|
|
6
|
+
// casting `(globalThis as any).downdraft`. The host installs the HostAPI
|
|
7
|
+
// object on `globalThis.downdraft`; this module provides a typed view.
|
|
8
|
+
//
|
|
9
|
+
// When no host bridge is installed (pure browser, headless test), the
|
|
10
|
+
// accessor returns a stub that no-ops / returns null. Callers that need
|
|
11
|
+
// real values should guard with `downdraft?.isAvailable`.
|
|
12
|
+
import { getNativeHost } from "@downdraft/engine";
|
|
13
|
+
import { OpfsSaveStore } from "@downdraft/engine/libraries/persistence/browser";
|
|
14
|
+
import { createSaveStore as _createSaveStore } from "./save-store-factory.js";
|
|
15
|
+
function noop() { }
|
|
16
|
+
const stubBridge = {
|
|
17
|
+
isAvailable: false,
|
|
18
|
+
saveGameState: () => Promise.resolve(false),
|
|
19
|
+
loadGameState: () => Promise.resolve(null),
|
|
20
|
+
deleteGameState: () => Promise.resolve(false),
|
|
21
|
+
listSaveSlots: () => Promise.resolve([]),
|
|
22
|
+
listSaveGenerations: () => Promise.resolve([]),
|
|
23
|
+
deleteSaveGeneration: () => Promise.resolve(false),
|
|
24
|
+
setThumbnail: () => Promise.resolve(),
|
|
25
|
+
getThumbnail: () => Promise.resolve(null),
|
|
26
|
+
setSaveProperties: () => Promise.resolve(),
|
|
27
|
+
getSaveProperties: () => Promise.resolve({}),
|
|
28
|
+
quit: () => Promise.resolve(),
|
|
29
|
+
setDebugMode: noop,
|
|
30
|
+
toggleDevtools: noop,
|
|
31
|
+
toggleFullscreen: noop,
|
|
32
|
+
getDisplayInfo: () => Promise.resolve({ refreshRate: 0 }),
|
|
33
|
+
openExternal: noop,
|
|
34
|
+
getGPUSystemInfo: () => Promise.resolve(null),
|
|
35
|
+
getGpuInfo: () => Promise.resolve(null),
|
|
36
|
+
getFeatureLog: () => Promise.resolve(null),
|
|
37
|
+
captureFrame: () => Promise.resolve(null),
|
|
38
|
+
getProcessStats: () => Promise.reject(new Error("Process stats not available on this host")),
|
|
39
|
+
importCacheGet: () => Promise.resolve(null),
|
|
40
|
+
importCacheSet: () => Promise.resolve(),
|
|
41
|
+
importCacheInvalidate: () => Promise.resolve(),
|
|
42
|
+
onSimReady: () => noop,
|
|
43
|
+
onDisplayInfo: () => noop,
|
|
44
|
+
onDisplayMetricsChanged: () => noop,
|
|
45
|
+
onPerfStats: () => noop,
|
|
46
|
+
onDebugMode: () => noop,
|
|
47
|
+
onDevtoolsToggle: () => noop,
|
|
48
|
+
deterministic: false,
|
|
49
|
+
onMcpRequest: noop,
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Typed accessor for the `globalThis.downdraft` host bridge.
|
|
53
|
+
*
|
|
54
|
+
* On the native runtime this is the real HostAPI. In a host-less context
|
|
55
|
+
* (e.g. model-viewer running standalone in a browser), it returns a stub
|
|
56
|
+
* with `isAvailable: false`.
|
|
57
|
+
*
|
|
58
|
+
* The accessor is lazy: the bridge may be installed AFTER this module is
|
|
59
|
+
* evaluated (the native host installs `globalThis.downdraft` once its
|
|
60
|
+
* window/device exist — after static imports have already run). Reads go
|
|
61
|
+
* through a Proxy so `downdraft.isAvailable` flips live when a bridge
|
|
62
|
+
* appears. Callers that need a stable snapshot should read it at use time,
|
|
63
|
+
* not module-eval time (all engine consumers already do).
|
|
64
|
+
*/
|
|
65
|
+
function currentBridge() {
|
|
66
|
+
const raw = globalThis.downdraft;
|
|
67
|
+
if (raw) {
|
|
68
|
+
return { ...raw, isAvailable: true };
|
|
69
|
+
}
|
|
70
|
+
return stubBridge;
|
|
71
|
+
}
|
|
72
|
+
export const downdraft = new Proxy({}, {
|
|
73
|
+
get(_target, prop) {
|
|
74
|
+
return currentBridge()[prop];
|
|
75
|
+
},
|
|
76
|
+
has(_target, prop) {
|
|
77
|
+
return prop in currentBridge();
|
|
78
|
+
},
|
|
79
|
+
});
|
|
80
|
+
// Import cache adapter — host-backed with memory fallback
|
|
81
|
+
export { createHostImportCache } from "./import-cache.js";
|
|
82
|
+
export { bootstrapGame } from "./bootstrap.js";
|
|
83
|
+
export { startGame } from "./game-module.js";
|
|
84
|
+
export { useDeterministicRenderPause, useDisplayInfo, useFpsPolling, useHotReloadDispose } from "./hooks.js";
|
|
85
|
+
export { installSimHotReload, restoreHotReloadState } from "./hot-reload.js";
|
|
86
|
+
export { createSimBridge } from "./sim-bridge.js";
|
|
87
|
+
// Save store factory + host save-store bridge type
|
|
88
|
+
export { createInlineSaveStore, createSaveStore } from "./save-store-factory.js";
|
|
89
|
+
/**
|
|
90
|
+
* Create the default ISaveStore for a game.
|
|
91
|
+
*
|
|
92
|
+
* When the host exposes a typed save store (`downdraft.saveStore` — the
|
|
93
|
+
* native host's HostSaveStore over FileSaveStore), defaults to "host" mode —
|
|
94
|
+
* disk persistence, stable across sessions, not origin-scoped.
|
|
95
|
+
*
|
|
96
|
+
* In a pure browser (no bridge), falls back to "auto" (OPFS worker → inline
|
|
97
|
+
* OPFS), since there is no host save path available.
|
|
98
|
+
*
|
|
99
|
+
* Games that want a specific backend should call `createSaveStore` directly
|
|
100
|
+
* with an explicit `mode` rather than relying on this default.
|
|
101
|
+
*/
|
|
102
|
+
export async function createDefaultSaveStore(engineVersion) {
|
|
103
|
+
const mode = downdraft.saveStore ? "host" : "auto";
|
|
104
|
+
const { store } = await _createSaveStore({
|
|
105
|
+
mode,
|
|
106
|
+
opfsOptions: { engineVersion },
|
|
107
|
+
bridge: downdraft,
|
|
108
|
+
});
|
|
109
|
+
if (!store) {
|
|
110
|
+
const fallback = new OpfsSaveStore({ engineVersion });
|
|
111
|
+
await fallback.init();
|
|
112
|
+
return fallback;
|
|
113
|
+
}
|
|
114
|
+
return store;
|
|
115
|
+
}
|
|
116
|
+
// AutosaveManager (re-exported from @downdraft/engine/libraries/persistence)
|
|
117
|
+
export { AutosaveManager } from "@downdraft/engine/libraries/persistence/browser";
|
|
118
|
+
// MCP automation harness factory + shared tool helpers
|
|
119
|
+
export { blobToBase64, createMcpHarness, errorResult, jsonResult } from "./mcp-harness.js";
|
|
120
|
+
export { createGameMcp, createStandardAutomationTools } from "./standard-automation-tools.js";
|
|
121
|
+
// Feature log (renderer collector + combined accessor + MCP tool factory)
|
|
122
|
+
export { collectRendererFeatureLog, createFeatureLogMcpTool, getCombinedFeatureLog, getRendererFeatureLog } from "./feature-log.js";
|
|
123
|
+
// --- Render surface ---
|
|
124
|
+
/**
|
|
125
|
+
* Get the renderer-facing surface for a given layer index.
|
|
126
|
+
*
|
|
127
|
+
* This is the canonical accessor — it returns the host-owned `RenderSurface`
|
|
128
|
+
* on the native runtime (the SDL-windowed wgpu surface installed by
|
|
129
|
+
* `createNativeHost`) and the DOM `<canvas>` element on browser hosts (which
|
|
130
|
+
* satisfies `RenderSurface` structurally).
|
|
131
|
+
*
|
|
132
|
+
* Layer 0 is the primary game surface. On native, layer 0 is the only
|
|
133
|
+
* surface — requesting any other layer throws (multi-canvas layering is a
|
|
134
|
+
* DOM-host concept).
|
|
135
|
+
*/
|
|
136
|
+
export function getSurface(layer = 0) {
|
|
137
|
+
if (layer !== 0) {
|
|
138
|
+
throw new Error(`No surface for layer ${layer} — the native host exposes exactly one RenderSurface (layer 0).`);
|
|
139
|
+
}
|
|
140
|
+
// The boundary cast: NativeSurface's WebGPU context returns the wgpu
|
|
141
|
+
// wrapper types (WgpuTexture), not @webgpu/types' branded GPUTexture.
|
|
142
|
+
// The contract is honored at runtime; the cast bridges the two type
|
|
143
|
+
// universes.
|
|
144
|
+
const surface = getNativeHost()?.surface;
|
|
145
|
+
if (!surface) {
|
|
146
|
+
throw new Error("No native surface — the host has not installed __nativeHost.surface yet");
|
|
147
|
+
}
|
|
148
|
+
return surface;
|
|
149
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// createMcpHarness() — factory for renderer-side MCP automation harnesses.
|
|
3
|
+
//
|
|
4
|
+
// Centralizes the MCP request-handling boilerplate shared by games
|
|
5
|
+
// that have MCP automation:
|
|
6
|
+
// - initialize / tools/list / tools/call / shutdown method dispatch
|
|
7
|
+
// - downdraft.onMcpRequest wiring
|
|
8
|
+
// - Error handling + logging
|
|
9
|
+
//
|
|
10
|
+
// Games provide only their tool definitions + handlers.
|
|
11
|
+
// ============================================================================
|
|
12
|
+
import { createLogger } from "@downdraft/engine/util/logger";
|
|
13
|
+
import { downdraft } from "./index.js";
|
|
14
|
+
const log = createLogger();
|
|
15
|
+
/**
|
|
16
|
+
* Create and register an MCP automation harness.
|
|
17
|
+
*
|
|
18
|
+
* Wires `downdraft.onMcpRequest` to handle the standard MCP protocol
|
|
19
|
+
* (initialize, tools/list, tools/call, shutdown) and dispatches tool calls
|
|
20
|
+
* to the provided handlers.
|
|
21
|
+
*
|
|
22
|
+
* If no host bridge is installed (e.g. running standalone in a browser),
|
|
23
|
+
* this is a no-op.
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* createMcpHarness({
|
|
27
|
+
* serverName: "downdraft-mygame-automation",
|
|
28
|
+
* tools: [
|
|
29
|
+
* {
|
|
30
|
+
* def: { name: "capture_screenshot", description: "...", inputSchema: {...} },
|
|
31
|
+
* handler: async (params) => { ... },
|
|
32
|
+
* },
|
|
33
|
+
* ],
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
export function createMcpHarness(opts) {
|
|
37
|
+
const { serverName, serverVersion = "0.1.0", tools } = opts;
|
|
38
|
+
const handleRequest = async (req) => {
|
|
39
|
+
const { id, method, params = {} } = req;
|
|
40
|
+
try {
|
|
41
|
+
if (method === "initialize") {
|
|
42
|
+
return {
|
|
43
|
+
id,
|
|
44
|
+
result: {
|
|
45
|
+
protocolVersion: "2024-11-05",
|
|
46
|
+
capabilities: { tools: {}, resources: {}, prompts: {} },
|
|
47
|
+
serverInfo: { name: serverName, version: serverVersion },
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
if (method === "tools/list") {
|
|
52
|
+
return {
|
|
53
|
+
id,
|
|
54
|
+
result: {
|
|
55
|
+
tools: tools.map((t) => ({
|
|
56
|
+
name: t.def.name,
|
|
57
|
+
description: t.def.description,
|
|
58
|
+
inputSchema: t.def.inputSchema,
|
|
59
|
+
})),
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
if (method === "tools/call") {
|
|
64
|
+
const name = params.name;
|
|
65
|
+
const args = params.arguments ?? {};
|
|
66
|
+
const tool = tools.find((t) => t.def.name === name);
|
|
67
|
+
if (!tool) {
|
|
68
|
+
return { id, error: { code: -32602, message: `Unknown tool: ${name}` } };
|
|
69
|
+
}
|
|
70
|
+
const result = await tool.handler(args);
|
|
71
|
+
return { id, result: result };
|
|
72
|
+
}
|
|
73
|
+
if (method === "shutdown") {
|
|
74
|
+
return { id, result: {} };
|
|
75
|
+
}
|
|
76
|
+
return { id, error: { code: -32601, message: `Method not found: ${method}` } };
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
return { id, error: { code: -32603, message: e.message } };
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
if (!downdraft?.isAvailable || typeof downdraft.onMcpRequest !== "function") {
|
|
83
|
+
log.warn("mcp", "Host bridge or onMcpRequest not available; automation harness disabled");
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
downdraft.onMcpRequest(async (request) => handleRequest(request));
|
|
87
|
+
log.info("mcp", `${serverName} registered; tools: ${tools.map((t) => t.def.name).join(", ")}`);
|
|
88
|
+
}
|
|
89
|
+
// ── Shared MCP tool helpers ──────────────────────────────────────────────────
|
|
90
|
+
// These utilities are used by multiple games' MCP automation harnesses.
|
|
91
|
+
// Games import them instead of duplicating the implementation.
|
|
92
|
+
/** Convert a Blob to a base64 string (without the data: prefix). */
|
|
93
|
+
export function blobToBase64(blob) {
|
|
94
|
+
return new Promise((resolve, reject) => {
|
|
95
|
+
const reader = new FileReader();
|
|
96
|
+
reader.onloadend = () => {
|
|
97
|
+
const result = reader.result;
|
|
98
|
+
const base64 = result.split(",")[1];
|
|
99
|
+
resolve(base64 ?? "");
|
|
100
|
+
};
|
|
101
|
+
reader.onerror = reject;
|
|
102
|
+
reader.readAsDataURL(blob);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** MCP result helper: wrap data as a JSON content array. */
|
|
106
|
+
export function jsonResult(data) {
|
|
107
|
+
return { content: [{ type: "text", text: JSON.stringify(data, null, 2) }] };
|
|
108
|
+
}
|
|
109
|
+
/** MCP result helper: wrap an error message. */
|
|
110
|
+
export function errorResult(message) {
|
|
111
|
+
return { content: [{ type: "text", text: JSON.stringify({ error: message }, null, 2) }] };
|
|
112
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Save Store Factory — creates the appropriate ISaveStore based on
|
|
3
|
+
// environment capabilities and game configuration.
|
|
4
|
+
// ============================================================================
|
|
5
|
+
//
|
|
6
|
+
// Mode selection:
|
|
7
|
+
// "inline" — OpfsSaveStore runs inside the sim worker (caller is responsible
|
|
8
|
+
// for creating it there). The factory returns null here; the
|
|
9
|
+
// sim worker creates the store directly.
|
|
10
|
+
// "worker" — Spawns a dedicated save Web Worker with OpfsSaveStore inside.
|
|
11
|
+
// Returns a SaveWorkerProxy. (Browser builds only — the native
|
|
12
|
+
// host has no OPFS.)
|
|
13
|
+
// "host" — The host's own save store (`downdraft.saveStore`). On native
|
|
14
|
+
// this is HostSaveStore over HostServices → FileSaveStore: real
|
|
15
|
+
// SaveState in, real SaveResult/LoadResult out, no JSON
|
|
16
|
+
// boundary. The default when a host bridge is installed.
|
|
17
|
+
// "auto" — Picks "host" when the host exposes a typed save store, else
|
|
18
|
+
// "worker" if OPFS is available. (On native there is no OPFS
|
|
19
|
+
// and no process boundary, so no fallback flip can produce a
|
|
20
|
+
// divergent save location.)
|
|
21
|
+
//
|
|
22
|
+
// The factory is called from the renderer after the sim worker is initialized.
|
|
23
|
+
import { OpfsSaveStore, SaveWorkerProxy } from "@downdraft/engine/libraries/persistence/browser";
|
|
24
|
+
/**
|
|
25
|
+
* Check if OPFS is available in the current environment.
|
|
26
|
+
*/
|
|
27
|
+
export function isOpfsAvailable() {
|
|
28
|
+
const nav = globalThis;
|
|
29
|
+
return typeof nav.navigator?.storage?.getDirectory === "function";
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create the appropriate ISaveStore based on the mode and environment.
|
|
33
|
+
*
|
|
34
|
+
* - "inline": Returns null. The caller should create an OpfsSaveStore inside
|
|
35
|
+
* the sim worker directly (the worker has the serialized state and can
|
|
36
|
+
* write to OPFS without crossing worker boundaries).
|
|
37
|
+
* - "worker": Spawns a dedicated save worker with OpfsSaveStore. Returns
|
|
38
|
+
* a SaveWorkerProxy. The caller must call init() on it.
|
|
39
|
+
* - "host": Returns the host's save store (native HostSaveStore →
|
|
40
|
+
* FileSaveStore on disk). Stable across sessions; not origin-scoped.
|
|
41
|
+
* - "auto": Picks "host" when the bridge exposes a typed save store, else
|
|
42
|
+
* "worker" when OPFS is available.
|
|
43
|
+
*
|
|
44
|
+
* Returns `{ store, mode }` where `mode` is the backend that was actually
|
|
45
|
+
* selected (which may differ from the requested mode in "auto" fallback).
|
|
46
|
+
*/
|
|
47
|
+
export async function createSaveStore(opts) {
|
|
48
|
+
const mode = opts.mode ?? "auto";
|
|
49
|
+
switch (mode) {
|
|
50
|
+
case "inline":
|
|
51
|
+
// The caller creates the OpfsSaveStore inside the sim worker.
|
|
52
|
+
// Return null to signal that the sim worker handles saves directly.
|
|
53
|
+
return { store: null, mode: "inline" };
|
|
54
|
+
case "worker": {
|
|
55
|
+
if (!isOpfsAvailable()) {
|
|
56
|
+
throw new Error("OPFS is not available — cannot use 'worker' mode. Use 'auto' or 'inline' mode.");
|
|
57
|
+
}
|
|
58
|
+
const proxy = new SaveWorkerProxy({
|
|
59
|
+
storeOptions: opts.opfsOptions,
|
|
60
|
+
workerUrl: opts.workerUrl,
|
|
61
|
+
});
|
|
62
|
+
await proxy.init();
|
|
63
|
+
return { store: proxy, mode: "worker" };
|
|
64
|
+
}
|
|
65
|
+
case "host": {
|
|
66
|
+
if (!opts.bridge?.saveStore) {
|
|
67
|
+
throw new Error("No host save store on the bridge — 'host' mode requires a native host (downdraft.saveStore)");
|
|
68
|
+
}
|
|
69
|
+
return { store: opts.bridge.saveStore, mode: "host" };
|
|
70
|
+
}
|
|
71
|
+
case "auto": {
|
|
72
|
+
// Native-first: when the host exposes a typed save store, use it.
|
|
73
|
+
// There is no OPFS and no process boundary on native.
|
|
74
|
+
if (opts.bridge?.saveStore) {
|
|
75
|
+
return { store: opts.bridge.saveStore, mode: "host" };
|
|
76
|
+
}
|
|
77
|
+
if (isOpfsAvailable()) {
|
|
78
|
+
// Try dedicated worker mode, with a 5s init timeout — the worker
|
|
79
|
+
// spawn can hang in some environments (e.g. when Vite's worker URL
|
|
80
|
+
// resolution fails in dev mode).
|
|
81
|
+
const proxy = new SaveWorkerProxy({
|
|
82
|
+
storeOptions: opts.opfsOptions,
|
|
83
|
+
workerUrl: opts.workerUrl,
|
|
84
|
+
});
|
|
85
|
+
await Promise.race([
|
|
86
|
+
proxy.init(),
|
|
87
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error("SaveWorkerProxy init timeout (5s)")), 5000)),
|
|
88
|
+
]);
|
|
89
|
+
return { store: proxy, mode: "worker" };
|
|
90
|
+
}
|
|
91
|
+
// Last resort: the bridge's JSON save methods. On native this only
|
|
92
|
+
// happens in headless/test hosts with no appId (the stub bridge) —
|
|
93
|
+
// saves no-op but callers get a well-formed store. In a browser with
|
|
94
|
+
// a real bridge this preserves the pre-migration fallback behavior.
|
|
95
|
+
if (opts.bridge) {
|
|
96
|
+
return { store: new BridgeJsonSaveStore(opts.bridge), mode: "host" };
|
|
97
|
+
}
|
|
98
|
+
throw new Error("No save backend available in 'auto' mode — no host save store, no OPFS, no bridge");
|
|
99
|
+
}
|
|
100
|
+
default:
|
|
101
|
+
throw new Error(`Unknown save store mode: ${mode}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* ISaveStore over the bridge's JSON-string save methods — the last-resort
|
|
106
|
+
* "auto" backend for headless hosts (stub bridge) and environments without
|
|
107
|
+
* a typed store or OPFS. The wire format is the components
|
|
108
|
+
* map (what host `saveGame`/`loadGame` handlers parse/return); SaveResult
|
|
109
|
+
* metadata is unavailable across the JSON boundary.
|
|
110
|
+
*/
|
|
111
|
+
export class BridgeJsonSaveStore {
|
|
112
|
+
bridge;
|
|
113
|
+
warningCallbacks = new Set();
|
|
114
|
+
constructor(bridge) {
|
|
115
|
+
this.bridge = bridge;
|
|
116
|
+
}
|
|
117
|
+
async save(slot, state, opts) {
|
|
118
|
+
try {
|
|
119
|
+
const success = await this.bridge.saveGameState(slot, JSON.stringify(state.components), opts);
|
|
120
|
+
return { success, bytes: 0 };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return { success: false, bytes: 0 };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async load(slot, opts) {
|
|
127
|
+
try {
|
|
128
|
+
const result = await this.bridge.loadGameState(slot, opts);
|
|
129
|
+
if (!result)
|
|
130
|
+
return { state: null };
|
|
131
|
+
const components = JSON.parse(result);
|
|
132
|
+
return {
|
|
133
|
+
state: {
|
|
134
|
+
components,
|
|
135
|
+
meta: { engineVersion: "", timestamp: 0, entityCount: 0, playerCount: 0 },
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return { state: null };
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
listSaves() {
|
|
144
|
+
return this.bridge.listSaveSlots();
|
|
145
|
+
}
|
|
146
|
+
async listGenerations(slot) {
|
|
147
|
+
return this.bridge.listSaveGenerations?.(slot) ?? [];
|
|
148
|
+
}
|
|
149
|
+
deleteSave(slot) {
|
|
150
|
+
return this.bridge.deleteGameState(slot);
|
|
151
|
+
}
|
|
152
|
+
async deleteGeneration(slot, gen) {
|
|
153
|
+
return this.bridge.deleteSaveGeneration?.(slot, gen) ?? false;
|
|
154
|
+
}
|
|
155
|
+
async setThumbnail(slot, data) {
|
|
156
|
+
await this.bridge.setThumbnail?.(slot, data);
|
|
157
|
+
}
|
|
158
|
+
async getThumbnail(slot) {
|
|
159
|
+
return (await this.bridge.getThumbnail?.(slot)) ?? null;
|
|
160
|
+
}
|
|
161
|
+
async setProperties(slot, props) {
|
|
162
|
+
await this.bridge.setSaveProperties?.(slot, props);
|
|
163
|
+
}
|
|
164
|
+
async getProperties(slot) {
|
|
165
|
+
return (await this.bridge.getSaveProperties?.(slot)) ?? {};
|
|
166
|
+
}
|
|
167
|
+
onWarning(cb) {
|
|
168
|
+
this.warningCallbacks.add(cb);
|
|
169
|
+
return () => { this.warningCallbacks.delete(cb); };
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Create an OpfsSaveStore directly (for inline mode where the store runs
|
|
174
|
+
* inside the sim worker). This is a convenience wrapper that calls init().
|
|
175
|
+
*/
|
|
176
|
+
export async function createInlineSaveStore(opts) {
|
|
177
|
+
const store = new OpfsSaveStore(opts);
|
|
178
|
+
await store.init();
|
|
179
|
+
return store;
|
|
180
|
+
}
|