@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,484 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Sand step pool — multi-threaded coordinator for SandWorld.step().
|
|
3
|
+
//
|
|
4
|
+
// Runs inside the mining worker. Spawns N sand-step workers, each processing
|
|
5
|
+
// a vertical strip of the grid. The grid + fields + deferred mask are backed
|
|
6
|
+
// by a single SharedArrayBuffer shared across all workers.
|
|
7
|
+
//
|
|
8
|
+
// Per step:
|
|
9
|
+
// 1. Dispatch step messages to all workers (postMessage, fire-and-forget).
|
|
10
|
+
// 2. Wait for all workers to report done (Promise.all of message events).
|
|
11
|
+
// 3. Boundary cleanup: re-run the movement pass on boundary columns, but
|
|
12
|
+
// ONLY for cells whose cross-strip move was deferred by the write guard
|
|
13
|
+
// (marked in the shared deferredMask). Write bounds are restricted to
|
|
14
|
+
// the adjacent strip so only cross-strip moves are attempted, and RNG
|
|
15
|
+
// gates are skipped (boundaryPass mode) to avoid giving boundary cells
|
|
16
|
+
// an unfair second movement chance.
|
|
17
|
+
//
|
|
18
|
+
// The boundary cleanup runs on the coordinator's own SandWorld instance
|
|
19
|
+
// but only iterates the boundary columns and only the deferred cells within
|
|
20
|
+
// them. This is O(boundaryColumns * H) — typically 2*(N-1) columns —
|
|
21
|
+
// much cheaper than the full O(W*H) step.
|
|
22
|
+
// ============================================================================
|
|
23
|
+
|
|
24
|
+
import { MAT_GRAVITY, MAT_GRAVITY_DIR, SandWorld } from "./sand-world";
|
|
25
|
+
|
|
26
|
+
export interface SandStepPoolOptions {
|
|
27
|
+
W: number;
|
|
28
|
+
H: number;
|
|
29
|
+
numWorkers: number;
|
|
30
|
+
// The SAB backing the grid + fields + skip mask + deferred mask. If not provided, the pool allocates one.
|
|
31
|
+
sab?: SharedArrayBuffer;
|
|
32
|
+
gridOffset?: number;
|
|
33
|
+
fieldsOffset?: number;
|
|
34
|
+
skipMaskOffset?: number;
|
|
35
|
+
deferredMaskOffset?: number;
|
|
36
|
+
histogramOffset?: number;
|
|
37
|
+
// Game-specific config forwarded to each worker's SandWorld.
|
|
38
|
+
preserveFlagsMask?: number;
|
|
39
|
+
disturbedFlags?: number;
|
|
40
|
+
// Gravity overrides for materials that are static by default (gravityDir=0)
|
|
41
|
+
// but need to fall in the game's context. Patched in each sand-step worker.
|
|
42
|
+
gravityOverrides?: { mat: number; gravityDir: number; gravity: number }[];
|
|
43
|
+
// Worker script URL (the sand-step-worker.ts compiled output).
|
|
44
|
+
// If not provided, workers are created via the inline
|
|
45
|
+
// `new Worker(new URL("./sand-step-worker.ts", import.meta.url))` pattern
|
|
46
|
+
// in init() so that Vite can properly bundle the nested worker.
|
|
47
|
+
workerUrl?: string;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export class SandStepPool {
|
|
51
|
+
private workers: Worker[] = [];
|
|
52
|
+
private W: number;
|
|
53
|
+
private H: number;
|
|
54
|
+
private numWorkers: number;
|
|
55
|
+
private sab: SharedArrayBuffer;
|
|
56
|
+
private gridOffset: number;
|
|
57
|
+
private fieldsOffset: number;
|
|
58
|
+
private skipMaskOffset: number;
|
|
59
|
+
private deferredMaskOffset: number;
|
|
60
|
+
private histogramOffset: number;
|
|
61
|
+
private strips: { startX: number; endX: number }[] = [];
|
|
62
|
+
// The coordinator's own SandWorld for boundary cleanup. It shares the same
|
|
63
|
+
// SAB-backed grid as the workers but has full-grid write bounds.
|
|
64
|
+
private boundaryWorld: SandWorld;
|
|
65
|
+
private workerUrl: string | null;
|
|
66
|
+
private initialized = false;
|
|
67
|
+
// In-flight init() promise — deduplicates concurrent init() calls so that
|
|
68
|
+
// two callers (e.g. loadGrid + onTick racing) share one initialization
|
|
69
|
+
// instead of each spawning a full set of workers. Without this, concurrent
|
|
70
|
+
// init() calls each push numWorkers workers into `this.workers`, leaving
|
|
71
|
+
// workers.length > strips.length and crashing step() on `strip.startX`.
|
|
72
|
+
private initPromise: Promise<void> | null = null;
|
|
73
|
+
private gravityOverrides: { mat: number; gravityDir: number; gravity: number }[] | undefined;
|
|
74
|
+
// Rebalance throttle: only rebalance every N steps to avoid overhead.
|
|
75
|
+
private stepCount = 0;
|
|
76
|
+
private readonly REBALANCE_INTERVAL = 8;
|
|
77
|
+
|
|
78
|
+
constructor(opts: SandStepPoolOptions) {
|
|
79
|
+
this.W = opts.W;
|
|
80
|
+
this.H = opts.H;
|
|
81
|
+
this.numWorkers = Math.max(1, opts.numWorkers);
|
|
82
|
+
const cells = opts.W * opts.H;
|
|
83
|
+
const gridBytes = cells * 4;
|
|
84
|
+
const fieldsBytes = cells * 4;
|
|
85
|
+
const skipMaskBytes = cells; // 1 byte per cell
|
|
86
|
+
const deferredMaskBytes = cells; // 1 byte per cell
|
|
87
|
+
const histogramBytes = opts.W * 4; // 1 uint32 per column
|
|
88
|
+
// The histogram is a Uint32Array view — its byte offset must stay
|
|
89
|
+
// 4-aligned even when `cells` is odd (skip/deferred are 1B per cell).
|
|
90
|
+
const align4 = (n: number) => (n + 3) & ~3;
|
|
91
|
+
if (opts.sab) {
|
|
92
|
+
this.sab = opts.sab;
|
|
93
|
+
this.gridOffset = opts.gridOffset ?? 0;
|
|
94
|
+
this.fieldsOffset = opts.fieldsOffset ?? gridBytes;
|
|
95
|
+
this.skipMaskOffset = opts.skipMaskOffset ?? (gridBytes + fieldsBytes);
|
|
96
|
+
this.deferredMaskOffset = opts.deferredMaskOffset ?? (gridBytes + fieldsBytes + skipMaskBytes);
|
|
97
|
+
this.histogramOffset = opts.histogramOffset ?? align4(gridBytes + fieldsBytes + skipMaskBytes + deferredMaskBytes);
|
|
98
|
+
} else {
|
|
99
|
+
// Allocate a SAB for grid + fields + skip mask + deferred mask + histogram.
|
|
100
|
+
this.gridOffset = 0;
|
|
101
|
+
this.fieldsOffset = gridBytes;
|
|
102
|
+
this.skipMaskOffset = gridBytes + fieldsBytes;
|
|
103
|
+
this.deferredMaskOffset = gridBytes + fieldsBytes + skipMaskBytes;
|
|
104
|
+
this.histogramOffset = align4(gridBytes + fieldsBytes + skipMaskBytes + deferredMaskBytes);
|
|
105
|
+
this.sab = new SharedArrayBuffer(this.histogramOffset + histogramBytes);
|
|
106
|
+
}
|
|
107
|
+
// Compute strip boundaries — divide W into numWorkers roughly-equal strips.
|
|
108
|
+
this.strips = this.computeStrips(opts.W, this.numWorkers);
|
|
109
|
+
// Coordinator's boundary cleanup world — full grid bounds, SAB-backed.
|
|
110
|
+
this.boundaryWorld = new SandWorld(opts.W, opts.H, {
|
|
111
|
+
sab: this.sab,
|
|
112
|
+
gridOffset: this.gridOffset,
|
|
113
|
+
fieldsOffset: this.fieldsOffset,
|
|
114
|
+
skipMaskOffset: this.skipMaskOffset,
|
|
115
|
+
deferredMaskOffset: this.deferredMaskOffset,
|
|
116
|
+
histogramOffset: this.histogramOffset,
|
|
117
|
+
skipStoneFloor: true,
|
|
118
|
+
});
|
|
119
|
+
if (opts.preserveFlagsMask !== undefined) this.boundaryWorld.preserveFlagsMask = opts.preserveFlagsMask;
|
|
120
|
+
if (opts.disturbedFlags !== undefined) this.boundaryWorld.disturbedFlags = opts.disturbedFlags;
|
|
121
|
+
// Apply gravity overrides to the coordinator's boundary world too.
|
|
122
|
+
if (opts.gravityOverrides) {
|
|
123
|
+
this.gravityOverrides = opts.gravityOverrides;
|
|
124
|
+
opts.gravityOverrides.forEach((o) => {
|
|
125
|
+
MAT_GRAVITY_DIR[o.mat] = o.gravityDir;
|
|
126
|
+
if (o.gravity !== 0) MAT_GRAVITY[o.mat] = o.gravity;
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
// Custom worker URL — when provided, workers are created from this URL.
|
|
130
|
+
// When not provided, init() uses the inline `new Worker(new URL(...))`
|
|
131
|
+
// pattern so Vite can bundle the nested worker for production builds.
|
|
132
|
+
this.workerUrl = opts.workerUrl ?? null;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private computeStrips(W: number, n: number): { startX: number; endX: number }[] {
|
|
136
|
+
const strips: { startX: number; endX: number }[] = [];
|
|
137
|
+
const base = Math.floor(W / n);
|
|
138
|
+
const rem = W % n;
|
|
139
|
+
let x = 0;
|
|
140
|
+
for (let i = 0; i < n; i++) {
|
|
141
|
+
const w = base + (i < rem ? 1 : 0);
|
|
142
|
+
strips.push({ startX: x, endX: x + w });
|
|
143
|
+
x += w;
|
|
144
|
+
}
|
|
145
|
+
return strips;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Compute balanced strip boundaries from the per-column active cell
|
|
150
|
+
* histogram. Uses a prefix-sum to find N boundaries that split the total
|
|
151
|
+
* active cell count as evenly as possible. This equalizes per-worker load
|
|
152
|
+
* regardless of where particles cluster in the X dimension.
|
|
153
|
+
*
|
|
154
|
+
* Each strip gets at least 1 column (guards against degenerate cases where
|
|
155
|
+
* most columns are empty).
|
|
156
|
+
*/
|
|
157
|
+
private computeBalancedStrips(histogram: Uint32Array, n: number): { startX: number; endX: number }[] {
|
|
158
|
+
const W = histogram.length;
|
|
159
|
+
// Prefix sum of active cells per column.
|
|
160
|
+
const prefix = new Float64Array(W + 1);
|
|
161
|
+
let total = 0;
|
|
162
|
+
for (let x = 0; x < W; x++) {
|
|
163
|
+
total += histogram[x];
|
|
164
|
+
prefix[x + 1] = total;
|
|
165
|
+
}
|
|
166
|
+
// If the grid is (nearly) empty, fall back to equal-width strips.
|
|
167
|
+
if (total < n) return this.computeStrips(W, n);
|
|
168
|
+
const strips: { startX: number; endX: number }[] = [];
|
|
169
|
+
const targetPerStrip = total / n;
|
|
170
|
+
let x = 0;
|
|
171
|
+
for (let i = 0; i < n; i++) {
|
|
172
|
+
const target = (i + 1) * targetPerStrip;
|
|
173
|
+
// Find the column x where prefix[x+1] first reaches the target.
|
|
174
|
+
// Binary search for efficiency (W can be 640+).
|
|
175
|
+
let lo = x, hi = W;
|
|
176
|
+
while (lo < hi) {
|
|
177
|
+
const mid = (lo + hi) >> 1;
|
|
178
|
+
if (prefix[mid + 1] < target) lo = mid + 1;
|
|
179
|
+
else hi = mid;
|
|
180
|
+
}
|
|
181
|
+
let endX = lo;
|
|
182
|
+
// Ensure at least 1 column per strip.
|
|
183
|
+
if (endX <= x) endX = x + 1;
|
|
184
|
+
// Ensure the last strip reaches W.
|
|
185
|
+
if (i === n - 1) endX = W;
|
|
186
|
+
// Don't exceed W.
|
|
187
|
+
if (endX > W) endX = W;
|
|
188
|
+
strips.push({ startX: x, endX });
|
|
189
|
+
x = endX;
|
|
190
|
+
}
|
|
191
|
+
return strips;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/** Initialize all workers. Must be called before step(). */
|
|
195
|
+
async init(): Promise<void> {
|
|
196
|
+
if (this.initialized) return;
|
|
197
|
+
// Deduplicate concurrent init() calls. If two callers race into init()
|
|
198
|
+
// (e.g. loadGrid's pool recreation overlapping with onTick's
|
|
199
|
+
// `if (!this.initialized) await this.init()`), they share the same
|
|
200
|
+
// initialization promise instead of each spawning numWorkers workers.
|
|
201
|
+
if (this.initPromise) return this.initPromise;
|
|
202
|
+
this.initPromise = this.runInit();
|
|
203
|
+
try {
|
|
204
|
+
await this.initPromise;
|
|
205
|
+
} finally {
|
|
206
|
+
this.initPromise = null;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
private async runInit(): Promise<void> {
|
|
211
|
+
const initPromises: Promise<void>[] = [];
|
|
212
|
+
for (let i = 0; i < this.numWorkers; i++) {
|
|
213
|
+
// Use inline `new Worker(new URL(...))` when no custom URL is provided
|
|
214
|
+
// so Vite can detect and bundle the nested worker for production builds.
|
|
215
|
+
// Assigning the URL to a variable first breaks Vite's worker bundling.
|
|
216
|
+
const worker = this.workerUrl
|
|
217
|
+
? new Worker(this.workerUrl, { type: "module" })
|
|
218
|
+
: new Worker(new URL("./sand-step-worker.ts", import.meta.url), { type: "module" });
|
|
219
|
+
this.workers.push(worker);
|
|
220
|
+
const strip = this.strips[i];
|
|
221
|
+
initPromises.push(new Promise<void>((resolve, reject) => {
|
|
222
|
+
const onWorkerError = (e: ErrorEvent) => {
|
|
223
|
+
reject(new Error(`sand-step-worker ${i} error: ${e.message ?? "undefined"} file=${e.filename ?? "none"}`));
|
|
224
|
+
};
|
|
225
|
+
worker.addEventListener("error", onWorkerError);
|
|
226
|
+
const handler = (e: MessageEvent) => {
|
|
227
|
+
if (e.data.type === "ready") {
|
|
228
|
+
worker.removeEventListener("message", handler);
|
|
229
|
+
worker.removeEventListener("error", onWorkerError);
|
|
230
|
+
resolve();
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
worker.addEventListener("message", handler);
|
|
234
|
+
worker.postMessage({
|
|
235
|
+
type: "init",
|
|
236
|
+
sab: this.sab,
|
|
237
|
+
gridOffset: this.gridOffset,
|
|
238
|
+
fieldsOffset: this.fieldsOffset,
|
|
239
|
+
skipMaskOffset: this.skipMaskOffset,
|
|
240
|
+
deferredMaskOffset: this.deferredMaskOffset,
|
|
241
|
+
histogramOffset: this.histogramOffset,
|
|
242
|
+
W: this.W,
|
|
243
|
+
H: this.H,
|
|
244
|
+
stripStartX: strip.startX,
|
|
245
|
+
stripEndX: strip.endX,
|
|
246
|
+
preserveFlagsMask: this.boundaryWorld.preserveFlagsMask,
|
|
247
|
+
disturbedFlags: this.boundaryWorld.disturbedFlags,
|
|
248
|
+
gravityOverrides: this.gravityOverrides,
|
|
249
|
+
});
|
|
250
|
+
}));
|
|
251
|
+
}
|
|
252
|
+
await Promise.all(initPromises);
|
|
253
|
+
this.initialized = true;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/** Get the SAB-backed skip mask (coordinator writes to it, workers read). */
|
|
257
|
+
getSkipMask(): Uint8Array {
|
|
258
|
+
return this.boundaryWorld.skipMask!;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Copy an external skip mask into the SAB-backed skip mask. */
|
|
262
|
+
setSkipMask(mask: Uint8Array): void {
|
|
263
|
+
const sabMask = this.boundaryWorld.skipMask;
|
|
264
|
+
if (sabMask) {
|
|
265
|
+
sabMask.set(mask.subarray(0, this.W * this.H));
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/** Sync config to all workers. Called when interlace/impulse settings change. */
|
|
270
|
+
private lastConfig = {
|
|
271
|
+
interlaceEnabled: false,
|
|
272
|
+
interlaceScale: 1,
|
|
273
|
+
horizontalImpulseChance: 0.02,
|
|
274
|
+
horizontalImpulseStrength: 1,
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
updateConfig(config: {
|
|
278
|
+
interlaceEnabled?: boolean;
|
|
279
|
+
interlaceScale?: number;
|
|
280
|
+
horizontalImpulseChance?: number;
|
|
281
|
+
horizontalImpulseStrength?: number;
|
|
282
|
+
}): void {
|
|
283
|
+
if (config.interlaceEnabled !== undefined) this.lastConfig.interlaceEnabled = config.interlaceEnabled;
|
|
284
|
+
if (config.interlaceScale !== undefined) this.lastConfig.interlaceScale = config.interlaceScale;
|
|
285
|
+
if (config.horizontalImpulseChance !== undefined) this.lastConfig.horizontalImpulseChance = config.horizontalImpulseChance;
|
|
286
|
+
if (config.horizontalImpulseStrength !== undefined) this.lastConfig.horizontalImpulseStrength = config.horizontalImpulseStrength;
|
|
287
|
+
// Also update the boundary world
|
|
288
|
+
this.boundaryWorld.interlaceEnabled = this.lastConfig.interlaceEnabled;
|
|
289
|
+
this.boundaryWorld.interlaceScale = this.lastConfig.interlaceScale;
|
|
290
|
+
this.boundaryWorld.horizontalImpulseChance = this.lastConfig.horizontalImpulseChance;
|
|
291
|
+
this.boundaryWorld.horizontalImpulseStrength = this.lastConfig.horizontalImpulseStrength;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Run one sand step across all workers + boundary cleanup.
|
|
296
|
+
* Returns a promise that resolves when all workers + cleanup are done.
|
|
297
|
+
*/
|
|
298
|
+
async step(frame: number): Promise<void> {
|
|
299
|
+
if (!this.initialized) await this.init();
|
|
300
|
+
// Dispatch step to all workers. The skip mask + histogram are in the SAB —
|
|
301
|
+
// workers read/write them directly, no need to post.
|
|
302
|
+
const stepPromises: Promise<void>[] = [];
|
|
303
|
+
for (let i = 0; i < this.workers.length; i++) {
|
|
304
|
+
const worker = this.workers[i];
|
|
305
|
+
const strip = this.strips[i];
|
|
306
|
+
stepPromises.push(new Promise<void>((resolve) => {
|
|
307
|
+
const handler = (e: MessageEvent) => {
|
|
308
|
+
if (e.data.type === "done") {
|
|
309
|
+
worker.removeEventListener("message", handler);
|
|
310
|
+
resolve();
|
|
311
|
+
}
|
|
312
|
+
};
|
|
313
|
+
worker.addEventListener("message", handler);
|
|
314
|
+
worker.postMessage({
|
|
315
|
+
type: "step",
|
|
316
|
+
frame,
|
|
317
|
+
stripStartX: strip.startX,
|
|
318
|
+
stripEndX: strip.endX,
|
|
319
|
+
interlaceEnabled: this.lastConfig.interlaceEnabled,
|
|
320
|
+
interlaceScale: this.lastConfig.interlaceScale,
|
|
321
|
+
horizontalImpulseChance: this.lastConfig.horizontalImpulseChance,
|
|
322
|
+
horizontalImpulseStrength: this.lastConfig.horizontalImpulseStrength,
|
|
323
|
+
});
|
|
324
|
+
}));
|
|
325
|
+
}
|
|
326
|
+
await Promise.all(stepPromises);
|
|
327
|
+
// Boundary cleanup: re-run movement on the 1-cell-wide columns at each
|
|
328
|
+
// strip boundary. The workers skipped cross-strip writes; this pass lets
|
|
329
|
+
// particles at the boundary move into the adjacent strip.
|
|
330
|
+
this.runBoundaryCleanup(frame);
|
|
331
|
+
// Periodically rebalance strip boundaries based on the per-column active
|
|
332
|
+
// cell histogram (written by workers during buildActiveListAndClearFlags).
|
|
333
|
+
// The histogram is in the SAB — no postMessage needed. New boundaries take
|
|
334
|
+
// effect on the next step (passed in the step message).
|
|
335
|
+
this.stepCount++;
|
|
336
|
+
if (this.stepCount % this.REBALANCE_INTERVAL === 0 && this.numWorkers > 1) {
|
|
337
|
+
const histogram = this.boundaryWorld.histogram;
|
|
338
|
+
if (histogram) {
|
|
339
|
+
this.strips = this.computeBalancedStrips(histogram, this.numWorkers);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Boundary cleanup: re-run the movement pass on boundary columns, but ONLY
|
|
346
|
+
* for cells whose cross-strip move was deferred by the write guard during
|
|
347
|
+
* the worker pass (marked in the shared deferredMask).
|
|
348
|
+
*
|
|
349
|
+
* For each interior strip boundary (between strip i and i+1), we process:
|
|
350
|
+
* - The last column of strip i — can now write into strip i+1.
|
|
351
|
+
* - The first column of strip i+1 — can now write into strip i.
|
|
352
|
+
*
|
|
353
|
+
* Key differences from the old approach (which re-ran the FULL tryMove on
|
|
354
|
+
* every boundary cell with full-grid write bounds):
|
|
355
|
+
*
|
|
356
|
+
* 1. Only deferred cells are processed. Cells that didn't attempt a
|
|
357
|
+
* cross-strip move (friction-blocked, obstacle-blocked, or already moved)
|
|
358
|
+
* are skipped. This prevents the cleanup from re-rolling RNG gates
|
|
359
|
+
* (friction, flicker, impulse, wind) and giving boundary cells an unfair
|
|
360
|
+
* second movement chance — the root cause of "fast falling" artifacts at
|
|
361
|
+
* strip boundaries.
|
|
362
|
+
*
|
|
363
|
+
* 2. Write bounds are restricted to the adjacent strip for each column, so
|
|
364
|
+
* only cross-strip moves are attempted. Within-strip moves (which the
|
|
365
|
+
* worker already handled) are blocked by the write guard.
|
|
366
|
+
*
|
|
367
|
+
* 3. The boundaryPass flag on the boundary world skips all RNG-based
|
|
368
|
+
* movement gates in tryMove — those already had their chance during the
|
|
369
|
+
* worker pass.
|
|
370
|
+
*
|
|
371
|
+
* This is a movement-only pass — reactions, combustion, and aging already
|
|
372
|
+
* ran in the workers. We only handle the cross-strip movement writes that
|
|
373
|
+
* were skipped at the boundaries.
|
|
374
|
+
*/
|
|
375
|
+
private runBoundaryCleanup(frame: number): void {
|
|
376
|
+
if (this.numWorkers <= 1) return; // no boundaries with a single worker
|
|
377
|
+
const bw = this.boundaryWorld;
|
|
378
|
+
bw.frame = frame;
|
|
379
|
+
bw.boundaryPass = true;
|
|
380
|
+
const grid = bw.grid;
|
|
381
|
+
const deferred = bw.deferredMask;
|
|
382
|
+
if (deferred === null) {
|
|
383
|
+
// No deferred mask (non-SAB mode) — nothing to do.
|
|
384
|
+
bw.boundaryPass = false;
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
const W = this.W;
|
|
388
|
+
const H = this.H;
|
|
389
|
+
// Process each interior boundary pair separately so we can restrict
|
|
390
|
+
// write bounds to the adjacent strip for each column.
|
|
391
|
+
for (let bi = 0; bi < this.strips.length - 1; bi++) {
|
|
392
|
+
const leftStrip = this.strips[bi];
|
|
393
|
+
const rightStrip = this.strips[bi + 1];
|
|
394
|
+
const leftCol = leftStrip.endX - 1; // last col of left strip
|
|
395
|
+
const rightCol = rightStrip.startX; // first col of right strip
|
|
396
|
+
|
|
397
|
+
// Process the left boundary column — can only write into the right strip.
|
|
398
|
+
bw.writeXMin = rightStrip.startX;
|
|
399
|
+
bw.writeXMax = rightStrip.endX;
|
|
400
|
+
this.processBoundaryColumn(bw, grid, deferred, leftCol, W, H);
|
|
401
|
+
|
|
402
|
+
// Process the right boundary column — can only write into the left strip.
|
|
403
|
+
bw.writeXMin = leftStrip.startX;
|
|
404
|
+
bw.writeXMax = leftStrip.endX;
|
|
405
|
+
this.processBoundaryColumn(bw, grid, deferred, rightCol, W, H);
|
|
406
|
+
}
|
|
407
|
+
// Reset boundary pass state.
|
|
408
|
+
bw.boundaryPass = false;
|
|
409
|
+
bw.writeXMin = 0;
|
|
410
|
+
bw.writeXMax = W;
|
|
411
|
+
// Clear the deferred mask on all boundary columns — the mask is also
|
|
412
|
+
// cleared at the start of the next frame by buildActiveListAndClearFlags,
|
|
413
|
+
// but clearing here prevents any stale markers from affecting a potential
|
|
414
|
+
// second cleanup call within the same frame.
|
|
415
|
+
for (let bi = 0; bi < this.strips.length - 1; bi++) {
|
|
416
|
+
const leftCol = this.strips[bi].endX - 1;
|
|
417
|
+
const rightCol = this.strips[bi + 1].startX;
|
|
418
|
+
for (let y = 0; y < H; y++) {
|
|
419
|
+
deferred[y * W + leftCol] = 0;
|
|
420
|
+
deferred[y * W + rightCol] = 0;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
/**
|
|
426
|
+
* Process a single boundary column: find the Y range of cells with the
|
|
427
|
+
* deferred marker, then run tryMove on them bottom-to-top (matching the
|
|
428
|
+
* main movement pass order). Only deferred cells are processed — tryMove
|
|
429
|
+
* early-returns for cells without the marker when boundaryPass is true.
|
|
430
|
+
*/
|
|
431
|
+
private processBoundaryColumn(
|
|
432
|
+
bw: SandWorld, grid: Uint32Array, deferred: Uint8Array,
|
|
433
|
+
col: number, W: number, H: number,
|
|
434
|
+
): void {
|
|
435
|
+
let minY = H, maxY = 0;
|
|
436
|
+
let hasDeferred = false;
|
|
437
|
+
for (let y = 0; y < H; y++) {
|
|
438
|
+
const idx = y * W + col;
|
|
439
|
+
if (grid[idx] !== 0 && deferred[idx] !== 0) {
|
|
440
|
+
if (y < minY) minY = y;
|
|
441
|
+
if (y > maxY) maxY = y;
|
|
442
|
+
hasDeferred = true;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
if (!hasDeferred) return;
|
|
446
|
+
// Process bottom-to-top (same as the main movement pass). tryMove
|
|
447
|
+
// early-returns for non-deferred cells when boundaryPass is true, so
|
|
448
|
+
// iterating the full [minY, maxY] range is cheap.
|
|
449
|
+
bw.runBoundaryMovement([col], minY, maxY, true);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/** Get the shared grid (for the chunk-world to read/write directly). */
|
|
453
|
+
getGrid(): Uint32Array {
|
|
454
|
+
return this.boundaryWorld.grid;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
/** Get the boundary world (the coordinator's SandWorld — shared SAB grid). */
|
|
458
|
+
getBoundaryWorld(): SandWorld {
|
|
459
|
+
return this.boundaryWorld;
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
/** Get the shared fields array. */
|
|
463
|
+
getFields(): Uint8Array {
|
|
464
|
+
return this.boundaryWorld.fields;
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
/** Get the SAB backing the grid + fields. */
|
|
468
|
+
getSAB(): SharedArrayBuffer {
|
|
469
|
+
return this.sab;
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/** Shut down all workers. */
|
|
473
|
+
shutdown(): void {
|
|
474
|
+
this.workers.forEach((worker) => {
|
|
475
|
+
worker.postMessage({ type: "shutdown" });
|
|
476
|
+
worker.terminate();
|
|
477
|
+
});
|
|
478
|
+
this.workers = [];
|
|
479
|
+
this.initialized = false;
|
|
480
|
+
// Clear any in-flight init promise so a subsequent init() can rebuild
|
|
481
|
+
// workers from scratch after shutdown.
|
|
482
|
+
this.initPromise = null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Sand step worker — processes one vertical strip of the sand grid per step.
|
|
3
|
+
//
|
|
4
|
+
// Spawned by SandStepPool (which runs inside the mining worker). Each sand-step
|
|
5
|
+
// worker shares the grid + fields via a SharedArrayBuffer and only writes to
|
|
6
|
+
// its assigned strip [stripStartX, stripEndX). Cross-strip writes are skipped
|
|
7
|
+
// by write guards in SandWorld; the coordinator's boundary cleanup pass
|
|
8
|
+
// handles them after all workers finish.
|
|
9
|
+
//
|
|
10
|
+
// Communication:
|
|
11
|
+
// - init: { sab, gridOffset, fieldsOffset, W, H, stripStartX, stripEndX, frame }
|
|
12
|
+
// - step: { frame } → processes one SandWorld.step() for this strip
|
|
13
|
+
// - The worker responds with { done: true } when the step is complete.
|
|
14
|
+
// - Atomics.wait/postMessage handshake for low-latency dispatch.
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
import { MAT_GRAVITY, MAT_GRAVITY_DIR, SandWorld } from "./sand-world";
|
|
18
|
+
|
|
19
|
+
// --- Gravity overrides for static materials ---
|
|
20
|
+
// Games can pass `gravityOverrides` in the init message to patch the gravity
|
|
21
|
+
// lookup tables for materials that are static by default (gravityDir=0) but
|
|
22
|
+
// need to fall in the game's context (e.g. Sandjongg's Ice/Plant/Fireflies).
|
|
23
|
+
// This runs in the sand-step worker thread, which has its own module instance
|
|
24
|
+
// separate from the game worker.
|
|
25
|
+
let gravityOverrides: { mat: number; gravityDir: number; gravity: number }[] | null = null;
|
|
26
|
+
|
|
27
|
+
function applyGravityOverrides(): void {
|
|
28
|
+
if (!gravityOverrides) return;
|
|
29
|
+
gravityOverrides.forEach((o) => {
|
|
30
|
+
MAT_GRAVITY_DIR[o.mat] = o.gravityDir;
|
|
31
|
+
if (o.gravity !== 0) MAT_GRAVITY[o.mat] = o.gravity;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let world: SandWorld | null = null;
|
|
36
|
+
let stripStartX = 0;
|
|
37
|
+
let stripEndX = 0;
|
|
38
|
+
|
|
39
|
+
self.onmessage = (e: MessageEvent) => {
|
|
40
|
+
const msg = e.data;
|
|
41
|
+
switch (msg.type) {
|
|
42
|
+
case "init": {
|
|
43
|
+
// Apply gravity overrides before creating the SandWorld so the patched
|
|
44
|
+
// tables are used from the first step.
|
|
45
|
+
if (msg.gravityOverrides) {
|
|
46
|
+
gravityOverrides = msg.gravityOverrides;
|
|
47
|
+
applyGravityOverrides();
|
|
48
|
+
}
|
|
49
|
+
world = new SandWorld(msg.W, msg.H, {
|
|
50
|
+
sab: msg.sab,
|
|
51
|
+
gridOffset: msg.gridOffset,
|
|
52
|
+
fieldsOffset: msg.fieldsOffset,
|
|
53
|
+
skipMaskOffset: msg.skipMaskOffset,
|
|
54
|
+
deferredMaskOffset: msg.deferredMaskOffset,
|
|
55
|
+
histogramOffset: msg.histogramOffset,
|
|
56
|
+
skipStoneFloor: true,
|
|
57
|
+
});
|
|
58
|
+
stripStartX = msg.stripStartX;
|
|
59
|
+
stripEndX = msg.stripEndX;
|
|
60
|
+
world.setStripBounds(stripStartX, stripEndX);
|
|
61
|
+
// Copy preserveFlagsMask + disturbedFlags from the coordinator (game-specific).
|
|
62
|
+
if (msg.preserveFlagsMask !== undefined) world.preserveFlagsMask = msg.preserveFlagsMask;
|
|
63
|
+
if (msg.disturbedFlags !== undefined) world.disturbedFlags = msg.disturbedFlags;
|
|
64
|
+
self.postMessage({ type: "ready" });
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case "step": {
|
|
68
|
+
if (!world) return;
|
|
69
|
+
// Sync strip bounds (in case the coordinator rebalanced strips).
|
|
70
|
+
if (msg.stripStartX !== undefined && msg.stripEndX !== undefined) {
|
|
71
|
+
stripStartX = msg.stripStartX;
|
|
72
|
+
stripEndX = msg.stripEndX;
|
|
73
|
+
world.setStripBounds(stripStartX, stripEndX);
|
|
74
|
+
}
|
|
75
|
+
// Sync per-step config from coordinator.
|
|
76
|
+
if (msg.interlaceEnabled !== undefined) world.interlaceEnabled = msg.interlaceEnabled;
|
|
77
|
+
if (msg.interlaceScale !== undefined) world.interlaceScale = msg.interlaceScale;
|
|
78
|
+
if (msg.horizontalImpulseChance !== undefined) world.horizontalImpulseChance = msg.horizontalImpulseChance;
|
|
79
|
+
if (msg.horizontalImpulseStrength !== undefined) world.horizontalImpulseStrength = msg.horizontalImpulseStrength;
|
|
80
|
+
// Set the frame number so interlace + fuse burn + C4 visited arrays work.
|
|
81
|
+
world.frame = msg.frame;
|
|
82
|
+
world.step();
|
|
83
|
+
self.postMessage({ type: "done", activeCount: world.getActiveCount() });
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
case "setSkipMask": {
|
|
87
|
+
// The skip mask is shared via SAB — the coordinator sets it directly.
|
|
88
|
+
// This message is a no-op placeholder for future per-worker skip masks.
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case "shutdown": {
|
|
92
|
+
world = null;
|
|
93
|
+
self.close();
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|