@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
package/app/README.md
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# `@downdraft/engine/app`
|
|
2
|
+
|
|
3
|
+
Downdraft application runtime — renderer runtime (startGame/GameModule), shared host services, and dev-shell support.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
bun add @downdraft/engine/app
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
See the [Downdraft engine repository](https://github.com/knackstedt/downdraft) for architecture docs and examples.
|
|
@@ -21,13 +21,79 @@
|
|
|
21
21
|
// that need full control can call `bootstrapGame()` directly.
|
|
22
22
|
// ============================================================================
|
|
23
23
|
|
|
24
|
-
import { encodeFeatureLogLine, isDevMode, type RenderSurface } from "@downdraft/engine";
|
|
24
|
+
import { encodeFeatureLogLine, getNativeHost, isDevMode, type RenderSurface } from "@downdraft/engine";
|
|
25
25
|
import { createLogger } from "@downdraft/engine/util/logger";
|
|
26
26
|
import { collectRendererFeatureLog } from "./feature-log";
|
|
27
27
|
import { downdraft, getSurface } from "./index";
|
|
28
28
|
|
|
29
29
|
const log = createLogger("info");
|
|
30
30
|
|
|
31
|
+
// Pre-warm the devtools chunks in dev mode. The dynamic imports below are
|
|
32
|
+
// awaited deep inside async bootstrap frames — if the fetch is still in
|
|
33
|
+
// flight when a dev-session restart clears the runner's module cache, the
|
|
34
|
+
// pending fetch can be dropped unresolved, leaving the async frame suspended
|
|
35
|
+
// forever and pinning the dead generation's renderer/devtools graph. Firing
|
|
36
|
+
// the import at module eval collapses the awaits to a settled-cache lookup.
|
|
37
|
+
const devtoolsModuleP = isDevMode
|
|
38
|
+
? import("@downdraft/engine/modules/devtools")
|
|
39
|
+
: null;
|
|
40
|
+
const devtoolsLibP = isDevMode
|
|
41
|
+
? import("@downdraft/engine/libraries/devtools")
|
|
42
|
+
: null;
|
|
43
|
+
// ./hooks is tiny and same-graph, but pre-warming it too keeps the await at
|
|
44
|
+
// the bottom of bootstrapGame() off the in-flight-fetch path as well.
|
|
45
|
+
const hooksP = import("./hooks");
|
|
46
|
+
// Attach benign handlers so a rejection before the first await isn't flagged
|
|
47
|
+
// as unhandled — awaiting the original promise still propagates the error.
|
|
48
|
+
devtoolsModuleP?.catch(() => {});
|
|
49
|
+
devtoolsLibP?.catch(() => {});
|
|
50
|
+
hooksP.catch(() => {});
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Race an awaited import against session teardown: under the dev shell a
|
|
54
|
+
* fetch can be orphaned mid-flight (module-cache clear drops the pending
|
|
55
|
+
* entry unresolved), which would suspend the awaiting async frame forever —
|
|
56
|
+
* JSC retains suspended frames via their rooted executables, so the frame's
|
|
57
|
+
* captured environment (renderer, module host, devtools host) leaks per
|
|
58
|
+
* restart. Resolving to null lets the caller abandon the work cleanly.
|
|
59
|
+
*/
|
|
60
|
+
function importOrDead<T>(p: Promise<T>, expectedSession?: any): Promise<T | null> {
|
|
61
|
+
const tracker = (globalThis as any).__ddSession;
|
|
62
|
+
if (!tracker || typeof tracker.onDispose !== "function") return p;
|
|
63
|
+
const s = tracker.session;
|
|
64
|
+
// No live session — or a DIFFERENT session than the caller's generation —
|
|
65
|
+
// at await time means this frame belongs to a generation that is already
|
|
66
|
+
// dead. Resolve null now so it unwinds rather than parking on a
|
|
67
|
+
// possibly-orphaned fetch or registering into the wrong session.
|
|
68
|
+
if (!s || s.dead || (expectedSession !== undefined && s !== expectedSession)) {
|
|
69
|
+
return Promise.resolve(null);
|
|
70
|
+
}
|
|
71
|
+
return Promise.race([
|
|
72
|
+
p,
|
|
73
|
+
new Promise<null>((resolve) => {
|
|
74
|
+
tracker.onDispose(() => resolve(null));
|
|
75
|
+
// The registration is dropped when the session is already dying —
|
|
76
|
+
// re-check so the race can't park on a resolve that will never fire.
|
|
77
|
+
if (s.dead || tracker.session !== s) resolve(null);
|
|
78
|
+
}),
|
|
79
|
+
]);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Bail predicate for bootstrapGame's mid-boot awaits. The session snapshot
|
|
83
|
+
* captured at ENTRY is this generation's identity: after any await a restart
|
|
84
|
+
* may have torn it down AND begun a fresh session — checking the tracker's
|
|
85
|
+
* current session alone would let dead-generation continuations register
|
|
86
|
+
* timers/listeners into the new session (which tracks them faithfully,
|
|
87
|
+
* pinning the dead module graph for a whole generation). Also bails when a
|
|
88
|
+
* host restart stripped the DOM polyfill globals. */
|
|
89
|
+
function makeBootGuard(mySession: any): () => boolean {
|
|
90
|
+
const tracker = (globalThis as any).__ddSession;
|
|
91
|
+
return () => {
|
|
92
|
+
if (tracker && (tracker.session !== mySession || !mySession || mySession.dead)) return true;
|
|
93
|
+
return typeof (globalThis as any).window === "undefined";
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
|
|
31
97
|
export interface BootstrapAutosaveOptions {
|
|
32
98
|
/** Load saved state. Returns null if no save exists. */
|
|
33
99
|
load: () => Promise<any | null>;
|
|
@@ -56,6 +122,8 @@ export interface BootstrapDevToolsOptions {
|
|
|
56
122
|
* renderer init — a factory runs when the game's sim worker is already
|
|
57
123
|
* started, e.g. by an overridden onInit). */
|
|
58
124
|
workerHosts?: any[] | ((renderer: any) => any[]);
|
|
125
|
+
/** Extra game-level rows for the Input panel. */
|
|
126
|
+
inputInfo?: () => { key: string; value: string; flags?: number }[];
|
|
59
127
|
/**
|
|
60
128
|
* Enable the profiling system (ProfilingSAB + ProfilingBridge + built-in views).
|
|
61
129
|
* When true, a ProfilingBridge is created and the ProfilingSAB is shared
|
|
@@ -63,6 +131,19 @@ export interface BootstrapDevToolsOptions {
|
|
|
63
131
|
* pre-allocated buffer. Default: false.
|
|
64
132
|
*/
|
|
65
133
|
profiling?: boolean | { sharedSAB?: { sab: SharedArrayBuffer; layout: unknown } };
|
|
134
|
+
/**
|
|
135
|
+
* Devtools UI frontend. "blitz" (default) mounts the docked in-window UI
|
|
136
|
+
* (F12 toggles); "web" starts the loopback browser frontend
|
|
137
|
+
* (WebDevtoolsHost, requires Bun); "none" wires data only.
|
|
138
|
+
* Object form: `{ kind: "blitz", dockFraction?, autoShow?, toggleKey? }`.
|
|
139
|
+
* `DOWNDRAFT_DISABLE_DEVTOOLS=1` forces "none".
|
|
140
|
+
*/
|
|
141
|
+
ui?: "blitz" | "web" | "none" | {
|
|
142
|
+
kind?: "blitz" | "web";
|
|
143
|
+
dockFraction?: number;
|
|
144
|
+
autoShow?: boolean;
|
|
145
|
+
toggleKey?: string | null;
|
|
146
|
+
};
|
|
66
147
|
}
|
|
67
148
|
|
|
68
149
|
export interface BootstrapGameOptions {
|
|
@@ -128,6 +209,8 @@ export interface BootstrapGameOptions {
|
|
|
128
209
|
* partial composition can use the individual hooks from `./hooks.ts` instead.
|
|
129
210
|
*/
|
|
130
211
|
export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
|
|
212
|
+
const bootSession = (globalThis as any).__ddSession?.session ?? null;
|
|
213
|
+
const bootAborted = makeBootGuard(bootSession);
|
|
131
214
|
const canvasLayer = opts.canvasLayer ?? 0;
|
|
132
215
|
const deterministic = downdraft?.deterministic === true;
|
|
133
216
|
|
|
@@ -137,17 +220,21 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
|
|
|
137
220
|
// 3. Create + init renderer
|
|
138
221
|
const renderer = opts.createRenderer(surface);
|
|
139
222
|
if (opts.initRenderer) {
|
|
140
|
-
const ok = await opts.initRenderer(renderer);
|
|
223
|
+
const ok = await importOrDead(Promise.resolve(opts.initRenderer(renderer)), bootSession);
|
|
224
|
+
if (ok === null) return;
|
|
141
225
|
if (!ok) {
|
|
142
|
-
log.error("
|
|
226
|
+
log.error("bootstrap-game", "Renderer init failed");
|
|
143
227
|
return;
|
|
144
228
|
}
|
|
145
229
|
}
|
|
230
|
+
if (bootAborted()) return;
|
|
146
231
|
|
|
147
232
|
// 4. Wire DevTools (if provided) — runs BEFORE onRendererInit so that
|
|
148
233
|
// games can access the ProfilingBridge + __sceneInspector API in onReady.
|
|
149
234
|
if (opts.devtools) {
|
|
150
|
-
const
|
|
235
|
+
const devtoolsMod = await importOrDead(devtoolsModuleP ?? import("@downdraft/engine/modules/devtools"), bootSession);
|
|
236
|
+
if (!devtoolsMod) return;
|
|
237
|
+
const { initDevTools } = devtoolsMod;
|
|
151
238
|
const simStatsProvider = opts.devtools.createSimStatsProvider?.(renderer);
|
|
152
239
|
const panels = typeof opts.devtools.panels === "function"
|
|
153
240
|
? opts.devtools.panels(renderer)
|
|
@@ -155,21 +242,149 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
|
|
|
155
242
|
const workerHosts = typeof opts.devtools.workerHosts === "function"
|
|
156
243
|
? opts.devtools.workerHosts(renderer)
|
|
157
244
|
: opts.devtools.workerHosts;
|
|
158
|
-
await initDevTools(renderer, {
|
|
245
|
+
const devtoolsBridge = await importOrDead(initDevTools(renderer, {
|
|
159
246
|
simStatsProvider,
|
|
160
247
|
panels,
|
|
161
248
|
sceneInspector: opts.devtools.sceneInspector,
|
|
162
249
|
bridgeClass: opts.devtools.bridgeClass,
|
|
163
250
|
workerHosts,
|
|
164
251
|
profiling: opts.devtools.profiling as any,
|
|
165
|
-
});
|
|
252
|
+
}), bootSession);
|
|
253
|
+
if (!devtoolsBridge) return;
|
|
254
|
+
if (bootAborted()) {
|
|
255
|
+
try { devtoolsBridge.destroy(); } catch {}
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
// The bridge exposes `window.__sceneInspector` on the PERSISTENT window —
|
|
259
|
+
// its methods close over `renderer`, so without a destroy on session
|
|
260
|
+
// teardown the old session's renderer (and through it the whole module
|
|
261
|
+
// graph) stays rooted across hot-reload restarts.
|
|
262
|
+
const hooksMod = await importOrDead(hooksP, bootSession);
|
|
263
|
+
if (!hooksMod) return;
|
|
264
|
+
hooksMod.dispose(() => { try { devtoolsBridge.destroy(); } catch {} });
|
|
265
|
+
|
|
266
|
+
// 4a. Profiling wiring — `profiling: true` allocates the SAB + bridge,
|
|
267
|
+
// but without this nothing ticks the bridge or shares the SAB with
|
|
268
|
+
// workers, so the perf tab would only ever report the main thread.
|
|
269
|
+
// wireProfilingBridge guards against games that also call it
|
|
270
|
+
// manually; worker-side attach is idempotent.
|
|
271
|
+
if (opts.devtools.profiling) {
|
|
272
|
+
try {
|
|
273
|
+
const mod = await importOrDead(devtoolsModuleP ?? import("@downdraft/engine/modules/devtools"), bootSession);
|
|
274
|
+
if (!mod) return;
|
|
275
|
+
const { wireProfilingBridge } = mod;
|
|
276
|
+
const bridge =
|
|
277
|
+
(globalThis as Record<string, any>).window?.__sceneInspector?.__getProfilingBridge?.()
|
|
278
|
+
?? (globalThis as Record<string, any>).__sceneInspector?.__getProfilingBridge?.()
|
|
279
|
+
?? null;
|
|
280
|
+
if (bridge) {
|
|
281
|
+
// workerHosts entries are {prefix, proxy} — the devtools proxy
|
|
282
|
+
// exposes __profilingAttach via exposeDevToolsApi → wrap each into
|
|
283
|
+
// the ProfilingWireHost surface wireProfilingBridge expects.
|
|
284
|
+
const hosts: Array<{ host: { attachProfilingSAB(sab: SharedArrayBuffer, o?: any): Promise<void> }; workerTag?: string }> = [];
|
|
285
|
+
(workerHosts ?? []).forEach((wh: any) => {
|
|
286
|
+
const proxy = wh?.proxy;
|
|
287
|
+
if (typeof proxy?.__profilingAttach !== "function") return;
|
|
288
|
+
const prefix = wh?.prefix;
|
|
289
|
+
hosts.push({
|
|
290
|
+
host: {
|
|
291
|
+
attachProfilingSAB: async (sab, o) => {
|
|
292
|
+
await proxy.__profilingAttach(sab, {
|
|
293
|
+
workerTag: o?.workerTag ?? prefix ?? "worker",
|
|
294
|
+
layout: o?.layout,
|
|
295
|
+
});
|
|
296
|
+
},
|
|
297
|
+
},
|
|
298
|
+
workerTag: prefix,
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
// The native services worker (save + SQLite) exposes the same
|
|
302
|
+
// profiling RPC — claim a slot for it too.
|
|
303
|
+
const services = (getNativeHost() as any)?.services;
|
|
304
|
+
if (typeof services?.api?.__profilingAttach === "function") {
|
|
305
|
+
hosts.push({
|
|
306
|
+
host: {
|
|
307
|
+
attachProfilingSAB: async (sab, o) => {
|
|
308
|
+
await services.api.__profilingAttach(sab, {
|
|
309
|
+
workerTag: "services",
|
|
310
|
+
layout: o?.layout,
|
|
311
|
+
});
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
workerTag: "services",
|
|
315
|
+
});
|
|
316
|
+
}
|
|
317
|
+
wireProfilingBridge({ renderer, bridge, workerHosts: hosts });
|
|
318
|
+
}
|
|
319
|
+
} catch (err) {
|
|
320
|
+
log.warn("bootstrap-game", `profiling wiring failed: ${err}`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// 4b. Devtools UI frontend — the Blitz dock is the default surface.
|
|
325
|
+
const disabled = typeof process !== "undefined" && !!process.env?.DOWNDRAFT_DISABLE_DEVTOOLS;
|
|
326
|
+
const uiOpt = opts.devtools.ui ?? "blitz";
|
|
327
|
+
const uiKind = disabled ? "none" : (typeof uiOpt === "string" ? uiOpt : uiOpt.kind ?? "blitz");
|
|
328
|
+
if (uiKind !== "none" && typeof renderer.useRendererModule === "function") {
|
|
329
|
+
try {
|
|
330
|
+
const uiCfg = typeof uiOpt === "object" ? uiOpt : {};
|
|
331
|
+
const profilingSAB =
|
|
332
|
+
(globalThis as Record<string, any>).window?.__sceneInspector?.__getProfilingBridge?.()?.getProfilingSAB?.()
|
|
333
|
+
?? (globalThis as Record<string, any>).__sceneInspector?.__getProfilingBridge?.()?.getProfilingSAB?.()
|
|
334
|
+
?? null;
|
|
335
|
+
if (uiKind === "blitz") {
|
|
336
|
+
const mod = await importOrDead(devtoolsModuleP ?? import("@downdraft/engine/modules/devtools"), bootSession);
|
|
337
|
+
if (!mod) return;
|
|
338
|
+
const { createDevtoolsUiModule } = mod;
|
|
339
|
+
renderer.useRendererModule(createDevtoolsUiModule({
|
|
340
|
+
renderer,
|
|
341
|
+
profilingSAB,
|
|
342
|
+
dockFraction: uiCfg.dockFraction,
|
|
343
|
+
autoShow: uiCfg.autoShow,
|
|
344
|
+
toggleKey: uiCfg.toggleKey,
|
|
345
|
+
onHost: (host) => {
|
|
346
|
+
renderer.nativeDebugger = host;
|
|
347
|
+
wireDevtoolsFrontend(host.devtoolsMirror, host, renderer, workerHosts, profilingSAB, opts.devtools?.inputInfo, bootSession);
|
|
348
|
+
},
|
|
349
|
+
}));
|
|
350
|
+
} else {
|
|
351
|
+
// "web" — loopback browser frontend (Bun-only transport).
|
|
352
|
+
const libMod = await importOrDead(devtoolsLibP ?? import("@downdraft/engine/libraries/devtools"), bootSession);
|
|
353
|
+
if (!libMod) return;
|
|
354
|
+
const { WebDevtoolsHost } = libMod;
|
|
355
|
+
const webHost = new WebDevtoolsHost({
|
|
356
|
+
device: renderer.getDevice?.() as GPUDevice,
|
|
357
|
+
adapter: null as any,
|
|
358
|
+
targetFormat: renderer.getFormat?.() ?? "bgra8unorm",
|
|
359
|
+
width: 0, height: 0,
|
|
360
|
+
renderer,
|
|
361
|
+
profilingSAB,
|
|
362
|
+
});
|
|
363
|
+
await webHost.start();
|
|
364
|
+
renderer.nativeDebugger = webHost;
|
|
365
|
+
wireDevtoolsFrontend(webHost.devtoolsMirror, webHost, renderer, workerHosts, profilingSAB, opts.devtools?.inputInfo, bootSession);
|
|
366
|
+
// Per-frame pump + F12 through the renderer's input bus, same as
|
|
367
|
+
// the Blitz module's wiring.
|
|
368
|
+
renderer.setCallbacks?.({
|
|
369
|
+
...renderer.getCallbacks?.(),
|
|
370
|
+
beforeFrame: ((prev: any) => (dt: number, t: number) => {
|
|
371
|
+
try { webHost.update(); } catch { /* ignore */ }
|
|
372
|
+
prev?.(dt, t);
|
|
373
|
+
})(renderer.getCallbacks?.().beforeFrame),
|
|
374
|
+
});
|
|
375
|
+
}
|
|
376
|
+
} catch (err) {
|
|
377
|
+
log.error("bootstrap-game", `Devtools UI init failed: ${err}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
166
380
|
}
|
|
167
381
|
|
|
168
|
-
//
|
|
382
|
+
// 4c. onRendererInit — library setup, sim start, game-specific wiring (onReady).
|
|
169
383
|
// DevTools is already wired, so games can access __sceneInspector +
|
|
170
384
|
// the ProfilingBridge from their onReady hook.
|
|
171
385
|
if (opts.onRendererInit) {
|
|
172
|
-
await opts.onRendererInit(renderer);
|
|
386
|
+
await importOrDead(Promise.resolve(opts.onRendererInit(renderer)), bootSession);
|
|
387
|
+
if (bootAborted()) return;
|
|
173
388
|
}
|
|
174
389
|
|
|
175
390
|
// 5. Start the render loop immediately — don't let a hung autosave load
|
|
@@ -191,16 +406,19 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
|
|
|
191
406
|
deterministic,
|
|
192
407
|
getActiveModules: opts.getActiveModules,
|
|
193
408
|
});
|
|
194
|
-
log.info("
|
|
409
|
+
log.info("bootstrap-game", encodeFeatureLogLine(renderFeatureLog));
|
|
195
410
|
|
|
196
|
-
// 7. FPS polling (if onFpsUpdate provided)
|
|
411
|
+
// 7. FPS polling (if onFpsUpdate provided). unref so the interval can't
|
|
412
|
+
// pin the runtime after the window closes (packaged mode has no session
|
|
413
|
+
// tracker to clear it).
|
|
197
414
|
if (opts.onFpsUpdate) {
|
|
198
415
|
const fpsInterval = opts.fpsPollIntervalMs ?? 500;
|
|
199
|
-
setInterval(() => {
|
|
416
|
+
const id = setInterval(() => {
|
|
200
417
|
if (typeof renderer.getFPS === "function") {
|
|
201
418
|
opts.onFpsUpdate!(renderer.getFPS());
|
|
202
419
|
}
|
|
203
420
|
}, fpsInterval);
|
|
421
|
+
(id as any)?.unref?.();
|
|
204
422
|
}
|
|
205
423
|
|
|
206
424
|
// 8. Display info wiring (if onDisplayInfo provided)
|
|
@@ -228,40 +446,49 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
|
|
|
228
446
|
const intervalMs = autosaveOpts.intervalMs ?? 3000;
|
|
229
447
|
|
|
230
448
|
try {
|
|
231
|
-
|
|
449
|
+
// The inner race's timeout leg is session-tracked — teardown sweeps it
|
|
450
|
+
// unresolved — so the whole race is additionally raced against session
|
|
451
|
+
// teardown via importOrDead (returns null → bootAborted bails below).
|
|
452
|
+
const saved = await importOrDead(Promise.race([
|
|
232
453
|
autosaveOpts.load(),
|
|
233
454
|
new Promise<null>((r) => setTimeout(() => r(null), 5000)),
|
|
234
|
-
]);
|
|
455
|
+
]), bootSession);
|
|
235
456
|
if (saved && autosaveOpts.onLoad) {
|
|
236
457
|
await autosaveOpts.onLoad(saved);
|
|
237
458
|
}
|
|
238
459
|
} catch (e) {
|
|
239
|
-
log.warn("
|
|
460
|
+
log.warn("bootstrap-game", `Autosave load failed: ${e}`);
|
|
240
461
|
}
|
|
462
|
+
// A restart landing during the load await must not leave this dead
|
|
463
|
+
// generation's save interval registered into the NEXT live session.
|
|
464
|
+
if (bootAborted()) return;
|
|
241
465
|
|
|
242
466
|
let saveInProgress = false;
|
|
243
|
-
setInterval(async () => {
|
|
467
|
+
const id = setInterval(async () => {
|
|
244
468
|
if (saveInProgress) return;
|
|
245
469
|
saveInProgress = true;
|
|
246
470
|
try {
|
|
247
471
|
await autosaveOpts.save();
|
|
248
472
|
} catch (e) {
|
|
249
|
-
log.warn("
|
|
473
|
+
log.warn("bootstrap-game", `Autosave save failed: ${e}`);
|
|
250
474
|
} finally {
|
|
251
475
|
saveInProgress = false;
|
|
252
476
|
}
|
|
253
477
|
}, intervalMs);
|
|
478
|
+
(id as any)?.unref?.();
|
|
254
479
|
}
|
|
480
|
+
if (bootAborted()) return;
|
|
255
481
|
|
|
256
482
|
// 10. MCP setup (if provided)
|
|
257
483
|
if (opts.mcp) {
|
|
258
|
-
await opts.mcp();
|
|
484
|
+
await importOrDead(Promise.resolve(opts.mcp()), bootSession);
|
|
259
485
|
}
|
|
260
486
|
|
|
261
487
|
// 11. Hot-reload dispose (if provided)
|
|
262
488
|
if (opts.onHotReloadDispose) {
|
|
263
|
-
const
|
|
264
|
-
|
|
489
|
+
const hooksMod = await importOrDead(hooksP, bootSession);
|
|
490
|
+
if (!hooksMod) return;
|
|
491
|
+
hooksMod.dispose(opts.onHotReloadDispose);
|
|
265
492
|
}
|
|
266
493
|
|
|
267
494
|
// 12. Deterministic callbacks (if onDeterministic provided)
|
|
@@ -269,3 +496,52 @@ export async function bootstrapGame(opts: BootstrapGameOptions): Promise<void> {
|
|
|
269
496
|
opts.onDeterministic(renderer);
|
|
270
497
|
}
|
|
271
498
|
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Shared wiring for a live devtools frontend (Blitz dock or web host):
|
|
502
|
+
* engine-generic providers + thread evals derived from the devtools
|
|
503
|
+
* workerHosts entries ({prefix, proxy} — proxies exposing __devtoolsEval
|
|
504
|
+
* get a REPL target under their prefix name).
|
|
505
|
+
*/
|
|
506
|
+
async function wireDevtoolsFrontend(
|
|
507
|
+
mirror: { registerProvider?: any; registerCommandHandler?: any },
|
|
508
|
+
host: { registerThreadEval: (n: string, fn: (e: string) => Promise<{ result?: unknown; error?: string }>) => void },
|
|
509
|
+
renderer: any,
|
|
510
|
+
workerHosts: any[] | undefined,
|
|
511
|
+
profilingSAB: SharedArrayBuffer | null,
|
|
512
|
+
inputInfo?: () => { key: string; value: string; flags?: number }[],
|
|
513
|
+
bootSession?: any,
|
|
514
|
+
): Promise<void> {
|
|
515
|
+
const mod = await importOrDead(devtoolsLibP ?? import("@downdraft/engine/libraries/devtools"), bootSession);
|
|
516
|
+
// If the dev session died while the import was in flight, abandon the
|
|
517
|
+
// wiring — registering providers now would root the dead generation's
|
|
518
|
+
// context through persistent host closures.
|
|
519
|
+
if (!mod) return;
|
|
520
|
+
const { registerEngineProviders } = mod;
|
|
521
|
+
// Main-thread REPL evaluates directly in this context — Bun's inspector
|
|
522
|
+
// doesn't implement Runtime.evaluate, and a direct eval works on every
|
|
523
|
+
// runtime. Registered evals take precedence over the CDP fallback.
|
|
524
|
+
host.registerThreadEval("main", async (expr) => {
|
|
525
|
+
try {
|
|
526
|
+
return { result: (0, eval)(expr) };
|
|
527
|
+
} catch (e) {
|
|
528
|
+
return { error: e instanceof Error ? `${e.name}: ${e.message}` : String(e) };
|
|
529
|
+
}
|
|
530
|
+
});
|
|
531
|
+
const evalNames: string[] = ["main"];
|
|
532
|
+
for (const wh of workerHosts ?? []) {
|
|
533
|
+
const evalFn = wh?.proxy?.__devtoolsEval;
|
|
534
|
+
if (typeof evalFn === "function" && wh.prefix) {
|
|
535
|
+
host.registerThreadEval(wh.prefix, (expr) => evalFn.call(wh.proxy, expr));
|
|
536
|
+
evalNames.push(wh.prefix);
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
registerEngineProviders(mirror as any, {
|
|
540
|
+
renderer,
|
|
541
|
+
profilingSAB,
|
|
542
|
+
simProxy: workerHosts?.[0]?.proxy ?? undefined,
|
|
543
|
+
evalTargetNames: () => evalNames,
|
|
544
|
+
inputInfo,
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
@@ -88,6 +88,12 @@ export interface GameSimWorker {
|
|
|
88
88
|
restoreFromState?(stateJson: string): Promise<void>;
|
|
89
89
|
hotReload?(config: unknown, preserveState: boolean): Promise<void>;
|
|
90
90
|
getDevToolsProxy?(): unknown;
|
|
91
|
+
/** Stop and terminate the worker. Entry points call this on window close —
|
|
92
|
+
* an unstopped worker's loop pins the runtime and the process never exits.
|
|
93
|
+
* Optional: bespoke workers without it leak-stop via `worker.unref()`. */
|
|
94
|
+
stop?(): Promise<void> | void;
|
|
95
|
+
/** Alias for stop() on some host implementations (BaseWorkerHost). */
|
|
96
|
+
shutdown?(): Promise<void> | void;
|
|
91
97
|
}
|
|
92
98
|
|
|
93
99
|
/** Optional seed passed to the sim worker factory. */
|
|
@@ -174,7 +180,7 @@ export function serializeRestorePayload(
|
|
|
174
180
|
if (explicit) {
|
|
175
181
|
const comp = components[explicit];
|
|
176
182
|
if (!comp) {
|
|
177
|
-
log.warn("
|
|
183
|
+
log.warn("start-game", `Save component "${explicit}" not found; available: ${Object.keys(components).join(", ")}`);
|
|
178
184
|
return undefined;
|
|
179
185
|
}
|
|
180
186
|
return JSON.stringify(comp.data);
|
|
@@ -474,6 +480,18 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
474
480
|
const isDev = !!(downdraft?.isDev) || isDevMode;
|
|
475
481
|
const hasSim = !!module.sim;
|
|
476
482
|
|
|
483
|
+
// Dev-session guard: capture the session snapshot this boot belongs to.
|
|
484
|
+
// If an HMR restart lands while a boot-stage await below is suspended, the
|
|
485
|
+
// continuation belongs to a dead generation — and the tracker by then may
|
|
486
|
+
// already host the NEXT session, which would happily track this dead gen's
|
|
487
|
+
// listeners/timers (pinning its whole module graph for a generation). Bail
|
|
488
|
+
// instead. No tracker → production mode → never aborts.
|
|
489
|
+
const ddTracker = (globalThis as any).__ddSession;
|
|
490
|
+
const bootSession = ddTracker?.session ?? null;
|
|
491
|
+
const sessionAborted = () =>
|
|
492
|
+
(!!ddTracker && (ddTracker.session !== bootSession || !bootSession || bootSession.dead))
|
|
493
|
+
|| typeof (globalThis as any).window === "undefined";
|
|
494
|
+
|
|
477
495
|
// 0. Resolve the render surface (NativeSurface on the native runtime)
|
|
478
496
|
const surface = getSurface(module.canvasLayer ?? 0);
|
|
479
497
|
|
|
@@ -515,7 +533,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
515
533
|
// If libraries declared, pass the library-allocated SABs to the sim
|
|
516
534
|
// factory via a seed object so the sim can share them zero-copy.
|
|
517
535
|
const simSeed = Object.keys(libBuffers).length > 0 ? { libraryBuffers: libBuffers } : undefined;
|
|
518
|
-
const simWorker = hasSim ? module.sim!(simSeed
|
|
536
|
+
const simWorker = hasSim ? module.sim!(simSeed) : null;
|
|
519
537
|
const simSAB = simWorker?.getSimBuffer();
|
|
520
538
|
const inputSAB = simWorker?.getInputBuffer();
|
|
521
539
|
const extraBuffers = simWorker?.getExtraBuffers?.() ?? {};
|
|
@@ -542,6 +560,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
542
560
|
// 3b. Merge library SABs into extraBuffers + store host on ctx
|
|
543
561
|
if (libHost) {
|
|
544
562
|
for (const [name, sab] of Object.entries(libBuffers)) {
|
|
563
|
+
if (name in ctx.extraBuffers) {
|
|
564
|
+
log.warn("start-game", `library SAB channel "${name}" shadows a same-named sim extra buffer in ctx.extraBuffers`);
|
|
565
|
+
}
|
|
545
566
|
ctx.extraBuffers[name] = sab;
|
|
546
567
|
}
|
|
547
568
|
ctx.libraryHost = libHost;
|
|
@@ -578,10 +599,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
578
599
|
try {
|
|
579
600
|
handler(msg.data, ctx);
|
|
580
601
|
} catch (err) {
|
|
581
|
-
log.error("
|
|
602
|
+
log.error("start-game", `Event handler error for "${msg.kind}": ${err}`);
|
|
582
603
|
}
|
|
583
604
|
} else if (isDev && !ENGINE_EMITTED_EVENT_KINDS.has(msg.kind)) {
|
|
584
|
-
log.warn("
|
|
605
|
+
log.warn("start-game", `Unhandled sim event kind: "${msg.kind}"`);
|
|
585
606
|
}
|
|
586
607
|
});
|
|
587
608
|
};
|
|
@@ -590,6 +611,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
590
611
|
// 5. Run onBeforeInit hook
|
|
591
612
|
if (module.onBeforeInit) {
|
|
592
613
|
await module.onBeforeInit(ctx);
|
|
614
|
+
if (sessionAborted()) return;
|
|
593
615
|
}
|
|
594
616
|
|
|
595
617
|
// 6. Initialize save store (if configured) — for non-inline modes this
|
|
@@ -623,9 +645,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
623
645
|
: resolvedMode === "worker" ? "worker" : "host";
|
|
624
646
|
}
|
|
625
647
|
} catch (e) {
|
|
626
|
-
log.warn("
|
|
648
|
+
log.warn("start-game", `Save store init failed, falling back to host bridge: ${e}`);
|
|
627
649
|
ctx.saveMode = "host";
|
|
628
650
|
}
|
|
651
|
+
if (sessionAborted()) return;
|
|
629
652
|
}
|
|
630
653
|
|
|
631
654
|
// 6b. Mode-aware save/load helpers — exposed on ctx so games can trigger manual
|
|
@@ -667,7 +690,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
667
690
|
}
|
|
668
691
|
return result?.success ?? false;
|
|
669
692
|
} catch (e) {
|
|
670
|
-
log.error("
|
|
693
|
+
log.error("start-game", `Manual save failed: ${e}`);
|
|
671
694
|
return false;
|
|
672
695
|
}
|
|
673
696
|
};
|
|
@@ -737,12 +760,27 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
737
760
|
}
|
|
738
761
|
return null;
|
|
739
762
|
} catch (e) {
|
|
740
|
-
log.error("
|
|
763
|
+
log.error("start-game", `Manual load failed: ${e}`);
|
|
741
764
|
return null;
|
|
742
765
|
}
|
|
743
766
|
};
|
|
744
767
|
}
|
|
745
768
|
|
|
769
|
+
// 6c. Kick the default sim start early — `simWorker.start()` spawns the
|
|
770
|
+
// worker + sends init config and doesn't touch renderer state, so it
|
|
771
|
+
// can overlap renderer.init() instead of serializing behind it inside
|
|
772
|
+
// onRendererInit. `onInit` overrides own sim start entirely (e.g.
|
|
773
|
+
// to-the-ocean's Promise.all); `onSimStart` overrides stay deferred
|
|
774
|
+
// since they may depend on post-init ctx state; renderer-owned workers
|
|
775
|
+
// (simFromRenderer) are untouched.
|
|
776
|
+
let simStartPromise: Promise<void> | null = null;
|
|
777
|
+
if (simWorker && !module.onInit && !module.onSimStart) {
|
|
778
|
+
simStartPromise = Promise.resolve(simWorker.start(module.simConfig ?? {}));
|
|
779
|
+
// Mark handled now — the real await (which re-throws on failure) happens
|
|
780
|
+
// at the original join point inside onRendererInit.
|
|
781
|
+
simStartPromise.catch(() => {});
|
|
782
|
+
}
|
|
783
|
+
|
|
746
784
|
// 7. Delegate to bootstrapGame() for the standard sequence
|
|
747
785
|
await bootstrapGame({
|
|
748
786
|
canvasLayer: module.canvasLayer,
|
|
@@ -764,6 +802,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
764
802
|
const device = r.getDevice?.();
|
|
765
803
|
const format = r.getFormat?.();
|
|
766
804
|
const moduleHost = r.getRendererModuleHost?.();
|
|
805
|
+
if (!moduleHost) {
|
|
806
|
+
log.warn("start-game", "renderer does not expose getRendererModuleHost() — EngineLibrary DI provides will be silently dropped");
|
|
807
|
+
}
|
|
767
808
|
const libProvide = (token: any, value: unknown) => {
|
|
768
809
|
if (moduleHost) moduleHost.provideExternal("library", token, value);
|
|
769
810
|
};
|
|
@@ -779,7 +820,7 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
779
820
|
// GPU-pass library init (after device is ready).
|
|
780
821
|
if (device && format) {
|
|
781
822
|
libHost.initRenderer({ device, format, provide: libProvide, inject: libInject, injectOptional: libInjectOptional });
|
|
782
|
-
libHost.setRendererBuffers(libBuffers);
|
|
823
|
+
libHost.setRendererBuffers(libBuffers, { provide: libProvide });
|
|
783
824
|
}
|
|
784
825
|
}
|
|
785
826
|
|
|
@@ -804,8 +845,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
804
845
|
wireSimEvents(owned);
|
|
805
846
|
}
|
|
806
847
|
} catch (e) {
|
|
807
|
-
log.warn("
|
|
848
|
+
log.warn("start-game", `simFromRenderer resolution failed: ${e}`);
|
|
808
849
|
}
|
|
850
|
+
if (sessionAborted()) return;
|
|
809
851
|
}
|
|
810
852
|
|
|
811
853
|
// ── Sim worker start ──
|
|
@@ -817,9 +859,12 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
817
859
|
if (simWorker && !module.onInit) {
|
|
818
860
|
if (module.onSimStart) {
|
|
819
861
|
await module.onSimStart(ctx);
|
|
862
|
+
} else if (simStartPromise) {
|
|
863
|
+
await simStartPromise;
|
|
820
864
|
} else {
|
|
821
865
|
await simWorker.start(module.simConfig ?? {});
|
|
822
866
|
}
|
|
867
|
+
if (sessionAborted()) return;
|
|
823
868
|
}
|
|
824
869
|
|
|
825
870
|
// ── Inline save store init (sim-worker + OPFS) ──
|
|
@@ -833,9 +878,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
833
878
|
maxGenerations: module.save.maxGenerations ?? 3,
|
|
834
879
|
});
|
|
835
880
|
} catch (e) {
|
|
836
|
-
log.warn("
|
|
881
|
+
log.warn("start-game", `Inline save store init failed, falling back to host save store: ${e}`);
|
|
837
882
|
ctx.saveMode = "host";
|
|
838
883
|
}
|
|
884
|
+
if (sessionAborted()) return;
|
|
839
885
|
}
|
|
840
886
|
|
|
841
887
|
// ── Plugin loading ──
|
|
@@ -854,8 +900,9 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
854
900
|
if (mh) pluginHost.setModuleHost(mh);
|
|
855
901
|
await pluginHost.loadAll();
|
|
856
902
|
} catch (e) {
|
|
857
|
-
log.warn("
|
|
903
|
+
log.warn("start-game", `Plugin loading error: ${e}`);
|
|
858
904
|
}
|
|
905
|
+
if (sessionAborted()) return;
|
|
859
906
|
}
|
|
860
907
|
|
|
861
908
|
// ── Declarative UI lifecycle ──
|
|
@@ -867,9 +914,10 @@ export async function startGame<Sim extends GameSimWorker, R extends GameRendere
|
|
|
867
914
|
await ctx.ui.start();
|
|
868
915
|
} catch (e) {
|
|
869
916
|
// UI failure is non-fatal — the game canvas still runs.
|
|
870
|
-
log.error("
|
|
917
|
+
log.error("start-game", `UI start failed: ${e}`);
|
|
871
918
|
ctx.ui = undefined;
|
|
872
919
|
}
|
|
920
|
+
if (sessionAborted()) return;
|
|
873
921
|
}
|
|
874
922
|
|
|
875
923
|
// ── Game-specific wiring ──
|
|
@@ -76,7 +76,15 @@ export function useHotReloadDispose(
|
|
|
76
76
|
export function dispose(disposeFn: () => Promise<void> | void): void {
|
|
77
77
|
const hot = (import.meta as any).hot;
|
|
78
78
|
const session = (globalThis as any).__ddSession;
|
|
79
|
-
if (!hot?.dispose && !session?.onDispose)
|
|
79
|
+
if (!hot?.dispose && !session?.onDispose) {
|
|
80
|
+
// Packaged/direct-run mode: no vite hot and no dev-shell session, so the
|
|
81
|
+
// callback would otherwise never fire — html-ui workers, plugin hosts,
|
|
82
|
+
// and module.onDispose would leak and pin the runtime after the window
|
|
83
|
+
// closes. Native entries drain this queue in their shutdown finally.
|
|
84
|
+
const g = globalThis as any;
|
|
85
|
+
(g.__ddDisposeQueue ??= []).push(disposeFn);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
80
88
|
let offSession: (() => void) | null = null;
|
|
81
89
|
const wrapped = () => {
|
|
82
90
|
offSession?.();
|