@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,558 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// createSimWorker — helper for game sim worker entries.
|
|
3
|
+
//
|
|
4
|
+
// Handles the standard sim worker API: init, pause, resume, shutdown, setSpeed,
|
|
5
|
+
// step, getStats, resize. Games provide only onInit, onTick, and optional
|
|
6
|
+
// onResize/onAfterTicks/onShutdown.
|
|
7
|
+
//
|
|
8
|
+
// This enforces the standard API shape — consumers can't deviate. The helper
|
|
9
|
+
// handles:
|
|
10
|
+
// - Tick loop with fixed-step accumulator + speed multiplier
|
|
11
|
+
// - FPS tracking (per-second frame counter)
|
|
12
|
+
// - frameCount + tickCount
|
|
13
|
+
// - stepOnce (single-step mode: step once then pause)
|
|
14
|
+
// - startPaused option (for workers that need to wait for save data before simulating)
|
|
15
|
+
// - getStats() returning { fps, tick, frame }
|
|
16
|
+
// - expose() wiring with the standard API
|
|
17
|
+
// - "ready" event emission after onInit
|
|
18
|
+
// - Error recovery (logs error, retries after 100ms)
|
|
19
|
+
// - SAB polyfill buffer sync (when SharedArrayBuffer is unavailable, e.g.
|
|
20
|
+
// polyfilled — see sab-polyfill.ts + buffer-sync.ts)
|
|
21
|
+
//
|
|
22
|
+
// Usage in a game worker entry:
|
|
23
|
+
// createSimWorker({
|
|
24
|
+
// fixedDt: 1/30,
|
|
25
|
+
// onInit(sab, gridW, gridH) { ... },
|
|
26
|
+
// onTick(dt, ctx) { ... },
|
|
27
|
+
// onAfterTicks(ctx) { ... }, // once-per-frame writes (e.g. SAB upload)
|
|
28
|
+
// onResize(gridW, gridH) { ... },
|
|
29
|
+
// startPaused: true, // start paused (e.g. wait for save data)
|
|
30
|
+
// onSyncConfig(sab) { ... }, // buffer sync regions (SAB polyfill)
|
|
31
|
+
// extraApi: { clear: () => { ... }, loadGrid: (...) => { ... } },
|
|
32
|
+
// });
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// Import the SAB polyfill FIRST — it must execute before any code that
|
|
35
|
+
// references SharedArrayBuffer. On hosts with real SABs this is a no-op.
|
|
36
|
+
import { flushProfilingTick, getWarningEngine, METRIC_TICK_LATENCY, recordTaskLatency } from "../profiling/worker-prelude.js";
|
|
37
|
+
import "../sab/sab-polyfill.js";
|
|
38
|
+
import { usingRealSAB } from "../sab/sab-polyfill.js";
|
|
39
|
+
import { mulberry32 } from "../math/rng.js";
|
|
40
|
+
import { createLogger } from "../util/logger.js";
|
|
41
|
+
import { expose, exposeEvents } from "./rpc.js";
|
|
42
|
+
const log = createLogger();
|
|
43
|
+
/**
|
|
44
|
+
* Detect deterministic/test mode inside a worker. `DOWNDRAFT_DETERMINISTIC`
|
|
45
|
+
* reaches workers via `globalThis.__DOWNDRAFT_DETERMINISTIC__` (set by the
|
|
46
|
+
* host before worker creation) or `process.env` (Bun/Node workers).
|
|
47
|
+
*/
|
|
48
|
+
function detectDeterministic() {
|
|
49
|
+
const g = globalThis;
|
|
50
|
+
if (g.__DOWNDRAFT_DETERMINISTIC__)
|
|
51
|
+
return true;
|
|
52
|
+
try {
|
|
53
|
+
return g.process?.env
|
|
54
|
+
?.DOWNDRAFT_DETERMINISTIC === "1";
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Replace `Math.random` with a seeded-RNG-backed function that warns once per
|
|
62
|
+
* callsite. In deterministic mode this makes stray `Math.random()` calls in
|
|
63
|
+
* sim code deterministic (they draw from the same stream as `ctx.rng`) while
|
|
64
|
+
* surfacing migration targets. Only installed when deterministic mode is on.
|
|
65
|
+
*/
|
|
66
|
+
function installDeterministicMathGuard(rng) {
|
|
67
|
+
const warned = new Set();
|
|
68
|
+
const original = Math.random;
|
|
69
|
+
Math.random = () => {
|
|
70
|
+
const stack = new Error().stack ?? "";
|
|
71
|
+
if (!warned.has(stack)) {
|
|
72
|
+
warned.add(stack);
|
|
73
|
+
const line = stack.split("\n")[1]?.trim() ?? "unknown callsite";
|
|
74
|
+
log.warn("create-sim-worker", `Math.random() called in deterministic sim — use ctx.rng (from ${line})`);
|
|
75
|
+
}
|
|
76
|
+
return rng();
|
|
77
|
+
};
|
|
78
|
+
// Restore path for tests / unusual host reuse.
|
|
79
|
+
Math.random.__downdraftRestore = () => {
|
|
80
|
+
Math.random = original;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Creates and starts a sim worker with the standard API.
|
|
85
|
+
* Call this at the top level of a game's worker entry file.
|
|
86
|
+
*
|
|
87
|
+
* The exposed API is:
|
|
88
|
+
* init(sab, ...args) — calls onInit, starts the loop, emits "ready"
|
|
89
|
+
* resize(...args) — calls onResize
|
|
90
|
+
* pause() — pauses the loop
|
|
91
|
+
* resume() — resumes the loop (resets accumulator to prevent catch-up spike)
|
|
92
|
+
* shutdown() — stops the loop, calls onShutdown
|
|
93
|
+
* setSpeed(speed) — sets the speed multiplier (0 = paused)
|
|
94
|
+
* step() — single-steps (runs 1 tick then pauses)
|
|
95
|
+
* getStats() — returns { fps, tick, frame }
|
|
96
|
+
* save/load/initSaveStore/restoreFromState — when opts.save is provided
|
|
97
|
+
* sendCommand(cmd) — when opts.onCommand is provided
|
|
98
|
+
* ...extraApi — any additional methods
|
|
99
|
+
*/
|
|
100
|
+
export function createSimWorker(opts) {
|
|
101
|
+
const tickMs = opts.fixedDt * 1000;
|
|
102
|
+
const maxStepsPerFrame = opts.maxStepsPerFrame ?? 5;
|
|
103
|
+
let running = false;
|
|
104
|
+
let loopActive = false;
|
|
105
|
+
let paused = false;
|
|
106
|
+
let stepOnce = false;
|
|
107
|
+
let speedMultiplier = 1;
|
|
108
|
+
let lastTick = 0;
|
|
109
|
+
let tickAccumulator = 0;
|
|
110
|
+
let tickCount = 0;
|
|
111
|
+
let tickTimeAccum = 0;
|
|
112
|
+
let frameCount = 0;
|
|
113
|
+
let fpsTimer = 0;
|
|
114
|
+
let fps = 0;
|
|
115
|
+
// SAB polyfill: buffer sync worker (only created when SAB is unavailable).
|
|
116
|
+
let syncWorker = null;
|
|
117
|
+
// SAB polyfill: throttled sync counter. When onSyncFastRegions is provided,
|
|
118
|
+
// fast regions are synced every tick batch, and ALL regions (including slow
|
|
119
|
+
// ones) are synced every onSyncSlowInterval tick batches.
|
|
120
|
+
let syncSlowCounter = 0;
|
|
121
|
+
const syncSlowInterval = opts.onSyncSlowInterval ?? 10;
|
|
122
|
+
// Inline save store (created by initSaveStore() via opts.save.createStore).
|
|
123
|
+
let saveStore = null;
|
|
124
|
+
// Optional GC controller — offered post-tick headroom each frame.
|
|
125
|
+
let gcController = null;
|
|
126
|
+
/**
|
|
127
|
+
* Extract the restore payload from a serialized state. Handles all three
|
|
128
|
+
* wire forms: raw data, a components map (`{ name: { v, data } }`), and a
|
|
129
|
+
* full SaveState (`{ components: { name: { v, data } } }`). When
|
|
130
|
+
* componentName is omitted the components map / raw payload is returned
|
|
131
|
+
* as-is for multi-component games.
|
|
132
|
+
*/
|
|
133
|
+
const extractRestoreData = (parsed) => {
|
|
134
|
+
const name = opts.save.componentName;
|
|
135
|
+
if (!name)
|
|
136
|
+
return parsed?.components ?? parsed;
|
|
137
|
+
return (parsed?.components?.[name]?.data ??
|
|
138
|
+
(parsed?.[name]?.data !== undefined ? parsed[name].data : parsed));
|
|
139
|
+
};
|
|
140
|
+
const syncFastRegions = opts.onSyncFastRegions;
|
|
141
|
+
// setTimeout truncates fractional milliseconds (e.g. 32.333 → 32), losing
|
|
142
|
+
// ~frac(tickMs) ms per iteration. For tickMs = 33.333 (30Hz), that's 0.333ms
|
|
143
|
+
// per iteration — after ~100 iterations (~3.3s) the deficit reaches one full
|
|
144
|
+
// tick, causing the accumulator to burst a 2-tick frame. This produces a
|
|
145
|
+
// slow, periodic oscillation in the effective tick rate (and thus in
|
|
146
|
+
// everything driven by dt: movement speed, drop spin, animation timing).
|
|
147
|
+
// We accumulate the sub-ms remainder and add it back when it exceeds 1ms,
|
|
148
|
+
// so the average setTimeout delay matches the desired interval exactly.
|
|
149
|
+
let timerRemainder = 0;
|
|
150
|
+
// The single armed loop timer — loop() schedules through scheduleLoop so
|
|
151
|
+
// withLoopStopped/stop/shutdown can disarm it. Without this, stopping the
|
|
152
|
+
// loop left a pending setTimeout that fired after the stop and spawned a
|
|
153
|
+
// second parallel loop chain.
|
|
154
|
+
let loopTimer = null;
|
|
155
|
+
// Promise for the in-flight onTick() call — the real barrier
|
|
156
|
+
// withLoopStopped waits on (the old code polled a flag for ~50ms then
|
|
157
|
+
// proceeded anyway, letting a suspended tick race the critical section).
|
|
158
|
+
let tickInFlight = null;
|
|
159
|
+
// Serializes withLoopStopped critical sections.
|
|
160
|
+
let stopChain = Promise.resolve();
|
|
161
|
+
const events = exposeEvents();
|
|
162
|
+
// Deterministic RNG — reseedable via control.setSeed(); the stable `rng`
|
|
163
|
+
// closure is what ctx.rng and the Math.random shim draw from.
|
|
164
|
+
let rngImpl = mulberry32(opts.seed ?? 0x9e3779b9);
|
|
165
|
+
const rng = () => rngImpl();
|
|
166
|
+
const deterministic = opts.deterministic ?? detectDeterministic();
|
|
167
|
+
if (deterministic) {
|
|
168
|
+
installDeterministicMathGuard(rng);
|
|
169
|
+
}
|
|
170
|
+
const control = {
|
|
171
|
+
pause: () => { paused = true; },
|
|
172
|
+
setSeed: (seed) => { rngImpl = mulberry32(seed); },
|
|
173
|
+
resume: () => {
|
|
174
|
+
paused = false;
|
|
175
|
+
lastTick = performance.now();
|
|
176
|
+
tickAccumulator = 0;
|
|
177
|
+
},
|
|
178
|
+
async withLoopStopped(fn) {
|
|
179
|
+
// Serialize concurrent callers — a second caller queues behind the
|
|
180
|
+
// first's stop → critical section → restart cycle.
|
|
181
|
+
const run = stopChain.then(async () => {
|
|
182
|
+
// Stop the loop from scheduling another iteration AND disarm the
|
|
183
|
+
// pending one — an armed setTimeout that fires while loopActive was
|
|
184
|
+
// already restored used to spawn a second parallel loop chain.
|
|
185
|
+
loopActive = false;
|
|
186
|
+
clearLoopTimer();
|
|
187
|
+
// Hard barrier: if onTick is mid-flight, wait for it to actually
|
|
188
|
+
// return. Its continuation observes loopActive === false and exits
|
|
189
|
+
// before touching the accumulator or rescheduling. No timeout —
|
|
190
|
+
// running fn() while a tick still mutates state is exactly the
|
|
191
|
+
// race this exists to prevent.
|
|
192
|
+
if (tickInFlight)
|
|
193
|
+
await tickInFlight.catch(() => { });
|
|
194
|
+
try {
|
|
195
|
+
return await fn();
|
|
196
|
+
}
|
|
197
|
+
finally {
|
|
198
|
+
// Restart the loop — unless shutdown landed while we held the
|
|
199
|
+
// barrier (running === false is the permanent stop signal).
|
|
200
|
+
if (running) {
|
|
201
|
+
loopActive = true;
|
|
202
|
+
lastTick = performance.now();
|
|
203
|
+
tickAccumulator = 0;
|
|
204
|
+
void loop();
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
// Keep the chain alive across failures in fn().
|
|
209
|
+
stopChain = run.then(() => undefined, () => undefined);
|
|
210
|
+
return run;
|
|
211
|
+
},
|
|
212
|
+
getSpeed: () => speedMultiplier,
|
|
213
|
+
setSpeed: (speed) => {
|
|
214
|
+
speedMultiplier = Math.min(opts.maxSpeed ?? Infinity, Math.max(opts.minSpeed ?? 0, speed));
|
|
215
|
+
},
|
|
216
|
+
getTickTimeAccum: () => tickTimeAccum,
|
|
217
|
+
resetTickTimeAccum: () => { tickTimeAccum = 0; },
|
|
218
|
+
getTickCount: () => tickCount,
|
|
219
|
+
setGCController: (ctrl) => { gcController = ctrl; },
|
|
220
|
+
stop: () => { running = false; loopActive = false; clearLoopTimer(); },
|
|
221
|
+
events,
|
|
222
|
+
};
|
|
223
|
+
/** Arm the next loop iteration — the ONLY place a loop timer is created. */
|
|
224
|
+
function scheduleLoop(delay) {
|
|
225
|
+
if (!loopActive)
|
|
226
|
+
return;
|
|
227
|
+
if (loopTimer !== null)
|
|
228
|
+
clearTimeout(loopTimer); // never stack timers
|
|
229
|
+
loopTimer = setTimeout(() => {
|
|
230
|
+
loopTimer = null;
|
|
231
|
+
void loop();
|
|
232
|
+
}, delay);
|
|
233
|
+
}
|
|
234
|
+
function clearLoopTimer() {
|
|
235
|
+
if (loopTimer !== null) {
|
|
236
|
+
clearTimeout(loopTimer);
|
|
237
|
+
loopTimer = null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
async function loop() {
|
|
241
|
+
if (!running || !loopActive)
|
|
242
|
+
return;
|
|
243
|
+
try {
|
|
244
|
+
const now = performance.now();
|
|
245
|
+
const elapsed = now - lastTick;
|
|
246
|
+
if (elapsed >= tickMs) {
|
|
247
|
+
lastTick = now - (elapsed % tickMs);
|
|
248
|
+
if (!paused || stepOnce) {
|
|
249
|
+
// Only accumulate sim time when actually stepping. While paused,
|
|
250
|
+
// lastTick still advances (above) so we don't get a huge elapsed
|
|
251
|
+
// spike on resume, but we must NOT let tickAccumulator build up.
|
|
252
|
+
//
|
|
253
|
+
// Credit only WHOLE tick periods: the fractional remainder stays
|
|
254
|
+
// owed in lastTick's phase (the snap above) and is re-measured as
|
|
255
|
+
// part of the next elapsed. Crediting elapsed/tickMs fractionally
|
|
256
|
+
// here AND keeping the remainder in lastTick counts it twice —
|
|
257
|
+
// every late-timer remainder leaks ~its size in extra sim time,
|
|
258
|
+
// so the sim ran measurably fast under timer jitter.
|
|
259
|
+
tickAccumulator += Math.floor(elapsed / tickMs) * speedMultiplier;
|
|
260
|
+
let steps = 0;
|
|
261
|
+
const maxSteps = stepOnce ? 1 : maxStepsPerFrame;
|
|
262
|
+
while (tickAccumulator >= 1 && steps < maxSteps) {
|
|
263
|
+
tickCount++;
|
|
264
|
+
const tickStart = performance.now();
|
|
265
|
+
const tick = Promise.resolve(opts.onTick(opts.fixedDt, { tickCount, frameCount, fps, rng }));
|
|
266
|
+
tickInFlight = tick;
|
|
267
|
+
try {
|
|
268
|
+
await tick;
|
|
269
|
+
}
|
|
270
|
+
finally {
|
|
271
|
+
tickInFlight = null;
|
|
272
|
+
}
|
|
273
|
+
const tickDurationUs = (performance.now() - tickStart) * 1000;
|
|
274
|
+
tickTimeAccum += tickDurationUs / 1000;
|
|
275
|
+
// Record task latency for the flame graph + histogram
|
|
276
|
+
recordTaskLatency("js", tickDurationUs, "tick");
|
|
277
|
+
// Fire instantaneous tick-latency warning (if configured)
|
|
278
|
+
getWarningEngine()?.checkInstant(METRIC_TICK_LATENCY, tickDurationUs);
|
|
279
|
+
if (!loopActive)
|
|
280
|
+
return; // resize/withLoopStopped interrupted
|
|
281
|
+
tickAccumulator -= 1;
|
|
282
|
+
steps++;
|
|
283
|
+
}
|
|
284
|
+
// Clamp accumulator if we hit the step cap (death spiral prevention)
|
|
285
|
+
if (tickAccumulator > maxStepsPerFrame) {
|
|
286
|
+
tickAccumulator = 0;
|
|
287
|
+
}
|
|
288
|
+
if (stepOnce) {
|
|
289
|
+
stepOnce = false;
|
|
290
|
+
paused = true;
|
|
291
|
+
tickAccumulator = 0;
|
|
292
|
+
}
|
|
293
|
+
// Once-per-frame callback (after all ticks this frame)
|
|
294
|
+
if (steps > 0) {
|
|
295
|
+
opts.onAfterTicks?.({
|
|
296
|
+
ticksThisFrame: steps,
|
|
297
|
+
tickCount,
|
|
298
|
+
frameCount,
|
|
299
|
+
fps,
|
|
300
|
+
});
|
|
301
|
+
// SAB polyfill: sync written regions to the main thread after
|
|
302
|
+
// each tick batch. No-op when real SAB is available (desktop).
|
|
303
|
+
// When onSyncFastRegions is provided, use throttled sync:
|
|
304
|
+
// - Every tick batch: sync only fast regions (header, entities)
|
|
305
|
+
// - Every N tick batches: sync ALL regions (including grids)
|
|
306
|
+
if (syncWorker) {
|
|
307
|
+
if (syncFastRegions) {
|
|
308
|
+
syncWorker.syncToMain(syncFastRegions);
|
|
309
|
+
syncSlowCounter++;
|
|
310
|
+
if (syncSlowCounter >= syncSlowInterval) {
|
|
311
|
+
syncWorker.syncToMain();
|
|
312
|
+
syncSlowCounter = 0;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
syncWorker.syncToMain();
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
// Flush profiling data (ThreadMetrics + EventLoop + instant warnings)
|
|
320
|
+
flushProfilingTick();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Offer post-tick headroom to the GC controller for proactive
|
|
324
|
+
// collection (same contract as SimWorkerLoop).
|
|
325
|
+
if (gcController) {
|
|
326
|
+
const headroom = tickMs - (performance.now() - now);
|
|
327
|
+
if (headroom > 0) {
|
|
328
|
+
gcController.maybeCollect(headroom, tickMs);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
frameCount++;
|
|
333
|
+
fpsTimer += elapsed;
|
|
334
|
+
if (fpsTimer >= 1000) {
|
|
335
|
+
fps = Math.round((frameCount * 1000) / fpsTimer);
|
|
336
|
+
frameCount = 0;
|
|
337
|
+
fpsTimer = 0;
|
|
338
|
+
}
|
|
339
|
+
// Sleep until the next tick is due instead of spinning with setTimeout(0).
|
|
340
|
+
// The deadline is phase-aligned: lastTick holds the fractional
|
|
341
|
+
// `elapsed % tickMs` remainder from the snap above, so the next tick is
|
|
342
|
+
// due at lastTick + tickMs — NOT a fresh tickMs from now. Sleeping a
|
|
343
|
+
// whole tickMs per iteration discards that remainder: whenever the
|
|
344
|
+
// remainder + timer jitter was smaller than this iteration's work, the
|
|
345
|
+
// loop woke before the deadline, did nothing, and slept another full
|
|
346
|
+
// tickMs — producing alternating normal/doubled tick intervals.
|
|
347
|
+
// If the accumulator still holds owed ticks (step cap was hit), they're
|
|
348
|
+
// spent on the next due iteration — the backlog is clamped to
|
|
349
|
+
// maxStepsPerFrame so a deadline wait is never more than ~tickMs.
|
|
350
|
+
const remaining = lastTick + tickMs - performance.now();
|
|
351
|
+
// Compensate for setTimeout's integer truncation: accumulate the sub-ms
|
|
352
|
+
// fractional part and add 1ms when it exceeds 1ms, so the average delay
|
|
353
|
+
// matches the desired interval exactly. Without this, a fractional tickMs
|
|
354
|
+
// (e.g. 33.333 for 30Hz) loses ~0.333ms per iteration to truncation,
|
|
355
|
+
// causing a ~3.3s periodic oscillation in the effective tick rate.
|
|
356
|
+
const intRemaining = Math.max(0, Math.floor(remaining));
|
|
357
|
+
timerRemainder += remaining - intRemaining;
|
|
358
|
+
let delay = intRemaining;
|
|
359
|
+
if (timerRemainder >= 1) {
|
|
360
|
+
delay += 1;
|
|
361
|
+
timerRemainder -= 1;
|
|
362
|
+
}
|
|
363
|
+
scheduleLoop(delay);
|
|
364
|
+
}
|
|
365
|
+
catch (e) {
|
|
366
|
+
const err = e;
|
|
367
|
+
log.error("create-sim-worker", `Loop error: ${err.message}\n${err.stack}`);
|
|
368
|
+
opts.onError?.(err);
|
|
369
|
+
scheduleLoop(100);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
const standardApi = {
|
|
373
|
+
async init(sab, ...args) {
|
|
374
|
+
await opts.onInit(sab, control, ...args);
|
|
375
|
+
// SAB polyfill: set up buffer sync if SAB is unavailable and the game
|
|
376
|
+
// provided a sync config. The BufferSyncWorker posts written regions
|
|
377
|
+
// to the main thread after each tick batch (see syncToMain() above).
|
|
378
|
+
if (!usingRealSAB && opts.onSyncConfig) {
|
|
379
|
+
const { BufferSyncWorker: BSW } = await import("./buffer-sync.js");
|
|
380
|
+
syncWorker = new BSW(opts.onSyncConfig(sab));
|
|
381
|
+
syncWorker.start();
|
|
382
|
+
// Sync initial state (e.g. board data written during onInit) to the
|
|
383
|
+
// main thread immediately — the sim may be paused at startup and
|
|
384
|
+
// syncToMain() won't be called until the first tick batch.
|
|
385
|
+
syncWorker.syncToMain();
|
|
386
|
+
}
|
|
387
|
+
running = true;
|
|
388
|
+
loopActive = true;
|
|
389
|
+
paused = opts.startPaused ?? false;
|
|
390
|
+
stepOnce = false;
|
|
391
|
+
speedMultiplier = 1;
|
|
392
|
+
lastTick = performance.now();
|
|
393
|
+
tickAccumulator = 0;
|
|
394
|
+
tickCount = 0;
|
|
395
|
+
frameCount = 0;
|
|
396
|
+
fpsTimer = 0;
|
|
397
|
+
fps = 0;
|
|
398
|
+
timerRemainder = 0;
|
|
399
|
+
clearLoopTimer();
|
|
400
|
+
events.emit("ready", {});
|
|
401
|
+
void loop();
|
|
402
|
+
},
|
|
403
|
+
async resize(...args) {
|
|
404
|
+
if (!opts.onResize)
|
|
405
|
+
return;
|
|
406
|
+
// Use withLoopStopped to safely pause the loop during resize.
|
|
407
|
+
// This prevents races between onTick() and onResize() when both
|
|
408
|
+
// access shared resources (e.g. SandStepPool).
|
|
409
|
+
await control.withLoopStopped(() => opts.onResize(...args));
|
|
410
|
+
},
|
|
411
|
+
async pause() {
|
|
412
|
+
paused = true;
|
|
413
|
+
},
|
|
414
|
+
async resume() {
|
|
415
|
+
paused = false;
|
|
416
|
+
lastTick = performance.now();
|
|
417
|
+
tickAccumulator = 0; // prevent catch-up spike after resume
|
|
418
|
+
},
|
|
419
|
+
async shutdown() {
|
|
420
|
+
running = false;
|
|
421
|
+
loopActive = false;
|
|
422
|
+
clearLoopTimer();
|
|
423
|
+
syncWorker = null; // release sync worker reference
|
|
424
|
+
saveStore = null;
|
|
425
|
+
await opts.onShutdown?.();
|
|
426
|
+
},
|
|
427
|
+
async setSpeed(speed) {
|
|
428
|
+
speedMultiplier = Math.min(opts.maxSpeed ?? Infinity, Math.max(opts.minSpeed ?? 0, speed));
|
|
429
|
+
},
|
|
430
|
+
async step() {
|
|
431
|
+
stepOnce = true;
|
|
432
|
+
paused = false;
|
|
433
|
+
lastTick = performance.now();
|
|
434
|
+
tickAccumulator = 0;
|
|
435
|
+
},
|
|
436
|
+
getStats() {
|
|
437
|
+
return { fps, tick: tickCount, frame: frameCount, tickMs: tickTimeAccum };
|
|
438
|
+
},
|
|
439
|
+
...(opts.save?.capture
|
|
440
|
+
? {
|
|
441
|
+
async save(slotName, saveOpts) {
|
|
442
|
+
const data = await opts.save.capture();
|
|
443
|
+
const capturedBlobs = await opts.save.captureBlobs?.();
|
|
444
|
+
// Always wrap in SaveState.components format so every backend
|
|
445
|
+
// stores the state in the expected component format —
|
|
446
|
+
// FileSaveStore.load() expects each component to have a
|
|
447
|
+
// { v, data } structure.
|
|
448
|
+
const name = opts.save.componentName;
|
|
449
|
+
const components = name
|
|
450
|
+
? { [name]: { v: opts.save.version ?? 1, data } }
|
|
451
|
+
: data;
|
|
452
|
+
const metaExtra = opts.save.meta?.(data, saveOpts);
|
|
453
|
+
const saveStateObj = {
|
|
454
|
+
components,
|
|
455
|
+
meta: {
|
|
456
|
+
engineVersion: "0.0.0",
|
|
457
|
+
timestamp: Date.now() / 1000,
|
|
458
|
+
entityCount: 0,
|
|
459
|
+
playerCount: 0,
|
|
460
|
+
...metaExtra,
|
|
461
|
+
},
|
|
462
|
+
};
|
|
463
|
+
const stateJson = JSON.stringify(saveStateObj.components);
|
|
464
|
+
let gen;
|
|
465
|
+
let success = true;
|
|
466
|
+
if (saveStore) {
|
|
467
|
+
const result = await saveStore.save(slotName, saveStateObj, {
|
|
468
|
+
...saveOpts,
|
|
469
|
+
blobs: capturedBlobs ?? saveOpts?.blobs,
|
|
470
|
+
});
|
|
471
|
+
success = result.success;
|
|
472
|
+
gen = result.gen;
|
|
473
|
+
}
|
|
474
|
+
events.emit("saved", { slotName, stateJson, success, gen, meta: saveStateObj.meta, origin: "renderer" });
|
|
475
|
+
return { slotName, stateJson, success, gen, meta: saveStateObj.meta };
|
|
476
|
+
},
|
|
477
|
+
/**
|
|
478
|
+
* Raw capture payload — no store interaction. Lets a
|
|
479
|
+
* renderer-owned save system (createGameSaveSystem) pull the
|
|
480
|
+
* worker's state and embed it in its own SaveState. Binary
|
|
481
|
+
* payloads (typed arrays) come back in `blobs`, transferred via
|
|
482
|
+
* structured clone.
|
|
483
|
+
*/
|
|
484
|
+
async captureState() {
|
|
485
|
+
const data = await opts.save.capture();
|
|
486
|
+
const blobs = await opts.save.captureBlobs?.();
|
|
487
|
+
return { stateJson: JSON.stringify(data), blobs };
|
|
488
|
+
},
|
|
489
|
+
}
|
|
490
|
+
: {}),
|
|
491
|
+
...(opts.save?.restore
|
|
492
|
+
? {
|
|
493
|
+
async load(slotName, stateJson, loadOpts) {
|
|
494
|
+
let json = stateJson;
|
|
495
|
+
let blobs;
|
|
496
|
+
let gen;
|
|
497
|
+
if (!json && saveStore) {
|
|
498
|
+
const result = await saveStore.load(slotName, loadOpts);
|
|
499
|
+
const payload = opts.save.componentName
|
|
500
|
+
? result.state?.components?.[opts.save.componentName]?.data
|
|
501
|
+
: result.state?.components;
|
|
502
|
+
if (payload !== undefined && payload !== null) {
|
|
503
|
+
json = JSON.stringify(payload);
|
|
504
|
+
blobs = result.blobs;
|
|
505
|
+
gen = result.gen;
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
if (!json) {
|
|
509
|
+
events.emit("loaded", { slotName, success: false });
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
let data = json;
|
|
513
|
+
try {
|
|
514
|
+
data = extractRestoreData(JSON.parse(json));
|
|
515
|
+
}
|
|
516
|
+
catch {
|
|
517
|
+
// not JSON — pass through as-is
|
|
518
|
+
}
|
|
519
|
+
// Stop the loop during restore — mutating sim state while a tick
|
|
520
|
+
// is in flight is a data race.
|
|
521
|
+
await control.withLoopStopped(() => opts.save.restore(data, blobs));
|
|
522
|
+
events.emit("loaded", { slotName, success: true, gen });
|
|
523
|
+
return true;
|
|
524
|
+
},
|
|
525
|
+
async restoreFromState(stateJson, blobs) {
|
|
526
|
+
let data = stateJson;
|
|
527
|
+
try {
|
|
528
|
+
data = extractRestoreData(JSON.parse(stateJson));
|
|
529
|
+
}
|
|
530
|
+
catch {
|
|
531
|
+
// not JSON — pass through as-is
|
|
532
|
+
}
|
|
533
|
+
await control.withLoopStopped(() => opts.save.restore(data, blobs));
|
|
534
|
+
},
|
|
535
|
+
}
|
|
536
|
+
: {}),
|
|
537
|
+
...(opts.save?.createStore
|
|
538
|
+
? {
|
|
539
|
+
async initSaveStore(storeOpts) {
|
|
540
|
+
saveStore = opts.save.createStore(storeOpts);
|
|
541
|
+
await saveStore.init?.();
|
|
542
|
+
},
|
|
543
|
+
}
|
|
544
|
+
: {}),
|
|
545
|
+
...(opts.onCommand
|
|
546
|
+
? {
|
|
547
|
+
async sendCommand(cmd) {
|
|
548
|
+
await opts.onCommand(cmd);
|
|
549
|
+
},
|
|
550
|
+
}
|
|
551
|
+
: {}),
|
|
552
|
+
};
|
|
553
|
+
const api = { ...standardApi, ...(opts.extraApi ?? {}) };
|
|
554
|
+
// Optionally wrap the API before exposing (e.g. with exposeDevToolsApi
|
|
555
|
+
// to add devtools + profiling RPC methods).
|
|
556
|
+
expose(opts.wrapExpose ? opts.wrapExpose(api) : api);
|
|
557
|
+
return control;
|
|
558
|
+
}
|