@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,124 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// glob-polyfill.ts — import.meta.glob replacement for the native runtime
|
|
3
|
+
//
|
|
4
|
+
// This module is imported by the bun-preload glob plugin. It provides a
|
|
5
|
+
// filesystem-based implementation of Vite's import.meta.glob().
|
|
6
|
+
// ============================================================================
|
|
7
|
+
|
|
8
|
+
import { existsSync, readdirSync, statSync } from "node:fs";
|
|
9
|
+
import { dirname, join, relative, resolve } from "node:path";
|
|
10
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
11
|
+
|
|
12
|
+
// Compiled-binary layout: `bun build --compile` embeds modules under
|
|
13
|
+
// /$bunfs/root/<repo-rel> (Windows: B:\~BUN\root\). Asset files aren't
|
|
14
|
+
// embedded — package-native.mjs stages them at <execDir>/dd-assets/
|
|
15
|
+
// <repo-rel>, so a $bunfs callerDir maps onto the staged tree. The keys
|
|
16
|
+
// stay identical because both trees share the same relative structure.
|
|
17
|
+
const BUNFS_ROOT_RE = /^\/\$bunfs\/root\/|^B:\\~BUN\\root\\/i;
|
|
18
|
+
|
|
19
|
+
function mapCallerDir(callerDir: string): string {
|
|
20
|
+
if (!BUNFS_ROOT_RE.test(callerDir)) return callerDir;
|
|
21
|
+
const rel = callerDir.replace(BUNFS_ROOT_RE, "");
|
|
22
|
+
const root = process.env.DOWNDRAFT_ASSET_ROOT
|
|
23
|
+
?? join(dirname(process.execPath), "dd-assets");
|
|
24
|
+
return join(root, rel);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function globToRegex(pattern: string): RegExp {
|
|
28
|
+
// Order matters: `**` must be handled before `*` (a single `*` matches one
|
|
29
|
+
// path segment; `**` matches zero or more segments). `**/` additionally
|
|
30
|
+
// collapses to zero segments so `a/**/b` also matches `a/b`.
|
|
31
|
+
let regex = pattern
|
|
32
|
+
.replace(/[.+^$()|[\]\\]/g, "\\$&")
|
|
33
|
+
.replace(/\*\*\//g, "\x00")
|
|
34
|
+
.replace(/\*\*/g, "\x01")
|
|
35
|
+
.replace(/\*/g, "[^/]*")
|
|
36
|
+
.replace(/\{([^}]+)\}/g, (_, group) => `(${group.replace(/,/g, "|")})`)
|
|
37
|
+
.replace(/\x00/g, "(?:.*/)?")
|
|
38
|
+
.replace(/\x01/g, ".*");
|
|
39
|
+
return new RegExp(`^${regex}$`, "i");
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function walkDir(dir: string, results: string[] = []): string[] {
|
|
43
|
+
let entries: string[];
|
|
44
|
+
try { entries = readdirSync(dir); } catch { return results; }
|
|
45
|
+
for (let _i = 0, _it = entries, _n = _it.length; _i < _n; _i++) { const entry = _it[_i];
|
|
46
|
+
const fullPath = join(dir, entry);
|
|
47
|
+
let stat;
|
|
48
|
+
try { stat = statSync(fullPath); } catch { continue; }
|
|
49
|
+
if (stat.isDirectory()) walkDir(fullPath, results);
|
|
50
|
+
else results.push(fullPath);
|
|
51
|
+
}
|
|
52
|
+
return results;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function createGlob(callerDir: string): (pattern: string, options?: any) => Record<string, string> {
|
|
56
|
+
const fsCallerDir = mapCallerDir(callerDir);
|
|
57
|
+
return function glob(pattern: string, options?: any): Record<string, string> {
|
|
58
|
+
// Extract the non-glob prefix to find the search root
|
|
59
|
+
const patternParts = pattern.split("/");
|
|
60
|
+
let rootParts: string[] = [];
|
|
61
|
+
for (let _i = 0, _it = patternParts, _n = _it.length; _i < _n; _i++) { const part = _it[_i];
|
|
62
|
+
if (part.includes("*") || part.includes("{")) break;
|
|
63
|
+
rootParts.push(part);
|
|
64
|
+
}
|
|
65
|
+
const searchDir = resolve(fsCallerDir, ...rootParts);
|
|
66
|
+
if (!existsSync(searchDir) || !statSync(searchDir).isDirectory()) return {};
|
|
67
|
+
|
|
68
|
+
const allFiles = walkDir(searchDir);
|
|
69
|
+
const result: Record<string, string> = {};
|
|
70
|
+
const normalizedPattern = pattern.replace(/^\.\//, "");
|
|
71
|
+
const matchRegex = globToRegex(normalizedPattern);
|
|
72
|
+
|
|
73
|
+
allFiles.forEach((file) => {
|
|
74
|
+
const relPath = relative(fsCallerDir, file).replace(/\\/g, "/");
|
|
75
|
+
const prefixedPath = relPath.startsWith("..") ? relPath : "./" + relPath;
|
|
76
|
+
if (matchRegex.test(relPath) || matchRegex.test(prefixedPath)) {
|
|
77
|
+
// For ?url queries, return the file:// URL
|
|
78
|
+
result["./" + relPath] = pathToFileURL(file).href;
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
return result;
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// ── globAssets — the canonical asset-glob call ──
|
|
86
|
+
//
|
|
87
|
+
// Games used to hand-roll the same shim at every call site:
|
|
88
|
+
//
|
|
89
|
+
// const _glob = (import.meta as any).glob ?? ((pattern) => {
|
|
90
|
+
// const { createGlob } = require("@downdraft/engine/platform/glob-polyfill");
|
|
91
|
+
// return createGlob(import.meta.dir)(pattern, { query: "?url", eager: true });
|
|
92
|
+
// });
|
|
93
|
+
//
|
|
94
|
+
// This is that shim, done once. Resolution order matches what the shims
|
|
95
|
+
// converged on:
|
|
96
|
+
// 1. `__nativeGlob` — installed by the native host (platform-native's
|
|
97
|
+
// installAssetGlob); caller-relative via the baseDir argument.
|
|
98
|
+
// 2. `import.meta.glob` — present only under a Vite transform that injected
|
|
99
|
+
// it; a plain property read is undefined on native, so this is a safe
|
|
100
|
+
// second probe.
|
|
101
|
+
// 3. `createGlob(callerDir)` — filesystem glob relative to the caller's
|
|
102
|
+
// module dir (packaged binaries, bare runtimes without the host global).
|
|
103
|
+
//
|
|
104
|
+
// Usage:
|
|
105
|
+
// const models = globAssets("../assets/models/*.glb", import.meta);
|
|
106
|
+
//
|
|
107
|
+
// `meta` is the CALLER's import.meta — a module-level helper can't see it.
|
|
108
|
+
export function globAssets(
|
|
109
|
+
pattern: string,
|
|
110
|
+
meta: { url?: string; dir?: string; glob?: unknown },
|
|
111
|
+
options?: { query?: string; import?: string; eager?: boolean },
|
|
112
|
+
): Record<string, string> {
|
|
113
|
+
const callerDir = meta.dir ?? (meta.url ? dirname(fileURLToPath(meta.url)) : process.cwd());
|
|
114
|
+
const opts = { eager: true, query: "?url", ...options };
|
|
115
|
+
|
|
116
|
+
const native = (globalThis as { __nativeGlob?: unknown }).__nativeGlob;
|
|
117
|
+
if (typeof native === "function") {
|
|
118
|
+
return (native as (p: string, o?: unknown, baseDir?: string) => Record<string, string>)(pattern, opts, callerDir);
|
|
119
|
+
}
|
|
120
|
+
if (typeof meta.glob === "function") {
|
|
121
|
+
return (meta.glob as (p: string, o?: unknown) => Record<string, string>)(pattern, opts);
|
|
122
|
+
}
|
|
123
|
+
return createGlob(callerDir)(pattern, opts);
|
|
124
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the current device pixel ratio (DPR), safely callable from any context
|
|
3
|
+
* (returns 1 in non-browser environments like Web Workers without `window`).
|
|
4
|
+
*
|
|
5
|
+
* Games use this to scale layout constants (tile sizes, HUD margins, grid cell
|
|
6
|
+
* sizes) so they render correctly on high-DPI mobile displays and Retina
|
|
7
|
+
* desktops. Equivalent to `window.devicePixelRatio || 1` but worker-safe.
|
|
8
|
+
*/
|
|
9
|
+
export function getDpr(): number {
|
|
10
|
+
if (typeof window !== "undefined" && typeof window.devicePixelRatio === "number") {
|
|
11
|
+
return window.devicePixelRatio;
|
|
12
|
+
}
|
|
13
|
+
return 1;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class HiDPIManager {
|
|
17
|
+
private scaleFactor: number = 1;
|
|
18
|
+
private handlers: Array<(scale: number) => void> = [];
|
|
19
|
+
|
|
20
|
+
detectScaleFactor(): number {
|
|
21
|
+
if (typeof window !== "undefined" && typeof window.devicePixelRatio === "number") {
|
|
22
|
+
return window.devicePixelRatio;
|
|
23
|
+
}
|
|
24
|
+
if (typeof process !== "undefined" && process.platform) {
|
|
25
|
+
if (process.platform === "darwin") {
|
|
26
|
+
return 2;
|
|
27
|
+
}
|
|
28
|
+
if (process.platform === "win32") {
|
|
29
|
+
return 1;
|
|
30
|
+
}
|
|
31
|
+
if (process.platform === "linux") {
|
|
32
|
+
return 1;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return 1;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
getScaleFactor(): number {
|
|
39
|
+
return this.scaleFactor;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
setScaleFactor(scale: number): void {
|
|
43
|
+
if (scale === this.scaleFactor) return;
|
|
44
|
+
this.scaleFactor = scale;
|
|
45
|
+
for (let i = 0; i < this.handlers.length; i++) {
|
|
46
|
+
this.handlers[i](scale);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
onScaleChange(fn: (scale: number) => void): void {
|
|
51
|
+
this.handlers.push(fn);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
init(): void {
|
|
55
|
+
this.scaleFactor = this.detectScaleFactor();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// RenderSurface — the engine's renderer-facing surface contract
|
|
3
|
+
//
|
|
4
|
+
// A RenderSurface is the thing a game renderer draws into: a WebGPU
|
|
5
|
+
// presentation target with a size, a resize event, and an input event
|
|
6
|
+
// target. It is intentionally NOT a DOM type — on the native host it is
|
|
7
|
+
// backed by an SDL window + wgpu surface (`NativeSurface`), on a DOM host
|
|
8
|
+
// it is the HTMLCanvasElement itself (which satisfies this interface
|
|
9
|
+
// structurally).
|
|
10
|
+
//
|
|
11
|
+
// Canvas-era APIs that are NOT part of this contract (2d contexts, toBlob,
|
|
12
|
+
// style, focus/blur, DOM tree traversal) live behind the canvas/DOM compat
|
|
13
|
+
// layer — engine code must never require them.
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* The WebGPU context for a RenderSurface. Structurally matches the slice of
|
|
18
|
+
* GPUCanvasContext the engine uses — both the real DOM GPUCanvasContext and
|
|
19
|
+
* the native NativeCanvasContext satisfy it. (GPUCanvasContext itself is a
|
|
20
|
+
* branded type that cannot be `implements`-ed, so this minimal shape is the
|
|
21
|
+
* engine's own contract.)
|
|
22
|
+
*/
|
|
23
|
+
export interface RenderSurfaceContext {
|
|
24
|
+
/** Configure the surface for presentation from a device. */
|
|
25
|
+
configure(config: GPUCanvasConfiguration): void;
|
|
26
|
+
/** Release the surface configuration. */
|
|
27
|
+
unconfigure(): void;
|
|
28
|
+
/** Acquire the next frame's texture for rendering. Can return null when
|
|
29
|
+
* the swapchain can't produce a frame (resize in flight, occluded
|
|
30
|
+
* window) — callers must treat null as "skip this frame". */
|
|
31
|
+
getCurrentTexture(): GPUTexture | null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Listener signature — the native event target dispatches plain event
|
|
35
|
+
* objects; DOM hosts dispatch real Events. Keep the parameter `any` so
|
|
36
|
+
* both event shapes flow through without casts. */
|
|
37
|
+
export type RenderSurfaceListener = (event: any) => void;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* The renderer-facing surface: size + WebGPU context + event target.
|
|
41
|
+
*
|
|
42
|
+
* `width`/`height` are the backing (pixel) size and are assignable —
|
|
43
|
+
* `surface.width = w` resizes the backing store, matching canvas
|
|
44
|
+
* semantics. `clientWidth`/`clientHeight` are the CSS-space size (equal to
|
|
45
|
+
* the backing size on native; DPR-scaled on DOM hosts).
|
|
46
|
+
*
|
|
47
|
+
* Events: `"resize"` fires when the host resizes the surface; input events
|
|
48
|
+
* (pointer/mouse/wheel/keyboard) are dispatched here on native and by the
|
|
49
|
+
* DOM on browser hosts.
|
|
50
|
+
*/
|
|
51
|
+
export interface RenderSurface {
|
|
52
|
+
/** Backing pixel width. Assignable — resizes the surface. */
|
|
53
|
+
width: number;
|
|
54
|
+
/** Backing pixel height. Assignable — resizes the surface. */
|
|
55
|
+
height: number;
|
|
56
|
+
/** CSS-space width (== width on native). */
|
|
57
|
+
readonly clientWidth: number;
|
|
58
|
+
/** CSS-space height (== height on native). */
|
|
59
|
+
readonly clientHeight: number;
|
|
60
|
+
/** Element-space bounding box for pointer coordinate mapping. */
|
|
61
|
+
getBoundingClientRect(): { left: number; top: number; right: number; bottom: number; width: number; height: number };
|
|
62
|
+
/** Acquire a rendering context. Only "webgpu" is part of the contract —
|
|
63
|
+
* other context ids return null (2d lives in the compat layer). */
|
|
64
|
+
getContext(contextId: "webgpu"): RenderSurfaceContext | null;
|
|
65
|
+
getContext(contextId: string): unknown;
|
|
66
|
+
/** Input + "resize" event target. */
|
|
67
|
+
addEventListener(type: string, listener: RenderSurfaceListener, options?: unknown): void;
|
|
68
|
+
removeEventListener(type: string, listener: RenderSurfaceListener, options?: unknown): void;
|
|
69
|
+
/** Dispatch an event — `Event` on DOM hosts, a plain `{ type, ...fields }`
|
|
70
|
+
* object on native. Typed `any` because the two event shapes share no
|
|
71
|
+
* common supertype and both flow through the same listeners. */
|
|
72
|
+
dispatchEvent(event: any): boolean;
|
|
73
|
+
/** Pointer lock (pointer-lock games). Optional — absent where the
|
|
74
|
+
* concept doesn't exist; presence is the feature check. */
|
|
75
|
+
requestPointerLock?(): Promise<void> | void;
|
|
76
|
+
exitPointerLock?(): void;
|
|
77
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export type RPCMessageType = "request" | "response" | "event";
|
|
2
|
+
|
|
3
|
+
export interface RPCMessage {
|
|
4
|
+
type: RPCMessageType;
|
|
5
|
+
id: number;
|
|
6
|
+
channel: string;
|
|
7
|
+
payload?: unknown;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export type RPCHandler = (payload: unknown) => Promise<unknown> | unknown;
|
|
11
|
+
|
|
12
|
+
export class RPC {
|
|
13
|
+
private handlers: Map<string, RPCHandler> = new Map();
|
|
14
|
+
private pending: Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }> = new Map();
|
|
15
|
+
private eventListeners: Map<string, Set<(payload: unknown) => void>> = new Map();
|
|
16
|
+
private messageIdCounter: number = 0;
|
|
17
|
+
private sendFn: ((msg: RPCMessage) => void) | null = null;
|
|
18
|
+
private static readonly MAX_PENDING = 1024;
|
|
19
|
+
|
|
20
|
+
setSendFn(fn: (msg: RPCMessage) => void): void {
|
|
21
|
+
this.sendFn = fn;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
registerHandler(channel: string, handler: RPCHandler): void {
|
|
25
|
+
this.handlers.set(channel, handler);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async call(channel: string, payload?: unknown, timeoutMs: number = 5000): Promise<unknown> {
|
|
29
|
+
if (!this.sendFn) {
|
|
30
|
+
return Promise.reject(new Error(`[RPC] No send function set for channel "${channel}"`));
|
|
31
|
+
}
|
|
32
|
+
if (this.pending.size >= RPC.MAX_PENDING) {
|
|
33
|
+
return Promise.reject(new Error(`[RPC] Pending map full (${RPC.MAX_PENDING}), cannot call "${channel}"`));
|
|
34
|
+
}
|
|
35
|
+
const id = this.messageIdCounter = (this.messageIdCounter + 1) % 0xFFFFFFFF;
|
|
36
|
+
return new Promise((resolve, reject) => {
|
|
37
|
+
const timer = setTimeout(() => {
|
|
38
|
+
if (this.pending.has(id)) {
|
|
39
|
+
this.pending.delete(id);
|
|
40
|
+
reject(new Error(`[RPC] Call to "${channel}" timed out after ${timeoutMs}ms`));
|
|
41
|
+
}
|
|
42
|
+
}, timeoutMs);
|
|
43
|
+
this.pending.set(id, {
|
|
44
|
+
resolve: (v) => { clearTimeout(timer); resolve(v); },
|
|
45
|
+
reject: (e) => { clearTimeout(timer); reject(e); },
|
|
46
|
+
});
|
|
47
|
+
this.send({ type: "request", id, channel, payload });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
emit(channel: string, payload?: unknown): void {
|
|
52
|
+
this.send({ type: "event", id: 0, channel, payload });
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
on(channel: string, fn: (payload: unknown) => void): () => void {
|
|
56
|
+
let listeners = this.eventListeners.get(channel);
|
|
57
|
+
if (!listeners) {
|
|
58
|
+
listeners = new Set();
|
|
59
|
+
this.eventListeners.set(channel, listeners);
|
|
60
|
+
}
|
|
61
|
+
listeners.add(fn);
|
|
62
|
+
return () => listeners!.delete(fn);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
receive(msg: RPCMessage): void {
|
|
66
|
+
if (msg.type === "response") {
|
|
67
|
+
const pending = this.pending.get(msg.id);
|
|
68
|
+
if (pending) {
|
|
69
|
+
this.pending.delete(msg.id);
|
|
70
|
+
pending.resolve(msg.payload);
|
|
71
|
+
}
|
|
72
|
+
} else if (msg.type === "request") {
|
|
73
|
+
const handler = this.handlers.get(msg.channel);
|
|
74
|
+
if (handler) {
|
|
75
|
+
Promise.resolve(handler(msg.payload))
|
|
76
|
+
.then((result) => {
|
|
77
|
+
this.send({ type: "response", id: msg.id, channel: msg.channel, payload: result });
|
|
78
|
+
})
|
|
79
|
+
.catch((err) => {
|
|
80
|
+
this.send({ type: "response", id: msg.id, channel: msg.channel, payload: { error: String(err) } });
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
} else if (msg.type === "event") {
|
|
84
|
+
const listeners = this.eventListeners.get(msg.channel);
|
|
85
|
+
if (listeners) {
|
|
86
|
+
for (const fn of listeners.values()) {
|
|
87
|
+
fn(msg.payload);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private send(msg: RPCMessage): void {
|
|
94
|
+
if (this.sendFn) {
|
|
95
|
+
this.sendFn(msg);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Runtime detection — capability-based, not runtime-name-based
|
|
3
|
+
//
|
|
4
|
+
// Every platform seam in the engine checks for capabilities, not runtime names.
|
|
5
|
+
// This file provides the few boolean helpers that are genuinely useful for
|
|
6
|
+
// dev/prod mode detection and logging, but the engine code should prefer
|
|
7
|
+
// direct capability checks (e.g. `navigator.gpu ?? globalThis.__nativeGpu`)
|
|
8
|
+
// over these helpers.
|
|
9
|
+
// ============================================================================
|
|
10
|
+
|
|
11
|
+
/** True when running under Bun (typeof Bun !== "undefined"). */
|
|
12
|
+
export const isBun: boolean = typeof (globalThis as any).Bun !== "undefined";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* True inside a `bun build --compile` binary. In compiled executables
|
|
16
|
+
* `Bun.main` is `/$bunfs/root/<entry>` instead of a real filesystem path —
|
|
17
|
+
* this is a global and stays correct even in bundles where a packager has
|
|
18
|
+
* rewritten a module's own `import.meta.url` to the staged asset tree.
|
|
19
|
+
*/
|
|
20
|
+
export const isCompiledBinary: boolean =
|
|
21
|
+
isBun && /^\/\$bunfs\//.test((globalThis as any).Bun?.main ?? "");
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Dev mode. Resolved from (in priority order):
|
|
25
|
+
* 1. DOWNDRAFT_DEV=1 env var
|
|
26
|
+
* 2. Vite's import.meta.env.DEV (injected at build time by Vite)
|
|
27
|
+
* 3. NODE_ENV !== "production" (Bun / Node)
|
|
28
|
+
*
|
|
29
|
+
* In native mode (Bun/Node/Deno), set DOWNDRAFT_DEV=1 or NODE_ENV=development.
|
|
30
|
+
* In Vite mode, Vite injects import.meta.env.DEV automatically.
|
|
31
|
+
*/
|
|
32
|
+
export const isDev: boolean = (() => {
|
|
33
|
+
// 1. Explicit env var
|
|
34
|
+
const env = (globalThis as any).process?.env;
|
|
35
|
+
if (env?.DOWNDRAFT_DEV === "1") return true;
|
|
36
|
+
if (env?.DOWNDRAFT_DEV === "0") return false;
|
|
37
|
+
// 2. Vite's import.meta.env.DEV — only available under Vite.
|
|
38
|
+
// In Bun, import.meta.env is process.env, so DEV is undefined (falsy).
|
|
39
|
+
// We use a try/catch because import.meta.env may not be accessible in
|
|
40
|
+
// all contexts (e.g. workers).
|
|
41
|
+
try {
|
|
42
|
+
const metaEnv = (import.meta as any).env;
|
|
43
|
+
if (metaEnv?.DEV === true) return true;
|
|
44
|
+
} catch {}
|
|
45
|
+
// 3. NODE_ENV
|
|
46
|
+
if (env?.NODE_ENV && env.NODE_ENV !== "production") return true;
|
|
47
|
+
return false;
|
|
48
|
+
})();
|
|
49
|
+
|
|
50
|
+
/** Alias for {@link isDev} — used by engine seams as `isDevMode`. */
|
|
51
|
+
export const isDevMode: boolean = isDev;
|
|
52
|
+
|
|
53
|
+
/** True when HMR (hot module replacement) is available (Vite dev mode only). */
|
|
54
|
+
export const hasHMR: boolean = (() => {
|
|
55
|
+
try {
|
|
56
|
+
return !!(import.meta as any).hot;
|
|
57
|
+
} catch {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
// Host capability surface
|
|
64
|
+
//
|
|
65
|
+
// `isBun` answers "what am I running
|
|
66
|
+
// on" — feature gates need "what can this host do". getHostCapabilities()
|
|
67
|
+
// answers that: it prefers the bridge-installed descriptor, then falls back
|
|
68
|
+
// to the `__nativeHost` marker (seeded by bun-preload before createNativeHost
|
|
69
|
+
// runs, so module-eval-time checks work), then to browser defaults.
|
|
70
|
+
// ---------------------------------------------------------------------------
|
|
71
|
+
|
|
72
|
+
export type HostRuntime = "native" | "browser";
|
|
73
|
+
|
|
74
|
+
export interface HostCapabilities {
|
|
75
|
+
readonly runtime: HostRuntime;
|
|
76
|
+
/** A real DOM compositor exists — DOM overlays, framework roots, real
|
|
77
|
+
* elementFromPoint. False on native (the DOM there is a polyfill for
|
|
78
|
+
* canvas-shaped APIs, not a compositor). */
|
|
79
|
+
readonly hasDom: boolean;
|
|
80
|
+
/** OPFS persistence is reachable (navigator.storage.getDirectory). */
|
|
81
|
+
readonly hasOpfs: boolean;
|
|
82
|
+
/** The host can expose its wgpu device to multiple worker threads.
|
|
83
|
+
* True on native: wgpu handles are process-global and workers attach a
|
|
84
|
+
* non-owning view via shareDevice/attachSharedDevice. Intended for
|
|
85
|
+
* coarse-grained work — per-pass splitting loses to worker overhead. */
|
|
86
|
+
readonly supportsMultiWorkerGpu: boolean;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export const NATIVE_HOST_CAPABILITIES: HostCapabilities = {
|
|
90
|
+
runtime: "native",
|
|
91
|
+
hasDom: false,
|
|
92
|
+
hasOpfs: false,
|
|
93
|
+
supportsMultiWorkerGpu: true,
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
const DOM_HOST_CAPABILITIES: HostCapabilities = {
|
|
97
|
+
runtime: "browser",
|
|
98
|
+
hasDom: true,
|
|
99
|
+
hasOpfs: true,
|
|
100
|
+
supportsMultiWorkerGpu: false,
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/** The host's capability descriptor. Prefers `downdraft.capabilities` when a
|
|
104
|
+
* bridge is installed; otherwise detects the native host marker and finally
|
|
105
|
+
* assumes a plain browser/DOM host. */
|
|
106
|
+
export function getHostCapabilities(): HostCapabilities {
|
|
107
|
+
const caps = (globalThis as { downdraft?: { capabilities?: HostCapabilities } })
|
|
108
|
+
.downdraft?.capabilities;
|
|
109
|
+
if (caps) return caps;
|
|
110
|
+
if ((globalThis as { __nativeHost?: unknown }).__nativeHost) {
|
|
111
|
+
return NATIVE_HOST_CAPABILITIES;
|
|
112
|
+
}
|
|
113
|
+
return DOM_HOST_CAPABILITIES;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The subset of the live native host object games legitimately reach for —
|
|
117
|
+
* primarily its GPU handles until the renderer gets an injected device
|
|
118
|
+
* (Phase 2 of the native re-architecture). */
|
|
119
|
+
export interface NativeHostHandle {
|
|
120
|
+
device?: GPUDevice;
|
|
121
|
+
adapter?: GPUAdapter;
|
|
122
|
+
[key: string]: unknown;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** The live native host object, or null when not on native — or when only
|
|
126
|
+
* the pre-boot `__nativeHost = true` marker exists (no device yet). Prefer
|
|
127
|
+
* `getHostCapabilities()` for feature gates; use this only when the host's
|
|
128
|
+
* concrete handles are genuinely needed. */
|
|
129
|
+
export function getNativeHost(): NativeHostHandle | null {
|
|
130
|
+
const host = (globalThis as { __nativeHost?: unknown }).__nativeHost;
|
|
131
|
+
return host && typeof host === "object" ? (host as NativeHostHandle) : null;
|
|
132
|
+
}
|