@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,91 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// RecastLib — declarative engine library descriptor for @downdraft/engine/libraries/recast
|
|
3
|
+
//
|
|
4
|
+
// Games declare `libraries: [RecastLib]` (or with config override) in their
|
|
5
|
+
// GameModule. The host creates the RecastBackend + RecastCrowdSystem
|
|
6
|
+
// (sim-side only — recast has no renderer component) and exposes them via
|
|
7
|
+
// typed tokens.
|
|
8
|
+
//
|
|
9
|
+
// Games that need full control can still import RecastBackend,
|
|
10
|
+
// RecastCrowdSystem, and RecastAgent directly (escape hatch).
|
|
11
|
+
// ============================================================================
|
|
12
|
+
|
|
13
|
+
import { resourceToken, type EngineLibrary } from "@downdraft/engine";
|
|
14
|
+
import { RecastBackend } from "./backend";
|
|
15
|
+
import { RecastCrowdSystem } from "./crowd-system";
|
|
16
|
+
|
|
17
|
+
// ── Config ──
|
|
18
|
+
|
|
19
|
+
export interface RecastLibConfig {
|
|
20
|
+
/** Default agent radius. Default: 0.5. */
|
|
21
|
+
agentRadius?: number;
|
|
22
|
+
/** Default agent height. Default: 1.8. */
|
|
23
|
+
agentHeight?: number;
|
|
24
|
+
/** Max crowd agents. Default: 512. */
|
|
25
|
+
maxAgents?: number;
|
|
26
|
+
/** Max agent radius for the recast Crowd ctor. Default: 0.6. */
|
|
27
|
+
maxAgentRadius?: number;
|
|
28
|
+
/** Seconds without progress before an agent flips to `stuck`. `0` disables. Default: 2. */
|
|
29
|
+
stuckTimeout?: number;
|
|
30
|
+
/** Min per-tick displacement (m) counting as progress for stuck detection. Default: 0.05. */
|
|
31
|
+
stuckMoveEpsilon?: number;
|
|
32
|
+
/** Horizontal distance (m) from the snapped target counted as arrived. Default: 0.5. */
|
|
33
|
+
arrivalDistance?: number;
|
|
34
|
+
/** Max distance (m) from path endpoint to target for it to count as reachable. `0` disables the reachability check. Default: 1.5. */
|
|
35
|
+
reachabilityTolerance?: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ── Typed tokens (DI) ──
|
|
39
|
+
|
|
40
|
+
/** Token for the sim-side recast backend (navmesh + query). Inject in sim systems that need pathfinding. */
|
|
41
|
+
export const RecastNavMeshTok = resourceToken<RecastBackend>("recast:navmesh");
|
|
42
|
+
/** Token for the sim-side recast crowd system. Inject in sim systems that drive agents. */
|
|
43
|
+
export const RecastCrowdTok = resourceToken<RecastCrowdSystem>("recast:crowd");
|
|
44
|
+
|
|
45
|
+
// ── Descriptor ──
|
|
46
|
+
|
|
47
|
+
export const RecastLib: EngineLibrary<RecastLibConfig> = {
|
|
48
|
+
name: "recast",
|
|
49
|
+
version: "1.0.0",
|
|
50
|
+
|
|
51
|
+
// No SAB channels — recast is sim-only, results synced via main SimBuffer.
|
|
52
|
+
sabChannels: [],
|
|
53
|
+
|
|
54
|
+
provides: [RecastNavMeshTok, RecastCrowdTok],
|
|
55
|
+
|
|
56
|
+
sim: {
|
|
57
|
+
async create(config, ctx) {
|
|
58
|
+
const backend = new RecastBackend();
|
|
59
|
+
await backend.init();
|
|
60
|
+
const crowd = new RecastCrowdSystem(backend, {
|
|
61
|
+
maxAgents: config.maxAgents ?? 512,
|
|
62
|
+
maxAgentRadius: config.maxAgentRadius ?? 0.6,
|
|
63
|
+
stuckTimeout: config.stuckTimeout,
|
|
64
|
+
stuckMoveEpsilon: config.stuckMoveEpsilon,
|
|
65
|
+
arrivalDistance: config.arrivalDistance,
|
|
66
|
+
reachabilityTolerance: config.reachabilityTolerance,
|
|
67
|
+
});
|
|
68
|
+
ctx.provide(RecastNavMeshTok, backend);
|
|
69
|
+
ctx.provide(RecastCrowdTok, crowd);
|
|
70
|
+
return { backend, crowd };
|
|
71
|
+
},
|
|
72
|
+
dispose(system) {
|
|
73
|
+
const { backend, crowd } = system as { backend: RecastBackend; crowd: RecastCrowdSystem };
|
|
74
|
+
crowd.destroy();
|
|
75
|
+
backend.destroy();
|
|
76
|
+
},
|
|
77
|
+
// tick is game-specific (calls crowd.update via the registered ECS system,
|
|
78
|
+
// setTarget per agent, repathing, etc.) — games wire this via onReady.
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
tickPhase: "post-physics",
|
|
82
|
+
|
|
83
|
+
// No renderer setup — recast is entirely sim-side.
|
|
84
|
+
|
|
85
|
+
defaultConfig: {
|
|
86
|
+
agentRadius: 0.5,
|
|
87
|
+
agentHeight: 1.8,
|
|
88
|
+
maxAgents: 512,
|
|
89
|
+
maxAgentRadius: 0.6,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Shared types for @downdraft/engine/libraries/recast
|
|
3
|
+
// ============================================================================
|
|
4
|
+
|
|
5
|
+
export type Vec3 = [number, number, number];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Configuration passed to {@link RecastBackend.buildNavMesh} (forwarded to
|
|
9
|
+
* recast-navigation's `generateSoloNavMesh` as `SoloNavMeshGeneratorConfig`).
|
|
10
|
+
* All fields optional — recast supplies sensible defaults.
|
|
11
|
+
*/
|
|
12
|
+
export interface RecastNavMeshConfig {
|
|
13
|
+
/** Voxel cell size (cs). Default from recast: 0.2. */
|
|
14
|
+
cs?: number;
|
|
15
|
+
/** Voxel cell height (ch). Default from recast: 0.2. */
|
|
16
|
+
ch?: number;
|
|
17
|
+
/** Maximum slope angle considered walkable, in degrees. Default: 45. */
|
|
18
|
+
walkableSlopeAngle?: number;
|
|
19
|
+
/** Minimum ceiling height (agent height) in world units. Default: 2. */
|
|
20
|
+
walkableHeight?: number;
|
|
21
|
+
/** Maximum ledge height considered climbable. Default: 0.4. */
|
|
22
|
+
walkableClimb?: number;
|
|
23
|
+
/** Agent radius (walkable radius). Default: 0.6. */
|
|
24
|
+
walkableRadius?: number;
|
|
25
|
+
/** Maximum edge length. Default: 12. */
|
|
26
|
+
maxEdgeLen?: number;
|
|
27
|
+
/** Maximum simplification error. Default: 1.3. */
|
|
28
|
+
maxSimplificationError?: number;
|
|
29
|
+
/** Minimum region area. Default: 8. */
|
|
30
|
+
minRegionArea?: number;
|
|
31
|
+
/** Region merge area. Default: 20. */
|
|
32
|
+
mergeRegionArea?: number;
|
|
33
|
+
/** Max vertices per polygon. Default: 6. */
|
|
34
|
+
maxVertsPerPoly?: number;
|
|
35
|
+
/** Detail sample distance. Default: 6. */
|
|
36
|
+
detailSampleDist?: number;
|
|
37
|
+
/** Detail sample max error. Default: 1. */
|
|
38
|
+
detailSampleMaxError?: number;
|
|
39
|
+
/** Build BV tree. Default: true. */
|
|
40
|
+
buildBvTree?: boolean;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Per-agent parameters. Mirrors recast-navigation's `CrowdAgentParams` but
|
|
45
|
+
* uses the engine's `Vec3`-free scalar form (agents are positioned via the
|
|
46
|
+
* ECS, not via a recast Vector3).
|
|
47
|
+
*/
|
|
48
|
+
export interface RecastAgentParams {
|
|
49
|
+
radius?: number;
|
|
50
|
+
height?: number;
|
|
51
|
+
maxAcceleration?: number;
|
|
52
|
+
maxSpeed?: number;
|
|
53
|
+
collisionQueryRange?: number;
|
|
54
|
+
pathOptimizationRange?: number;
|
|
55
|
+
separationWeight?: number;
|
|
56
|
+
updateFlags?: number;
|
|
57
|
+
obstacleAvoidanceType?: number;
|
|
58
|
+
queryFilterType?: number;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* ECS component data for a recast crowd agent. Stored on the entity alongside
|
|
63
|
+
* `PhysicsTransform`; the crowd system reads/writes both each tick.
|
|
64
|
+
*/
|
|
65
|
+
export interface RecastAgentData {
|
|
66
|
+
[key: string]: unknown;
|
|
67
|
+
/** recast crowd agent index (returned by `Crowd.addAgent`). -1 = not added. */
|
|
68
|
+
agentId: number;
|
|
69
|
+
radius: number;
|
|
70
|
+
height: number;
|
|
71
|
+
maxSpeed: number;
|
|
72
|
+
maxAcceleration: number;
|
|
73
|
+
target: Vec3 | null;
|
|
74
|
+
/**
|
|
75
|
+
* Lifecycle state of the agent's current move goal:
|
|
76
|
+
* - `idle` — no move target.
|
|
77
|
+
* - `seeking` — has a reachable target, crowd is steering toward it.
|
|
78
|
+
* - `arrived` — within `arrivalDistance` of the (snapped) target.
|
|
79
|
+
* - `stuck` — has a target but has made no appreciable progress for
|
|
80
|
+
* `stuckTimeout` seconds (e.g. target snapped to an
|
|
81
|
+
* unreachable navmesh island, or the agent is wedged against
|
|
82
|
+
* geometry). Games should react by clearing / reassigning.
|
|
83
|
+
*/
|
|
84
|
+
state: "idle" | "seeking" | "arrived" | "stuck";
|
|
85
|
+
velocity: Vec3;
|
|
86
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# `@downdraft/engine/libraries/sand`
|
|
2
|
+
|
|
3
|
+
Falling-sand simulation — cellular automata world, material palette, rule engine, and parallel step pools (SandLib descriptor).
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
bun add @downdraft/engine/libraries/sand
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Key exports
|
|
12
|
+
|
|
13
|
+
- `DEFAULT_GRAVITY`
|
|
14
|
+
- `DEFAULT_TEMP`
|
|
15
|
+
- `FIELD`
|
|
16
|
+
- `FLAG_ANCHORED`
|
|
17
|
+
- `FLAG_POPPED`
|
|
18
|
+
- `FLAG_SPARK`
|
|
19
|
+
- `FLAG_UPDATED`
|
|
20
|
+
- `FLAG_UPDATED_BIT`
|
|
21
|
+
- `FluidGrid`
|
|
22
|
+
- `GRAVEL_DISTURB_SETTLE_TICKS`
|
|
23
|
+
- …and 42 more
|
|
24
|
+
|
|
25
|
+
See the [Downdraft engine repository](https://github.com/knackstedt/downdraft) for architecture docs and examples.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Cell packing helpers — shared between the sand simulation and consumers.
|
|
3
|
+
//
|
|
4
|
+
// A cell is packed into a single uint32:
|
|
5
|
+
// bits 0-7 : material id (0..255)
|
|
6
|
+
// bits 8-15 : lifetime (0..255)
|
|
7
|
+
// bits 16-23 : flags (shade bits 0-1, FLAG_UPDATED bit 2, FLAG_SPARK bit 3,
|
|
8
|
+
// FLAG_POPPED bit 5)
|
|
9
|
+
// bits 24-31 : unused (reserved)
|
|
10
|
+
// ============================================================================
|
|
11
|
+
|
|
12
|
+
export interface Cell {
|
|
13
|
+
mat: number;
|
|
14
|
+
lifetime: number;
|
|
15
|
+
flags: number;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const FLAG_UPDATED = 0x04; // bit 2 — cell was updated this frame
|
|
19
|
+
export const FLAG_SPARK = 0x08; // bit 3 — this fire is a spark (expires to empty, not smoke)
|
|
20
|
+
export const FLAG_ANCHORED = 0x10; // bit 4 — fire stays put (wax flame, doesn't rise/drift)
|
|
21
|
+
export const FLAG_POPPED = 0x20; // bit 5 — popcorn that has already popped (won't re-pop)
|
|
22
|
+
export const SHADE_MASK = 0x03; // bits 0-1 — shade index (0-3)
|
|
23
|
+
|
|
24
|
+
// Precomputed bit position of FLAG_UPDATED within the packed uint32 flags field.
|
|
25
|
+
// OR-ing this into a packed cell value sets FLAG_UPDATED without re-packing.
|
|
26
|
+
export const FLAG_UPDATED_BIT = FLAG_UPDATED << 16;
|
|
27
|
+
|
|
28
|
+
export function pack(cell: Cell): number {
|
|
29
|
+
return (cell.mat & 0xff) | ((cell.lifetime & 0xff) << 8) | ((cell.flags & 0xff) << 16);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function unpack(v: number): Cell {
|
|
33
|
+
return {
|
|
34
|
+
mat: v & 0xff,
|
|
35
|
+
lifetime: (v >> 8) & 0xff,
|
|
36
|
+
flags: (v >> 16) & 0xff,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Pack a cell value from raw components without allocating a Cell object. */
|
|
41
|
+
export function packCell(mat: number, lifetime: number, flags: number): number {
|
|
42
|
+
return (mat & 0xff) | ((lifetime & 0xff) << 8) | ((flags & 0xff) << 16);
|
|
43
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Shared per-cell physics field layout.
|
|
3
|
+
//
|
|
4
|
+
// Each cell carries 4 field bytes alongside its packed material cell:
|
|
5
|
+
// [gravity:u8, temp:u8, reserved:u8, reserved:u8]
|
|
6
|
+
//
|
|
7
|
+
// Wind/velocity is no longer stored per-cell. It's handled by the coarse-grid
|
|
8
|
+
// FluidGrid (fluid-grid.ts) at 1/4 resolution, which provides proper pressure
|
|
9
|
+
// relaxation and sustained airflow. The reserved bytes are kept for SAB layout
|
|
10
|
+
// compatibility (avoiding save migration) but are unused.
|
|
11
|
+
//
|
|
12
|
+
// These constants are shared between the sand simulation (sand-world.ts) and
|
|
13
|
+
// any game-specific SharedArrayBuffer bridge (e.g. a game's sim-buffer.ts
|
|
14
|
+
// or a game's chunk SAB). Games keep their own SAB layout but reference
|
|
15
|
+
// these field offsets so the indexing stays consistent.
|
|
16
|
+
// ============================================================================
|
|
17
|
+
|
|
18
|
+
export const FIELD = {
|
|
19
|
+
GRAVITY: 0,
|
|
20
|
+
TEMP: 1,
|
|
21
|
+
// Bytes 2-3 are reserved (formerly WIND_X/WIND_Y, now handled by FluidGrid).
|
|
22
|
+
// Kept for SAB layout compatibility — do not repurpose without updating
|
|
23
|
+
// grid-sim-buffer.ts fieldCellBytes and all save files.
|
|
24
|
+
RESERVED_2: 2,
|
|
25
|
+
RESERVED_3: 3,
|
|
26
|
+
} as const;
|
|
27
|
+
|
|
28
|
+
export const DEFAULT_GRAVITY = 128; // u8, 128 = 1.0x
|
|
29
|
+
export const DEFAULT_TEMP = 128; // u8, 128 = 1.0
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// FluidGrid — coarse-grid pressure/velocity fluid simulation.
|
|
3
|
+
//
|
|
4
|
+
// Replaces the per-cell wind field system with a proper fluid dynamics
|
|
5
|
+
// simulation at 1/4 resolution. Each coarse cell covers 4×4 fine cells.
|
|
6
|
+
//
|
|
7
|
+
// The simulation runs a simplified Navier-Stokes step each frame:
|
|
8
|
+
// 1. Pressure relaxation — pressure diffuses to neighbors
|
|
9
|
+
// 2. Velocity from pressure gradient — velX/velY derived from pressure diffs
|
|
10
|
+
// 3. Velocity damping — velocities decay slightly each frame
|
|
11
|
+
//
|
|
12
|
+
// This enables sustained airflow (fans), pressure equalization (gas flows
|
|
13
|
+
// from high to low pressure), and realistic explosion shockwaves.
|
|
14
|
+
//
|
|
15
|
+
// Per-cell wind is sampled from the coarse grid via bilinear interpolation
|
|
16
|
+
// in tryMove(), replacing the old per-cell WIND_X/WIND_Y fields.
|
|
17
|
+
//
|
|
18
|
+
// Inspired by the Dan-Ball dust2.js fluid simulation, which uses a similar
|
|
19
|
+
// coarse-grid pressure/velocity approach at 1/4 particle resolution.
|
|
20
|
+
// ============================================================================
|
|
21
|
+
|
|
22
|
+
const COARSE_SCALE = 4; // each coarse cell = 4×4 fine cells
|
|
23
|
+
|
|
24
|
+
export class FluidGrid {
|
|
25
|
+
// Coarse grid dimensions
|
|
26
|
+
readonly cw: number;
|
|
27
|
+
readonly ch: number;
|
|
28
|
+
|
|
29
|
+
// Pressure + velocity fields (Float32Array for performance)
|
|
30
|
+
pressure: Float32Array;
|
|
31
|
+
velX: Float32Array;
|
|
32
|
+
velY: Float32Array;
|
|
33
|
+
|
|
34
|
+
// Double-buffered temp arrays for relaxation steps
|
|
35
|
+
private pressureNext: Float32Array;
|
|
36
|
+
private velXNext: Float32Array;
|
|
37
|
+
private velYNext: Float32Array;
|
|
38
|
+
|
|
39
|
+
// Solid mask — coarse cells blocked by walls/stone don't participate.
|
|
40
|
+
// 1 = solid (blocked), 0 = fluid (participates).
|
|
41
|
+
private solid: Uint8Array;
|
|
42
|
+
|
|
43
|
+
// Dirty flag — skip the step() entirely when no impulses or pressure exists.
|
|
44
|
+
private dirty = false;
|
|
45
|
+
|
|
46
|
+
constructor(fineW: number, fineH: number) {
|
|
47
|
+
this.cw = Math.ceil(fineW / COARSE_SCALE);
|
|
48
|
+
this.ch = Math.ceil(fineH / COARSE_SCALE);
|
|
49
|
+
const n = this.cw * this.ch;
|
|
50
|
+
this.pressure = new Float32Array(n);
|
|
51
|
+
this.velX = new Float32Array(n);
|
|
52
|
+
this.velY = new Float32Array(n);
|
|
53
|
+
this.pressureNext = new Float32Array(n);
|
|
54
|
+
this.velXNext = new Float32Array(n);
|
|
55
|
+
this.velYNext = new Float32Array(n);
|
|
56
|
+
this.solid = new Uint8Array(n);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Mark a fine-grid cell as solid (wall/stone). Blocks fluid flow. */
|
|
60
|
+
setSolid(fineX: number, fineY: number): void {
|
|
61
|
+
const cx = (fineX / COARSE_SCALE) | 0;
|
|
62
|
+
const cy = (fineY / COARSE_SCALE) | 0;
|
|
63
|
+
if (cx >= 0 && cx < this.cw && cy >= 0 && cy < this.ch) {
|
|
64
|
+
this.solid[cy * this.cw + cx] = 1;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Clear the solid flag for a fine-grid cell. */
|
|
69
|
+
clearSolid(fineX: number, fineY: number): void {
|
|
70
|
+
const cx = (fineX / COARSE_SCALE) | 0;
|
|
71
|
+
const cy = (fineY / COARSE_SCALE) | 0;
|
|
72
|
+
if (cx >= 0 && cx < this.cw && cy >= 0 && cy < this.ch) {
|
|
73
|
+
this.solid[cy * this.cw + cx] = 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Apply an impulse at a fine-grid position. Adds to the velocity field
|
|
79
|
+
* with linear falloff from the center. Used for explosions, fans, etc.
|
|
80
|
+
*/
|
|
81
|
+
applyImpulse(fineX: number, fineY: number, radius: number, strengthX: number, strengthY: number): void {
|
|
82
|
+
const ccx = (fineX / COARSE_SCALE) | 0;
|
|
83
|
+
const ccy = (fineY / COARSE_SCALE) | 0;
|
|
84
|
+
const cr = Math.ceil(radius / COARSE_SCALE);
|
|
85
|
+
const cr2 = cr * cr;
|
|
86
|
+
for (let dy = -cr; dy <= cr; dy++) {
|
|
87
|
+
const ny = ccy + dy;
|
|
88
|
+
if (ny < 0 || ny >= this.ch) continue;
|
|
89
|
+
for (let dx = -cr; dx <= cr; dx++) {
|
|
90
|
+
const nx = ccx + dx;
|
|
91
|
+
if (nx < 0 || nx >= this.cw) continue;
|
|
92
|
+
const dist2 = dx * dx + dy * dy;
|
|
93
|
+
if (dist2 > cr2) continue;
|
|
94
|
+
const falloff = 1 - Math.sqrt(dist2) / (cr + 1);
|
|
95
|
+
const idx = ny * this.cw + nx;
|
|
96
|
+
if (this.solid[idx]) continue;
|
|
97
|
+
this.velX[idx] += strengthX * falloff;
|
|
98
|
+
this.velY[idx] += strengthY * falloff;
|
|
99
|
+
// Pressure impulse for shockwave effect
|
|
100
|
+
this.pressure[idx] += Math.abs(strengthX + strengthY) * falloff * 0.3;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
this.dirty = true;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Sample horizontal velocity at a fine-grid position using bilinear
|
|
108
|
+
* interpolation. Returns a velocity in cells/frame units.
|
|
109
|
+
*
|
|
110
|
+
* Fast-path: when the fluid grid is not dirty (no active impulses/pressure),
|
|
111
|
+
* all velocities are zero — skip the bilinear math entirely. This eliminates
|
|
112
|
+
* ~90% of calls in normal play (no explosions = no fluid activity), which
|
|
113
|
+
* was the #1 CPU hot spot in profiling (13.3% of total sampled time).
|
|
114
|
+
*/
|
|
115
|
+
sampleVelX(fineX: number, fineY: number): number {
|
|
116
|
+
if (!this.dirty) return 0;
|
|
117
|
+
const fx = fineX / COARSE_SCALE - 0.5;
|
|
118
|
+
const fy = fineY / COARSE_SCALE - 0.5;
|
|
119
|
+
const x0 = Math.floor(fx);
|
|
120
|
+
const y0 = Math.floor(fy);
|
|
121
|
+
const tx = fx - x0;
|
|
122
|
+
const ty = fy - y0;
|
|
123
|
+
const x1 = x0 + 1;
|
|
124
|
+
const y1 = y0 + 1;
|
|
125
|
+
const v00 = this.safeVelX(x0, y0);
|
|
126
|
+
const v10 = this.safeVelX(x1, y0);
|
|
127
|
+
const v01 = this.safeVelX(x0, y1);
|
|
128
|
+
const v11 = this.safeVelX(x1, y1);
|
|
129
|
+
return (1 - tx) * (1 - ty) * v00 + tx * (1 - ty) * v10 +
|
|
130
|
+
(1 - tx) * ty * v01 + tx * ty * v11;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** Sample vertical velocity at a fine-grid position. */
|
|
134
|
+
sampleVelY(fineX: number, fineY: number): number {
|
|
135
|
+
if (!this.dirty) return 0;
|
|
136
|
+
const fx = fineX / COARSE_SCALE - 0.5;
|
|
137
|
+
const fy = fineY / COARSE_SCALE - 0.5;
|
|
138
|
+
const x0 = Math.floor(fx);
|
|
139
|
+
const y0 = Math.floor(fy);
|
|
140
|
+
const tx = fx - x0;
|
|
141
|
+
const ty = fy - y0;
|
|
142
|
+
const x1 = x0 + 1;
|
|
143
|
+
const y1 = y0 + 1;
|
|
144
|
+
const v00 = this.safeVelY(x0, y0);
|
|
145
|
+
const v10 = this.safeVelY(x1, y0);
|
|
146
|
+
const v01 = this.safeVelY(x0, y1);
|
|
147
|
+
const v11 = this.safeVelY(x1, y1);
|
|
148
|
+
return (1 - tx) * (1 - ty) * v00 + tx * (1 - ty) * v10 +
|
|
149
|
+
(1 - tx) * ty * v01 + tx * ty * v11;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Get the raw velocity magnitude at a coarse cell (for debugging/visualization). */
|
|
153
|
+
getPressure(cx: number, cy: number): number {
|
|
154
|
+
if (cx < 0 || cx >= this.cw || cy < 0 || cy >= this.ch) return 0;
|
|
155
|
+
return this.pressure[cy * this.cw + cx];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Whether any fluid activity exists (for skipping the step when idle). */
|
|
159
|
+
isActive(): boolean {
|
|
160
|
+
return this.dirty;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/** Clear all fields (e.g. on world clear/resize). */
|
|
164
|
+
clear(): void {
|
|
165
|
+
this.pressure.fill(0);
|
|
166
|
+
this.velX.fill(0);
|
|
167
|
+
this.velY.fill(0);
|
|
168
|
+
this.pressureNext.fill(0);
|
|
169
|
+
this.velXNext.fill(0);
|
|
170
|
+
this.velYNext.fill(0);
|
|
171
|
+
this.solid.fill(0);
|
|
172
|
+
this.dirty = false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Run one simulation step:
|
|
177
|
+
* 1. Pressure relaxation (diffuse to neighbors)
|
|
178
|
+
* 2. Velocity from pressure gradient
|
|
179
|
+
* 3. Velocity damping
|
|
180
|
+
*
|
|
181
|
+
* Skipped entirely when no impulses have been applied and all fields are
|
|
182
|
+
* near-zero (the dirty flag tracks this).
|
|
183
|
+
*/
|
|
184
|
+
step(): void {
|
|
185
|
+
if (!this.dirty) return;
|
|
186
|
+
const cw = this.cw, ch = this.ch;
|
|
187
|
+
const pressure = this.pressure;
|
|
188
|
+
const velX = this.velX, velY = this.velY;
|
|
189
|
+
const pressureNext = this.pressureNext;
|
|
190
|
+
const velXNext = this.velXNext, velYNext = this.velYNext;
|
|
191
|
+
const solid = this.solid;
|
|
192
|
+
|
|
193
|
+
// --- 1. Pressure relaxation (diffuse) ---
|
|
194
|
+
// Each cell's pressure moves toward the average of its neighbors.
|
|
195
|
+
// This is a single Jacobi iteration — enough for visual fluid flow.
|
|
196
|
+
for (let y = 0; y < ch; y++) {
|
|
197
|
+
for (let x = 0; x < cw; x++) {
|
|
198
|
+
const idx = y * cw + x;
|
|
199
|
+
if (solid[idx]) { pressureNext[idx] = 0; continue; }
|
|
200
|
+
let sum = pressure[idx] * 2; // self-weight
|
|
201
|
+
let count = 2;
|
|
202
|
+
if (x > 0 && !solid[idx - 1]) { sum += pressure[idx - 1]; count++; }
|
|
203
|
+
if (x < cw - 1 && !solid[idx + 1]) { sum += pressure[idx + 1]; count++; }
|
|
204
|
+
if (y > 0 && !solid[idx - cw]) { sum += pressure[idx - cw]; count++; }
|
|
205
|
+
if (y < ch - 1 && !solid[idx + cw]) { sum += pressure[idx + cw]; count++; }
|
|
206
|
+
pressureNext[idx] = sum / count;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
// --- 2. Velocity from pressure gradient ---
|
|
211
|
+
// velX -= (P[x+1] - P[x-1]) * dt
|
|
212
|
+
// velY -= (P[y+1] - P[y-1]) * dt
|
|
213
|
+
// Pressure naturally pushes flow from high to low.
|
|
214
|
+
const pressureGrad = 0.15;
|
|
215
|
+
for (let y = 0; y < ch; y++) {
|
|
216
|
+
for (let x = 0; x < cw; x++) {
|
|
217
|
+
const idx = y * cw + x;
|
|
218
|
+
if (solid[idx]) { velXNext[idx] = 0; velYNext[idx] = 0; continue; }
|
|
219
|
+
const pL = x > 0 && !solid[idx - 1] ? pressureNext[idx - 1] : pressureNext[idx];
|
|
220
|
+
const pR = x < cw - 1 && !solid[idx + 1] ? pressureNext[idx + 1] : pressureNext[idx];
|
|
221
|
+
const pU = y > 0 && !solid[idx - cw] ? pressureNext[idx - cw] : pressureNext[idx];
|
|
222
|
+
const pD = y < ch - 1 && !solid[idx + cw] ? pressureNext[idx + cw] : pressureNext[idx];
|
|
223
|
+
velXNext[idx] = velX[idx] - (pR - pL) * pressureGrad;
|
|
224
|
+
velYNext[idx] = velY[idx] - (pD - pU) * pressureGrad;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
// --- 3. Damping + pressure decay ---
|
|
229
|
+
// Velocities decay ~10% per frame. Pressure decays faster (it's a
|
|
230
|
+
// transient impulse, not a sustained field). This prevents impulses
|
|
231
|
+
// from persisting forever and keeps the sim stable.
|
|
232
|
+
const velDamping = 0.9;
|
|
233
|
+
const pressureDamping = 0.85;
|
|
234
|
+
let anyActive = false;
|
|
235
|
+
for (let i = 0; i < cw * ch; i++) {
|
|
236
|
+
velX[i] = velXNext[i] * velDamping;
|
|
237
|
+
velY[i] = velYNext[i] * velDamping;
|
|
238
|
+
pressure[i] = pressureNext[i] * pressureDamping;
|
|
239
|
+
if (Math.abs(velX[i]) > 0.01 || Math.abs(velY[i]) > 0.01 || Math.abs(pressure[i]) > 0.01) {
|
|
240
|
+
anyActive = true;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
// Clear dirty flag if everything has decayed to near-zero.
|
|
245
|
+
this.dirty = anyActive;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// --- Internal helpers ---
|
|
249
|
+
|
|
250
|
+
private safeVelX(cx: number, cy: number): number {
|
|
251
|
+
if (cx < 0 || cx >= this.cw || cy < 0 || cy >= this.ch) return 0;
|
|
252
|
+
const idx = cy * this.cw + cx;
|
|
253
|
+
return this.solid[idx] ? 0 : this.velX[idx];
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
private safeVelY(cx: number, cy: number): number {
|
|
257
|
+
if (cx < 0 || cx >= this.cw || cy < 0 || cy >= this.ch) return 0;
|
|
258
|
+
const idx = cy * this.cw + cx;
|
|
259
|
+
return this.solid[idx] ? 0 : this.velY[idx];
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// computeGridDims — shared grid dimension calculator for sand/grid games
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// Both falling-sand and sandjongg (and any future grid-based sand game) need
|
|
6
|
+
// to compute sand grid dimensions from canvas buffer pixels. The math is
|
|
7
|
+
// identical except for the base cell size, max grid bounds, and optional
|
|
8
|
+
// alignment. This shared utility eliminates the duplication.
|
|
9
|
+
//
|
|
10
|
+
|
|
11
|
+
export interface ComputeGridDimsOptions {
|
|
12
|
+
/** Target canvas buffer pixels per grid cell (before DPR scaling). Higher = larger grains. */
|
|
13
|
+
baseCellPx: number;
|
|
14
|
+
/** Maximum grid width in cells (SAB is allocated at this size). */
|
|
15
|
+
maxGridW: number;
|
|
16
|
+
/** Maximum grid height in cells (SAB is allocated at this size). */
|
|
17
|
+
maxGridH: number;
|
|
18
|
+
/** Minimum grid dimension in cells. Default: 32. */
|
|
19
|
+
minDim?: number;
|
|
20
|
+
/**
|
|
21
|
+
* Align grid dimensions to a multiple of this value (e.g. 4 for 4-byte
|
|
22
|
+
* alignment of per-row buffers). Default: 1 (no alignment).
|
|
23
|
+
*/
|
|
24
|
+
align?: number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Compute sand grid dimensions from canvas buffer dimensions (CSS × DPR).
|
|
29
|
+
*
|
|
30
|
+
* The grid is sized so that each cell covers `baseCellPx * dpr` canvas pixels,
|
|
31
|
+
* keeping cell density consistent across HiDPI displays. If the computed size
|
|
32
|
+
* exceeds `maxGridW`/`maxGridH`, both dimensions are scaled down proportionally
|
|
33
|
+
* to preserve the aspect ratio (guarantees square cells).
|
|
34
|
+
*
|
|
35
|
+
* @param canvasW Canvas backing-store width (CSS width × DPR).
|
|
36
|
+
* @param canvasH Canvas backing-store height (CSS height × DPR).
|
|
37
|
+
* @param options Configuration (base cell size, max grid, alignment).
|
|
38
|
+
* @returns `{ w, h }` grid dimensions in cells.
|
|
39
|
+
*/
|
|
40
|
+
export function computeGridDims(
|
|
41
|
+
canvasW: number,
|
|
42
|
+
canvasH: number,
|
|
43
|
+
options: ComputeGridDimsOptions,
|
|
44
|
+
): { w: number; h: number } {
|
|
45
|
+
const { baseCellPx, maxGridW, maxGridH } = options;
|
|
46
|
+
const minDim = options.minDim ?? 32;
|
|
47
|
+
const align = options.align ?? 1;
|
|
48
|
+
|
|
49
|
+
const dpr = typeof window !== "undefined" ? (window.devicePixelRatio || 1) : 1;
|
|
50
|
+
const cellPx = baseCellPx * dpr;
|
|
51
|
+
|
|
52
|
+
let w = Math.floor(canvasW / cellPx);
|
|
53
|
+
let h = Math.floor(canvasH / cellPx);
|
|
54
|
+
|
|
55
|
+
// Clamp to minimums.
|
|
56
|
+
w = Math.max(minDim, w);
|
|
57
|
+
h = Math.max(minDim, h);
|
|
58
|
+
|
|
59
|
+
// If either dimension exceeds the max, scale BOTH proportionally
|
|
60
|
+
// to preserve aspect ratio (guarantees 1:1 cells).
|
|
61
|
+
if (w > maxGridW || h > maxGridH) {
|
|
62
|
+
const scale = Math.min(maxGridW / w, maxGridH / h);
|
|
63
|
+
w = Math.max(minDim, Math.floor(w * scale));
|
|
64
|
+
h = Math.max(minDim, Math.floor(h * scale));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Align to a multiple of `align` (e.g. 4 for Uint32Array row alignment).
|
|
68
|
+
if (align > 1) {
|
|
69
|
+
w = Math.floor(w / align) * align;
|
|
70
|
+
h = Math.floor(h / align) * align;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return { w, h };
|
|
74
|
+
}
|