@downdraft/engine 0.1.1 → 0.1.2-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/README.md +11 -0
- package/app/src/renderer/bootstrap.ts +295 -19
- package/app/src/renderer/game-module.ts +60 -12
- package/app/src/renderer/hooks.ts +9 -1
- package/app/src/renderer/hot-reload.ts +9 -9
- package/app/src/renderer/mcp-harness.ts +2 -2
- package/app/src/renderer/standard-automation-tools.ts +104 -3
- package/app/src/shared/feature-log.ts +2 -1
- package/app/src/shared/mcp-discovery.ts +8 -3
- package/app/src/shared/mcp-proxy.ts +2 -2
- package/asset-bake/README.md +22 -0
- package/core/README.md +25 -0
- package/core/src/animation/skeleton-animator.ts +23 -5
- package/core/src/assets/manager.ts +4 -4
- package/core/src/ecs/events.ts +1 -1
- package/core/src/ecs/schedule.ts +1 -1
- package/core/src/ecs/world.ts +1 -1
- package/core/src/index.ts +3 -4
- package/core/src/library/host.ts +27 -13
- package/core/src/library/library.ts +13 -5
- package/core/src/module/cross-thread.ts +6 -0
- package/core/src/module/diagnostics.ts +10 -6
- package/core/src/module/host.ts +65 -18
- package/core/src/module/index.ts +1 -0
- package/core/src/module/module.ts +11 -5
- package/core/src/module/renderer-module.ts +15 -0
- package/core/src/physics/safety.ts +1 -1
- package/core/src/platform/bun-preload.ts +7 -2
- package/core/src/platform/glob-polyfill.ts +17 -8
- package/core/src/platform/pkg-root.ts +27 -0
- package/core/src/platform/runtime.ts +29 -0
- package/core/src/plugin/discovery.ts +1 -1
- package/core/src/plugin/extension-loaders.ts +6 -4
- package/core/src/plugin/host.ts +13 -13
- package/core/src/plugin/loader-asset.ts +5 -5
- package/core/src/plugin/loader-quickjs.ts +1 -1
- package/core/src/plugin/loader-wasm.ts +3 -3
- package/core/src/plugin/loader-worker.ts +1 -1
- package/core/src/plugin/manifest.ts +8 -3
- package/core/src/plugin/workshop.ts +3 -3
- package/core/src/profiling/index.ts +1 -1
- package/core/src/profiling/profiling-sab.ts +19 -0
- package/core/src/profiling/warnings.ts +1 -1
- package/core/src/profiling/worker-prelude.ts +1 -1
- package/core/src/render/bindless/frame-bindings.ts +1 -1
- package/core/src/render/bindless/material-manager.ts +2 -2
- package/core/src/render/bindless/texture-registry.ts +2 -2
- package/core/src/render/device.ts +5 -5
- package/core/src/render/frame-graph.ts +2 -2
- package/core/src/render/game-renderer.ts +42 -18
- package/core/src/render/hot-reload.ts +3 -3
- package/core/src/render/renderer-module-host.ts +32 -12
- package/core/src/render/shader-validator.ts +7 -7
- package/core/src/render/surface.ts +1 -1
- package/core/src/sab/errors.ts +1 -1
- package/core/src/sab/sab-polyfill.ts +1 -1
- package/core/src/save/migration-registry.ts +4 -4
- package/core/src/save/schema.ts +1 -1
- package/core/src/scene/prefab.ts +1 -1
- package/core/src/scene/scene-manager.ts +2 -2
- package/core/src/scene/scene.ts +4 -4
- package/core/src/scene/streaming.ts +2 -2
- package/core/src/scripting/hot-reload.ts +2 -2
- package/core/src/sim/hot-reload-pipeline.ts +30 -6
- package/core/src/sim/sim-state-helper.ts +1 -1
- package/core/src/sim/transient-state-registry.ts +1 -1
- package/core/src/sim/worker-loop.ts +2 -2
- package/core/src/telemetry/gpu-profiler.ts +3 -3
- package/core/src/util/index.ts +1 -1
- package/core/src/util/logger.ts +36 -5
- package/core/src/version.ts +13 -0
- package/core/src/worker/base-worker-host.ts +87 -25
- package/core/src/worker/buffer-sync.ts +1 -1
- package/core/src/worker/crash-recovery.ts +2 -2
- package/core/src/worker/instrumented-worker-host.ts +3 -3
- package/core/src/worker/rpc.ts +62 -11
- package/core/src/worker/sim-worker-base.ts +3 -8
- package/core/src/worker/task-pool.ts +2 -2
- package/dist/.dd-manifest.json +4119 -0
- package/dist/app/src/index.js +9 -0
- package/dist/app/src/renderer/bootstrap.js +446 -0
- package/dist/app/src/renderer/downdraft-base.css +93 -0
- package/dist/app/src/renderer/feature-log.js +180 -0
- package/dist/app/src/renderer/game-module.js +562 -0
- package/dist/app/src/renderer/hooks.js +82 -0
- package/dist/app/src/renderer/hot-reload.js +158 -0
- package/dist/app/src/renderer/import-cache.js +77 -0
- package/dist/app/src/renderer/index.js +149 -0
- package/dist/app/src/renderer/mcp-harness.js +112 -0
- package/dist/app/src/renderer/save-store-factory.js +180 -0
- package/dist/app/src/renderer/sim-bridge.js +138 -0
- package/dist/app/src/renderer/standard-automation-tools.js +720 -0
- package/dist/app/src/shared/feature-log.js +54 -0
- package/dist/app/src/shared/gpu-info.js +74 -0
- package/dist/app/src/shared/import-cache-store.js +123 -0
- package/dist/app/src/shared/index.js +4 -0
- package/dist/app/src/shared/mcp-discovery.js +55 -0
- package/dist/app/src/shared/mcp-proxy.js +71 -0
- package/dist/app/src/shared/types.js +13 -0
- package/dist/asset-bake/src/bake-audio.js +103 -0
- package/dist/asset-bake/src/bake-gltf.js +141 -0
- package/dist/asset-bake/src/bake.js +63 -0
- package/dist/asset-bake/src/cache.js +147 -0
- package/dist/asset-bake/src/config.js +93 -0
- package/dist/asset-bake/src/index.js +25 -0
- package/dist/core/src/animation/animation-event.js +24 -0
- package/dist/core/src/animation/bone-mask.js +103 -0
- package/dist/core/src/animation/clip.js +210 -0
- package/dist/core/src/animation/index.js +13 -0
- package/dist/core/src/animation/mixamo.js +78 -0
- package/dist/core/src/animation/morph-target.js +37 -0
- package/dist/core/src/animation/player.js +621 -0
- package/dist/core/src/animation/retarget.js +101 -0
- package/dist/core/src/animation/skeleton-animator.js +1361 -0
- package/dist/core/src/animation/skeleton.js +166 -0
- package/dist/core/src/animation/state-machine.js +252 -0
- package/dist/core/src/assets/blob-store.js +14 -0
- package/dist/core/src/assets/cache.js +168 -0
- package/dist/core/src/assets/cubemap-converter.js +129 -0
- package/dist/core/src/assets/environment-manager.js +84 -0
- package/dist/core/src/assets/import-cache.js +36 -0
- package/dist/core/src/assets/import-settings.js +34 -0
- package/dist/core/src/assets/importer.js +78 -0
- package/dist/core/src/assets/index.js +29 -0
- package/dist/core/src/assets/irradiance-generator.js +179 -0
- package/dist/core/src/assets/loader-audio.js +70 -0
- package/dist/core/src/assets/loader-cubemap.js +141 -0
- package/dist/core/src/assets/loader-dds.js +185 -0
- package/dist/core/src/assets/loader-hdr.js +430 -0
- package/dist/core/src/assets/loader-mesh.js +47 -0
- package/dist/core/src/assets/loader-shader.js +61 -0
- package/dist/core/src/assets/loader-texture.js +264 -0
- package/dist/core/src/assets/lod.js +150 -0
- package/dist/core/src/assets/manager.js +401 -0
- package/dist/core/src/assets/manifest.js +57 -0
- package/dist/core/src/assets/material-bridge.js +160 -0
- package/dist/core/src/assets/model-importer.js +32 -0
- package/dist/core/src/assets/model-normalizer.js +213 -0
- package/dist/core/src/assets/model-to-gpu.js +44 -0
- package/dist/core/src/assets/model-to-mesh.js +171 -0
- package/dist/core/src/assets/prefilter-generator.js +220 -0
- package/dist/core/src/audio/engine.js +153 -0
- package/dist/core/src/audio/interface.js +8 -0
- package/dist/core/src/audio/listener.js +19 -0
- package/dist/core/src/audio/mixer.js +124 -0
- package/dist/core/src/audio/registry.js +43 -0
- package/dist/core/src/audio/sab.js +74 -0
- package/dist/core/src/audio/source.js +60 -0
- package/dist/core/src/change-detection/atomics.js +1 -0
- package/dist/core/src/change-detection/tracker.js +26 -0
- package/dist/core/src/debug-draw/lines.js +27 -0
- package/dist/core/src/debug-draw/points.js +9 -0
- package/dist/core/src/debug-draw/queue.js +77 -0
- package/dist/core/src/debug-draw/text.js +12 -0
- package/dist/core/src/ecs/archetype.js +271 -0
- package/dist/core/src/ecs/component.js +109 -0
- package/dist/core/src/ecs/entity.js +11 -0
- package/dist/core/src/ecs/events.js +73 -0
- package/dist/core/src/ecs/hierarchy.js +104 -0
- package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
- package/dist/core/src/ecs/index.js +14 -0
- package/dist/core/src/ecs/query.js +110 -0
- package/dist/core/src/ecs/resource.js +3 -0
- package/dist/core/src/ecs/schedule.js +157 -0
- package/dist/core/src/ecs/system-params.js +45 -0
- package/dist/core/src/ecs/system.js +18 -0
- package/dist/core/src/ecs/world.js +292 -0
- package/dist/core/src/index.js +191 -0
- package/dist/core/src/input/context.js +69 -0
- package/dist/core/src/input/dom-handler.js +288 -0
- package/dist/core/src/input/local-player-manager.js +145 -0
- package/dist/core/src/input/mapping.js +36 -0
- package/dist/core/src/input/multi-sab-bridge.js +224 -0
- package/dist/core/src/input/multi-state.js +48 -0
- package/dist/core/src/input/sab-bridge.js +66 -0
- package/dist/core/src/input/state.js +108 -0
- package/dist/core/src/input/ui-router.js +76 -0
- package/dist/core/src/library/host.js +291 -0
- package/dist/core/src/library/index.js +1 -0
- package/dist/core/src/library/library.js +20 -0
- package/dist/core/src/material/compiler.js +73 -0
- package/dist/core/src/material/graph-bridge.js +119 -0
- package/dist/core/src/material/index.js +6 -0
- package/dist/core/src/material/library.js +414 -0
- package/dist/core/src/material/material.js +120 -0
- package/dist/core/src/material/variants.js +37 -0
- package/dist/core/src/math/mat4.js +198 -0
- package/dist/core/src/math/perlin-noise-2d.js +66 -0
- package/dist/core/src/math/perlin-noise-3d.js +76 -0
- package/dist/core/src/math/quat.js +29 -0
- package/dist/core/src/math/rng.js +25 -0
- package/dist/core/src/math/trig.js +42 -0
- package/dist/core/src/math/value-noise.js +49 -0
- package/dist/core/src/mesh/builder.js +137 -0
- package/dist/core/src/mesh/csg.js +250 -0
- package/dist/core/src/mesh/greased-line.js +102 -0
- package/dist/core/src/mesh/mesh.js +6 -0
- package/dist/core/src/mesh/parametric.js +392 -0
- package/dist/core/src/mesh/skinning.js +30 -0
- package/dist/core/src/mesh/vertex-layout.js +65 -0
- package/dist/core/src/module/cross-thread.js +126 -0
- package/dist/core/src/module/diagnostics.js +99 -0
- package/dist/core/src/module/host.js +449 -0
- package/dist/core/src/module/index.js +6 -0
- package/dist/core/src/module/module.js +1 -0
- package/dist/core/src/module/registry.js +83 -0
- package/dist/core/src/module/renderer-module.js +13 -0
- package/dist/core/src/module/ts-loader.js +20 -0
- package/dist/core/src/particles/compute-pass.js +329 -0
- package/dist/core/src/particles/emitter.js +113 -0
- package/dist/core/src/particles/index.js +7 -0
- package/dist/core/src/particles/particle-data.js +33 -0
- package/dist/core/src/particles/render-pass.js +338 -0
- package/dist/core/src/particles/simulator.js +224 -0
- package/dist/core/src/particles/system.js +157 -0
- package/dist/core/src/physics/body.js +25 -0
- package/dist/core/src/physics/ccd-heuristic.js +46 -0
- package/dist/core/src/physics/character.js +184 -0
- package/dist/core/src/physics/collider.js +36 -0
- package/dist/core/src/physics/collision-system.js +62 -0
- package/dist/core/src/physics/events.js +74 -0
- package/dist/core/src/physics/index.js +24 -0
- package/dist/core/src/physics/interface.js +14 -0
- package/dist/core/src/physics/interpolation-buffer.js +182 -0
- package/dist/core/src/physics/lifecycle.js +66 -0
- package/dist/core/src/physics/load-shedder.js +155 -0
- package/dist/core/src/physics/physics-accumulator.js +94 -0
- package/dist/core/src/physics/physics-system.js +142 -0
- package/dist/core/src/physics/ragdoll-presets.js +248 -0
- package/dist/core/src/physics/ragdoll-system.js +193 -0
- package/dist/core/src/physics/ragdoll.js +117 -0
- package/dist/core/src/physics/raycast.js +97 -0
- package/dist/core/src/physics/realm-manager.js +431 -0
- package/dist/core/src/physics/realm-worker-pool.js +181 -0
- package/dist/core/src/physics/realm-worker.js +91 -0
- package/dist/core/src/physics/realm.js +137 -0
- package/dist/core/src/physics/registry.js +43 -0
- package/dist/core/src/physics/safety.js +211 -0
- package/dist/core/src/physics/snapshot-manager.js +118 -0
- package/dist/core/src/physics/worker-protocol.js +1 -0
- package/dist/core/src/platform/bun-preload.js +175 -0
- package/dist/core/src/platform/css-stub.js +4 -0
- package/dist/core/src/platform/glob-polyfill.js +137 -0
- package/dist/core/src/platform/hidpi.js +52 -0
- package/dist/core/src/platform/pkg-root.js +27 -0
- package/dist/core/src/platform/render-surface.js +15 -0
- package/dist/core/src/platform/rpc.js +82 -0
- package/dist/core/src/platform/runtime.js +93 -0
- package/dist/core/src/plugin/context.js +144 -0
- package/dist/core/src/plugin/diagnostics.js +20 -0
- package/dist/core/src/plugin/discovery.js +124 -0
- package/dist/core/src/plugin/extension-loaders.js +111 -0
- package/dist/core/src/plugin/host.js +542 -0
- package/dist/core/src/plugin/index.js +19 -0
- package/dist/core/src/plugin/loader-asset.js +105 -0
- package/dist/core/src/plugin/loader-quickjs.js +67 -0
- package/dist/core/src/plugin/loader-wasm.js +385 -0
- package/dist/core/src/plugin/loader-worker.js +228 -0
- package/dist/core/src/plugin/manifest.js +424 -0
- package/dist/core/src/plugin/material-registry.js +44 -0
- package/dist/core/src/plugin/mcp-tools.js +147 -0
- package/dist/core/src/plugin/permissions.js +152 -0
- package/dist/core/src/plugin/quickjs-bridge.js +219 -0
- package/dist/core/src/plugin/registry.js +92 -0
- package/dist/core/src/plugin/sandbox-shim.js +79 -0
- package/dist/core/src/plugin/sandbox-worker.js +194 -0
- package/dist/core/src/plugin/wasm-abi.js +62 -0
- package/dist/core/src/plugin/wasm-worker.js +234 -0
- package/dist/core/src/plugin/workshop.js +131 -0
- package/dist/core/src/profiling/event-loop.js +164 -0
- package/dist/core/src/profiling/index.js +23 -0
- package/dist/core/src/profiling/iops/idb-patch.js +211 -0
- package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
- package/dist/core/src/profiling/profiling-sab.js +632 -0
- package/dist/core/src/profiling/task-latency.js +118 -0
- package/dist/core/src/profiling/thread-metrics.js +103 -0
- package/dist/core/src/profiling/trace-event-writer.js +165 -0
- package/dist/core/src/profiling/warnings.js +304 -0
- package/dist/core/src/profiling/worker-prelude.js +281 -0
- package/dist/core/src/render/bind-group.js +33 -0
- package/dist/core/src/render/bindless/bindless-struct.js +39 -0
- package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
- package/dist/core/src/render/bindless/frame-bindings.js +142 -0
- package/dist/core/src/render/bindless/index.js +6 -0
- package/dist/core/src/render/bindless/material-manager.js +182 -0
- package/dist/core/src/render/bindless/texture-registry.js +498 -0
- package/dist/core/src/render/buffer.js +74 -0
- package/dist/core/src/render/camera-2d.js +151 -0
- package/dist/core/src/render/camera-controller.js +370 -0
- package/dist/core/src/render/camera.js +332 -0
- package/dist/core/src/render/canvas-resize-watcher.js +36 -0
- package/dist/core/src/render/compute-kernel.js +130 -0
- package/dist/core/src/render/constants.js +2 -0
- package/dist/core/src/render/device.js +91 -0
- package/dist/core/src/render/frame-graph.js +594 -0
- package/dist/core/src/render/frustum.js +152 -0
- package/dist/core/src/render/fullscreen-vs.js +24 -0
- package/dist/core/src/render/g-buffer.js +156 -0
- package/dist/core/src/render/game-renderer.js +1165 -0
- package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
- package/dist/core/src/render/gpu-driven/hzb.js +183 -0
- package/dist/core/src/render/gpu-driven/index.js +6 -0
- package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
- package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
- package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
- package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
- package/dist/core/src/render/gpu-utils.js +72 -0
- package/dist/core/src/render/hdr.js +69 -0
- package/dist/core/src/render/hot-reload.js +236 -0
- package/dist/core/src/render/ibl-bind-group.js +232 -0
- package/dist/core/src/render/ibl.js +148 -0
- package/dist/core/src/render/index.js +86 -0
- package/dist/core/src/render/input-manager.js +224 -0
- package/dist/core/src/render/lighting/area-light.js +142 -0
- package/dist/core/src/render/lighting/cluster-grid.js +255 -0
- package/dist/core/src/render/lighting/cluster-types.js +87 -0
- package/dist/core/src/render/lighting/ies-parser.js +111 -0
- package/dist/core/src/render/lighting.js +300 -0
- package/dist/core/src/render/material-types/depth.wgsl +44 -0
- package/dist/core/src/render/material-types/line.wgsl +50 -0
- package/dist/core/src/render/material-types/matcap.wgsl +51 -0
- package/dist/core/src/render/material-types/normal.wgsl +41 -0
- package/dist/core/src/render/material-types/physical.wgsl +152 -0
- package/dist/core/src/render/material-types/sprite.wgsl +46 -0
- package/dist/core/src/render/material-types/sss.wgsl +79 -0
- package/dist/core/src/render/material-types/toon.wgsl +79 -0
- package/dist/core/src/render/passes/README.md +121 -0
- package/dist/core/src/render/passes/atmosphere.js +107 -0
- package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
- package/dist/core/src/render/passes/csm.js +338 -0
- package/dist/core/src/render/passes/cubemap-capture.js +93 -0
- package/dist/core/src/render/passes/debug-viz.js +248 -0
- package/dist/core/src/render/passes/debug.js +500 -0
- package/dist/core/src/render/passes/decal-mesh.js +86 -0
- package/dist/core/src/render/passes/decal-pass.js +344 -0
- package/dist/core/src/render/passes/deferred-lighting.js +406 -0
- package/dist/core/src/render/passes/depth-prepass.js +148 -0
- package/dist/core/src/render/passes/dome-360.js +68 -0
- package/dist/core/src/render/passes/fluid-render.js +116 -0
- package/dist/core/src/render/passes/gi-types.js +78 -0
- package/dist/core/src/render/passes/graph-compute.js +251 -0
- package/dist/core/src/render/passes/greased-line-pass.js +218 -0
- package/dist/core/src/render/passes/morph-target.js +35 -0
- package/dist/core/src/render/passes/opaque.js +966 -0
- package/dist/core/src/render/passes/point-light-shadow.js +221 -0
- package/dist/core/src/render/passes/procedural-texture.js +142 -0
- package/dist/core/src/render/passes/reflection-probe.js +100 -0
- package/dist/core/src/render/passes/rsm-pass.js +228 -0
- package/dist/core/src/render/passes/sdf-text.js +114 -0
- package/dist/core/src/render/passes/shadow-map.js +121 -0
- package/dist/core/src/render/passes/shadow.js +191 -0
- package/dist/core/src/render/passes/skinning-vs.js +102 -0
- package/dist/core/src/render/passes/skinning.js +282 -0
- package/dist/core/src/render/passes/sky-dome.js +380 -0
- package/dist/core/src/render/passes/skybox.js +146 -0
- package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
- package/dist/core/src/render/passes/terrain.js +303 -0
- package/dist/core/src/render/passes/transparent.js +323 -0
- package/dist/core/src/render/passes/underwater-fog.js +173 -0
- package/dist/core/src/render/passes/video-texture.js +58 -0
- package/dist/core/src/render/passes/volumetric-pass.js +278 -0
- package/dist/core/src/render/passes/volumetric-types.js +96 -0
- package/dist/core/src/render/passes/water.js +697 -0
- package/dist/core/src/render/pbr.js +257 -0
- package/dist/core/src/render/pipeline.js +49 -0
- package/dist/core/src/render/render-pass.js +13 -0
- package/dist/core/src/render/renderer-input-bus.js +176 -0
- package/dist/core/src/render/renderer-module-host.js +539 -0
- package/dist/core/src/render/resource-tracker.js +59 -0
- package/dist/core/src/render/sab-canvas-overlay.js +83 -0
- package/dist/core/src/render/shader-validator.js +172 -0
- package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
- package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
- package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
- package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
- package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
- package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
- package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
- package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
- package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
- package/dist/core/src/render/skybox.js +123 -0
- package/dist/core/src/render/splitscreen.js +60 -0
- package/dist/core/src/render/surface.js +63 -0
- package/dist/core/src/render/tonemap.js +171 -0
- package/dist/core/src/render/tracked-render-pass.js +115 -0
- package/dist/core/src/render/viewport.js +81 -0
- package/dist/core/src/render/wgsl-hmr.js +66 -0
- package/dist/core/src/sab/core-input-channel.js +22 -0
- package/dist/core/src/sab/define.js +127 -0
- package/dist/core/src/sab/errors.js +60 -0
- package/dist/core/src/sab/game-input.js +299 -0
- package/dist/core/src/sab/gamepad-devices.js +205 -0
- package/dist/core/src/sab/grid-buffer.js +91 -0
- package/dist/core/src/sab/input.js +38 -0
- package/dist/core/src/sab/layout.js +160 -0
- package/dist/core/src/sab/multi-input-channel.js +39 -0
- package/dist/core/src/sab/record-buffer.js +130 -0
- package/dist/core/src/sab/sab-polyfill.js +47 -0
- package/dist/core/src/sab/sim-channel.js +397 -0
- package/dist/core/src/sab/slot-buffer.js +140 -0
- package/dist/core/src/sab/types.js +1 -0
- package/dist/core/src/safety/bounds.js +71 -0
- package/dist/core/src/safety/json.js +70 -0
- package/dist/core/src/safety/path.js +151 -0
- package/dist/core/src/save/binary-format.js +95 -0
- package/dist/core/src/save/game-save-system.js +101 -0
- package/dist/core/src/save/grid-save-system.js +102 -0
- package/dist/core/src/save/migrate.js +35 -0
- package/dist/core/src/save/migration-registry.js +66 -0
- package/dist/core/src/save/persist-types.js +4 -0
- package/dist/core/src/save/schema.js +36 -0
- package/dist/core/src/save/serializer.js +139 -0
- package/dist/core/src/scene/builder.js +31 -0
- package/dist/core/src/scene/camera.js +118 -0
- package/dist/core/src/scene/checkpoint.js +84 -0
- package/dist/core/src/scene/game-loop.js +155 -0
- package/dist/core/src/scene/index.js +14 -0
- package/dist/core/src/scene/layer.js +7 -0
- package/dist/core/src/scene/prefab.js +97 -0
- package/dist/core/src/scene/scene-manager.js +141 -0
- package/dist/core/src/scene/scene.js +147 -0
- package/dist/core/src/scene/sky.js +179 -0
- package/dist/core/src/scene/spatial-grid.js +140 -0
- package/dist/core/src/scene/streaming.js +247 -0
- package/dist/core/src/scene/vegetation.js +107 -0
- package/dist/core/src/scene/world.js +66 -0
- package/dist/core/src/scripting/binding.js +85 -0
- package/dist/core/src/scripting/hot-reload.js +123 -0
- package/dist/core/src/scripting/script.js +68 -0
- package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
- package/dist/core/src/sim/sim-state-helper.js +40 -0
- package/dist/core/src/sim/transient-state-registry.js +63 -0
- package/dist/core/src/sim/types.js +4 -0
- package/dist/core/src/sim/worker-loop.js +168 -0
- package/dist/core/src/stores/game-store.js +81 -0
- package/dist/core/src/stores/hot-reload-store.js +19 -0
- package/dist/core/src/telemetry/collector.js +303 -0
- package/dist/core/src/telemetry/gc-controller.js +365 -0
- package/dist/core/src/telemetry/gc-profiler.js +82 -0
- package/dist/core/src/telemetry/gc-tracker.js +63 -0
- package/dist/core/src/telemetry/gpu-profiler.js +554 -0
- package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
- package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
- package/dist/core/src/telemetry/gpu-timer.js +117 -0
- package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
- package/dist/core/src/telemetry/reporter.js +56 -0
- package/dist/core/src/types/engine-types.js +21 -0
- package/dist/core/src/ui-font-scale.js +111 -0
- package/dist/core/src/util/broad-phase-grid.js +77 -0
- package/dist/core/src/util/feature-log.js +176 -0
- package/dist/core/src/util/index.js +4 -0
- package/dist/core/src/util/logger.js +596 -0
- package/dist/core/src/version.js +11 -0
- package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
- package/dist/core/src/worker/base-worker-host.js +212 -0
- package/dist/core/src/worker/buffer-sync.js +454 -0
- package/dist/core/src/worker/crash-recovery.js +153 -0
- package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
- package/dist/core/src/worker/instrumented-worker-host.js +139 -0
- package/dist/core/src/worker/rpc.js +244 -0
- package/dist/core/src/worker/sim-worker-base.js +558 -0
- package/dist/core/src/worker/sim-worker-host.js +271 -0
- package/dist/core/src/worker/task-pool.js +205 -0
- package/dist/core/src/worker/task-worker.js +77 -0
- package/dist/libraries/asset-browser/src/index.js +10 -0
- package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
- package/dist/libraries/audio-kira/src/backend.js +405 -0
- package/dist/libraries/audio-kira/src/index.js +4 -0
- package/dist/libraries/audio-kira/src/library.js +54 -0
- package/dist/libraries/blitz-ui/src/index.js +13 -0
- package/dist/libraries/blitz-ui/src/native-module.js +162 -0
- package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
- package/dist/libraries/blitz-ui/src/router.js +82 -0
- package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
- package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
- package/dist/libraries/character/src/character-animator.js +323 -0
- package/dist/libraries/character/src/customization.js +464 -0
- package/dist/libraries/character/src/index.js +19 -0
- package/dist/libraries/character/src/inspectable.js +77 -0
- package/dist/libraries/character/src/loader.js +336 -0
- package/dist/libraries/character/src/locomotion.js +84 -0
- package/dist/libraries/character/src/preview.js +280 -0
- package/dist/libraries/devtools/src/backend.js +449 -0
- package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
- package/dist/libraries/devtools/src/collectors.js +318 -0
- package/dist/libraries/devtools/src/index.js +31 -0
- package/dist/libraries/devtools/src/native-providers.js +749 -0
- package/dist/libraries/devtools/src/snapshot.js +35 -0
- package/dist/libraries/devtools/src/verify.js +139 -0
- package/dist/libraries/devtools/src/web/browser.js +94 -0
- package/dist/libraries/devtools/src/web/host.js +183 -0
- package/dist/libraries/devtools/src/web/mirror.js +26 -0
- package/dist/libraries/devtools/src/web/server.js +187 -0
- package/dist/libraries/entities/src/index.js +3 -0
- package/dist/libraries/entities/src/library.js +46 -0
- package/dist/libraries/entities/src/model-renderer.js +1307 -0
- package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
- package/dist/libraries/gamepad/src/feed-input.js +54 -0
- package/dist/libraries/gamepad/src/filters.js +44 -0
- package/dist/libraries/gamepad/src/glyphs.js +83 -0
- package/dist/libraries/gamepad/src/hub.js +164 -0
- package/dist/libraries/gamepad/src/index.js +10 -0
- package/dist/libraries/gamepad/src/library.js +56 -0
- package/dist/libraries/gamepad/src/source-sab.js +62 -0
- package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
- package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
- package/dist/libraries/gaussian-splats/src/index.js +8 -0
- package/dist/libraries/gaussian-splats/src/library.js +44 -0
- package/dist/libraries/gaussian-splats/src/parser.js +297 -0
- package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
- package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
- package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
- package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
- package/dist/libraries/gpu-kernels/src/index.js +8 -0
- package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
- package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
- package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
- package/dist/libraries/html-ui-kit/src/components.js +219 -0
- package/dist/libraries/html-ui-kit/src/index.js +17 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
- package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
- package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
- package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
- package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
- package/dist/libraries/html-ui-kit/src/theme.js +235 -0
- package/dist/libraries/inspectable/src/index.js +6 -0
- package/dist/libraries/inspectable/src/inspectable.js +205 -0
- package/dist/libraries/lighting/src/index.js +4 -0
- package/dist/libraries/lighting/src/library.js +48 -0
- package/dist/libraries/lighting/src/light-system.js +395 -0
- package/dist/libraries/lighting/src/lighting-system.js +57 -0
- package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
- package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
- package/dist/libraries/marching-cubes/src/deformation.js +41 -0
- package/dist/libraries/marching-cubes/src/generator.js +356 -0
- package/dist/libraries/marching-cubes/src/index.js +13 -0
- package/dist/libraries/marching-cubes/src/library.js +54 -0
- package/dist/libraries/marching-cubes/src/lod.js +95 -0
- package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
- package/dist/libraries/marching-cubes/src/sab.js +40 -0
- package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
- package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
- package/dist/libraries/marching-cubes/src/tables.js +314 -0
- package/dist/libraries/marching-cubes/src/types.js +1 -0
- package/dist/libraries/models/src/bake-node-transforms.js +146 -0
- package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
- package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
- package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
- package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
- package/dist/libraries/models/src/codecs/index.js +5 -0
- package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
- package/dist/libraries/models/src/codecs/registry.js +111 -0
- package/dist/libraries/models/src/dae.js +665 -0
- package/dist/libraries/models/src/default-part-selection.js +58 -0
- package/dist/libraries/models/src/dxf.js +235 -0
- package/dist/libraries/models/src/fbx/index.js +438 -0
- package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
- package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
- package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
- package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
- package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
- package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
- package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
- package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
- package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
- package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
- package/dist/libraries/models/src/fbx/types.js +88 -0
- package/dist/libraries/models/src/gltf-extensions.js +121 -0
- package/dist/libraries/models/src/gltf.js +724 -0
- package/dist/libraries/models/src/index.js +46 -0
- package/dist/libraries/models/src/library.js +44 -0
- package/dist/libraries/models/src/loader.js +218 -0
- package/dist/libraries/models/src/material-adapter.js +82 -0
- package/dist/libraries/models/src/mini-xml.js +145 -0
- package/dist/libraries/models/src/normalize.js +168 -0
- package/dist/libraries/models/src/obj.js +247 -0
- package/dist/libraries/models/src/off.js +94 -0
- package/dist/libraries/models/src/ply.js +329 -0
- package/dist/libraries/models/src/pose-sampler.js +183 -0
- package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
- package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
- package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
- package/dist/libraries/models/src/sidecar/resolver.js +112 -0
- package/dist/libraries/models/src/sidecar/types.js +8 -0
- package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
- package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
- package/dist/libraries/models/src/stl.js +129 -0
- package/dist/libraries/models/src/threeds.js +312 -0
- package/dist/libraries/models/src/threemf.js +203 -0
- package/dist/libraries/models/src/types.js +33 -0
- package/dist/libraries/models/src/vtk.js +242 -0
- package/dist/libraries/navmesh/src/crowd-system.js +207 -0
- package/dist/libraries/navmesh/src/debug-viz.js +52 -0
- package/dist/libraries/navmesh/src/index.js +7 -0
- package/dist/libraries/navmesh/src/library.js +47 -0
- package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
- package/dist/libraries/navmesh/src/navmesh.js +141 -0
- package/dist/libraries/navmesh/src/pathfinder.js +221 -0
- package/dist/libraries/navmesh/src/types.js +1 -0
- package/dist/libraries/networking/src/authority.js +107 -0
- package/dist/libraries/networking/src/connection.js +107 -0
- package/dist/libraries/networking/src/discovery.js +314 -0
- package/dist/libraries/networking/src/enhanced-replication.js +282 -0
- package/dist/libraries/networking/src/epic-adapter.js +101 -0
- package/dist/libraries/networking/src/index.js +16 -0
- package/dist/libraries/networking/src/library.js +45 -0
- package/dist/libraries/networking/src/lobby.js +84 -0
- package/dist/libraries/networking/src/platform-adapter.js +92 -0
- package/dist/libraries/networking/src/rcs-adapter.js +100 -0
- package/dist/libraries/networking/src/remote-input.js +162 -0
- package/dist/libraries/networking/src/replication.js +273 -0
- package/dist/libraries/networking/src/rpc.js +172 -0
- package/dist/libraries/networking/src/session.js +129 -0
- package/dist/libraries/networking/src/transport.js +156 -0
- package/dist/libraries/networking/src/webrtc.js +266 -0
- package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
- package/dist/libraries/pathfinding-2d/src/index.js +9 -0
- package/dist/libraries/persistence/src/autosave-manager.js +94 -0
- package/dist/libraries/persistence/src/binary-record-store.js +205 -0
- package/dist/libraries/persistence/src/browser.js +16 -0
- package/dist/libraries/persistence/src/file-save-store.js +507 -0
- package/dist/libraries/persistence/src/hash-utils.js +54 -0
- package/dist/libraries/persistence/src/index.js +17 -0
- package/dist/libraries/persistence/src/library.js +51 -0
- package/dist/libraries/persistence/src/mock-opfs.js +114 -0
- package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
- package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
- package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
- package/dist/libraries/persistence/src/save-worker.js +76 -0
- package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
- package/dist/libraries/physics-native/src/backend.js +960 -0
- package/dist/libraries/physics-native/src/broadphase.js +79 -0
- package/dist/libraries/physics-native/src/index.js +6 -0
- package/dist/libraries/physics-native/src/library.js +57 -0
- package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
- package/dist/libraries/physics-native/src/narrowphase.js +60 -0
- package/dist/libraries/physics-native/src/solver.js +105 -0
- package/dist/libraries/physics-native/src/types.js +4 -0
- package/dist/libraries/physics-rapier/src/api.js +352 -0
- package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
- package/dist/libraries/physics-rapier/src/backend.js +1066 -0
- package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
- package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
- package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
- package/dist/libraries/physics-rapier/src/index.js +9 -0
- package/dist/libraries/physics-rapier/src/library.js +71 -0
- package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
- package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
- package/dist/libraries/postfx/src/index.js +14 -0
- package/dist/libraries/postfx/src/library.js +207 -0
- package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
- package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
- package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
- package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
- package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
- package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
- package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
- package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
- package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
- package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
- package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
- package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
- package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
- package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
- package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
- package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
- package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
- package/dist/libraries/recast/src/backend.js +124 -0
- package/dist/libraries/recast/src/crowd-system.js +310 -0
- package/dist/libraries/recast/src/index.js +4 -0
- package/dist/libraries/recast/src/library.js +59 -0
- package/dist/libraries/recast/src/types.js +4 -0
- package/dist/libraries/sand/src/cell.js +32 -0
- package/dist/libraries/sand/src/fields.js +27 -0
- package/dist/libraries/sand/src/fluid-grid.js +267 -0
- package/dist/libraries/sand/src/grid-dims.js +47 -0
- package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
- package/dist/libraries/sand/src/index.js +20 -0
- package/dist/libraries/sand/src/library.js +67 -0
- package/dist/libraries/sand/src/materials.js +437 -0
- package/dist/libraries/sand/src/palette.js +87 -0
- package/dist/libraries/sand/src/particles.js +163 -0
- package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
- package/dist/libraries/sand/src/rng.js +44 -0
- package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
- package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
- package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
- package/dist/libraries/sand/src/rules/rule-types.js +27 -0
- package/dist/libraries/sand/src/sand-step-pool.js +458 -0
- package/dist/libraries/sand/src/sand-step-worker.js +101 -0
- package/dist/libraries/sand/src/sand-world.js +3382 -0
- package/dist/libraries/stickman/src/index.js +7 -0
- package/dist/libraries/stickman/src/library.js +44 -0
- package/dist/libraries/stickman/src/proportions.js +40 -0
- package/dist/libraries/stickman/src/shader.js +113 -0
- package/dist/libraries/stickman/src/skeleton.js +163 -0
- package/dist/libraries/stickman/src/stickman-pass.js +210 -0
- package/dist/libraries/stickman/src/thick-line.js +120 -0
- package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
- package/dist/libraries/surface-nets/src/deformation.js +29 -0
- package/dist/libraries/surface-nets/src/index.js +15 -0
- package/dist/libraries/surface-nets/src/library.js +41 -0
- package/dist/libraries/surface-nets/src/lod.js +6 -0
- package/dist/libraries/surface-nets/src/sab.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
- package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
- package/dist/libraries/surface-nets/src/types.js +1 -0
- package/dist/libraries/water/src/buoyancy.js +80 -0
- package/dist/libraries/water/src/index.js +12 -0
- package/dist/libraries/water/src/library.js +65 -0
- package/dist/libraries/water/src/shore-damping.js +70 -0
- package/dist/libraries/water/src/water-buffer.js +78 -0
- package/dist/libraries/water/src/water-chunks.js +5 -0
- package/dist/libraries/water/src/water-physics.js +315 -0
- package/dist/libraries/water/src/water-renderer.js +736 -0
- package/dist/libraries/water/src/water-sab.js +138 -0
- package/dist/libraries/water/src/wave-sources.js +45 -0
- package/dist/libraries/weather/src/index.js +5 -0
- package/dist/libraries/weather/src/library.js +48 -0
- package/dist/libraries/weather/src/types.js +29 -0
- package/dist/libraries/weather/src/weather-blend.js +108 -0
- package/dist/libraries/weather/src/weather-system.js +275 -0
- package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
- package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
- package/dist/libraries/weatherfx/src/index.js +4 -0
- package/dist/libraries/weatherfx/src/library.js +41 -0
- package/dist/libraries/weatherfx/src/particle-system.js +350 -0
- package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
- package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
- package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
- package/dist/mcp/src/client.js +669 -0
- package/dist/mcp/src/engine-context.js +99 -0
- package/dist/mcp/src/http-transport.js +423 -0
- package/dist/mcp/src/index.js +5 -0
- package/dist/mcp/src/prompts/add-entity.js +39 -0
- package/dist/mcp/src/prompts/create-scene.js +41 -0
- package/dist/mcp/src/prompts/debug-frame.js +36 -0
- package/dist/mcp/src/prompts/index.js +10 -0
- package/dist/mcp/src/resources/asset-list.js +28 -0
- package/dist/mcp/src/resources/checkpoint-list.js +29 -0
- package/dist/mcp/src/resources/entity-state.js +45 -0
- package/dist/mcp/src/resources/gpu-info.js +90 -0
- package/dist/mcp/src/resources/index.js +51 -0
- package/dist/mcp/src/resources/performance.js +33 -0
- package/dist/mcp/src/resources/scene-tree.js +37 -0
- package/dist/mcp/src/server.js +307 -0
- package/dist/mcp/src/tools/animation.js +102 -0
- package/dist/mcp/src/tools/asset.js +146 -0
- package/dist/mcp/src/tools/audio.js +80 -0
- package/dist/mcp/src/tools/build.js +128 -0
- package/dist/mcp/src/tools/camera.js +157 -0
- package/dist/mcp/src/tools/checkpoint.js +90 -0
- package/dist/mcp/src/tools/component.js +176 -0
- package/dist/mcp/src/tools/debug.js +273 -0
- package/dist/mcp/src/tools/entity.js +309 -0
- package/dist/mcp/src/tools/inspect.js +192 -0
- package/dist/mcp/src/tools/lighting.js +239 -0
- package/dist/mcp/src/tools/material.js +225 -0
- package/dist/mcp/src/tools/mesh.js +210 -0
- package/dist/mcp/src/tools/physics.js +251 -0
- package/dist/mcp/src/tools/scene.js +139 -0
- package/dist/mcp/src/tools/script.js +114 -0
- package/dist/mcp/src/types.js +9 -0
- package/dist/mcp/src/undo-redo.js +64 -0
- package/dist/modules/camera-controls/src/index.js +116 -0
- package/dist/modules/controller-ui/src/index.js +149 -0
- package/dist/modules/devtools/src/api.js +317 -0
- package/dist/modules/devtools/src/asset-utils.js +102 -0
- package/dist/modules/devtools/src/bind-debug-store.js +34 -0
- package/dist/modules/devtools/src/blitz/host.js +391 -0
- package/dist/modules/devtools/src/blitz/module.js +65 -0
- package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
- package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
- package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
- package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
- package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
- package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
- package/dist/modules/devtools/src/blitz/theme.js +167 -0
- package/dist/modules/devtools/src/data-bridge.js +247 -0
- package/dist/modules/devtools/src/debug-overlay.js +181 -0
- package/dist/modules/devtools/src/debug-raycast.js +296 -0
- package/dist/modules/devtools/src/debug-store.js +28 -0
- package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
- package/dist/modules/devtools/src/doctor-panel.js +163 -0
- package/dist/modules/devtools/src/gizmo-module.js +95 -0
- package/dist/modules/devtools/src/graph-model.js +387 -0
- package/dist/modules/devtools/src/grid-renderer.js +145 -0
- package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
- package/dist/modules/devtools/src/index.js +46 -0
- package/dist/modules/devtools/src/init.js +204 -0
- package/dist/modules/devtools/src/label-overlay.js +129 -0
- package/dist/modules/devtools/src/material-stats-panel.js +171 -0
- package/dist/modules/devtools/src/profiling-bridge.js +288 -0
- package/dist/modules/devtools/src/profiling-hooks.js +63 -0
- package/dist/modules/devtools/src/renderer-adapter.js +61 -0
- package/dist/modules/devtools/src/scene-inspector.js +571 -0
- package/dist/modules/devtools/src/scene-store.js +212 -0
- package/dist/modules/devtools/src/scene-sync.js +92 -0
- package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
- package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
- package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
- package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
- package/dist/modules/devtools/src/transform-gizmo.js +677 -0
- package/dist/modules/devtools/src/types.js +5 -0
- package/dist/modules/devtools/src/worker-expose.js +59 -0
- package/dist/modules/devtools/src/worker-sync.js +115 -0
- package/dist/modules/editor/src/commands/component.js +151 -0
- package/dist/modules/editor/src/commands/entity.js +253 -0
- package/dist/modules/editor/src/commands/hierarchy.js +79 -0
- package/dist/modules/editor/src/commands/index.js +57 -0
- package/dist/modules/editor/src/commands/prefab.js +149 -0
- package/dist/modules/editor/src/commands/registry.js +246 -0
- package/dist/modules/editor/src/commands/scene-io.js +206 -0
- package/dist/modules/editor/src/commands/selection.js +71 -0
- package/dist/modules/editor/src/commands/transform.js +88 -0
- package/dist/modules/editor/src/ddscene.js +189 -0
- package/dist/modules/editor/src/document.js +96 -0
- package/dist/modules/editor/src/editor-context.js +115 -0
- package/dist/modules/editor/src/index.js +11 -0
- package/dist/modules/editor/src/mcp.js +91 -0
- package/dist/modules/editor/src/module.js +115 -0
- package/dist/modules/editor/src/selection.js +60 -0
- package/dist/modules/editor/src/shell.js +397 -0
- package/dist/modules/editor/src/viewport.js +186 -0
- package/dist/modules/html-ui/src/composite.js +116 -0
- package/dist/modules/html-ui/src/create-html-ui.js +137 -0
- package/dist/modules/html-ui/src/doc-backend.js +518 -0
- package/dist/modules/html-ui/src/host.js +819 -0
- package/dist/modules/html-ui/src/index.js +5 -0
- package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
- package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
- package/dist/modules/html-ui/src/protocol.js +6 -0
- package/dist/modules/html-ui/src/ui-worker.js +10 -0
- package/dist/modules/mcp/src/index.js +62 -0
- package/dist/modules/movement-2d/src/grid-character.js +345 -0
- package/dist/modules/movement-2d/src/index.js +27 -0
- package/dist/modules/movement-3d/src/character-motor.js +166 -0
- package/dist/modules/movement-3d/src/index.js +27 -0
- package/dist/modules/native-osr/src/index.js +12 -0
- package/dist/modules/native-osr/src/input-router.js +335 -0
- package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
- package/dist/modules/native-osr/src/native-texture-source.js +66 -0
- package/dist/modules/native-osr/src/types.js +8 -0
- package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
- package/dist/modules/sailing/src/index.js +39 -0
- package/dist/modules/terrain/src/index.js +44 -0
- package/dist/modules/vitals/src/index.js +25 -0
- package/dist/modules/vitals/src/vitals.js +195 -0
- package/dist/modules/xr/src/camera-rig.js +119 -0
- package/dist/modules/xr/src/debug.js +45 -0
- package/dist/modules/xr/src/frame-loop.js +139 -0
- package/dist/modules/xr/src/index.js +10 -0
- package/dist/modules/xr/src/input.js +164 -0
- package/dist/modules/xr/src/layer.js +100 -0
- package/dist/modules/xr/src/session.js +133 -0
- package/dist/modules/xr/src/sim-module.js +21 -0
- package/dist/modules/xr/src/types.js +4 -0
- package/dist/modules/xr/src/webxr.d.ts +182 -0
- package/dist/modules/xr/src/xr-module.js +134 -0
- package/dist/shader-graph/src/chunks.js +340 -0
- package/dist/shader-graph/src/compiler.js +639 -0
- package/dist/shader-graph/src/compute-compiler.js +384 -0
- package/dist/shader-graph/src/compute-graph.js +55 -0
- package/dist/shader-graph/src/compute-profiles.js +39 -0
- package/dist/shader-graph/src/graph.js +38 -0
- package/dist/shader-graph/src/index.js +15 -0
- package/dist/shader-graph/src/profiles.js +305 -0
- package/dist/shader-graph/src/validator.js +42 -0
- package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
- package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
- package/dist/shader-graph/src/wgsl-struct.js +251 -0
- package/dist/test/src/index.js +1 -0
- package/dist/test/src/vision-test.js +228 -0
- package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
- package/libraries/audio-kira/src/backend.ts +2 -1
- package/libraries/blitz-ui/native/src/shell.rs +35 -1
- package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
- package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
- package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
- package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
- package/libraries/blitz-ui/src/router.ts +3 -1
- package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
- package/libraries/character/src/character-animator.ts +1 -1
- package/libraries/character/src/customization.ts +513 -0
- package/libraries/character/src/index.ts +6 -0
- package/libraries/character/src/inspectable.ts +111 -0
- package/libraries/character/src/loader.ts +38 -13
- package/libraries/character/src/locomotion.ts +13 -1
- package/libraries/character/src/preview.ts +94 -24
- package/libraries/devtools/README.md +16 -18
- package/libraries/devtools/src/backend.ts +505 -0
- package/libraries/devtools/src/cdp-bridge.ts +8 -8
- package/libraries/devtools/src/collectors.ts +41 -37
- package/libraries/devtools/src/index.ts +32 -14
- package/libraries/devtools/src/native-providers.ts +20 -12
- package/libraries/devtools/src/snapshot.ts +77 -0
- package/libraries/devtools/src/web/host.ts +11 -12
- package/libraries/devtools/src/web/mirror.ts +14 -405
- package/libraries/devtools/src/web/server.ts +4 -3
- package/libraries/entities/src/model-renderer.ts +96 -23
- package/libraries/gamepad/src/library.ts +2 -1
- package/libraries/inspectable/src/index.ts +11 -0
- package/libraries/inspectable/src/inspectable.ts +277 -0
- package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
- package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
- package/libraries/models/src/index.ts +1 -0
- package/libraries/models/src/types.ts +22 -0
- package/libraries/persistence/src/autosave-manager.ts +1 -1
- package/libraries/persistence/src/binary-record-store.ts +1 -1
- package/libraries/persistence/src/file-save-store.ts +4 -4
- package/libraries/persistence/src/library.ts +1 -1
- package/libraries/persistence/src/opfs-save-store.ts +5 -5
- package/libraries/persistence/src/save-worker.ts +13 -14
- package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
- package/libraries/postfx/src/post-process-stack.ts +1 -1
- package/libraries/sand/src/sand-step-pool.ts +5 -0
- package/libraries/water/src/water-renderer.ts +1 -1
- package/libraries/weatherfx/src/cloud-system.ts +3 -3
- package/mcp/README.md +20 -0
- package/mcp/src/client.ts +75 -22
- package/mcp/src/undo-redo.ts +2 -2
- package/modules/devtools/src/blitz/host.ts +430 -0
- package/modules/devtools/src/blitz/module.ts +101 -0
- package/modules/devtools/src/blitz/panels/console.ts +223 -0
- package/modules/devtools/src/blitz/panels/elements.ts +92 -0
- package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
- package/modules/devtools/src/blitz/panels/performance.ts +120 -0
- package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
- package/modules/devtools/src/blitz/panels/types.ts +120 -0
- package/modules/devtools/src/blitz/theme.ts +168 -0
- package/modules/devtools/src/data-bridge.ts +1 -1
- package/modules/devtools/src/index.ts +6 -0
- package/modules/devtools/src/profiling-bridge.ts +17 -13
- package/modules/devtools/src/profiling-hooks.ts +22 -13
- package/modules/devtools/src/scene-inspector.ts +1 -1
- package/modules/devtools/src/worker-sync.ts +9 -1
- package/modules/editor/src/commands/registry.ts +2 -2
- package/modules/editor/src/module.ts +1 -1
- package/modules/html-ui/src/composite.ts +1 -1
- package/modules/html-ui/src/create-html-ui.ts +21 -9
- package/modules/html-ui/src/doc-backend.ts +189 -10
- package/modules/html-ui/src/host.ts +354 -40
- package/modules/html-ui/src/index.ts +1 -1
- package/modules/html-ui/src/jsx-runtime.ts +1 -1
- package/modules/html-ui/src/protocol.ts +53 -6
- package/modules/mcp/README.md +6 -0
- package/modules/mcp/src/index.ts +70 -3
- package/modules/movement-3d/src/character-motor.ts +83 -10
- package/package.json +838 -165
- package/shader-graph/README.md +25 -0
- package/test/README.md +16 -0
- package/libraries/blitz-ui/native-osr-spike.ts +0 -70
- package/libraries/devtools/native/Cargo.toml +0 -12
- package/libraries/devtools/native/src/lib.rs +0 -1646
- package/libraries/devtools/native/src/panels/console.rs +0 -338
- package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
- package/libraries/devtools/native/src/panels/generic.rs +0 -317
- package/libraries/devtools/native/src/panels/gpu.rs +0 -107
- package/libraries/devtools/native/src/panels/input.rs +0 -88
- package/libraries/devtools/native/src/panels/mod.rs +0 -154
- package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
- package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
- package/libraries/devtools/native/src/panels/scene.rs +0 -72
- package/libraries/devtools/native/src/state.rs +0 -394
- package/libraries/devtools/src/egui-ffi.ts +0 -804
- package/libraries/devtools/src/egui-renderer.ts +0 -407
- package/libraries/devtools/src/host.ts +0 -363
- package/libraries/devtools/src/mirror.ts +0 -794
- package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
- package/libraries/models/test-fixtures/fbx/README.md +0 -46
- package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
- package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
- package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
- package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
- package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
|
@@ -0,0 +1,562 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// GameModule — declarative game definition + startGame() entry point
|
|
3
|
+
//
|
|
4
|
+
// A `GameModule` is a declarative description of a game's renderer-side
|
|
5
|
+
// bootstrap: the renderer factory, sim worker factory, UI mount, event
|
|
6
|
+
// routing, save config, devtools, and game-specific hooks. `startGame()`
|
|
7
|
+
// consumes a module and orchestrates the full bootstrap sequence, collapsing
|
|
8
|
+
// the ~700-line per-game `main.tsx` into a ~100-line module declaration.
|
|
9
|
+
//
|
|
10
|
+
// Design goals:
|
|
11
|
+
// - Declarative: games declare *what* they need, not *how* to wire it.
|
|
12
|
+
// - Progressive: every field is optional except `renderer` and `sim`.
|
|
13
|
+
// Simple games get a 10-line module; complex games add hooks.
|
|
14
|
+
// - Typed: the `GameContext` passed to hooks carries typed references
|
|
15
|
+
// (renderer, simWorker, SABs, saveStore, bridge) — no module-scope `let`.
|
|
16
|
+
// - Escape hatches: `onInit` / `onReady` / `onDispose` hooks let games
|
|
17
|
+
// run bespoke logic at well-defined points in the sequence.
|
|
18
|
+
//
|
|
19
|
+
// `startGame()` wraps `bootstrapGame()` — games that need full control can
|
|
20
|
+
// still call `bootstrapGame()` directly.
|
|
21
|
+
// ============================================================================
|
|
22
|
+
import { ENGINE_VERSION, LibraryHostImpl, PluginHost, WorkerPluginLoader, isDevMode } from "@downdraft/engine";
|
|
23
|
+
import { createLogger } from "@downdraft/engine/util/logger";
|
|
24
|
+
import { bootstrapGame } from "./bootstrap.js";
|
|
25
|
+
import { downdraft, getSurface } from "./index.js";
|
|
26
|
+
import { createSaveStore, isOpfsAvailable } from "./save-store-factory.js";
|
|
27
|
+
const log = createLogger("info");
|
|
28
|
+
/**
|
|
29
|
+
* Serialize the restore payload for a SaveState components map.
|
|
30
|
+
* `explicit` (GameSaveConfig.componentName) selects a single component's
|
|
31
|
+
* `data`. Otherwise: a single-component save unwraps to its `data` (the raw
|
|
32
|
+
* payload restores expect), while a multi-component save forwards the whole
|
|
33
|
+
* map — the worker's extractRestoreData passes component-map input through
|
|
34
|
+
* to the game's restore, which selects the sections it owns. Picking the
|
|
35
|
+
* first component would silently drop the rest of the world.
|
|
36
|
+
*/
|
|
37
|
+
export function serializeRestorePayload(components, explicit) {
|
|
38
|
+
if (explicit) {
|
|
39
|
+
const comp = components[explicit];
|
|
40
|
+
if (!comp) {
|
|
41
|
+
log.warn("start-game", `Save component "${explicit}" not found; available: ${Object.keys(components).join(", ")}`);
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
return JSON.stringify(comp.data);
|
|
45
|
+
}
|
|
46
|
+
const keys = Object.keys(components).filter((k) => components[k]?.data !== undefined && components[k]?.data !== null);
|
|
47
|
+
if (keys.length === 0)
|
|
48
|
+
return undefined;
|
|
49
|
+
if (keys.length === 1)
|
|
50
|
+
return JSON.stringify(components[keys[0]].data);
|
|
51
|
+
return JSON.stringify(components);
|
|
52
|
+
}
|
|
53
|
+
// ── startGame() ──
|
|
54
|
+
/**
|
|
55
|
+
* Start a game from a declarative `GameModule`.
|
|
56
|
+
*
|
|
57
|
+
* This is the high-level entry point. It wraps `bootstrapGame()` and adds:
|
|
58
|
+
* - Engine library auto-wiring (SAB allocation, sim systems, renderer passes)
|
|
59
|
+
* - Sim worker spawn + SAB capture (skipped for renderer-only games)
|
|
60
|
+
* - Declarative event routing (the `events` map — sim-worker games only)
|
|
61
|
+
* - Save store initialization (sim-worker or renderer-side save source)
|
|
62
|
+
* - Typed `GameContext` passed to all hooks
|
|
63
|
+
*
|
|
64
|
+
* Two topologies are supported:
|
|
65
|
+
* - **Sim-worker**: `module.sim` is declared → worker spawned, SABs captured,
|
|
66
|
+
* events routed, sim started after renderer init.
|
|
67
|
+
* - **Renderer-only**: `module.sim` is omitted → no worker, no SABs, no
|
|
68
|
+
* event routing. All logic runs on the renderer thread. Declare
|
|
69
|
+
* `module.saveSource` for autosave support.
|
|
70
|
+
*
|
|
71
|
+
* Games that need full control can call `bootstrapGame()` directly.
|
|
72
|
+
*/
|
|
73
|
+
export async function startGame(module) {
|
|
74
|
+
const deterministic = !!downdraft?.deterministic;
|
|
75
|
+
const isDev = !!(downdraft?.isDev) || isDevMode;
|
|
76
|
+
const hasSim = !!module.sim;
|
|
77
|
+
// Dev-session guard: capture the session snapshot this boot belongs to.
|
|
78
|
+
// If an HMR restart lands while a boot-stage await below is suspended, the
|
|
79
|
+
// continuation belongs to a dead generation — and the tracker by then may
|
|
80
|
+
// already host the NEXT session, which would happily track this dead gen's
|
|
81
|
+
// listeners/timers (pinning its whole module graph for a generation). Bail
|
|
82
|
+
// instead. No tracker → production mode → never aborts.
|
|
83
|
+
const ddTracker = globalThis.__ddSession;
|
|
84
|
+
const bootSession = ddTracker?.session ?? null;
|
|
85
|
+
const sessionAborted = () => (!!ddTracker && (ddTracker.session !== bootSession || !bootSession || bootSession.dead))
|
|
86
|
+
|| typeof globalThis.window === "undefined";
|
|
87
|
+
// 0. Resolve the render surface (NativeSurface on the native runtime)
|
|
88
|
+
const surface = getSurface(module.canvasLayer ?? 0);
|
|
89
|
+
// 0b. Allocate library SABs (if any libraries declared) — before sim worker
|
|
90
|
+
// creation so the sim factory can receive externally-allocated SABs.
|
|
91
|
+
let libHost = null;
|
|
92
|
+
let libBuffers = {};
|
|
93
|
+
if (module.libraries && module.libraries.length > 0) {
|
|
94
|
+
libHost = new LibraryHostImpl(module.libraries);
|
|
95
|
+
libBuffers = libHost.allocateBuffers();
|
|
96
|
+
}
|
|
97
|
+
// 0c. Construct the renderer-side plugin host (if plugins declared).
|
|
98
|
+
// Sim-thread plugins are forwarded to the sim worker after it starts;
|
|
99
|
+
// renderer/own-worker plugins load here. The host is exposed on ctx so
|
|
100
|
+
// games + the doctor panel can query snapshots.
|
|
101
|
+
let pluginHost = null;
|
|
102
|
+
if (module.plugins) {
|
|
103
|
+
const pCfg = module.plugins;
|
|
104
|
+
const hostOpts = {
|
|
105
|
+
gameId: downdraft?.appId ?? "unknown",
|
|
106
|
+
engineVersion: ENGINE_VERSION,
|
|
107
|
+
gameAllow: pCfg.permissions,
|
|
108
|
+
eventCatalog: pCfg.eventCatalog,
|
|
109
|
+
sources: pCfg.sources,
|
|
110
|
+
};
|
|
111
|
+
pluginHost = new PluginHost(hostOpts);
|
|
112
|
+
// Register the worker-js loader (handles own-worker plugins on renderer).
|
|
113
|
+
pluginHost.registerLoader(new WorkerPluginLoader());
|
|
114
|
+
// Pre-resolved manifests (tests / first-party plugins).
|
|
115
|
+
for (let _i23990 = 0, _it23990 = (pCfg.manifests ?? []), _n23990 = _it23990.length; _i23990 < _n23990; _i23990++) {
|
|
116
|
+
const m = _it23990[_i23990];
|
|
117
|
+
pluginHost.discover(m, "inline");
|
|
118
|
+
}
|
|
119
|
+
;
|
|
120
|
+
// Manifests are discovered via the plugin host's discover() API. Here we
|
|
121
|
+
// only load what's been discovered so far.
|
|
122
|
+
}
|
|
123
|
+
// 1. Create sim worker + capture SABs (renderer-only games skip this).
|
|
124
|
+
// If libraries declared, pass the library-allocated SABs to the sim
|
|
125
|
+
// factory via a seed object so the sim can share them zero-copy.
|
|
126
|
+
const simSeed = Object.keys(libBuffers).length > 0 ? { libraryBuffers: libBuffers } : undefined;
|
|
127
|
+
const simWorker = hasSim ? module.sim(simSeed) : null;
|
|
128
|
+
const simSAB = simWorker?.getSimBuffer();
|
|
129
|
+
const inputSAB = simWorker?.getInputBuffer();
|
|
130
|
+
const extraBuffers = simWorker?.getExtraBuffers?.() ?? {};
|
|
131
|
+
// 2. Create renderer
|
|
132
|
+
const renderer = module.renderer(surface);
|
|
133
|
+
// 3. Build the game context. Sim fields are undefined for renderer-only games.
|
|
134
|
+
const ctx = {
|
|
135
|
+
renderer,
|
|
136
|
+
surface,
|
|
137
|
+
sim: simWorker,
|
|
138
|
+
simSAB,
|
|
139
|
+
inputSAB,
|
|
140
|
+
extraBuffers,
|
|
141
|
+
saveStore: null,
|
|
142
|
+
saveMode: "host",
|
|
143
|
+
saveSource: module.saveSource,
|
|
144
|
+
bridge: downdraft,
|
|
145
|
+
deterministic,
|
|
146
|
+
isDev,
|
|
147
|
+
};
|
|
148
|
+
// 3b. Merge library SABs into extraBuffers + store host on ctx
|
|
149
|
+
if (libHost) {
|
|
150
|
+
for (const [name, sab] of Object.entries(libBuffers)) {
|
|
151
|
+
if (name in ctx.extraBuffers) {
|
|
152
|
+
log.warn("start-game", `library SAB channel "${name}" shadows a same-named sim extra buffer in ctx.extraBuffers`);
|
|
153
|
+
}
|
|
154
|
+
ctx.extraBuffers[name] = sab;
|
|
155
|
+
}
|
|
156
|
+
ctx.libraryHost = libHost;
|
|
157
|
+
}
|
|
158
|
+
// 3c. Expose the plugin host on ctx (if constructed).
|
|
159
|
+
if (pluginHost) {
|
|
160
|
+
ctx.pluginHost = pluginHost;
|
|
161
|
+
}
|
|
162
|
+
// Event kinds emitted by the engine itself (sim-worker-base lifecycle)
|
|
163
|
+
// that games are not required to handle — suppress the dev warning for
|
|
164
|
+
// these so autosave doesn't spam the console when no handler is wired.
|
|
165
|
+
const ENGINE_EMITTED_EVENT_KINDS = new Set(["ready", "saved", "loaded", "error"]);
|
|
166
|
+
// 4. Wire event routing from the declarative events map (sim-worker only).
|
|
167
|
+
// Supports both GameSimWorker.onEvent(cb) and SimWorkerHost's
|
|
168
|
+
// subscribeEvents(cb) (renderer-owned worker hosts).
|
|
169
|
+
const wireSimEvents = (worker) => {
|
|
170
|
+
if (!module.events || !worker)
|
|
171
|
+
return;
|
|
172
|
+
const events = module.events;
|
|
173
|
+
// Prefer subscribeEvents when present: SimWorkerHost subclasses expose it
|
|
174
|
+
// as the public registration API, while their protected onEvent(kind,data)
|
|
175
|
+
// is the internal dispatcher (and would be incorrectly bound if we probed
|
|
176
|
+
// onEvent first — it exists on the prototype at runtime).
|
|
177
|
+
const onEvent = worker.subscribeEvents
|
|
178
|
+
? (cb) => { worker.subscribeEvents(cb); }
|
|
179
|
+
: worker.onEvent?.bind(worker);
|
|
180
|
+
if (!onEvent)
|
|
181
|
+
return;
|
|
182
|
+
onEvent((msg) => {
|
|
183
|
+
const handler = events[msg.kind];
|
|
184
|
+
if (handler) {
|
|
185
|
+
try {
|
|
186
|
+
handler(msg.data, ctx);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
log.error("start-game", `Event handler error for "${msg.kind}": ${err}`);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
else if (isDev && !ENGINE_EMITTED_EVENT_KINDS.has(msg.kind)) {
|
|
193
|
+
log.warn("start-game", `Unhandled sim event kind: "${msg.kind}"`);
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
};
|
|
197
|
+
if (simWorker)
|
|
198
|
+
wireSimEvents(simWorker);
|
|
199
|
+
// 5. Run onBeforeInit hook
|
|
200
|
+
if (module.onBeforeInit) {
|
|
201
|
+
await module.onBeforeInit(ctx);
|
|
202
|
+
if (sessionAborted())
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
// 6. Initialize save store (if configured) — for non-inline modes this
|
|
206
|
+
// runs before bootstrapGame so onReady can use it. For inline mode
|
|
207
|
+
// (sim-worker + OPFS), the store is initialized inside onRendererInit
|
|
208
|
+
// after the sim worker has started.
|
|
209
|
+
if (module.save && !deterministic) {
|
|
210
|
+
try {
|
|
211
|
+
// Default to "host" (disk via the host's typed save store) when the
|
|
212
|
+
// bridge exposes one — on native this is HostSaveStore over
|
|
213
|
+
// HostServices. Fall back to "auto" (OPFS) only in a pure browser
|
|
214
|
+
// where there is no host bridge.
|
|
215
|
+
const saveMode = module.save.mode ?? (downdraft.saveStore ? "host" : "auto");
|
|
216
|
+
if (saveMode === "auto" && simWorker?.initSaveStore && isOpfsAvailable() && !downdraft.saveStore) {
|
|
217
|
+
// Inline mode — defer init to onRendererInit (after sim worker starts).
|
|
218
|
+
ctx.saveMode = "inline";
|
|
219
|
+
ctx.saveStore = null;
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
const { store, mode: resolvedMode } = await createSaveStore({
|
|
223
|
+
mode: saveMode,
|
|
224
|
+
opfsOptions: {
|
|
225
|
+
engineVersion: module.save.engineVersion,
|
|
226
|
+
maxGenerations: module.save.maxGenerations ?? 3,
|
|
227
|
+
},
|
|
228
|
+
bridge: downdraft,
|
|
229
|
+
});
|
|
230
|
+
ctx.saveStore = store;
|
|
231
|
+
// resolvedMode is "worker" | "host" | "inline" (inline returns a
|
|
232
|
+
// null store); narrow to the ctx.saveMode union accordingly.
|
|
233
|
+
ctx.saveMode = resolvedMode === "inline" ? "inline"
|
|
234
|
+
: resolvedMode === "worker" ? "worker" : "host";
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
catch (e) {
|
|
238
|
+
log.warn("start-game", `Save store init failed, falling back to host bridge: ${e}`);
|
|
239
|
+
ctx.saveMode = "host";
|
|
240
|
+
}
|
|
241
|
+
if (sessionAborted())
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
// 6b. Mode-aware save/load helpers — exposed on ctx so games can trigger manual
|
|
245
|
+
// saves/loads that work regardless of the selected backend. This is the
|
|
246
|
+
// same logic the autosave interval uses below. Games MUST use ctx.save /
|
|
247
|
+
// ctx.load instead of sim.save / sim.load directly: sim.save only writes
|
|
248
|
+
// in inline mode (it has its own OPFS store) and silently drops the save
|
|
249
|
+
// in host mode (it returns stateJson but nothing forwards it to disk).
|
|
250
|
+
if (module.save && !deterministic) {
|
|
251
|
+
ctx.save = async (slotName) => {
|
|
252
|
+
try {
|
|
253
|
+
// Renderer-side save source takes priority (renderer-only games);
|
|
254
|
+
// otherwise fall back to the sim worker's save() (sim-worker games).
|
|
255
|
+
// ctx.sim covers simFromRenderer games, resolved after renderer init.
|
|
256
|
+
const sim = ctx.sim ?? simWorker;
|
|
257
|
+
const result = ctx.saveSource
|
|
258
|
+
? await ctx.saveSource.save(slotName)
|
|
259
|
+
: sim?.save
|
|
260
|
+
? await sim.save(slotName)
|
|
261
|
+
: null;
|
|
262
|
+
// In inline mode, the sim worker's save() already persisted to its own
|
|
263
|
+
// OPFS store — nothing more to do. In host/worker mode the sim worker
|
|
264
|
+
// only serialized — the renderer owns the store write.
|
|
265
|
+
if (result?.stateJson && ctx.saveMode !== "inline" && ctx.saveStore) {
|
|
266
|
+
const components = JSON.parse(result.stateJson);
|
|
267
|
+
const state = {
|
|
268
|
+
components,
|
|
269
|
+
meta: {
|
|
270
|
+
engineVersion: module.save?.engineVersion ?? "",
|
|
271
|
+
timestamp: Date.now() / 1000,
|
|
272
|
+
entityCount: 0,
|
|
273
|
+
playerCount: 0,
|
|
274
|
+
// Real SaveMeta from the worker's save.meta() hook wins.
|
|
275
|
+
...result.meta,
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
const sr = await ctx.saveStore.save(slotName, state);
|
|
279
|
+
return result.success !== false && sr.success;
|
|
280
|
+
}
|
|
281
|
+
return result?.success ?? false;
|
|
282
|
+
}
|
|
283
|
+
catch (e) {
|
|
284
|
+
log.error("start-game", `Manual save failed: ${e}`);
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
};
|
|
288
|
+
ctx.load = async (slotName) => {
|
|
289
|
+
try {
|
|
290
|
+
// Renderer-side save source load (renderer-only games)
|
|
291
|
+
if (ctx.saveSource?.load) {
|
|
292
|
+
const stateJson = await ctx.saveSource.load(slotName);
|
|
293
|
+
return stateJson ? JSON.parse(stateJson) : null;
|
|
294
|
+
}
|
|
295
|
+
// ctx.sim covers simFromRenderer games (resolved post renderer-init).
|
|
296
|
+
const sim = ctx.sim ?? simWorker;
|
|
297
|
+
// Inline mode: sim worker loads directly from its own OPFS store.
|
|
298
|
+
// The sim worker's load() restores state internally; we just need a
|
|
299
|
+
// truthy return value so any onLoad hook fires.
|
|
300
|
+
if (ctx.saveMode === "inline" && sim?.load) {
|
|
301
|
+
const success = await sim.load(slotName);
|
|
302
|
+
return success ? { restored: true } : null;
|
|
303
|
+
}
|
|
304
|
+
if (ctx.saveStore) {
|
|
305
|
+
const result = await ctx.saveStore.load(slotName);
|
|
306
|
+
const state = result?.state ?? null;
|
|
307
|
+
if (state && sim?.restoreFromState) {
|
|
308
|
+
// The save store returns a SaveState with `components`. Each
|
|
309
|
+
// component has { v, data } structure — forward the restore
|
|
310
|
+
// payload to the sim worker.
|
|
311
|
+
const components = state.components;
|
|
312
|
+
if (components) {
|
|
313
|
+
const payload = serializeRestorePayload(components, module.save?.componentName);
|
|
314
|
+
if (payload !== undefined) {
|
|
315
|
+
await sim.restoreFromState(payload);
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return state;
|
|
320
|
+
}
|
|
321
|
+
if (downdraft?.loadGameState) {
|
|
322
|
+
const stateJson = await downdraft.loadGameState(slotName);
|
|
323
|
+
if (!stateJson)
|
|
324
|
+
return null;
|
|
325
|
+
// The host bridge returns JSON.stringify(result.state.components),
|
|
326
|
+
// so the parsed result is the components map directly (not a
|
|
327
|
+
// SaveState). Find the game component (e.g. "sandbox") and
|
|
328
|
+
// forward its `data` to the sim worker.
|
|
329
|
+
let parsed = null;
|
|
330
|
+
try {
|
|
331
|
+
parsed = JSON.parse(stateJson);
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
// Non-JSON payload — fall through to raw restore.
|
|
335
|
+
}
|
|
336
|
+
if (sim?.restoreFromState) {
|
|
337
|
+
const components = parsed;
|
|
338
|
+
const payload = components && typeof components === "object"
|
|
339
|
+
? serializeRestorePayload(components, module.save?.componentName)
|
|
340
|
+
: undefined;
|
|
341
|
+
if (payload !== undefined) {
|
|
342
|
+
await sim.restoreFromState(payload);
|
|
343
|
+
}
|
|
344
|
+
else {
|
|
345
|
+
// No recognizable components map — forward the raw payload.
|
|
346
|
+
await sim.restoreFromState(stateJson);
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
// Return the parsed payload (or the raw string when it isn't JSON)
|
|
350
|
+
// — the previous version re-parsed unconditionally here, so a
|
|
351
|
+
// successful raw restore still reported failure.
|
|
352
|
+
return parsed ?? stateJson;
|
|
353
|
+
}
|
|
354
|
+
return null;
|
|
355
|
+
}
|
|
356
|
+
catch (e) {
|
|
357
|
+
log.error("start-game", `Manual load failed: ${e}`);
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
// 6c. Kick the default sim start early — `simWorker.start()` spawns the
|
|
363
|
+
// worker + sends init config and doesn't touch renderer state, so it
|
|
364
|
+
// can overlap renderer.init() instead of serializing behind it inside
|
|
365
|
+
// onRendererInit. `onInit` overrides own sim start entirely (e.g.
|
|
366
|
+
// to-the-ocean's Promise.all); `onSimStart` overrides stay deferred
|
|
367
|
+
// since they may depend on post-init ctx state; renderer-owned workers
|
|
368
|
+
// (simFromRenderer) are untouched.
|
|
369
|
+
let simStartPromise = null;
|
|
370
|
+
if (simWorker && !module.onInit && !module.onSimStart) {
|
|
371
|
+
simStartPromise = Promise.resolve(simWorker.start(module.simConfig ?? {}));
|
|
372
|
+
// Mark handled now — the real await (which re-throws on failure) happens
|
|
373
|
+
// at the original join point inside onRendererInit.
|
|
374
|
+
simStartPromise.catch(() => { });
|
|
375
|
+
}
|
|
376
|
+
// 7. Delegate to bootstrapGame() for the standard sequence
|
|
377
|
+
await bootstrapGame({
|
|
378
|
+
canvasLayer: module.canvasLayer,
|
|
379
|
+
fpsPollIntervalMs: module.fpsPollIntervalMs,
|
|
380
|
+
getActiveModules: module.getActiveModules,
|
|
381
|
+
createRenderer: () => renderer,
|
|
382
|
+
initRenderer: module.onInit
|
|
383
|
+
? () => module.onInit(ctx)
|
|
384
|
+
: (r) => r.init(),
|
|
385
|
+
onRendererInit: async (r) => {
|
|
386
|
+
// ── Library renderer setup ──
|
|
387
|
+
// Early renderer-only library setup (hosts, workers — no GPU needed).
|
|
388
|
+
// Runs before the GPU device is available so libraries can construct
|
|
389
|
+
// their host + provide DI tokens.
|
|
390
|
+
if (libHost && r) {
|
|
391
|
+
const device = r.getDevice?.();
|
|
392
|
+
const format = r.getFormat?.();
|
|
393
|
+
const moduleHost = r.getRendererModuleHost?.();
|
|
394
|
+
if (!moduleHost) {
|
|
395
|
+
log.warn("start-game", "renderer does not expose getRendererModuleHost() — EngineLibrary DI provides will be silently dropped");
|
|
396
|
+
}
|
|
397
|
+
const libProvide = (token, value) => {
|
|
398
|
+
if (moduleHost)
|
|
399
|
+
moduleHost.provideExternal("library", token, value);
|
|
400
|
+
};
|
|
401
|
+
const libInject = (token) => {
|
|
402
|
+
if (moduleHost)
|
|
403
|
+
return moduleHost.injectResource(token);
|
|
404
|
+
throw new Error(`Library inject("${token.key}") failed — no renderer plugin host available`);
|
|
405
|
+
};
|
|
406
|
+
const libInjectOptional = (token) => {
|
|
407
|
+
if (moduleHost)
|
|
408
|
+
return moduleHost.injectResourceOptional(token);
|
|
409
|
+
return undefined;
|
|
410
|
+
};
|
|
411
|
+
libHost.createRenderer({ provide: libProvide, inject: libInject, injectOptional: libInjectOptional });
|
|
412
|
+
// GPU-pass library init (after device is ready).
|
|
413
|
+
if (device && format) {
|
|
414
|
+
libHost.initRenderer({ device, format, provide: libProvide, inject: libInject, injectOptional: libInjectOptional });
|
|
415
|
+
libHost.setRendererBuffers(libBuffers, { provide: libProvide });
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
// ── Renderer-owned sim resolution ──
|
|
419
|
+
// Games whose renderer spawns/starts the sim worker internally (declared
|
|
420
|
+
// via `module.simFromRenderer` instead of `module.sim`) get the worker
|
|
421
|
+
// resolved here — after renderer.init() has created it. ctx.sim is
|
|
422
|
+
// populated and declarative `events` routing is wired, matching the
|
|
423
|
+
// factory-created path. startGame() never calls start() on it — the
|
|
424
|
+
// renderer owns the lifecycle.
|
|
425
|
+
if (module.simFromRenderer) {
|
|
426
|
+
try {
|
|
427
|
+
const owned = await module.simFromRenderer(r, ctx);
|
|
428
|
+
if (owned) {
|
|
429
|
+
ctx.sim = owned;
|
|
430
|
+
ctx.simSAB = owned.getSimBuffer();
|
|
431
|
+
ctx.inputSAB = owned.getInputBuffer();
|
|
432
|
+
const extra = owned.getExtraBuffers?.() ?? {};
|
|
433
|
+
for (const [name, sab] of Object.entries(extra)) {
|
|
434
|
+
ctx.extraBuffers[name] = sab;
|
|
435
|
+
}
|
|
436
|
+
wireSimEvents(owned);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
catch (e) {
|
|
440
|
+
log.warn("start-game", `simFromRenderer resolution failed: ${e}`);
|
|
441
|
+
}
|
|
442
|
+
if (sessionAborted())
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
// ── Sim worker start ──
|
|
446
|
+
// When `onInit` is NOT overridden, startGame owns sim start — it runs
|
|
447
|
+
// here, after renderer.init() has succeeded. When `onInit` IS overridden,
|
|
448
|
+
// the game's onInit owns sim start (e.g. to-the-ocean starts the sim in
|
|
449
|
+
// parallel with renderer.init() inside its onInit). Renderer-only games
|
|
450
|
+
// have no sim worker to start.
|
|
451
|
+
if (simWorker && !module.onInit) {
|
|
452
|
+
if (module.onSimStart) {
|
|
453
|
+
await module.onSimStart(ctx);
|
|
454
|
+
}
|
|
455
|
+
else if (simStartPromise) {
|
|
456
|
+
await simStartPromise;
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
await simWorker.start(module.simConfig ?? {});
|
|
460
|
+
}
|
|
461
|
+
if (sessionAborted())
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
// ── Inline save store init (sim-worker + OPFS) ──
|
|
465
|
+
// Now that the sim worker is started, initialize its inline OPFS store.
|
|
466
|
+
// This must happen before the autosave load (which runs in bootstrapGame
|
|
467
|
+
// after onRendererInit returns) so that the sim worker can load from OPFS.
|
|
468
|
+
if (ctx.saveMode === "inline" && (ctx.sim ?? simWorker)?.initSaveStore && module.save) {
|
|
469
|
+
try {
|
|
470
|
+
await (ctx.sim ?? simWorker).initSaveStore({
|
|
471
|
+
engineVersion: module.save.engineVersion,
|
|
472
|
+
maxGenerations: module.save.maxGenerations ?? 3,
|
|
473
|
+
});
|
|
474
|
+
}
|
|
475
|
+
catch (e) {
|
|
476
|
+
log.warn("start-game", `Inline save store init failed, falling back to host save store: ${e}`);
|
|
477
|
+
ctx.saveMode = "host";
|
|
478
|
+
}
|
|
479
|
+
if (sessionAborted())
|
|
480
|
+
return;
|
|
481
|
+
}
|
|
482
|
+
// ── Plugin loading ──
|
|
483
|
+
// Load all discovered plugins (renderer + own-worker threads). Sim-
|
|
484
|
+
// thread plugins are forwarded to the sim worker by the game's sim
|
|
485
|
+
// bridge (the sim worker runs its own PluginHost); here we load the
|
|
486
|
+
// renderer/own-worker subset. Failures are recorded on the plugin
|
|
487
|
+
// snapshot (ctx.pluginHost.snapshot()) and do not abort startup.
|
|
488
|
+
if (pluginHost) {
|
|
489
|
+
try {
|
|
490
|
+
// Wire the renderer's ModuleHost now that it exists — required for
|
|
491
|
+
// native-tier plugins (their context bridges into the typed-DI
|
|
492
|
+
// graph). Without it a native-tier mod fails with "no ModuleHost
|
|
493
|
+
// configured on this thread".
|
|
494
|
+
const mh = r?.getRendererModuleHost?.();
|
|
495
|
+
if (mh)
|
|
496
|
+
pluginHost.setModuleHost(mh);
|
|
497
|
+
await pluginHost.loadAll();
|
|
498
|
+
}
|
|
499
|
+
catch (e) {
|
|
500
|
+
log.warn("start-game", `Plugin loading error: ${e}`);
|
|
501
|
+
}
|
|
502
|
+
if (sessionAborted())
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
// ── Declarative UI lifecycle ──
|
|
506
|
+
// Create + start the UI handle before onReady so
|
|
507
|
+
// hooks can wire subscriptions against ctx.ui.
|
|
508
|
+
if (module.ui) {
|
|
509
|
+
try {
|
|
510
|
+
ctx.ui = await module.ui(ctx);
|
|
511
|
+
await ctx.ui.start();
|
|
512
|
+
}
|
|
513
|
+
catch (e) {
|
|
514
|
+
// UI failure is non-fatal — the game canvas still runs.
|
|
515
|
+
log.error("start-game", `UI start failed: ${e}`);
|
|
516
|
+
ctx.ui = undefined;
|
|
517
|
+
}
|
|
518
|
+
if (sessionAborted())
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
// ── Game-specific wiring ──
|
|
522
|
+
if (module.onReady) {
|
|
523
|
+
await module.onReady(ctx);
|
|
524
|
+
}
|
|
525
|
+
},
|
|
526
|
+
devtools: module.devtools,
|
|
527
|
+
autosave: module.save && !deterministic
|
|
528
|
+
? {
|
|
529
|
+
// Reuse the mode-aware ctx.save / ctx.load helpers so the autosave
|
|
530
|
+
// interval and manual saves share one code path.
|
|
531
|
+
load: async () => {
|
|
532
|
+
const slotName = module.save.slotName ?? "autosave";
|
|
533
|
+
return ctx.load(slotName);
|
|
534
|
+
},
|
|
535
|
+
save: async () => {
|
|
536
|
+
const slotName = module.save.slotName ?? "autosave";
|
|
537
|
+
await ctx.save(slotName);
|
|
538
|
+
},
|
|
539
|
+
intervalMs: module.save?.intervalMs,
|
|
540
|
+
}
|
|
541
|
+
: undefined,
|
|
542
|
+
mcp: module.mcp ? () => module.mcp(ctx) : undefined,
|
|
543
|
+
onDisplayInfo: module.onDisplayInfo
|
|
544
|
+
? (rate) => module.onDisplayInfo(rate, ctx)
|
|
545
|
+
: undefined,
|
|
546
|
+
onHotReloadDispose: () => {
|
|
547
|
+
ctx.ui?.dispose();
|
|
548
|
+
ctx.ui = undefined;
|
|
549
|
+
pluginHost?.disposeAll();
|
|
550
|
+
libHost?.disposeRenderer();
|
|
551
|
+
if (module.onDispose) {
|
|
552
|
+
module.onDispose(ctx);
|
|
553
|
+
}
|
|
554
|
+
},
|
|
555
|
+
onDeterministic: module.onDeterministic
|
|
556
|
+
? () => module.onDeterministic(ctx)
|
|
557
|
+
: undefined,
|
|
558
|
+
onFpsUpdate: module.onFpsUpdate
|
|
559
|
+
? (fps) => module.onFpsUpdate(fps, ctx)
|
|
560
|
+
: undefined,
|
|
561
|
+
});
|
|
562
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Individual composable hooks — fallback for games that need partial
|
|
3
|
+
// composition instead of the full bootstrapGame() orchestrator.
|
|
4
|
+
//
|
|
5
|
+
// These are plain functions (not React hooks) that return cleanup callbacks.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import { downdraft } from "./index.js";
|
|
8
|
+
/**
|
|
9
|
+
* Poll the renderer's FPS and call the callback at the given interval.
|
|
10
|
+
* Returns a cleanup function that clears the interval.
|
|
11
|
+
*/
|
|
12
|
+
export function useFpsPolling(renderer, onFps, intervalMs = 500) {
|
|
13
|
+
const id = setInterval(() => {
|
|
14
|
+
onFps(renderer.getFPS());
|
|
15
|
+
}, intervalMs);
|
|
16
|
+
return () => clearInterval(id);
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* In deterministic mode, pause the renderer's sim (so the e2e test can
|
|
20
|
+
* control it via MCP). No-op in non-deterministic mode.
|
|
21
|
+
*/
|
|
22
|
+
export function useDeterministicRenderPause(renderer, deterministic) {
|
|
23
|
+
if (deterministic && typeof renderer.pause === "function") {
|
|
24
|
+
renderer.pause();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Wire display info refresh rate updates.
|
|
29
|
+
* Returns a cleanup function that removes the listener.
|
|
30
|
+
*/
|
|
31
|
+
export function useDisplayInfo(onRefreshRate) {
|
|
32
|
+
if (!downdraft?.isAvailable)
|
|
33
|
+
return () => { };
|
|
34
|
+
downdraft.getDisplayInfo().then((info) => {
|
|
35
|
+
if (info.refreshRate > 0)
|
|
36
|
+
onRefreshRate(info.refreshRate);
|
|
37
|
+
}).catch(() => { });
|
|
38
|
+
return downdraft.onDisplayInfo((info) => {
|
|
39
|
+
if (info?.refreshRate > 0)
|
|
40
|
+
onRefreshRate(info.refreshRate);
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Register a Vite hot-reload dispose callback.
|
|
45
|
+
* In non-hot-reload environments, this is a no-op.
|
|
46
|
+
*/
|
|
47
|
+
export function useHotReloadDispose(disposeFn) {
|
|
48
|
+
dispose(disposeFn);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Internal: register a dispose callback via Vite's import.meta.hot API.
|
|
52
|
+
* Exported for bootstrapGame() to use.
|
|
53
|
+
*
|
|
54
|
+
* Under the native dev shell the callback also lands on the __ddSession
|
|
55
|
+
* dispose registry — vite only fires hot.dispose on targeted invalidation,
|
|
56
|
+
* NOT when a session restart clears the whole module cache, so the session
|
|
57
|
+
* teardown must own the second copy. The wrapper unregisters from the
|
|
58
|
+
* session when vite fires it (directed update) so it never runs twice.
|
|
59
|
+
*/
|
|
60
|
+
export function dispose(disposeFn) {
|
|
61
|
+
const hot = import.meta.hot;
|
|
62
|
+
const session = globalThis.__ddSession;
|
|
63
|
+
if (!hot?.dispose && !session?.onDispose) {
|
|
64
|
+
// Packaged/direct-run mode: no vite hot and no dev-shell session, so the
|
|
65
|
+
// callback would otherwise never fire — html-ui workers, plugin hosts,
|
|
66
|
+
// and module.onDispose would leak and pin the runtime after the window
|
|
67
|
+
// closes. Native entries drain this queue in their shutdown finally.
|
|
68
|
+
const g = globalThis;
|
|
69
|
+
(g.__ddDisposeQueue ??= []).push(disposeFn);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
let offSession = null;
|
|
73
|
+
const wrapped = () => {
|
|
74
|
+
offSession?.();
|
|
75
|
+
offSession = null;
|
|
76
|
+
return disposeFn();
|
|
77
|
+
};
|
|
78
|
+
if (hot?.dispose)
|
|
79
|
+
hot.dispose(wrapped);
|
|
80
|
+
if (session?.onDispose)
|
|
81
|
+
offSession = session.onDispose(wrapped);
|
|
82
|
+
}
|