@downdraft/engine 0.0.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/app/src/index.ts +10 -0
- package/app/src/renderer/bootstrap.ts +271 -0
- package/app/src/renderer/downdraft-base.css +93 -0
- package/app/src/renderer/feature-log.ts +200 -0
- package/app/src/renderer/game-module.ts +923 -0
- package/app/src/renderer/hooks.ts +88 -0
- package/app/src/renderer/hot-reload.ts +178 -0
- package/app/src/renderer/import-cache.ts +88 -0
- package/app/src/renderer/index.ts +206 -0
- package/app/src/renderer/mcp-harness.ts +144 -0
- package/app/src/renderer/save-store-factory.ts +239 -0
- package/app/src/renderer/sim-bridge.ts +183 -0
- package/app/src/renderer/standard-automation-tools.ts +771 -0
- package/app/src/shared/feature-log.ts +71 -0
- package/app/src/shared/gpu-info.ts +82 -0
- package/app/src/shared/import-cache-store.ts +142 -0
- package/app/src/shared/index.ts +6 -0
- package/app/src/shared/mcp-discovery.ts +47 -0
- package/app/src/shared/mcp-proxy.ts +82 -0
- package/app/src/shared/types.ts +324 -0
- package/asset-bake/src/bake-audio.ts +119 -0
- package/asset-bake/src/bake-gltf.ts +172 -0
- package/asset-bake/src/bake.ts +78 -0
- package/asset-bake/src/cache.ts +188 -0
- package/asset-bake/src/config.ts +186 -0
- package/asset-bake/src/index.ts +36 -0
- package/core/src/animation/animation-event.ts +41 -0
- package/core/src/animation/bone-mask.ts +122 -0
- package/core/src/animation/clip.ts +252 -0
- package/core/src/animation/index.ts +22 -0
- package/core/src/animation/mixamo.ts +113 -0
- package/core/src/animation/morph-target.ts +69 -0
- package/core/src/animation/player.ts +697 -0
- package/core/src/animation/retarget.ts +158 -0
- package/core/src/animation/skeleton-animator.ts +1399 -0
- package/core/src/animation/skeleton.ts +214 -0
- package/core/src/animation/state-machine.ts +280 -0
- package/core/src/assets/blob-store.ts +66 -0
- package/core/src/assets/cache.ts +186 -0
- package/core/src/assets/cubemap-converter.ts +155 -0
- package/core/src/assets/environment-manager.ts +121 -0
- package/core/src/assets/import-cache.ts +65 -0
- package/core/src/assets/import-settings.ts +72 -0
- package/core/src/assets/importer.ts +108 -0
- package/core/src/assets/index.ts +74 -0
- package/core/src/assets/irradiance-generator.ts +198 -0
- package/core/src/assets/loader-audio.ts +86 -0
- package/core/src/assets/loader-cubemap.ts +211 -0
- package/core/src/assets/loader-dds.ts +236 -0
- package/core/src/assets/loader-hdr.ts +474 -0
- package/core/src/assets/loader-mesh.ts +143 -0
- package/core/src/assets/loader-shader.ts +73 -0
- package/core/src/assets/loader-texture.ts +349 -0
- package/core/src/assets/lod.ts +198 -0
- package/core/src/assets/manager.ts +480 -0
- package/core/src/assets/manifest.ts +81 -0
- package/core/src/assets/material-bridge.ts +186 -0
- package/core/src/assets/model-importer.ts +72 -0
- package/core/src/assets/model-normalizer.ts +248 -0
- package/core/src/assets/model-to-gpu.ts +70 -0
- package/core/src/assets/model-to-mesh.ts +237 -0
- package/core/src/assets/prefilter-generator.ts +250 -0
- package/core/src/audio/engine.ts +177 -0
- package/core/src/audio/interface.ts +130 -0
- package/core/src/audio/listener.ts +32 -0
- package/core/src/audio/mixer.ts +141 -0
- package/core/src/audio/registry.ts +52 -0
- package/core/src/audio/sab.ts +87 -0
- package/core/src/audio/source.ts +89 -0
- package/core/src/change-detection/atomics.ts +1 -0
- package/core/src/change-detection/tracker.ts +47 -0
- package/core/src/debug-draw/lines.ts +64 -0
- package/core/src/debug-draw/points.ts +17 -0
- package/core/src/debug-draw/queue.ts +124 -0
- package/core/src/debug-draw/text.ts +25 -0
- package/core/src/ecs/archetype.ts +323 -0
- package/core/src/ecs/component.ts +188 -0
- package/core/src/ecs/entity.ts +25 -0
- package/core/src/ecs/events.ts +93 -0
- package/core/src/ecs/hierarchy.ts +124 -0
- package/core/src/ecs/hmr-swap-registry.ts +22 -0
- package/core/src/ecs/index.ts +25 -0
- package/core/src/ecs/query.ts +141 -0
- package/core/src/ecs/resource.ts +8 -0
- package/core/src/ecs/schedule.ts +181 -0
- package/core/src/ecs/system-params.ts +99 -0
- package/core/src/ecs/system.ts +42 -0
- package/core/src/ecs/world.ts +348 -0
- package/core/src/index.ts +352 -0
- package/core/src/input/context.ts +73 -0
- package/core/src/input/dom-handler.ts +380 -0
- package/core/src/input/local-player-manager.ts +218 -0
- package/core/src/input/mapping.ts +40 -0
- package/core/src/input/multi-sab-bridge.ts +276 -0
- package/core/src/input/multi-state.ts +54 -0
- package/core/src/input/sab-bridge.ts +71 -0
- package/core/src/input/state.ts +132 -0
- package/core/src/input/ui-router.ts +87 -0
- package/core/src/library/host.ts +317 -0
- package/core/src/library/index.ts +16 -0
- package/core/src/library/library.ts +292 -0
- package/core/src/material/compiler.ts +80 -0
- package/core/src/material/graph-bridge.ts +172 -0
- package/core/src/material/index.ts +9 -0
- package/core/src/material/library.ts +442 -0
- package/core/src/material/material.ts +156 -0
- package/core/src/material/variants.ts +61 -0
- package/core/src/math/mat4.ts +202 -0
- package/core/src/math/perlin-noise-2d.ts +77 -0
- package/core/src/math/perlin-noise-3d.ts +110 -0
- package/core/src/math/quat.ts +33 -0
- package/core/src/math/rng.ts +29 -0
- package/core/src/math/trig.ts +47 -0
- package/core/src/math/value-noise.ts +67 -0
- package/core/src/mesh/builder.ts +177 -0
- package/core/src/mesh/csg.ts +312 -0
- package/core/src/mesh/greased-line.ts +145 -0
- package/core/src/mesh/mesh.ts +17 -0
- package/core/src/mesh/parametric.ts +501 -0
- package/core/src/mesh/skinning.ts +67 -0
- package/core/src/mesh/vertex-layout.ts +91 -0
- package/core/src/module/cross-thread.ts +163 -0
- package/core/src/module/diagnostics.ts +123 -0
- package/core/src/module/host.ts +451 -0
- package/core/src/module/index.ts +22 -0
- package/core/src/module/module.ts +109 -0
- package/core/src/module/registry.ts +94 -0
- package/core/src/module/renderer-module.ts +247 -0
- package/core/src/module/ts-loader.ts +26 -0
- package/core/src/particles/compute-pass.ts +378 -0
- package/core/src/particles/emitter.ts +156 -0
- package/core/src/particles/index.ts +11 -0
- package/core/src/particles/particle-data.ts +47 -0
- package/core/src/particles/render-pass.ts +365 -0
- package/core/src/particles/simulator.ts +264 -0
- package/core/src/particles/system.ts +193 -0
- package/core/src/physics/body.ts +59 -0
- package/core/src/physics/ccd-heuristic.ts +55 -0
- package/core/src/physics/character.ts +282 -0
- package/core/src/physics/collider.ts +55 -0
- package/core/src/physics/collision-system.ts +91 -0
- package/core/src/physics/events.ts +133 -0
- package/core/src/physics/index.ts +34 -0
- package/core/src/physics/interface.ts +473 -0
- package/core/src/physics/interpolation-buffer.ts +192 -0
- package/core/src/physics/lifecycle.ts +87 -0
- package/core/src/physics/load-shedder.ts +164 -0
- package/core/src/physics/physics-accumulator.ts +101 -0
- package/core/src/physics/physics-system.ts +240 -0
- package/core/src/physics/ragdoll-presets.ts +272 -0
- package/core/src/physics/ragdoll-system.ts +220 -0
- package/core/src/physics/ragdoll.ts +182 -0
- package/core/src/physics/raycast.ts +143 -0
- package/core/src/physics/realm-manager.ts +499 -0
- package/core/src/physics/realm-worker-pool.ts +191 -0
- package/core/src/physics/realm-worker.ts +102 -0
- package/core/src/physics/realm.ts +189 -0
- package/core/src/physics/registry.ts +52 -0
- package/core/src/physics/safety.ts +247 -0
- package/core/src/physics/snapshot-manager.ts +141 -0
- package/core/src/physics/worker-protocol.ts +30 -0
- package/core/src/platform/bun-preload.ts +169 -0
- package/core/src/platform/css-stub.ts +4 -0
- package/core/src/platform/glob-polyfill.ts +124 -0
- package/core/src/platform/hidpi.ts +57 -0
- package/core/src/platform/render-surface.ts +77 -0
- package/core/src/platform/rpc.ts +98 -0
- package/core/src/platform/runtime.ts +132 -0
- package/core/src/plugin/context.ts +364 -0
- package/core/src/plugin/diagnostics.ts +61 -0
- package/core/src/plugin/discovery.ts +186 -0
- package/core/src/plugin/extension-loaders.ts +172 -0
- package/core/src/plugin/host.ts +659 -0
- package/core/src/plugin/index.ts +106 -0
- package/core/src/plugin/loader-asset.ts +124 -0
- package/core/src/plugin/loader-quickjs.ts +84 -0
- package/core/src/plugin/loader-wasm.ts +411 -0
- package/core/src/plugin/loader-worker.ts +261 -0
- package/core/src/plugin/manifest.ts +653 -0
- package/core/src/plugin/material-registry.ts +65 -0
- package/core/src/plugin/mcp-tools.ts +165 -0
- package/core/src/plugin/permissions.ts +175 -0
- package/core/src/plugin/quickjs-bridge.ts +294 -0
- package/core/src/plugin/registry.ts +107 -0
- package/core/src/plugin/sandbox-shim.ts +86 -0
- package/core/src/plugin/sandbox-worker.ts +215 -0
- package/core/src/plugin/wasm-abi.ts +152 -0
- package/core/src/plugin/wasm-worker.ts +229 -0
- package/core/src/plugin/workshop.ts +169 -0
- package/core/src/profiling/event-loop.ts +180 -0
- package/core/src/profiling/index.ts +69 -0
- package/core/src/profiling/iops/idb-patch.ts +242 -0
- package/core/src/profiling/iops/opfs-patch.ts +276 -0
- package/core/src/profiling/profiling-sab.ts +839 -0
- package/core/src/profiling/task-latency.ts +134 -0
- package/core/src/profiling/thread-metrics.ts +126 -0
- package/core/src/profiling/trace-event-writer.ts +205 -0
- package/core/src/profiling/warnings.ts +423 -0
- package/core/src/profiling/worker-prelude.ts +376 -0
- package/core/src/render/bind-group.ts +38 -0
- package/core/src/render/bindless/bindless-struct.ts +42 -0
- package/core/src/render/bindless/bindless.wgsl.ts +167 -0
- package/core/src/render/bindless/frame-bindings.ts +176 -0
- package/core/src/render/bindless/index.ts +10 -0
- package/core/src/render/bindless/material-manager.ts +257 -0
- package/core/src/render/bindless/texture-registry.ts +609 -0
- package/core/src/render/buffer.ts +82 -0
- package/core/src/render/camera-2d.ts +217 -0
- package/core/src/render/camera-controller.ts +440 -0
- package/core/src/render/camera.ts +409 -0
- package/core/src/render/canvas-resize-watcher.ts +46 -0
- package/core/src/render/compute-kernel.ts +172 -0
- package/core/src/render/constants.ts +2 -0
- package/core/src/render/device.ts +111 -0
- package/core/src/render/frame-graph.ts +768 -0
- package/core/src/render/frustum.ts +185 -0
- package/core/src/render/fullscreen-vs.ts +25 -0
- package/core/src/render/g-buffer.ts +186 -0
- package/core/src/render/game-renderer.ts +1452 -0
- package/core/src/render/gpu-driven/cull-pass.ts +394 -0
- package/core/src/render/gpu-driven/hzb.ts +215 -0
- package/core/src/render/gpu-driven/index.ts +7 -0
- package/core/src/render/gpu-driven/indirect-draw-pass.ts +324 -0
- package/core/src/render/gpu-driven/instance-buffer.ts +178 -0
- package/core/src/render/gpu-driven/mesh-table.ts +175 -0
- package/core/src/render/gpu-driven/passes/hzb-build-pass.ts +47 -0
- package/core/src/render/gpu-utils.ts +96 -0
- package/core/src/render/hdr.ts +88 -0
- package/core/src/render/hot-reload.ts +295 -0
- package/core/src/render/ibl-bind-group.ts +266 -0
- package/core/src/render/ibl.ts +180 -0
- package/core/src/render/index.ts +163 -0
- package/core/src/render/input-manager.ts +259 -0
- package/core/src/render/lighting/area-light.ts +196 -0
- package/core/src/render/lighting/cluster-grid.ts +288 -0
- package/core/src/render/lighting/cluster-types.ts +193 -0
- package/core/src/render/lighting/ies-parser.ts +162 -0
- package/core/src/render/lighting.ts +454 -0
- package/core/src/render/material-types/depth.wgsl +44 -0
- package/core/src/render/material-types/line.wgsl +50 -0
- package/core/src/render/material-types/matcap.wgsl +51 -0
- package/core/src/render/material-types/normal.wgsl +41 -0
- package/core/src/render/material-types/physical.wgsl +152 -0
- package/core/src/render/material-types/sprite.wgsl +46 -0
- package/core/src/render/material-types/sss.wgsl +79 -0
- package/core/src/render/material-types/toon.wgsl +79 -0
- package/core/src/render/passes/README.md +121 -0
- package/core/src/render/passes/atmosphere.ts +152 -0
- package/core/src/render/passes/cluster-lighting-pass.ts +476 -0
- package/core/src/render/passes/csm.ts +408 -0
- package/core/src/render/passes/cubemap-capture.ts +114 -0
- package/core/src/render/passes/debug-viz.ts +278 -0
- package/core/src/render/passes/debug.ts +538 -0
- package/core/src/render/passes/decal-mesh.ts +111 -0
- package/core/src/render/passes/decal-pass.ts +377 -0
- package/core/src/render/passes/deferred-lighting.ts +434 -0
- package/core/src/render/passes/depth-prepass.ts +163 -0
- package/core/src/render/passes/dome-360.ts +83 -0
- package/core/src/render/passes/fluid-render.ts +137 -0
- package/core/src/render/passes/gi-types.ts +118 -0
- package/core/src/render/passes/graph-compute.ts +300 -0
- package/core/src/render/passes/greased-line-pass.ts +232 -0
- package/core/src/render/passes/morph-target.ts +40 -0
- package/core/src/render/passes/opaque.ts +1028 -0
- package/core/src/render/passes/point-light-shadow.ts +266 -0
- package/core/src/render/passes/procedural-texture.ts +185 -0
- package/core/src/render/passes/reflection-probe.ts +140 -0
- package/core/src/render/passes/rsm-pass.ts +248 -0
- package/core/src/render/passes/sdf-text.ts +155 -0
- package/core/src/render/passes/shadow-map.ts +163 -0
- package/core/src/render/passes/shadow.ts +220 -0
- package/core/src/render/passes/skinning-vs.ts +121 -0
- package/core/src/render/passes/skinning.ts +326 -0
- package/core/src/render/passes/sky-dome.ts +404 -0
- package/core/src/render/passes/skybox.ts +162 -0
- package/core/src/render/passes/spot-light-shadow.ts +273 -0
- package/core/src/render/passes/terrain.ts +326 -0
- package/core/src/render/passes/transparent.ts +353 -0
- package/core/src/render/passes/underwater-fog.ts +185 -0
- package/core/src/render/passes/video-texture.ts +79 -0
- package/core/src/render/passes/volumetric-pass.ts +312 -0
- package/core/src/render/passes/volumetric-types.ts +171 -0
- package/core/src/render/passes/water.ts +753 -0
- package/core/src/render/pbr.ts +296 -0
- package/core/src/render/pipeline.ts +52 -0
- package/core/src/render/render-pass.ts +30 -0
- package/core/src/render/renderer-input-bus.ts +220 -0
- package/core/src/render/renderer-module-host.ts +623 -0
- package/core/src/render/resource-tracker.ts +67 -0
- package/core/src/render/sab-canvas-overlay.ts +122 -0
- package/core/src/render/shader-validator.ts +200 -0
- package/core/src/render/shaders/debug/debug-line.wgsl +27 -0
- package/core/src/render/shaders/debug/debug-point.wgsl +30 -0
- package/core/src/render/shaders/debug/debug-text.wgsl +42 -0
- package/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
- package/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
- package/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
- package/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
- package/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
- package/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
- package/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
- package/core/src/render/shaders/shadow-chunks.ts +135 -0
- package/core/src/render/skybox.ts +146 -0
- package/core/src/render/splitscreen.ts +85 -0
- package/core/src/render/surface.ts +78 -0
- package/core/src/render/tonemap.ts +180 -0
- package/core/src/render/tracked-render-pass.ts +158 -0
- package/core/src/render/viewport.ts +109 -0
- package/core/src/render/wgsl-hmr.ts +70 -0
- package/core/src/sab/core-input-channel.ts +23 -0
- package/core/src/sab/define.ts +239 -0
- package/core/src/sab/errors.ts +76 -0
- package/core/src/sab/game-input.ts +343 -0
- package/core/src/sab/gamepad-devices.ts +259 -0
- package/core/src/sab/grid-buffer.ts +117 -0
- package/core/src/sab/input.ts +55 -0
- package/core/src/sab/layout.ts +219 -0
- package/core/src/sab/multi-input-channel.ts +50 -0
- package/core/src/sab/record-buffer.ts +155 -0
- package/core/src/sab/sab-polyfill.ts +56 -0
- package/core/src/sab/sim-channel.ts +453 -0
- package/core/src/sab/slot-buffer.ts +190 -0
- package/core/src/sab/types.ts +158 -0
- package/core/src/safety/bounds.ts +76 -0
- package/core/src/safety/json.ts +80 -0
- package/core/src/safety/path.ts +167 -0
- package/core/src/save/binary-format.ts +117 -0
- package/core/src/save/game-save-system.ts +161 -0
- package/core/src/save/grid-save-system.ts +158 -0
- package/core/src/save/migrate.ts +44 -0
- package/core/src/save/migration-registry.ts +94 -0
- package/core/src/save/persist-types.ts +208 -0
- package/core/src/save/schema.ts +46 -0
- package/core/src/save/serializer.ts +180 -0
- package/core/src/scene/builder.ts +65 -0
- package/core/src/scene/camera.ts +142 -0
- package/core/src/scene/checkpoint.ts +109 -0
- package/core/src/scene/game-loop.ts +198 -0
- package/core/src/scene/index.ts +24 -0
- package/core/src/scene/layer.ts +6 -0
- package/core/src/scene/prefab.ts +145 -0
- package/core/src/scene/scene-manager.ts +157 -0
- package/core/src/scene/scene.ts +192 -0
- package/core/src/scene/sky.ts +256 -0
- package/core/src/scene/spatial-grid.ts +176 -0
- package/core/src/scene/streaming.ts +304 -0
- package/core/src/scene/vegetation.ts +163 -0
- package/core/src/scene/world.ts +89 -0
- package/core/src/scripting/binding.ts +129 -0
- package/core/src/scripting/hot-reload.ts +144 -0
- package/core/src/scripting/script.ts +99 -0
- package/core/src/sim/hot-reload-pipeline.ts +49 -0
- package/core/src/sim/sim-state-helper.ts +47 -0
- package/core/src/sim/transient-state-registry.ts +77 -0
- package/core/src/sim/types.ts +113 -0
- package/core/src/sim/worker-loop.ts +222 -0
- package/core/src/stores/game-store.ts +158 -0
- package/core/src/stores/hot-reload-store.ts +44 -0
- package/core/src/telemetry/collector.ts +410 -0
- package/core/src/telemetry/gc-controller.ts +453 -0
- package/core/src/telemetry/gc-profiler.ts +126 -0
- package/core/src/telemetry/gc-tracker.ts +69 -0
- package/core/src/telemetry/gpu-profiler.ts +703 -0
- package/core/src/telemetry/gpu-resource-tracker.ts +285 -0
- package/core/src/telemetry/gpu-timer-pool.ts +234 -0
- package/core/src/telemetry/gpu-timer.ts +123 -0
- package/core/src/telemetry/gpu-timestamp-gate.ts +21 -0
- package/core/src/telemetry/reporter.ts +62 -0
- package/core/src/types/engine-types.ts +129 -0
- package/core/src/ui-font-scale.ts +112 -0
- package/core/src/util/broad-phase-grid.ts +82 -0
- package/core/src/util/feature-log.ts +220 -0
- package/core/src/util/index.ts +17 -0
- package/core/src/util/logger.ts +604 -0
- package/core/src/webgpu-destroy-augmentation.d.ts +25 -0
- package/core/src/worker/base-worker-host.ts +183 -0
- package/core/src/worker/buffer-sync.ts +550 -0
- package/core/src/worker/crash-recovery.ts +201 -0
- package/core/src/worker/entity-sim-worker-host.ts +190 -0
- package/core/src/worker/instrumented-worker-host.ts +171 -0
- package/core/src/worker/rpc.ts +253 -0
- package/core/src/worker/sim-worker-base.ts +913 -0
- package/core/src/worker/sim-worker-host.ts +358 -0
- package/core/src/worker/task-pool.ts +256 -0
- package/core/src/worker/task-worker.ts +83 -0
- package/libraries/asset-browser/src/index.ts +11 -0
- package/libraries/asset-browser/src/software-thumbnails.ts +949 -0
- package/libraries/audio-kira/README.md +17 -0
- package/libraries/audio-kira/native/Cargo.toml +14 -0
- package/libraries/audio-kira/native/src/engine.rs +27 -0
- package/libraries/audio-kira/native/src/lib.rs +185 -0
- package/libraries/audio-kira/native/src/mixer.rs +11 -0
- package/libraries/audio-kira/native/src/source.rs +80 -0
- package/libraries/audio-kira/src/backend.ts +469 -0
- package/libraries/audio-kira/src/index.ts +8 -0
- package/libraries/audio-kira/src/library.ts +82 -0
- package/libraries/blitz-ui/native/Cargo.toml +33 -0
- package/libraries/blitz-ui/native/assets/DejaVuSans.woff2 +0 -0
- package/libraries/blitz-ui/native/src/bridge.rs +100 -0
- package/libraries/blitz-ui/native/src/fonts.rs +20 -0
- package/libraries/blitz-ui/native/src/input.rs +80 -0
- package/libraries/blitz-ui/native/src/lib.rs +96 -0
- package/libraries/blitz-ui/native/src/shell.rs +301 -0
- package/libraries/blitz-ui/native-osr/Cargo.toml +24 -0
- package/libraries/blitz-ui/native-osr/src/events.rs +237 -0
- package/libraries/blitz-ui/native-osr/src/lib.rs +846 -0
- package/libraries/blitz-ui/native-osr/src/mutate.rs +385 -0
- package/libraries/blitz-ui/native-osr/src/resources.rs +45 -0
- package/libraries/blitz-ui/native-osr-spike.ts +70 -0
- package/libraries/blitz-ui/src/index.ts +15 -0
- package/libraries/blitz-ui/src/native-module.ts +221 -0
- package/libraries/blitz-ui/src/native-osr-ffi.ts +423 -0
- package/libraries/blitz-ui/src/router.ts +101 -0
- package/libraries/blitz-ui/src/shaders/ui-blit.wgsl.ts +35 -0
- package/libraries/blitz-ui/src/ui-blit-pass.ts +116 -0
- package/libraries/character/README.md +25 -0
- package/libraries/character/src/character-animator.ts +374 -0
- package/libraries/character/src/index.ts +24 -0
- package/libraries/character/src/loader.ts +375 -0
- package/libraries/character/src/locomotion.ts +124 -0
- package/libraries/character/src/preview.ts +287 -0
- package/libraries/devtools/README.md +51 -0
- package/libraries/devtools/native/Cargo.toml +12 -0
- package/libraries/devtools/native/src/lib.rs +1646 -0
- package/libraries/devtools/native/src/panels/console.rs +338 -0
- package/libraries/devtools/native/src/panels/dom_tree.rs +47 -0
- package/libraries/devtools/native/src/panels/generic.rs +317 -0
- package/libraries/devtools/native/src/panels/gpu.rs +107 -0
- package/libraries/devtools/native/src/panels/input.rs +88 -0
- package/libraries/devtools/native/src/panels/mod.rs +154 -0
- package/libraries/devtools/native/src/panels/perf_metrics.rs +91 -0
- package/libraries/devtools/native/src/panels/perf_recorder.rs +158 -0
- package/libraries/devtools/native/src/panels/scene.rs +72 -0
- package/libraries/devtools/native/src/state.rs +394 -0
- package/libraries/devtools/src/cdp-bridge.ts +349 -0
- package/libraries/devtools/src/collectors.ts +346 -0
- package/libraries/devtools/src/egui-ffi.ts +804 -0
- package/libraries/devtools/src/egui-renderer.ts +407 -0
- package/libraries/devtools/src/host.ts +363 -0
- package/libraries/devtools/src/index.ts +40 -0
- package/libraries/devtools/src/mirror.ts +794 -0
- package/libraries/devtools/src/native-providers.ts +744 -0
- package/libraries/devtools/src/verify.ts +167 -0
- package/libraries/devtools/src/web/browser.ts +102 -0
- package/libraries/devtools/src/web/host.ts +212 -0
- package/libraries/devtools/src/web/mirror.ts +430 -0
- package/libraries/devtools/src/web/server.ts +198 -0
- package/libraries/entities/README.md +17 -0
- package/libraries/entities/src/index.ts +4 -0
- package/libraries/entities/src/library.ts +64 -0
- package/libraries/entities/src/model-renderer.ts +1345 -0
- package/libraries/entities/src/shaders/model.wgsl +375 -0
- package/libraries/gamepad/src/feed-input.ts +83 -0
- package/libraries/gamepad/src/filters.ts +49 -0
- package/libraries/gamepad/src/glyphs.ts +93 -0
- package/libraries/gamepad/src/hub.ts +206 -0
- package/libraries/gamepad/src/index.ts +22 -0
- package/libraries/gamepad/src/library.ts +68 -0
- package/libraries/gamepad/src/source-sab.ts +70 -0
- package/libraries/gamepad/src/sysfs-enrich.ts +138 -0
- package/libraries/gaussian-splats/README.md +25 -0
- package/libraries/gaussian-splats/src/gpu-sort.ts +595 -0
- package/libraries/gaussian-splats/src/index.ts +31 -0
- package/libraries/gaussian-splats/src/library.ts +60 -0
- package/libraries/gaussian-splats/src/parser.ts +382 -0
- package/libraries/gaussian-splats/src/renderer.ts +427 -0
- package/libraries/gaussian-splats/src/sh-eval.ts +211 -0
- package/libraries/gaussian-splats/src/sorter.ts +110 -0
- package/libraries/gaussian-splats/src/tile-raster.ts +473 -0
- package/libraries/gpu-kernels/README.md +154 -0
- package/libraries/gpu-kernels/src/index.ts +11 -0
- package/libraries/gpu-kernels/src/kernel.ts +696 -0
- package/libraries/gpu-kernels/src/transpile.ts +958 -0
- package/libraries/html-ui-kit/src/behaviors.ts +250 -0
- package/libraries/html-ui-kit/src/components.ts +309 -0
- package/libraries/html-ui-kit/src/index.ts +30 -0
- package/libraries/html-ui-kit/src/nav/nav-controller.ts +238 -0
- package/libraries/html-ui-kit/src/nav/nav-input.ts +145 -0
- package/libraries/html-ui-kit/src/nav/osk.ts +153 -0
- package/libraries/html-ui-kit/src/nav/router.ts +167 -0
- package/libraries/html-ui-kit/src/nav/vcursor.ts +203 -0
- package/libraries/html-ui-kit/src/ten-foot.ts +182 -0
- package/libraries/html-ui-kit/src/theme.ts +238 -0
- package/libraries/lighting/README.md +20 -0
- package/libraries/lighting/src/index.ts +5 -0
- package/libraries/lighting/src/library.ts +66 -0
- package/libraries/lighting/src/light-system.ts +452 -0
- package/libraries/lighting/src/lighting-system.ts +68 -0
- package/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
- package/libraries/marching-cubes/README.md +25 -0
- package/libraries/marching-cubes/src/chunked-field.ts +177 -0
- package/libraries/marching-cubes/src/deformation.ts +63 -0
- package/libraries/marching-cubes/src/generator.ts +407 -0
- package/libraries/marching-cubes/src/index.ts +32 -0
- package/libraries/marching-cubes/src/library.ts +80 -0
- package/libraries/marching-cubes/src/lod.ts +122 -0
- package/libraries/marching-cubes/src/marching-tetrahedra.ts +252 -0
- package/libraries/marching-cubes/src/sab.ts +45 -0
- package/libraries/marching-cubes/src/streaming-config.ts +48 -0
- package/libraries/marching-cubes/src/streaming-manager.ts +686 -0
- package/libraries/marching-cubes/src/tables.ts +323 -0
- package/libraries/marching-cubes/src/types.ts +18 -0
- package/libraries/models/README.md +25 -0
- package/libraries/models/src/bake-node-transforms.ts +171 -0
- package/libraries/models/src/codecs/basisu-codec.ts +180 -0
- package/libraries/models/src/codecs/draco-codec.ts +372 -0
- package/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
- package/libraries/models/src/codecs/index.ts +22 -0
- package/libraries/models/src/codecs/meshopt-codec.ts +91 -0
- package/libraries/models/src/codecs/registry.ts +221 -0
- package/libraries/models/src/dae.ts +753 -0
- package/libraries/models/src/default-part-selection.ts +56 -0
- package/libraries/models/src/dxf.ts +200 -0
- package/libraries/models/src/fbx/index.ts +457 -0
- package/libraries/models/src/fbx/interpreter/animation.ts +431 -0
- package/libraries/models/src/fbx/interpreter/blend-shapes.ts +323 -0
- package/libraries/models/src/fbx/interpreter/connections.ts +166 -0
- package/libraries/models/src/fbx/interpreter/diagnostics.ts +65 -0
- package/libraries/models/src/fbx/interpreter/geometry.ts +535 -0
- package/libraries/models/src/fbx/interpreter/global-settings.ts +92 -0
- package/libraries/models/src/fbx/interpreter/materials.ts +265 -0
- package/libraries/models/src/fbx/interpreter/nodes.ts +197 -0
- package/libraries/models/src/fbx/interpreter/skeleton.ts +476 -0
- package/libraries/models/src/fbx/parsers/binary-parser.ts +244 -0
- package/libraries/models/src/fbx/types.ts +119 -0
- package/libraries/models/src/gltf-extensions.ts +196 -0
- package/libraries/models/src/gltf.ts +935 -0
- package/libraries/models/src/index.ts +87 -0
- package/libraries/models/src/library.ts +75 -0
- package/libraries/models/src/loader.ts +265 -0
- package/libraries/models/src/material-adapter.ts +108 -0
- package/libraries/models/src/mini-xml.ts +174 -0
- package/libraries/models/src/normalize.ts +216 -0
- package/libraries/models/src/obj.ts +264 -0
- package/libraries/models/src/off.ts +95 -0
- package/libraries/models/src/ply.ts +348 -0
- package/libraries/models/src/pose-sampler.ts +219 -0
- package/libraries/models/src/sidecar/blender-extras.ts +37 -0
- package/libraries/models/src/sidecar/ddmeta.ts +114 -0
- package/libraries/models/src/sidecar/godot-import.ts +86 -0
- package/libraries/models/src/sidecar/resolver.ts +145 -0
- package/libraries/models/src/sidecar/types.ts +11 -0
- package/libraries/models/src/sidecar/unity-meta.ts +61 -0
- package/libraries/models/src/skeleton-synthesis.ts +132 -0
- package/libraries/models/src/stl.ts +149 -0
- package/libraries/models/src/threeds.ts +363 -0
- package/libraries/models/src/threemf.ts +201 -0
- package/libraries/models/src/types.ts +188 -0
- package/libraries/models/src/vtk.ts +218 -0
- package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +24 -0
- package/libraries/models/test-fixtures/fbx/README.md +46 -0
- 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/navmesh/README.md +23 -0
- package/libraries/navmesh/src/crowd-system.ts +240 -0
- package/libraries/navmesh/src/debug-viz.ts +74 -0
- package/libraries/navmesh/src/index.ts +15 -0
- package/libraries/navmesh/src/library.ts +64 -0
- package/libraries/navmesh/src/navmesh-generator.ts +407 -0
- package/libraries/navmesh/src/navmesh.ts +159 -0
- package/libraries/navmesh/src/pathfinder.ts +252 -0
- package/libraries/navmesh/src/types.ts +63 -0
- package/libraries/networking/README.md +25 -0
- package/libraries/networking/src/authority.ts +121 -0
- package/libraries/networking/src/connection.ts +139 -0
- package/libraries/networking/src/discovery.ts +373 -0
- package/libraries/networking/src/enhanced-replication.ts +355 -0
- package/libraries/networking/src/epic-adapter.ts +129 -0
- package/libraries/networking/src/index.ts +45 -0
- package/libraries/networking/src/library.ts +69 -0
- package/libraries/networking/src/lobby.ts +108 -0
- package/libraries/networking/src/platform-adapter.ts +163 -0
- package/libraries/networking/src/rcs-adapter.ts +127 -0
- package/libraries/networking/src/remote-input.ts +188 -0
- package/libraries/networking/src/replication.ts +327 -0
- package/libraries/networking/src/rpc.ts +188 -0
- package/libraries/networking/src/session.ts +173 -0
- package/libraries/networking/src/transport.ts +201 -0
- package/libraries/networking/src/webrtc.ts +323 -0
- package/libraries/pathfinding-2d/README.md +15 -0
- package/libraries/pathfinding-2d/src/astar-grid.ts +312 -0
- package/libraries/pathfinding-2d/src/index.ts +11 -0
- package/libraries/persistence/README.md +25 -0
- package/libraries/persistence/src/autosave-manager.ts +112 -0
- package/libraries/persistence/src/binary-record-store.ts +244 -0
- package/libraries/persistence/src/browser.ts +51 -0
- package/libraries/persistence/src/file-save-store.ts +553 -0
- package/libraries/persistence/src/hash-utils.ts +59 -0
- package/libraries/persistence/src/index.ts +57 -0
- package/libraries/persistence/src/library.ts +74 -0
- package/libraries/persistence/src/mock-opfs.ts +141 -0
- package/libraries/persistence/src/node-fs-directory-handle.ts +161 -0
- package/libraries/persistence/src/opfs-save-store.ts +745 -0
- package/libraries/persistence/src/save-worker-proxy.ts +127 -0
- package/libraries/persistence/src/save-worker.ts +99 -0
- package/libraries/persistence/src/xxh3-ts.d.ts +10 -0
- package/libraries/physics-native/README.md +21 -0
- package/libraries/physics-native/native/Cargo.toml +11 -0
- package/libraries/physics-native/native/src/body.rs +403 -0
- package/libraries/physics-native/native/src/character.rs +226 -0
- package/libraries/physics-native/native/src/collider.rs +299 -0
- package/libraries/physics-native/native/src/joint.rs +81 -0
- package/libraries/physics-native/native/src/lib.rs +830 -0
- package/libraries/physics-native/native/src/query.rs +261 -0
- package/libraries/physics-native/native/src/realm.rs +33 -0
- package/libraries/physics-native/native/src/step.rs +54 -0
- package/libraries/physics-native/native/src/world.rs +148 -0
- package/libraries/physics-native/src/backend.ts +1046 -0
- package/libraries/physics-native/src/broadphase.ts +101 -0
- package/libraries/physics-native/src/ffi-spike-worker.ts +71 -0
- package/libraries/physics-native/src/index.ts +11 -0
- package/libraries/physics-native/src/library.ts +79 -0
- package/libraries/physics-native/src/narrowphase-shapes.ts +420 -0
- package/libraries/physics-native/src/narrowphase.ts +123 -0
- package/libraries/physics-native/src/solver.ts +141 -0
- package/libraries/physics-native/src/types.ts +76 -0
- package/libraries/physics-rapier/README.md +21 -0
- package/libraries/physics-rapier/bench/ffi-bench.ts +79 -0
- package/libraries/physics-rapier/bench/wasm-baseline.ts +90 -0
- package/libraries/physics-rapier/src/api.ts +452 -0
- package/libraries/physics-rapier/src/auto-backend.ts +59 -0
- package/libraries/physics-rapier/src/backend.ts +1207 -0
- package/libraries/physics-rapier/src/bulk-ops.ts +68 -0
- package/libraries/physics-rapier/src/ffi-backend.ts +21 -0
- package/libraries/physics-rapier/src/ffi-lib.ts +597 -0
- package/libraries/physics-rapier/src/index.ts +12 -0
- package/libraries/physics-rapier/src/library.ts +107 -0
- package/libraries/physics-rapier/src/rapier-backend.ts +1052 -0
- package/libraries/physics-rapier/src/realm-worker-script.ts +237 -0
- package/libraries/postfx/README.md +17 -0
- package/libraries/postfx/src/index.ts +19 -0
- package/libraries/postfx/src/library.ts +337 -0
- package/libraries/postfx/src/post-process-stack.ts +1752 -0
- package/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
- package/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
- package/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
- package/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
- package/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
- package/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
- package/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
- package/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
- package/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
- package/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
- package/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
- package/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
- package/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
- package/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
- package/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
- package/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
- package/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
- package/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
- package/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
- package/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
- package/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
- package/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
- package/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
- package/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
- package/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
- package/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
- package/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
- package/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
- package/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
- package/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
- package/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
- package/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
- package/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
- package/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
- package/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
- package/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
- package/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
- package/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
- package/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
- package/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
- package/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
- package/libraries/recast/README.md +21 -0
- package/libraries/recast/src/backend.ts +150 -0
- package/libraries/recast/src/crowd-system.ts +352 -0
- package/libraries/recast/src/index.ts +12 -0
- package/libraries/recast/src/library.ts +91 -0
- package/libraries/recast/src/types.ts +86 -0
- package/libraries/sand/README.md +25 -0
- package/libraries/sand/src/cell.ts +43 -0
- package/libraries/sand/src/fields.ts +29 -0
- package/libraries/sand/src/fluid-grid.ts +261 -0
- package/libraries/sand/src/grid-dims.ts +74 -0
- package/libraries/sand/src/grid-sim-buffer.ts +271 -0
- package/libraries/sand/src/index.ts +81 -0
- package/libraries/sand/src/library.ts +92 -0
- package/libraries/sand/src/materials.ts +492 -0
- package/libraries/sand/src/palette.ts +93 -0
- package/libraries/sand/src/particles.ts +185 -0
- package/libraries/sand/src/render/sand-grid-pass.ts +430 -0
- package/libraries/sand/src/rng.ts +51 -0
- package/libraries/sand/src/rules/builtin-rules.ts +132 -0
- package/libraries/sand/src/rules/rule-compiler.ts +162 -0
- package/libraries/sand/src/rules/rule-engine.ts +231 -0
- package/libraries/sand/src/rules/rule-types.ts +87 -0
- package/libraries/sand/src/sand-step-pool.ts +484 -0
- package/libraries/sand/src/sand-step-worker.ts +97 -0
- package/libraries/sand/src/sand-world.ts +3227 -0
- package/libraries/stickman/README.md +25 -0
- package/libraries/stickman/src/index.ts +25 -0
- package/libraries/stickman/src/library.ts +61 -0
- package/libraries/stickman/src/proportions.ts +45 -0
- package/libraries/stickman/src/shader.ts +117 -0
- package/libraries/stickman/src/skeleton.ts +197 -0
- package/libraries/stickman/src/stickman-pass.ts +255 -0
- package/libraries/stickman/src/thick-line.ts +123 -0
- package/libraries/surface-nets/README.md +25 -0
- package/libraries/surface-nets/src/chunked-field.ts +14 -0
- package/libraries/surface-nets/src/deformation.ts +45 -0
- package/libraries/surface-nets/src/index.ts +36 -0
- package/libraries/surface-nets/src/library.ts +59 -0
- package/libraries/surface-nets/src/lod.ts +7 -0
- package/libraries/surface-nets/src/sab.ts +4 -0
- package/libraries/surface-nets/src/streaming-config.ts +5 -0
- package/libraries/surface-nets/src/streaming-manager.ts +15 -0
- package/libraries/surface-nets/src/surface-nets.ts +334 -0
- package/libraries/surface-nets/src/types.ts +23 -0
- package/libraries/water/README.md +25 -0
- package/libraries/water/src/buoyancy.ts +103 -0
- package/libraries/water/src/index.ts +43 -0
- package/libraries/water/src/library.ts +85 -0
- package/libraries/water/src/shore-damping.ts +93 -0
- package/libraries/water/src/water-buffer.ts +89 -0
- package/libraries/water/src/water-chunks.ts +13 -0
- package/libraries/water/src/water-physics.ts +376 -0
- package/libraries/water/src/water-renderer.ts +809 -0
- package/libraries/water/src/water-sab.ts +161 -0
- package/libraries/water/src/wave-sources.ts +84 -0
- package/libraries/weather/README.md +20 -0
- package/libraries/weather/src/index.ts +9 -0
- package/libraries/weather/src/library.ts +72 -0
- package/libraries/weather/src/types.ts +64 -0
- package/libraries/weather/src/weather-blend.ts +112 -0
- package/libraries/weather/src/weather-system.ts +271 -0
- package/libraries/weatherfx/README.md +24 -0
- package/libraries/weatherfx/src/cloud-provider.ts +31 -0
- package/libraries/weatherfx/src/cloud-system.ts +372 -0
- package/libraries/weatherfx/src/index.ts +9 -0
- package/libraries/weatherfx/src/library.ts +58 -0
- package/libraries/weatherfx/src/particle-system.ts +434 -0
- package/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
- package/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
- package/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
- package/lint-plugin.mjs +41 -0
- package/mcp/src/client.ts +703 -0
- package/mcp/src/engine-context.ts +186 -0
- package/mcp/src/http-transport.ts +471 -0
- package/mcp/src/index.ts +13 -0
- package/mcp/src/prompts/add-entity.ts +42 -0
- package/mcp/src/prompts/create-scene.ts +44 -0
- package/mcp/src/prompts/debug-frame.ts +39 -0
- package/mcp/src/prompts/index.ts +12 -0
- package/mcp/src/resources/asset-list.ts +32 -0
- package/mcp/src/resources/checkpoint-list.ts +33 -0
- package/mcp/src/resources/entity-state.ts +55 -0
- package/mcp/src/resources/gpu-info.ts +103 -0
- package/mcp/src/resources/index.ts +57 -0
- package/mcp/src/resources/performance.ts +37 -0
- package/mcp/src/resources/scene-tree.ts +43 -0
- package/mcp/src/server.ts +375 -0
- package/mcp/src/tools/animation.ts +118 -0
- package/mcp/src/tools/asset.ts +161 -0
- package/mcp/src/tools/audio.ts +96 -0
- package/mcp/src/tools/build.ts +143 -0
- package/mcp/src/tools/camera.ts +167 -0
- package/mcp/src/tools/checkpoint.ts +100 -0
- package/mcp/src/tools/component.ts +199 -0
- package/mcp/src/tools/debug.ts +300 -0
- package/mcp/src/tools/entity.ts +361 -0
- package/mcp/src/tools/inspect.ts +210 -0
- package/mcp/src/tools/lighting.ts +263 -0
- package/mcp/src/tools/material.ts +243 -0
- package/mcp/src/tools/mesh.ts +239 -0
- package/mcp/src/tools/physics.ts +266 -0
- package/mcp/src/tools/scene.ts +153 -0
- package/mcp/src/tools/script.ts +122 -0
- package/mcp/src/types.ts +92 -0
- package/mcp/src/undo-redo.ts +77 -0
- package/modules/camera-controls/README.md +20 -0
- package/modules/camera-controls/src/index.ts +161 -0
- package/modules/controller-ui/src/index.ts +164 -0
- package/modules/devtools/README.md +25 -0
- package/modules/devtools/src/api.ts +461 -0
- package/modules/devtools/src/asset-utils.ts +105 -0
- package/modules/devtools/src/bind-debug-store.ts +48 -0
- package/modules/devtools/src/data-bridge.ts +286 -0
- package/modules/devtools/src/debug-overlay.ts +238 -0
- package/modules/devtools/src/debug-raycast.ts +328 -0
- package/modules/devtools/src/debug-store.ts +92 -0
- package/modules/devtools/src/debug-view-descriptors.ts +59 -0
- package/modules/devtools/src/doctor-panel.ts +182 -0
- package/modules/devtools/src/gizmo-module.ts +136 -0
- package/modules/devtools/src/graph-model.ts +509 -0
- package/modules/devtools/src/grid-renderer.ts +157 -0
- package/modules/devtools/src/height-ruler-renderer.ts +216 -0
- package/modules/devtools/src/index.ts +81 -0
- package/modules/devtools/src/init.ts +261 -0
- package/modules/devtools/src/label-overlay.ts +154 -0
- package/modules/devtools/src/material-stats-panel.ts +188 -0
- package/modules/devtools/src/profiling-bridge.ts +377 -0
- package/modules/devtools/src/profiling-hooks.ts +98 -0
- package/modules/devtools/src/renderer-adapter.ts +76 -0
- package/modules/devtools/src/scene-inspector.ts +637 -0
- package/modules/devtools/src/scene-store.ts +320 -0
- package/modules/devtools/src/scene-sync.ts +116 -0
- package/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
- package/modules/devtools/src/sim-stats-panel.ts +272 -0
- package/modules/devtools/src/sim-stats-provider.ts +105 -0
- package/modules/devtools/src/skeleton-renderer.ts +351 -0
- package/modules/devtools/src/transform-gizmo.ts +928 -0
- package/modules/devtools/src/types.ts +290 -0
- package/modules/devtools/src/worker-expose.ts +67 -0
- package/modules/devtools/src/worker-sync.ts +137 -0
- package/modules/editor/src/commands/component.ts +156 -0
- package/modules/editor/src/commands/entity.ts +287 -0
- package/modules/editor/src/commands/hierarchy.ts +83 -0
- package/modules/editor/src/commands/index.ts +61 -0
- package/modules/editor/src/commands/prefab.ts +163 -0
- package/modules/editor/src/commands/registry.ts +331 -0
- package/modules/editor/src/commands/scene-io.ts +211 -0
- package/modules/editor/src/commands/selection.ts +73 -0
- package/modules/editor/src/commands/transform.ts +91 -0
- package/modules/editor/src/ddscene.ts +267 -0
- package/modules/editor/src/document.ts +123 -0
- package/modules/editor/src/editor-context.ts +172 -0
- package/modules/editor/src/index.ts +41 -0
- package/modules/editor/src/mcp.ts +103 -0
- package/modules/editor/src/module.ts +148 -0
- package/modules/editor/src/selection.ts +70 -0
- package/modules/editor/src/shell.ts +456 -0
- package/modules/editor/src/viewport.ts +199 -0
- package/modules/html-ui/src/composite.ts +135 -0
- package/modules/html-ui/src/create-html-ui.ts +188 -0
- package/modules/html-ui/src/doc-backend.ts +343 -0
- package/modules/html-ui/src/host.ts +646 -0
- package/modules/html-ui/src/index.ts +13 -0
- package/modules/html-ui/src/jsx-dev-runtime.ts +12 -0
- package/modules/html-ui/src/jsx-runtime.ts +126 -0
- package/modules/html-ui/src/protocol.ts +88 -0
- package/modules/html-ui/src/ui-worker.ts +16 -0
- package/modules/mcp/README.md +18 -0
- package/modules/mcp/src/index.ts +27 -0
- package/modules/movement-2d/README.md +19 -0
- package/modules/movement-2d/src/grid-character.ts +455 -0
- package/modules/movement-2d/src/index.ts +45 -0
- package/modules/movement-3d/README.md +21 -0
- package/modules/movement-3d/src/character-motor.ts +230 -0
- package/modules/movement-3d/src/index.ts +46 -0
- package/modules/native-osr/src/index.ts +22 -0
- package/modules/native-osr/src/input-router.ts +401 -0
- package/modules/native-osr/src/native-osr-manager.ts +247 -0
- package/modules/native-osr/src/native-texture-source.ts +86 -0
- package/modules/native-osr/src/types.ts +112 -0
- package/modules/native-osr/src/world-space-ui-pass.ts +351 -0
- package/modules/sailing/README.md +18 -0
- package/modules/sailing/src/index.ts +51 -0
- package/modules/terrain/README.md +18 -0
- package/modules/terrain/src/index.ts +78 -0
- package/modules/vitals/README.md +17 -0
- package/modules/vitals/src/index.ts +43 -0
- package/modules/vitals/src/vitals.ts +265 -0
- package/modules/xr/README.md +25 -0
- package/modules/xr/src/camera-rig.ts +146 -0
- package/modules/xr/src/debug.ts +59 -0
- package/modules/xr/src/frame-loop.ts +197 -0
- package/modules/xr/src/index.ts +16 -0
- package/modules/xr/src/input.ts +208 -0
- package/modules/xr/src/layer.ts +140 -0
- package/modules/xr/src/session.ts +156 -0
- package/modules/xr/src/sim-module.ts +23 -0
- package/modules/xr/src/types.ts +32 -0
- package/modules/xr/src/webxr.d.ts +182 -0
- package/modules/xr/src/xr-module.ts +179 -0
- package/package.json +232 -3
- package/shader-graph/src/chunks.ts +349 -0
- package/shader-graph/src/compiler.ts +732 -0
- package/shader-graph/src/compute-compiler.ts +453 -0
- package/shader-graph/src/compute-graph.ts +112 -0
- package/shader-graph/src/compute-profiles.ts +54 -0
- package/shader-graph/src/graph.ts +52 -0
- package/shader-graph/src/index.ts +53 -0
- package/shader-graph/src/profiles.ts +407 -0
- package/shader-graph/src/validator.ts +48 -0
- package/shader-graph/src/wgsl-binding-validator.ts +143 -0
- package/shader-graph/src/wgsl-struct-validator.ts +245 -0
- package/shader-graph/src/wgsl-struct.ts +397 -0
- package/test/src/index.ts +7 -0
- package/test/src/vision-test.ts +369 -0
|
@@ -0,0 +1,88 @@
|
|
|
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
|
+
|
|
8
|
+
import { downdraft } from "./index";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Poll the renderer's FPS and call the callback at the given interval.
|
|
12
|
+
* Returns a cleanup function that clears the interval.
|
|
13
|
+
*/
|
|
14
|
+
export function useFpsPolling(
|
|
15
|
+
renderer: { getFPS: () => number },
|
|
16
|
+
onFps: (fps: number) => void,
|
|
17
|
+
intervalMs: number = 500,
|
|
18
|
+
): () => void {
|
|
19
|
+
const id = setInterval(() => {
|
|
20
|
+
onFps(renderer.getFPS());
|
|
21
|
+
}, intervalMs);
|
|
22
|
+
return () => clearInterval(id);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* In deterministic mode, pause the renderer's sim (so the e2e test can
|
|
27
|
+
* control it via MCP). No-op in non-deterministic mode.
|
|
28
|
+
*/
|
|
29
|
+
export function useDeterministicRenderPause(
|
|
30
|
+
renderer: { pause?: () => void },
|
|
31
|
+
deterministic: boolean,
|
|
32
|
+
): void {
|
|
33
|
+
if (deterministic && typeof renderer.pause === "function") {
|
|
34
|
+
renderer.pause();
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Wire display info refresh rate updates.
|
|
40
|
+
* Returns a cleanup function that removes the listener.
|
|
41
|
+
*/
|
|
42
|
+
export function useDisplayInfo(
|
|
43
|
+
onRefreshRate: (refreshRate: number) => void,
|
|
44
|
+
): () => void {
|
|
45
|
+
if (!downdraft?.isAvailable) return () => {};
|
|
46
|
+
|
|
47
|
+
downdraft.getDisplayInfo().then((info) => {
|
|
48
|
+
if (info.refreshRate > 0) onRefreshRate(info.refreshRate);
|
|
49
|
+
}).catch(() => { /* ignore */ });
|
|
50
|
+
|
|
51
|
+
return downdraft.onDisplayInfo((info: any) => {
|
|
52
|
+
if (info?.refreshRate > 0) onRefreshRate(info.refreshRate);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Register a Vite hot-reload dispose callback.
|
|
58
|
+
* In non-hot-reload environments, this is a no-op.
|
|
59
|
+
*/
|
|
60
|
+
export function useHotReloadDispose(
|
|
61
|
+
disposeFn: () => Promise<void> | void,
|
|
62
|
+
): void {
|
|
63
|
+
dispose(disposeFn);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Internal: register a dispose callback via Vite's import.meta.hot API.
|
|
68
|
+
* Exported for bootstrapGame() to use.
|
|
69
|
+
*
|
|
70
|
+
* Under the native dev shell the callback also lands on the __ddSession
|
|
71
|
+
* dispose registry — vite only fires hot.dispose on targeted invalidation,
|
|
72
|
+
* NOT when a session restart clears the whole module cache, so the session
|
|
73
|
+
* teardown must own the second copy. The wrapper unregisters from the
|
|
74
|
+
* session when vite fires it (directed update) so it never runs twice.
|
|
75
|
+
*/
|
|
76
|
+
export function dispose(disposeFn: () => Promise<void> | void): void {
|
|
77
|
+
const hot = (import.meta as any).hot;
|
|
78
|
+
const session = (globalThis as any).__ddSession;
|
|
79
|
+
if (!hot?.dispose && !session?.onDispose) return;
|
|
80
|
+
let offSession: (() => void) | null = null;
|
|
81
|
+
const wrapped = () => {
|
|
82
|
+
offSession?.();
|
|
83
|
+
offSession = null;
|
|
84
|
+
return disposeFn();
|
|
85
|
+
};
|
|
86
|
+
if (hot?.dispose) hot.dispose(wrapped);
|
|
87
|
+
if (session?.onDispose) offSession = session.onDispose(wrapped);
|
|
88
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// installSimHotReload / restoreHotReloadState — shared dev-mode HMR wiring.
|
|
3
|
+
//
|
|
4
|
+
// Generalized from to-the-ocean's main.tsx. The vite plugin emits
|
|
5
|
+
// "sim:hot-reload" / "renderer:hot-reload" custom events when watched sim or
|
|
6
|
+
// renderer files change. These helpers own the standard response:
|
|
7
|
+
//
|
|
8
|
+
// sim:hot-reload → sim.hotReload(config, preserveState) — save/stop/
|
|
9
|
+
// respawn/restore inside the running page.
|
|
10
|
+
// renderer:hot-reload → save sim state (+ renderer meta) via the app bridge,
|
|
11
|
+
// set the "hot-reload-pending" session flag, reload.
|
|
12
|
+
//
|
|
13
|
+
// restoreHotReloadState() is the other half: call it during init to pick up
|
|
14
|
+
// the saved state after the page reload.
|
|
15
|
+
//
|
|
16
|
+
// Status is reported through the shared useHotReloadStore (devtools reads it).
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
import { isDevMode, useHotReloadStore, type IRendererStateProvider, type SaveOptions } from "@downdraft/engine";
|
|
20
|
+
import { createLogger } from "@downdraft/engine/util/logger";
|
|
21
|
+
import { downdraft, type Host } from "./index";
|
|
22
|
+
|
|
23
|
+
const log = createLogger("info");
|
|
24
|
+
|
|
25
|
+
/** Minimal sim surface needed by the HMR handlers. */
|
|
26
|
+
export interface HotReloadableSim {
|
|
27
|
+
hotReload?(config: unknown, preserveState: boolean): Promise<void>;
|
|
28
|
+
save?(slotName: string, opts?: SaveOptions): Promise<{ stateJson?: string } | null>;
|
|
29
|
+
restoreFromState?(stateJson: string): Promise<void>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface SimHotReloadDeps {
|
|
33
|
+
sim: HotReloadableSim;
|
|
34
|
+
/** Renderer meta provider — grafted into the hot-reload save. */
|
|
35
|
+
renderer?: IRendererStateProvider | null;
|
|
36
|
+
/** Config passed to sim.hotReload(). May be a getter evaluated per reload. */
|
|
37
|
+
simConfig: unknown | (() => unknown);
|
|
38
|
+
/** App bridge — defaults to the window.downdraft singleton (or its stub). */
|
|
39
|
+
downdraft?: Host | null;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const PENDING_KEY = "hot-reload-pending";
|
|
43
|
+
const SLOT = "hot-reload";
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Register the sim:hot-reload / renderer:hot-reload handlers.
|
|
47
|
+
* No-op outside dev mode or when import.meta.hot is absent.
|
|
48
|
+
* Call once from onReady (or equivalent) — safe to call again after HMR
|
|
49
|
+
* re-mount because import.meta.hot.on dedupes per-module.
|
|
50
|
+
*/
|
|
51
|
+
export function installSimHotReload(deps: SimHotReloadDeps): void {
|
|
52
|
+
if (!isDevMode || !import.meta.hot) return;
|
|
53
|
+
const bridge = () => deps.downdraft ?? downdraft;
|
|
54
|
+
const getConfig = () =>
|
|
55
|
+
typeof deps.simConfig === "function" ? (deps.simConfig as () => unknown)() : deps.simConfig;
|
|
56
|
+
|
|
57
|
+
// Native dev shell: the in-runner runtime (@downdraft/platform-native
|
|
58
|
+
// dev/native-dev-runtime) owns the single sim:hot-reload / renderer:
|
|
59
|
+
// hot-reload handler set, fanning out over the __ddSession registry.
|
|
60
|
+
// Registering hot.on here too would fire the swap twice. Contribute the
|
|
61
|
+
// sim handle + renderer meta provider to the session instead.
|
|
62
|
+
const session = (globalThis as any).__ddSession;
|
|
63
|
+
if (session) {
|
|
64
|
+
if (deps.sim?.hotReload && !session.hasSimFor?.(deps.sim)) {
|
|
65
|
+
session.registerSim?.({
|
|
66
|
+
label: "game-sim",
|
|
67
|
+
host: deps.sim,
|
|
68
|
+
hotReload: (preserve: boolean) => deps.sim.hotReload!(getConfig(), preserve),
|
|
69
|
+
save: async () => (await deps.sim.save?.(SLOT))?.stateJson ?? null,
|
|
70
|
+
restore: (json: string) => deps.sim.restoreFromState?.(json),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
if (deps.renderer?.serializeRendererMeta) {
|
|
74
|
+
const renderer = deps.renderer;
|
|
75
|
+
session.registerMetaProvider?.({
|
|
76
|
+
serialize: () => renderer.serializeRendererMeta!(),
|
|
77
|
+
restore: (meta: unknown) => renderer.restoreRendererMeta?.(meta as Record<string, unknown>),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Cast: bun-types' ImportMeta augmentation can shadow vite/client's HMR
|
|
84
|
+
// typing when both are in the program (node config). This code is
|
|
85
|
+
// Vite-specific, so pin the subset of the vite HMR surface we use.
|
|
86
|
+
const hot = import.meta.hot as unknown as {
|
|
87
|
+
on(event: string, cb: (data: any) => void): void;
|
|
88
|
+
send(event: string, data?: any): void;
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
hot.on("sim:hot-reload", async (data: { file: string; timestamp: number }) => {
|
|
92
|
+
const store = useHotReloadStore.getState();
|
|
93
|
+
if (!store.enabled) return;
|
|
94
|
+
hot.send("sim:hot-reload:ack", {});
|
|
95
|
+
log.info("HMR", `Sim file changed: ${data.file}`);
|
|
96
|
+
store.setStatus("reloading");
|
|
97
|
+
const t0 = performance.now();
|
|
98
|
+
try {
|
|
99
|
+
await deps.sim.hotReload?.(getConfig(), store.preserveState);
|
|
100
|
+
const elapsed = (performance.now() - t0).toFixed(0);
|
|
101
|
+
log.info("HMR", `Sim worker swap complete (${elapsed}ms)`);
|
|
102
|
+
store.setStatus("ready");
|
|
103
|
+
store.setLastReload({ file: data.file, elapsed: Number(elapsed), timestamp: data.timestamp });
|
|
104
|
+
} catch (err) {
|
|
105
|
+
log.error("HMR", `Sim hot-reload failed: ${(err as Error).message}`);
|
|
106
|
+
store.setStatus("error", (err as Error).message);
|
|
107
|
+
log.warn("HMR", "Falling back to full reload");
|
|
108
|
+
if (!bridge().requestRestart?.("sim hot-reload failed")) {
|
|
109
|
+
window.location.reload();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
hot.on("renderer:hot-reload", async (data: { file: string; timestamp: number }) => {
|
|
115
|
+
const store = useHotReloadStore.getState();
|
|
116
|
+
if (!store.enabled) return;
|
|
117
|
+
hot.send("renderer:hot-reload:ack", {});
|
|
118
|
+
log.info("HMR", `Renderer file changed: ${data.file}`);
|
|
119
|
+
store.setStatus("reloading");
|
|
120
|
+
if (store.preserveState) {
|
|
121
|
+
try {
|
|
122
|
+
const result = await deps.sim.save?.(SLOT);
|
|
123
|
+
const dd = bridge();
|
|
124
|
+
if (result?.stateJson && dd?.saveGameState) {
|
|
125
|
+
const components = JSON.parse(result.stateJson);
|
|
126
|
+
if (deps.renderer?.serializeRendererMeta) {
|
|
127
|
+
components.renderer = { v: 1, data: deps.renderer.serializeRendererMeta() };
|
|
128
|
+
}
|
|
129
|
+
dd.saveGameState(SLOT, JSON.stringify(components));
|
|
130
|
+
sessionStorage.setItem(PENDING_KEY, "1");
|
|
131
|
+
log.info("HMR", "State saved, reloading page...");
|
|
132
|
+
}
|
|
133
|
+
} catch (err) {
|
|
134
|
+
log.warn("HMR", `State save failed, reloading without preservation: ${err}`);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!bridge().requestRestart?.("renderer hot-reload")) {
|
|
138
|
+
window.location.reload();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Restore sim state saved by the renderer:hot-reload handler. Call during
|
|
145
|
+
* init (after the sim worker is started, before rendering). Returns true when
|
|
146
|
+
* a pending state was found and restored.
|
|
147
|
+
*/
|
|
148
|
+
export async function restoreHotReloadState(
|
|
149
|
+
deps: Pick<SimHotReloadDeps, "sim" | "renderer" | "downdraft">,
|
|
150
|
+
): Promise<boolean> {
|
|
151
|
+
// Native dev shell: state restore is pushed by the session tracker
|
|
152
|
+
// (notifySimStarted on sim start + registerMetaProvider for renderer
|
|
153
|
+
// meta). If this sim was already restored, report success without a
|
|
154
|
+
// second restore.
|
|
155
|
+
const session = (globalThis as any).__ddSession;
|
|
156
|
+
if (session?.wasRestored?.(deps.sim)) return true;
|
|
157
|
+
if (!sessionStorage.getItem(PENDING_KEY)) return false;
|
|
158
|
+
sessionStorage.removeItem(PENDING_KEY);
|
|
159
|
+
const dd = deps.downdraft ?? downdraft;
|
|
160
|
+
if (!dd?.loadGameState) return false;
|
|
161
|
+
try {
|
|
162
|
+
const stateJson = await dd.loadGameState(SLOT);
|
|
163
|
+
if (!stateJson) return false;
|
|
164
|
+
await deps.sim.restoreFromState?.(stateJson);
|
|
165
|
+
try {
|
|
166
|
+
const components = JSON.parse(stateJson);
|
|
167
|
+
if (components.renderer?.data) {
|
|
168
|
+
deps.renderer?.restoreRendererMeta?.(components.renderer.data);
|
|
169
|
+
}
|
|
170
|
+
} catch { /* ignore */ }
|
|
171
|
+
log.info("HMR", "Restored state after page reload");
|
|
172
|
+
if (dd.deleteGameState) dd.deleteGameState(SLOT);
|
|
173
|
+
return true;
|
|
174
|
+
} catch (err) {
|
|
175
|
+
log.error("HMR", `Failed to restore hot-reload state: ${err}. Starting fresh.`);
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Host Import Cache — renderer-side adapter for the host's SQLite cache
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// When a host bridge is installed, delegates to the host via `downdraft`
|
|
5
|
+
// (direct in-process calls on native). Without a host, falls back to an
|
|
6
|
+
// in-memory Map via MemoryImportCache.
|
|
7
|
+
//
|
|
8
|
+
|
|
9
|
+
import { MemoryImportCache, type CacheEntry, type ImportCache } from "@downdraft/engine";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Create an ImportCache backed by the host SQLite database.
|
|
13
|
+
* Falls back to MemoryImportCache if the bridge is unavailable (browser-only mode).
|
|
14
|
+
*/
|
|
15
|
+
export function createHostImportCache(bridge?: {
|
|
16
|
+
importCacheGet?: (modelPath: string) => Promise<{ settings: unknown; sourceMtime: number; sidecarMtime: number; updatedAt: number } | null>;
|
|
17
|
+
importCacheSet?: (modelPath: string, entry: { settings: unknown; sourceMtime: number; sidecarMtime: number; updatedAt: number }) => Promise<void>;
|
|
18
|
+
importCacheInvalidate?: (modelPath: string) => Promise<void>;
|
|
19
|
+
} | null): ImportCache {
|
|
20
|
+
if (bridge?.importCacheGet && bridge.importCacheSet && bridge.importCacheInvalidate) {
|
|
21
|
+
return new HostImportCache(bridge);
|
|
22
|
+
}
|
|
23
|
+
return new MemoryImportCache();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* ImportCache implementation that delegates to the host's SQLite store.
|
|
28
|
+
*/
|
|
29
|
+
/** Marker for a confirmed-persisted miss — prevents refetching absent paths. */
|
|
30
|
+
const ABSENT = Symbol("absent");
|
|
31
|
+
|
|
32
|
+
class HostImportCache implements ImportCache {
|
|
33
|
+
// Synchronous get/set are backed by an in-memory mirror, since the host
|
|
34
|
+
// calls are async. The async methods on the bridge are used for actual
|
|
35
|
+
// persistence. This is a pragmatic trade-off: the cache is eventually
|
|
36
|
+
// consistent with the SQLite store.
|
|
37
|
+
private memory = new Map<string, CacheEntry | typeof ABSENT>();
|
|
38
|
+
private pending = new Set<string>();
|
|
39
|
+
private bridge: NonNullable<Parameters<typeof createHostImportCache>[0]>;
|
|
40
|
+
|
|
41
|
+
constructor(bridge: NonNullable<Parameters<typeof createHostImportCache>[0]>) {
|
|
42
|
+
this.bridge = bridge;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
get(modelPath: string): CacheEntry | null {
|
|
46
|
+
const hit = this.memory.get(modelPath);
|
|
47
|
+
if (hit) return hit === ABSENT ? null : hit;
|
|
48
|
+
// Sync interface over an async store: on a miss, hydrate the mirror in
|
|
49
|
+
// the background so a later get() sees the persisted entry. First-read
|
|
50
|
+
// after restart can still miss — callers treat null as "reimport". A
|
|
51
|
+
// negative result is cached so absent paths don't refire per get().
|
|
52
|
+
if (!this.pending.has(modelPath)) {
|
|
53
|
+
this.pending.add(modelPath);
|
|
54
|
+
this.bridge.importCacheGet?.(modelPath).then((entry) => {
|
|
55
|
+
// Only commit if the fetch is still pending — set()/invalidate()
|
|
56
|
+
// clear the marker, and an in-flight result must not resurrect an
|
|
57
|
+
// invalidated entry or clobber a fresher local write.
|
|
58
|
+
if (!this.pending.delete(modelPath)) return;
|
|
59
|
+
this.memory.set(modelPath, entry === null ? ABSENT : (entry as CacheEntry));
|
|
60
|
+
}).catch(() => { this.pending.delete(modelPath); });
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
set(modelPath: string, entry: CacheEntry): void {
|
|
66
|
+
this.pending.delete(modelPath);
|
|
67
|
+
this.memory.set(modelPath, entry);
|
|
68
|
+
// Persist to SQLite via the host bridge (fire-and-forget)
|
|
69
|
+
this.bridge.importCacheSet?.(modelPath, {
|
|
70
|
+
settings: entry.settings,
|
|
71
|
+
sourceMtime: entry.sourceMtime,
|
|
72
|
+
sidecarMtime: entry.sidecarMtime,
|
|
73
|
+
updatedAt: entry.updatedAt,
|
|
74
|
+
}).catch(() => {
|
|
75
|
+
// Host failures are non-fatal — the in-memory cache still works
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
invalidate(modelPath: string): void {
|
|
80
|
+
this.pending.delete(modelPath);
|
|
81
|
+
this.memory.delete(modelPath);
|
|
82
|
+
this.bridge.importCacheInvalidate?.(modelPath).catch(() => {});
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
close(): void {
|
|
86
|
+
this.memory.clear();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// @downdraft/engine/app/renderer — typed accessor for globalThis.downdraft
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// Import `downdraft` from this module in game/bootstrap code instead of
|
|
6
|
+
// casting `(globalThis as any).downdraft`. The host installs the HostAPI
|
|
7
|
+
// object on `globalThis.downdraft`; this module provides a typed view.
|
|
8
|
+
//
|
|
9
|
+
// When no host bridge is installed (pure browser, headless test), the
|
|
10
|
+
// accessor returns a stub that no-ops / returns null. Callers that need
|
|
11
|
+
// real values should guard with `downdraft?.isAvailable`.
|
|
12
|
+
|
|
13
|
+
import { getNativeHost, type RenderSurface } from "@downdraft/engine";
|
|
14
|
+
import { OpfsSaveStore } from "@downdraft/engine/libraries/persistence/browser";
|
|
15
|
+
import type {
|
|
16
|
+
HostAPI,
|
|
17
|
+
HostOsrAPI
|
|
18
|
+
} from "../shared/types";
|
|
19
|
+
import { createSaveStore as _createSaveStore } from "./save-store-factory";
|
|
20
|
+
|
|
21
|
+
export type HostOsr = HostOsrAPI;
|
|
22
|
+
|
|
23
|
+
export interface Host extends Omit<HostAPI, "osr"> {
|
|
24
|
+
isAvailable: boolean;
|
|
25
|
+
isDev?: boolean;
|
|
26
|
+
osr?: HostOsr;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function noop(): void {}
|
|
30
|
+
|
|
31
|
+
const stubBridge: Host = {
|
|
32
|
+
isAvailable: false,
|
|
33
|
+
saveGameState: () => Promise.resolve(false),
|
|
34
|
+
loadGameState: () => Promise.resolve(null),
|
|
35
|
+
deleteGameState: () => Promise.resolve(false),
|
|
36
|
+
listSaveSlots: () => Promise.resolve([]),
|
|
37
|
+
listSaveGenerations: () => Promise.resolve([]),
|
|
38
|
+
deleteSaveGeneration: () => Promise.resolve(false),
|
|
39
|
+
setThumbnail: () => Promise.resolve(),
|
|
40
|
+
getThumbnail: () => Promise.resolve(null),
|
|
41
|
+
setSaveProperties: () => Promise.resolve(),
|
|
42
|
+
getSaveProperties: () => Promise.resolve({}),
|
|
43
|
+
quit: () => Promise.resolve(),
|
|
44
|
+
setDebugMode: noop,
|
|
45
|
+
toggleDevtools: noop,
|
|
46
|
+
toggleFullscreen: noop,
|
|
47
|
+
getDisplayInfo: () => Promise.resolve({ refreshRate: 0 }),
|
|
48
|
+
openExternal: noop,
|
|
49
|
+
getGPUSystemInfo: () => Promise.resolve(null),
|
|
50
|
+
getGpuInfo: () => Promise.resolve(null),
|
|
51
|
+
getFeatureLog: () => Promise.resolve(null),
|
|
52
|
+
captureFrame: () => Promise.resolve(null),
|
|
53
|
+
getProcessStats: () => Promise.reject(new Error("Process stats not available on this host")),
|
|
54
|
+
importCacheGet: () => Promise.resolve(null),
|
|
55
|
+
importCacheSet: () => Promise.resolve(),
|
|
56
|
+
importCacheInvalidate: () => Promise.resolve(),
|
|
57
|
+
onSimReady: () => noop,
|
|
58
|
+
onDisplayInfo: () => noop,
|
|
59
|
+
onDisplayMetricsChanged: () => noop,
|
|
60
|
+
onPerfStats: () => noop,
|
|
61
|
+
onDebugMode: () => noop,
|
|
62
|
+
onDevtoolsToggle: () => noop,
|
|
63
|
+
deterministic: false,
|
|
64
|
+
onMcpRequest: noop,
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Typed accessor for the `globalThis.downdraft` host bridge.
|
|
69
|
+
*
|
|
70
|
+
* On the native runtime this is the real HostAPI. In a host-less context
|
|
71
|
+
* (e.g. model-viewer running standalone in a browser), it returns a stub
|
|
72
|
+
* with `isAvailable: false`.
|
|
73
|
+
*
|
|
74
|
+
* The accessor is lazy: the bridge may be installed AFTER this module is
|
|
75
|
+
* evaluated (the native host installs `globalThis.downdraft` once its
|
|
76
|
+
* window/device exist — after static imports have already run). Reads go
|
|
77
|
+
* through a Proxy so `downdraft.isAvailable` flips live when a bridge
|
|
78
|
+
* appears. Callers that need a stable snapshot should read it at use time,
|
|
79
|
+
* not module-eval time (all engine consumers already do).
|
|
80
|
+
*/
|
|
81
|
+
function currentBridge(): Host {
|
|
82
|
+
const raw = (globalThis as unknown as { downdraft?: HostAPI }).downdraft;
|
|
83
|
+
if (raw) {
|
|
84
|
+
return { ...raw, isAvailable: true } as Host;
|
|
85
|
+
}
|
|
86
|
+
return stubBridge;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const downdraft: Host = new Proxy({} as Host, {
|
|
90
|
+
get(_target, prop) {
|
|
91
|
+
return (currentBridge() as unknown as Record<string | symbol, unknown>)[prop];
|
|
92
|
+
},
|
|
93
|
+
has(_target, prop) {
|
|
94
|
+
return prop in currentBridge();
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Import cache adapter — host-backed with memory fallback
|
|
99
|
+
export { createHostImportCache } from "./import-cache";
|
|
100
|
+
|
|
101
|
+
// Bootstrap orchestrator + composable hooks
|
|
102
|
+
export type { GameRendererLike } from "@downdraft/engine";
|
|
103
|
+
export { bootstrapGame } from "./bootstrap";
|
|
104
|
+
export type { BootstrapAutosaveOptions, BootstrapDevToolsOptions, BootstrapGameOptions } from "./bootstrap";
|
|
105
|
+
export { startGame } from "./game-module";
|
|
106
|
+
export type {
|
|
107
|
+
GameContext,
|
|
108
|
+
GameModule,
|
|
109
|
+
GameSaveConfig,
|
|
110
|
+
GameSaveSource,
|
|
111
|
+
GameSimWorker, GameUiHandle,
|
|
112
|
+
PluginRuntimeConfig,
|
|
113
|
+
RendererFactory,
|
|
114
|
+
SimEventMap,
|
|
115
|
+
SimWorkerFactory,
|
|
116
|
+
SimWorkerSeed
|
|
117
|
+
} from "./game-module";
|
|
118
|
+
export { useDeterministicRenderPause, useDisplayInfo, useFpsPolling, useHotReloadDispose } from "./hooks";
|
|
119
|
+
export { installSimHotReload, restoreHotReloadState } from "./hot-reload";
|
|
120
|
+
export type { HotReloadableSim, SimHotReloadDeps } from "./hot-reload";
|
|
121
|
+
export { createSimBridge } from "./sim-bridge";
|
|
122
|
+
export type { SimBridge, SimBridgeDeps, SimBridgeWorker } from "./sim-bridge";
|
|
123
|
+
|
|
124
|
+
// Save store factory + host save-store bridge type
|
|
125
|
+
export { createInlineSaveStore, createSaveStore, type CreateSaveStoreOptions, type CreateSaveStoreResult, type SaveBridge, type SaveStoreMode } from "./save-store-factory";
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Create the default ISaveStore for a game.
|
|
129
|
+
*
|
|
130
|
+
* When the host exposes a typed save store (`downdraft.saveStore` — the
|
|
131
|
+
* native host's HostSaveStore over FileSaveStore), defaults to "host" mode —
|
|
132
|
+
* disk persistence, stable across sessions, not origin-scoped.
|
|
133
|
+
*
|
|
134
|
+
* In a pure browser (no bridge), falls back to "auto" (OPFS worker → inline
|
|
135
|
+
* OPFS), since there is no host save path available.
|
|
136
|
+
*
|
|
137
|
+
* Games that want a specific backend should call `createSaveStore` directly
|
|
138
|
+
* with an explicit `mode` rather than relying on this default.
|
|
139
|
+
*/
|
|
140
|
+
export async function createDefaultSaveStore(engineVersion: string): Promise<import("@downdraft/engine").ISaveStore> {
|
|
141
|
+
const mode = downdraft.saveStore ? "host" : "auto";
|
|
142
|
+
const { store } = await _createSaveStore({
|
|
143
|
+
mode,
|
|
144
|
+
opfsOptions: { engineVersion },
|
|
145
|
+
bridge: downdraft,
|
|
146
|
+
});
|
|
147
|
+
if (!store) {
|
|
148
|
+
const fallback = new OpfsSaveStore({ engineVersion });
|
|
149
|
+
await fallback.init();
|
|
150
|
+
return fallback;
|
|
151
|
+
}
|
|
152
|
+
return store;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
// AutosaveManager (re-exported from @downdraft/engine/libraries/persistence)
|
|
156
|
+
export { AutosaveManager, type AutosaveManagerOptions } from "@downdraft/engine/libraries/persistence/browser";
|
|
157
|
+
|
|
158
|
+
// MCP automation harness factory + shared tool helpers
|
|
159
|
+
export { blobToBase64, createMcpHarness, errorResult, jsonResult } from "./mcp-harness";
|
|
160
|
+
export type { McpHarnessOptions, McpRequest, McpResponse, McpToolDef, McpToolRegistration } from "./mcp-harness";
|
|
161
|
+
export { createGameMcp, createStandardAutomationTools } from "./standard-automation-tools";
|
|
162
|
+
export type {
|
|
163
|
+
GameMcpOptions,
|
|
164
|
+
InjectedInputFrame,
|
|
165
|
+
StandardAutomationContext,
|
|
166
|
+
StandardInputInjector,
|
|
167
|
+
StandardToolName
|
|
168
|
+
} from "./standard-automation-tools";
|
|
169
|
+
|
|
170
|
+
// Feature log (renderer collector + combined accessor + MCP tool factory)
|
|
171
|
+
export {
|
|
172
|
+
collectRendererFeatureLog,
|
|
173
|
+
createFeatureLogMcpTool,
|
|
174
|
+
getCombinedFeatureLog,
|
|
175
|
+
getRendererFeatureLog
|
|
176
|
+
} from "./feature-log";
|
|
177
|
+
export type { CombinedFeatureLog, RendererFeatureLogOptions } from "./feature-log";
|
|
178
|
+
|
|
179
|
+
// --- Render surface ---
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Get the renderer-facing surface for a given layer index.
|
|
183
|
+
*
|
|
184
|
+
* This is the canonical accessor — it returns the host-owned `RenderSurface`
|
|
185
|
+
* on the native runtime (the SDL-windowed wgpu surface installed by
|
|
186
|
+
* `createNativeHost`) and the DOM `<canvas>` element on browser hosts (which
|
|
187
|
+
* satisfies `RenderSurface` structurally).
|
|
188
|
+
*
|
|
189
|
+
* Layer 0 is the primary game surface. On native, layer 0 is the only
|
|
190
|
+
* surface — requesting any other layer throws (multi-canvas layering is a
|
|
191
|
+
* DOM-host concept).
|
|
192
|
+
*/
|
|
193
|
+
export function getSurface(layer: number = 0): RenderSurface {
|
|
194
|
+
if (layer !== 0) {
|
|
195
|
+
throw new Error(`No surface for layer ${layer} — the native host exposes exactly one RenderSurface (layer 0).`);
|
|
196
|
+
}
|
|
197
|
+
// The boundary cast: NativeSurface's WebGPU context returns the wgpu
|
|
198
|
+
// wrapper types (WgpuTexture), not @webgpu/types' branded GPUTexture.
|
|
199
|
+
// The contract is honored at runtime; the cast bridges the two type
|
|
200
|
+
// universes.
|
|
201
|
+
const surface = getNativeHost()?.surface;
|
|
202
|
+
if (!surface) {
|
|
203
|
+
throw new Error("No native surface — the host has not installed __nativeHost.surface yet");
|
|
204
|
+
}
|
|
205
|
+
return surface as RenderSurface;
|
|
206
|
+
}
|