@downdraft/engine 0.1.0 → 0.1.2-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/app/README.md +11 -0
- package/app/src/renderer/bootstrap.ts +295 -19
- package/app/src/renderer/game-module.ts +60 -12
- package/app/src/renderer/hooks.ts +9 -1
- package/app/src/renderer/hot-reload.ts +9 -9
- package/app/src/renderer/mcp-harness.ts +2 -2
- package/app/src/renderer/standard-automation-tools.ts +104 -3
- package/app/src/shared/feature-log.ts +2 -1
- package/app/src/shared/mcp-discovery.ts +8 -3
- package/app/src/shared/mcp-proxy.ts +2 -2
- package/asset-bake/README.md +22 -0
- package/core/README.md +25 -0
- package/core/src/animation/skeleton-animator.ts +23 -5
- package/core/src/assets/manager.ts +4 -4
- package/core/src/ecs/events.ts +1 -1
- package/core/src/ecs/schedule.ts +1 -1
- package/core/src/ecs/world.ts +1 -1
- package/core/src/index.ts +3 -4
- package/core/src/library/host.ts +27 -13
- package/core/src/library/library.ts +13 -5
- package/core/src/module/cross-thread.ts +6 -0
- package/core/src/module/diagnostics.ts +10 -6
- package/core/src/module/host.ts +65 -18
- package/core/src/module/index.ts +1 -0
- package/core/src/module/module.ts +11 -5
- package/core/src/module/renderer-module.ts +15 -0
- package/core/src/physics/safety.ts +1 -1
- package/core/src/platform/bun-preload.ts +7 -2
- package/core/src/platform/glob-polyfill.ts +17 -8
- package/core/src/platform/pkg-root.ts +27 -0
- package/core/src/platform/runtime.ts +38 -0
- package/core/src/plugin/discovery.ts +1 -1
- package/core/src/plugin/extension-loaders.ts +6 -4
- package/core/src/plugin/host.ts +13 -13
- package/core/src/plugin/loader-asset.ts +5 -5
- package/core/src/plugin/loader-quickjs.ts +1 -1
- package/core/src/plugin/loader-wasm.ts +3 -3
- package/core/src/plugin/loader-worker.ts +1 -1
- package/core/src/plugin/manifest.ts +8 -3
- package/core/src/plugin/workshop.ts +3 -3
- package/core/src/profiling/index.ts +1 -1
- package/core/src/profiling/profiling-sab.ts +19 -0
- package/core/src/profiling/warnings.ts +1 -1
- package/core/src/profiling/worker-prelude.ts +1 -1
- package/core/src/render/bindless/frame-bindings.ts +1 -1
- package/core/src/render/bindless/material-manager.ts +2 -2
- package/core/src/render/bindless/texture-registry.ts +2 -2
- package/core/src/render/device.ts +5 -5
- package/core/src/render/frame-graph.ts +2 -2
- package/core/src/render/game-renderer.ts +42 -18
- package/core/src/render/hot-reload.ts +3 -3
- package/core/src/render/renderer-module-host.ts +32 -12
- package/core/src/render/shader-validator.ts +7 -7
- package/core/src/render/surface.ts +1 -1
- package/core/src/sab/errors.ts +1 -1
- package/core/src/sab/sab-polyfill.ts +1 -1
- package/core/src/save/migration-registry.ts +4 -4
- package/core/src/save/schema.ts +1 -1
- package/core/src/scene/prefab.ts +1 -1
- package/core/src/scene/scene-manager.ts +2 -2
- package/core/src/scene/scene.ts +4 -4
- package/core/src/scene/streaming.ts +2 -2
- package/core/src/scripting/hot-reload.ts +2 -2
- package/core/src/sim/hot-reload-pipeline.ts +30 -6
- package/core/src/sim/sim-state-helper.ts +1 -1
- package/core/src/sim/transient-state-registry.ts +1 -1
- package/core/src/sim/worker-loop.ts +2 -2
- package/core/src/telemetry/gpu-profiler.ts +3 -3
- package/core/src/util/index.ts +1 -1
- package/core/src/util/logger.ts +36 -5
- package/core/src/version.ts +13 -0
- package/core/src/worker/base-worker-host.ts +87 -25
- package/core/src/worker/buffer-sync.ts +1 -1
- package/core/src/worker/crash-recovery.ts +2 -2
- package/core/src/worker/instrumented-worker-host.ts +3 -3
- package/core/src/worker/rpc.ts +62 -11
- package/core/src/worker/sim-worker-base.ts +3 -8
- package/core/src/worker/task-pool.ts +2 -2
- package/dist/.dd-manifest.json +4119 -0
- package/dist/app/src/index.js +9 -0
- package/dist/app/src/renderer/bootstrap.js +446 -0
- package/dist/app/src/renderer/downdraft-base.css +93 -0
- package/dist/app/src/renderer/feature-log.js +180 -0
- package/dist/app/src/renderer/game-module.js +562 -0
- package/dist/app/src/renderer/hooks.js +82 -0
- package/dist/app/src/renderer/hot-reload.js +158 -0
- package/dist/app/src/renderer/import-cache.js +77 -0
- package/dist/app/src/renderer/index.js +149 -0
- package/dist/app/src/renderer/mcp-harness.js +112 -0
- package/dist/app/src/renderer/save-store-factory.js +180 -0
- package/dist/app/src/renderer/sim-bridge.js +138 -0
- package/dist/app/src/renderer/standard-automation-tools.js +720 -0
- package/dist/app/src/shared/feature-log.js +54 -0
- package/dist/app/src/shared/gpu-info.js +74 -0
- package/dist/app/src/shared/import-cache-store.js +123 -0
- package/dist/app/src/shared/index.js +4 -0
- package/dist/app/src/shared/mcp-discovery.js +55 -0
- package/dist/app/src/shared/mcp-proxy.js +71 -0
- package/dist/app/src/shared/types.js +13 -0
- package/dist/asset-bake/src/bake-audio.js +103 -0
- package/dist/asset-bake/src/bake-gltf.js +141 -0
- package/dist/asset-bake/src/bake.js +63 -0
- package/dist/asset-bake/src/cache.js +147 -0
- package/dist/asset-bake/src/config.js +93 -0
- package/dist/asset-bake/src/index.js +25 -0
- package/dist/core/src/animation/animation-event.js +24 -0
- package/dist/core/src/animation/bone-mask.js +103 -0
- package/dist/core/src/animation/clip.js +210 -0
- package/dist/core/src/animation/index.js +13 -0
- package/dist/core/src/animation/mixamo.js +78 -0
- package/dist/core/src/animation/morph-target.js +37 -0
- package/dist/core/src/animation/player.js +621 -0
- package/dist/core/src/animation/retarget.js +101 -0
- package/dist/core/src/animation/skeleton-animator.js +1361 -0
- package/dist/core/src/animation/skeleton.js +166 -0
- package/dist/core/src/animation/state-machine.js +252 -0
- package/dist/core/src/assets/blob-store.js +14 -0
- package/dist/core/src/assets/cache.js +168 -0
- package/dist/core/src/assets/cubemap-converter.js +129 -0
- package/dist/core/src/assets/environment-manager.js +84 -0
- package/dist/core/src/assets/import-cache.js +36 -0
- package/dist/core/src/assets/import-settings.js +34 -0
- package/dist/core/src/assets/importer.js +78 -0
- package/dist/core/src/assets/index.js +29 -0
- package/dist/core/src/assets/irradiance-generator.js +179 -0
- package/dist/core/src/assets/loader-audio.js +70 -0
- package/dist/core/src/assets/loader-cubemap.js +141 -0
- package/dist/core/src/assets/loader-dds.js +185 -0
- package/dist/core/src/assets/loader-hdr.js +430 -0
- package/dist/core/src/assets/loader-mesh.js +47 -0
- package/dist/core/src/assets/loader-shader.js +61 -0
- package/dist/core/src/assets/loader-texture.js +264 -0
- package/dist/core/src/assets/lod.js +150 -0
- package/dist/core/src/assets/manager.js +401 -0
- package/dist/core/src/assets/manifest.js +57 -0
- package/dist/core/src/assets/material-bridge.js +160 -0
- package/dist/core/src/assets/model-importer.js +32 -0
- package/dist/core/src/assets/model-normalizer.js +213 -0
- package/dist/core/src/assets/model-to-gpu.js +44 -0
- package/dist/core/src/assets/model-to-mesh.js +171 -0
- package/dist/core/src/assets/prefilter-generator.js +220 -0
- package/dist/core/src/audio/engine.js +153 -0
- package/dist/core/src/audio/interface.js +8 -0
- package/dist/core/src/audio/listener.js +19 -0
- package/dist/core/src/audio/mixer.js +124 -0
- package/dist/core/src/audio/registry.js +43 -0
- package/dist/core/src/audio/sab.js +74 -0
- package/dist/core/src/audio/source.js +60 -0
- package/dist/core/src/change-detection/atomics.js +1 -0
- package/dist/core/src/change-detection/tracker.js +26 -0
- package/dist/core/src/debug-draw/lines.js +27 -0
- package/dist/core/src/debug-draw/points.js +9 -0
- package/dist/core/src/debug-draw/queue.js +77 -0
- package/dist/core/src/debug-draw/text.js +12 -0
- package/dist/core/src/ecs/archetype.js +271 -0
- package/dist/core/src/ecs/component.js +109 -0
- package/dist/core/src/ecs/entity.js +11 -0
- package/dist/core/src/ecs/events.js +73 -0
- package/dist/core/src/ecs/hierarchy.js +104 -0
- package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
- package/dist/core/src/ecs/index.js +14 -0
- package/dist/core/src/ecs/query.js +110 -0
- package/dist/core/src/ecs/resource.js +3 -0
- package/dist/core/src/ecs/schedule.js +157 -0
- package/dist/core/src/ecs/system-params.js +45 -0
- package/dist/core/src/ecs/system.js +18 -0
- package/dist/core/src/ecs/world.js +292 -0
- package/dist/core/src/index.js +191 -0
- package/dist/core/src/input/context.js +69 -0
- package/dist/core/src/input/dom-handler.js +288 -0
- package/dist/core/src/input/local-player-manager.js +145 -0
- package/dist/core/src/input/mapping.js +36 -0
- package/dist/core/src/input/multi-sab-bridge.js +224 -0
- package/dist/core/src/input/multi-state.js +48 -0
- package/dist/core/src/input/sab-bridge.js +66 -0
- package/dist/core/src/input/state.js +108 -0
- package/dist/core/src/input/ui-router.js +76 -0
- package/dist/core/src/library/host.js +291 -0
- package/dist/core/src/library/index.js +1 -0
- package/dist/core/src/library/library.js +20 -0
- package/dist/core/src/material/compiler.js +73 -0
- package/dist/core/src/material/graph-bridge.js +119 -0
- package/dist/core/src/material/index.js +6 -0
- package/dist/core/src/material/library.js +414 -0
- package/dist/core/src/material/material.js +120 -0
- package/dist/core/src/material/variants.js +37 -0
- package/dist/core/src/math/mat4.js +198 -0
- package/dist/core/src/math/perlin-noise-2d.js +66 -0
- package/dist/core/src/math/perlin-noise-3d.js +76 -0
- package/dist/core/src/math/quat.js +29 -0
- package/dist/core/src/math/rng.js +25 -0
- package/dist/core/src/math/trig.js +42 -0
- package/dist/core/src/math/value-noise.js +49 -0
- package/dist/core/src/mesh/builder.js +137 -0
- package/dist/core/src/mesh/csg.js +250 -0
- package/dist/core/src/mesh/greased-line.js +102 -0
- package/dist/core/src/mesh/mesh.js +6 -0
- package/dist/core/src/mesh/parametric.js +392 -0
- package/dist/core/src/mesh/skinning.js +30 -0
- package/dist/core/src/mesh/vertex-layout.js +65 -0
- package/dist/core/src/module/cross-thread.js +126 -0
- package/dist/core/src/module/diagnostics.js +99 -0
- package/dist/core/src/module/host.js +449 -0
- package/dist/core/src/module/index.js +6 -0
- package/dist/core/src/module/module.js +1 -0
- package/dist/core/src/module/registry.js +83 -0
- package/dist/core/src/module/renderer-module.js +13 -0
- package/dist/core/src/module/ts-loader.js +20 -0
- package/dist/core/src/particles/compute-pass.js +329 -0
- package/dist/core/src/particles/emitter.js +113 -0
- package/dist/core/src/particles/index.js +7 -0
- package/dist/core/src/particles/particle-data.js +33 -0
- package/dist/core/src/particles/render-pass.js +338 -0
- package/dist/core/src/particles/simulator.js +224 -0
- package/dist/core/src/particles/system.js +157 -0
- package/dist/core/src/physics/body.js +25 -0
- package/dist/core/src/physics/ccd-heuristic.js +46 -0
- package/dist/core/src/physics/character.js +184 -0
- package/dist/core/src/physics/collider.js +36 -0
- package/dist/core/src/physics/collision-system.js +62 -0
- package/dist/core/src/physics/events.js +74 -0
- package/dist/core/src/physics/index.js +24 -0
- package/dist/core/src/physics/interface.js +14 -0
- package/dist/core/src/physics/interpolation-buffer.js +182 -0
- package/dist/core/src/physics/lifecycle.js +66 -0
- package/dist/core/src/physics/load-shedder.js +155 -0
- package/dist/core/src/physics/physics-accumulator.js +94 -0
- package/dist/core/src/physics/physics-system.js +142 -0
- package/dist/core/src/physics/ragdoll-presets.js +248 -0
- package/dist/core/src/physics/ragdoll-system.js +193 -0
- package/dist/core/src/physics/ragdoll.js +117 -0
- package/dist/core/src/physics/raycast.js +97 -0
- package/dist/core/src/physics/realm-manager.js +431 -0
- package/dist/core/src/physics/realm-worker-pool.js +181 -0
- package/dist/core/src/physics/realm-worker.js +91 -0
- package/dist/core/src/physics/realm.js +137 -0
- package/dist/core/src/physics/registry.js +43 -0
- package/dist/core/src/physics/safety.js +211 -0
- package/dist/core/src/physics/snapshot-manager.js +118 -0
- package/dist/core/src/physics/worker-protocol.js +1 -0
- package/dist/core/src/platform/bun-preload.js +175 -0
- package/dist/core/src/platform/css-stub.js +4 -0
- package/dist/core/src/platform/glob-polyfill.js +137 -0
- package/dist/core/src/platform/hidpi.js +52 -0
- package/dist/core/src/platform/pkg-root.js +27 -0
- package/dist/core/src/platform/render-surface.js +15 -0
- package/dist/core/src/platform/rpc.js +82 -0
- package/dist/core/src/platform/runtime.js +93 -0
- package/dist/core/src/plugin/context.js +144 -0
- package/dist/core/src/plugin/diagnostics.js +20 -0
- package/dist/core/src/plugin/discovery.js +124 -0
- package/dist/core/src/plugin/extension-loaders.js +111 -0
- package/dist/core/src/plugin/host.js +542 -0
- package/dist/core/src/plugin/index.js +19 -0
- package/dist/core/src/plugin/loader-asset.js +105 -0
- package/dist/core/src/plugin/loader-quickjs.js +67 -0
- package/dist/core/src/plugin/loader-wasm.js +385 -0
- package/dist/core/src/plugin/loader-worker.js +228 -0
- package/dist/core/src/plugin/manifest.js +424 -0
- package/dist/core/src/plugin/material-registry.js +44 -0
- package/dist/core/src/plugin/mcp-tools.js +147 -0
- package/dist/core/src/plugin/permissions.js +152 -0
- package/dist/core/src/plugin/quickjs-bridge.js +219 -0
- package/dist/core/src/plugin/registry.js +92 -0
- package/dist/core/src/plugin/sandbox-shim.js +79 -0
- package/dist/core/src/plugin/sandbox-worker.js +194 -0
- package/dist/core/src/plugin/wasm-abi.js +62 -0
- package/dist/core/src/plugin/wasm-worker.js +234 -0
- package/dist/core/src/plugin/workshop.js +131 -0
- package/dist/core/src/profiling/event-loop.js +164 -0
- package/dist/core/src/profiling/index.js +23 -0
- package/dist/core/src/profiling/iops/idb-patch.js +211 -0
- package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
- package/dist/core/src/profiling/profiling-sab.js +632 -0
- package/dist/core/src/profiling/task-latency.js +118 -0
- package/dist/core/src/profiling/thread-metrics.js +103 -0
- package/dist/core/src/profiling/trace-event-writer.js +165 -0
- package/dist/core/src/profiling/warnings.js +304 -0
- package/dist/core/src/profiling/worker-prelude.js +281 -0
- package/dist/core/src/render/bind-group.js +33 -0
- package/dist/core/src/render/bindless/bindless-struct.js +39 -0
- package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
- package/dist/core/src/render/bindless/frame-bindings.js +142 -0
- package/dist/core/src/render/bindless/index.js +6 -0
- package/dist/core/src/render/bindless/material-manager.js +182 -0
- package/dist/core/src/render/bindless/texture-registry.js +498 -0
- package/dist/core/src/render/buffer.js +74 -0
- package/dist/core/src/render/camera-2d.js +151 -0
- package/dist/core/src/render/camera-controller.js +370 -0
- package/dist/core/src/render/camera.js +332 -0
- package/dist/core/src/render/canvas-resize-watcher.js +36 -0
- package/dist/core/src/render/compute-kernel.js +130 -0
- package/dist/core/src/render/constants.js +2 -0
- package/dist/core/src/render/device.js +91 -0
- package/dist/core/src/render/frame-graph.js +594 -0
- package/dist/core/src/render/frustum.js +152 -0
- package/dist/core/src/render/fullscreen-vs.js +24 -0
- package/dist/core/src/render/g-buffer.js +156 -0
- package/dist/core/src/render/game-renderer.js +1165 -0
- package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
- package/dist/core/src/render/gpu-driven/hzb.js +183 -0
- package/dist/core/src/render/gpu-driven/index.js +6 -0
- package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
- package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
- package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
- package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
- package/dist/core/src/render/gpu-utils.js +72 -0
- package/dist/core/src/render/hdr.js +69 -0
- package/dist/core/src/render/hot-reload.js +236 -0
- package/dist/core/src/render/ibl-bind-group.js +232 -0
- package/dist/core/src/render/ibl.js +148 -0
- package/dist/core/src/render/index.js +86 -0
- package/dist/core/src/render/input-manager.js +224 -0
- package/dist/core/src/render/lighting/area-light.js +142 -0
- package/dist/core/src/render/lighting/cluster-grid.js +255 -0
- package/dist/core/src/render/lighting/cluster-types.js +87 -0
- package/dist/core/src/render/lighting/ies-parser.js +111 -0
- package/dist/core/src/render/lighting.js +300 -0
- package/dist/core/src/render/material-types/depth.wgsl +44 -0
- package/dist/core/src/render/material-types/line.wgsl +50 -0
- package/dist/core/src/render/material-types/matcap.wgsl +51 -0
- package/dist/core/src/render/material-types/normal.wgsl +41 -0
- package/dist/core/src/render/material-types/physical.wgsl +152 -0
- package/dist/core/src/render/material-types/sprite.wgsl +46 -0
- package/dist/core/src/render/material-types/sss.wgsl +79 -0
- package/dist/core/src/render/material-types/toon.wgsl +79 -0
- package/dist/core/src/render/passes/README.md +121 -0
- package/dist/core/src/render/passes/atmosphere.js +107 -0
- package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
- package/dist/core/src/render/passes/csm.js +338 -0
- package/dist/core/src/render/passes/cubemap-capture.js +93 -0
- package/dist/core/src/render/passes/debug-viz.js +248 -0
- package/dist/core/src/render/passes/debug.js +500 -0
- package/dist/core/src/render/passes/decal-mesh.js +86 -0
- package/dist/core/src/render/passes/decal-pass.js +344 -0
- package/dist/core/src/render/passes/deferred-lighting.js +406 -0
- package/dist/core/src/render/passes/depth-prepass.js +148 -0
- package/dist/core/src/render/passes/dome-360.js +68 -0
- package/dist/core/src/render/passes/fluid-render.js +116 -0
- package/dist/core/src/render/passes/gi-types.js +78 -0
- package/dist/core/src/render/passes/graph-compute.js +251 -0
- package/dist/core/src/render/passes/greased-line-pass.js +218 -0
- package/dist/core/src/render/passes/morph-target.js +35 -0
- package/dist/core/src/render/passes/opaque.js +966 -0
- package/dist/core/src/render/passes/point-light-shadow.js +221 -0
- package/dist/core/src/render/passes/procedural-texture.js +142 -0
- package/dist/core/src/render/passes/reflection-probe.js +100 -0
- package/dist/core/src/render/passes/rsm-pass.js +228 -0
- package/dist/core/src/render/passes/sdf-text.js +114 -0
- package/dist/core/src/render/passes/shadow-map.js +121 -0
- package/dist/core/src/render/passes/shadow.js +191 -0
- package/dist/core/src/render/passes/skinning-vs.js +102 -0
- package/dist/core/src/render/passes/skinning.js +282 -0
- package/dist/core/src/render/passes/sky-dome.js +380 -0
- package/dist/core/src/render/passes/skybox.js +146 -0
- package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
- package/dist/core/src/render/passes/terrain.js +303 -0
- package/dist/core/src/render/passes/transparent.js +323 -0
- package/dist/core/src/render/passes/underwater-fog.js +173 -0
- package/dist/core/src/render/passes/video-texture.js +58 -0
- package/dist/core/src/render/passes/volumetric-pass.js +278 -0
- package/dist/core/src/render/passes/volumetric-types.js +96 -0
- package/dist/core/src/render/passes/water.js +697 -0
- package/dist/core/src/render/pbr.js +257 -0
- package/dist/core/src/render/pipeline.js +49 -0
- package/dist/core/src/render/render-pass.js +13 -0
- package/dist/core/src/render/renderer-input-bus.js +176 -0
- package/dist/core/src/render/renderer-module-host.js +539 -0
- package/dist/core/src/render/resource-tracker.js +59 -0
- package/dist/core/src/render/sab-canvas-overlay.js +83 -0
- package/dist/core/src/render/shader-validator.js +172 -0
- package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
- package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
- package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
- package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
- package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
- package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
- package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
- package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
- package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
- package/dist/core/src/render/skybox.js +123 -0
- package/dist/core/src/render/splitscreen.js +60 -0
- package/dist/core/src/render/surface.js +63 -0
- package/dist/core/src/render/tonemap.js +171 -0
- package/dist/core/src/render/tracked-render-pass.js +115 -0
- package/dist/core/src/render/viewport.js +81 -0
- package/dist/core/src/render/wgsl-hmr.js +66 -0
- package/dist/core/src/sab/core-input-channel.js +22 -0
- package/dist/core/src/sab/define.js +127 -0
- package/dist/core/src/sab/errors.js +60 -0
- package/dist/core/src/sab/game-input.js +299 -0
- package/dist/core/src/sab/gamepad-devices.js +205 -0
- package/dist/core/src/sab/grid-buffer.js +91 -0
- package/dist/core/src/sab/input.js +38 -0
- package/dist/core/src/sab/layout.js +160 -0
- package/dist/core/src/sab/multi-input-channel.js +39 -0
- package/dist/core/src/sab/record-buffer.js +130 -0
- package/dist/core/src/sab/sab-polyfill.js +47 -0
- package/dist/core/src/sab/sim-channel.js +397 -0
- package/dist/core/src/sab/slot-buffer.js +140 -0
- package/dist/core/src/sab/types.js +1 -0
- package/dist/core/src/safety/bounds.js +71 -0
- package/dist/core/src/safety/json.js +70 -0
- package/dist/core/src/safety/path.js +151 -0
- package/dist/core/src/save/binary-format.js +95 -0
- package/dist/core/src/save/game-save-system.js +101 -0
- package/dist/core/src/save/grid-save-system.js +102 -0
- package/dist/core/src/save/migrate.js +35 -0
- package/dist/core/src/save/migration-registry.js +66 -0
- package/dist/core/src/save/persist-types.js +4 -0
- package/dist/core/src/save/schema.js +36 -0
- package/dist/core/src/save/serializer.js +139 -0
- package/dist/core/src/scene/builder.js +31 -0
- package/dist/core/src/scene/camera.js +118 -0
- package/dist/core/src/scene/checkpoint.js +84 -0
- package/dist/core/src/scene/game-loop.js +155 -0
- package/dist/core/src/scene/index.js +14 -0
- package/dist/core/src/scene/layer.js +7 -0
- package/dist/core/src/scene/prefab.js +97 -0
- package/dist/core/src/scene/scene-manager.js +141 -0
- package/dist/core/src/scene/scene.js +147 -0
- package/dist/core/src/scene/sky.js +179 -0
- package/dist/core/src/scene/spatial-grid.js +140 -0
- package/dist/core/src/scene/streaming.js +247 -0
- package/dist/core/src/scene/vegetation.js +107 -0
- package/dist/core/src/scene/world.js +66 -0
- package/dist/core/src/scripting/binding.js +85 -0
- package/dist/core/src/scripting/hot-reload.js +123 -0
- package/dist/core/src/scripting/script.js +68 -0
- package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
- package/dist/core/src/sim/sim-state-helper.js +40 -0
- package/dist/core/src/sim/transient-state-registry.js +63 -0
- package/dist/core/src/sim/types.js +4 -0
- package/dist/core/src/sim/worker-loop.js +168 -0
- package/dist/core/src/stores/game-store.js +81 -0
- package/dist/core/src/stores/hot-reload-store.js +19 -0
- package/dist/core/src/telemetry/collector.js +303 -0
- package/dist/core/src/telemetry/gc-controller.js +365 -0
- package/dist/core/src/telemetry/gc-profiler.js +82 -0
- package/dist/core/src/telemetry/gc-tracker.js +63 -0
- package/dist/core/src/telemetry/gpu-profiler.js +554 -0
- package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
- package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
- package/dist/core/src/telemetry/gpu-timer.js +117 -0
- package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
- package/dist/core/src/telemetry/reporter.js +56 -0
- package/dist/core/src/types/engine-types.js +21 -0
- package/dist/core/src/ui-font-scale.js +111 -0
- package/dist/core/src/util/broad-phase-grid.js +77 -0
- package/dist/core/src/util/feature-log.js +176 -0
- package/dist/core/src/util/index.js +4 -0
- package/dist/core/src/util/logger.js +596 -0
- package/dist/core/src/version.js +11 -0
- package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
- package/dist/core/src/worker/base-worker-host.js +212 -0
- package/dist/core/src/worker/buffer-sync.js +454 -0
- package/dist/core/src/worker/crash-recovery.js +153 -0
- package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
- package/dist/core/src/worker/instrumented-worker-host.js +139 -0
- package/dist/core/src/worker/rpc.js +244 -0
- package/dist/core/src/worker/sim-worker-base.js +558 -0
- package/dist/core/src/worker/sim-worker-host.js +271 -0
- package/dist/core/src/worker/task-pool.js +205 -0
- package/dist/core/src/worker/task-worker.js +77 -0
- package/dist/libraries/asset-browser/src/index.js +10 -0
- package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
- package/dist/libraries/audio-kira/src/backend.js +405 -0
- package/dist/libraries/audio-kira/src/index.js +4 -0
- package/dist/libraries/audio-kira/src/library.js +54 -0
- package/dist/libraries/blitz-ui/src/index.js +13 -0
- package/dist/libraries/blitz-ui/src/native-module.js +162 -0
- package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
- package/dist/libraries/blitz-ui/src/router.js +82 -0
- package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
- package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
- package/dist/libraries/character/src/character-animator.js +323 -0
- package/dist/libraries/character/src/customization.js +464 -0
- package/dist/libraries/character/src/index.js +19 -0
- package/dist/libraries/character/src/inspectable.js +77 -0
- package/dist/libraries/character/src/loader.js +336 -0
- package/dist/libraries/character/src/locomotion.js +84 -0
- package/dist/libraries/character/src/preview.js +280 -0
- package/dist/libraries/devtools/src/backend.js +449 -0
- package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
- package/dist/libraries/devtools/src/collectors.js +318 -0
- package/dist/libraries/devtools/src/index.js +31 -0
- package/dist/libraries/devtools/src/native-providers.js +749 -0
- package/dist/libraries/devtools/src/snapshot.js +35 -0
- package/dist/libraries/devtools/src/verify.js +139 -0
- package/dist/libraries/devtools/src/web/browser.js +94 -0
- package/dist/libraries/devtools/src/web/host.js +183 -0
- package/dist/libraries/devtools/src/web/mirror.js +26 -0
- package/dist/libraries/devtools/src/web/server.js +187 -0
- package/dist/libraries/entities/src/index.js +3 -0
- package/dist/libraries/entities/src/library.js +46 -0
- package/dist/libraries/entities/src/model-renderer.js +1307 -0
- package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
- package/dist/libraries/gamepad/src/feed-input.js +54 -0
- package/dist/libraries/gamepad/src/filters.js +44 -0
- package/dist/libraries/gamepad/src/glyphs.js +83 -0
- package/dist/libraries/gamepad/src/hub.js +164 -0
- package/dist/libraries/gamepad/src/index.js +10 -0
- package/dist/libraries/gamepad/src/library.js +56 -0
- package/dist/libraries/gamepad/src/source-sab.js +62 -0
- package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
- package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
- package/dist/libraries/gaussian-splats/src/index.js +8 -0
- package/dist/libraries/gaussian-splats/src/library.js +44 -0
- package/dist/libraries/gaussian-splats/src/parser.js +297 -0
- package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
- package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
- package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
- package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
- package/dist/libraries/gpu-kernels/src/index.js +8 -0
- package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
- package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
- package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
- package/dist/libraries/html-ui-kit/src/components.js +219 -0
- package/dist/libraries/html-ui-kit/src/index.js +17 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
- package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
- package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
- package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
- package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
- package/dist/libraries/html-ui-kit/src/theme.js +235 -0
- package/dist/libraries/inspectable/src/index.js +6 -0
- package/dist/libraries/inspectable/src/inspectable.js +205 -0
- package/dist/libraries/lighting/src/index.js +4 -0
- package/dist/libraries/lighting/src/library.js +48 -0
- package/dist/libraries/lighting/src/light-system.js +395 -0
- package/dist/libraries/lighting/src/lighting-system.js +57 -0
- package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
- package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
- package/dist/libraries/marching-cubes/src/deformation.js +41 -0
- package/dist/libraries/marching-cubes/src/generator.js +356 -0
- package/dist/libraries/marching-cubes/src/index.js +13 -0
- package/dist/libraries/marching-cubes/src/library.js +54 -0
- package/dist/libraries/marching-cubes/src/lod.js +95 -0
- package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
- package/dist/libraries/marching-cubes/src/sab.js +40 -0
- package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
- package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
- package/dist/libraries/marching-cubes/src/tables.js +314 -0
- package/dist/libraries/marching-cubes/src/types.js +1 -0
- package/dist/libraries/models/src/bake-node-transforms.js +146 -0
- package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
- package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
- package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
- package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
- package/dist/libraries/models/src/codecs/index.js +5 -0
- package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
- package/dist/libraries/models/src/codecs/registry.js +111 -0
- package/dist/libraries/models/src/dae.js +665 -0
- package/dist/libraries/models/src/default-part-selection.js +58 -0
- package/dist/libraries/models/src/dxf.js +235 -0
- package/dist/libraries/models/src/fbx/index.js +438 -0
- package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
- package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
- package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
- package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
- package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
- package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
- package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
- package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
- package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
- package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
- package/dist/libraries/models/src/fbx/types.js +88 -0
- package/dist/libraries/models/src/gltf-extensions.js +121 -0
- package/dist/libraries/models/src/gltf.js +724 -0
- package/dist/libraries/models/src/index.js +46 -0
- package/dist/libraries/models/src/library.js +44 -0
- package/dist/libraries/models/src/loader.js +218 -0
- package/dist/libraries/models/src/material-adapter.js +82 -0
- package/dist/libraries/models/src/mini-xml.js +145 -0
- package/dist/libraries/models/src/normalize.js +168 -0
- package/dist/libraries/models/src/obj.js +247 -0
- package/dist/libraries/models/src/off.js +94 -0
- package/dist/libraries/models/src/ply.js +329 -0
- package/dist/libraries/models/src/pose-sampler.js +183 -0
- package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
- package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
- package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
- package/dist/libraries/models/src/sidecar/resolver.js +112 -0
- package/dist/libraries/models/src/sidecar/types.js +8 -0
- package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
- package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
- package/dist/libraries/models/src/stl.js +129 -0
- package/dist/libraries/models/src/threeds.js +312 -0
- package/dist/libraries/models/src/threemf.js +203 -0
- package/dist/libraries/models/src/types.js +33 -0
- package/dist/libraries/models/src/vtk.js +242 -0
- package/dist/libraries/navmesh/src/crowd-system.js +207 -0
- package/dist/libraries/navmesh/src/debug-viz.js +52 -0
- package/dist/libraries/navmesh/src/index.js +7 -0
- package/dist/libraries/navmesh/src/library.js +47 -0
- package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
- package/dist/libraries/navmesh/src/navmesh.js +141 -0
- package/dist/libraries/navmesh/src/pathfinder.js +221 -0
- package/dist/libraries/navmesh/src/types.js +1 -0
- package/dist/libraries/networking/src/authority.js +107 -0
- package/dist/libraries/networking/src/connection.js +107 -0
- package/dist/libraries/networking/src/discovery.js +314 -0
- package/dist/libraries/networking/src/enhanced-replication.js +282 -0
- package/dist/libraries/networking/src/epic-adapter.js +101 -0
- package/dist/libraries/networking/src/index.js +16 -0
- package/dist/libraries/networking/src/library.js +45 -0
- package/dist/libraries/networking/src/lobby.js +84 -0
- package/dist/libraries/networking/src/platform-adapter.js +92 -0
- package/dist/libraries/networking/src/rcs-adapter.js +100 -0
- package/dist/libraries/networking/src/remote-input.js +162 -0
- package/dist/libraries/networking/src/replication.js +273 -0
- package/dist/libraries/networking/src/rpc.js +172 -0
- package/dist/libraries/networking/src/session.js +129 -0
- package/dist/libraries/networking/src/transport.js +156 -0
- package/dist/libraries/networking/src/webrtc.js +266 -0
- package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
- package/dist/libraries/pathfinding-2d/src/index.js +9 -0
- package/dist/libraries/persistence/src/autosave-manager.js +94 -0
- package/dist/libraries/persistence/src/binary-record-store.js +205 -0
- package/dist/libraries/persistence/src/browser.js +16 -0
- package/dist/libraries/persistence/src/file-save-store.js +507 -0
- package/dist/libraries/persistence/src/hash-utils.js +54 -0
- package/dist/libraries/persistence/src/index.js +17 -0
- package/dist/libraries/persistence/src/library.js +51 -0
- package/dist/libraries/persistence/src/mock-opfs.js +114 -0
- package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
- package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
- package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
- package/dist/libraries/persistence/src/save-worker.js +76 -0
- package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
- package/dist/libraries/physics-native/src/backend.js +960 -0
- package/dist/libraries/physics-native/src/broadphase.js +79 -0
- package/dist/libraries/physics-native/src/index.js +6 -0
- package/dist/libraries/physics-native/src/library.js +57 -0
- package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
- package/dist/libraries/physics-native/src/narrowphase.js +60 -0
- package/dist/libraries/physics-native/src/solver.js +105 -0
- package/dist/libraries/physics-native/src/types.js +4 -0
- package/dist/libraries/physics-rapier/src/api.js +352 -0
- package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
- package/dist/libraries/physics-rapier/src/backend.js +1066 -0
- package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
- package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
- package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
- package/dist/libraries/physics-rapier/src/index.js +9 -0
- package/dist/libraries/physics-rapier/src/library.js +71 -0
- package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
- package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
- package/dist/libraries/postfx/src/index.js +14 -0
- package/dist/libraries/postfx/src/library.js +207 -0
- package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
- package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
- package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
- package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
- package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
- package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
- package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
- package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
- package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
- package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
- package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
- package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
- package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
- package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
- package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
- package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
- package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
- package/dist/libraries/recast/src/backend.js +124 -0
- package/dist/libraries/recast/src/crowd-system.js +310 -0
- package/dist/libraries/recast/src/index.js +4 -0
- package/dist/libraries/recast/src/library.js +59 -0
- package/dist/libraries/recast/src/types.js +4 -0
- package/dist/libraries/sand/src/cell.js +32 -0
- package/dist/libraries/sand/src/fields.js +27 -0
- package/dist/libraries/sand/src/fluid-grid.js +267 -0
- package/dist/libraries/sand/src/grid-dims.js +47 -0
- package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
- package/dist/libraries/sand/src/index.js +20 -0
- package/dist/libraries/sand/src/library.js +67 -0
- package/dist/libraries/sand/src/materials.js +437 -0
- package/dist/libraries/sand/src/palette.js +87 -0
- package/dist/libraries/sand/src/particles.js +163 -0
- package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
- package/dist/libraries/sand/src/rng.js +44 -0
- package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
- package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
- package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
- package/dist/libraries/sand/src/rules/rule-types.js +27 -0
- package/dist/libraries/sand/src/sand-step-pool.js +458 -0
- package/dist/libraries/sand/src/sand-step-worker.js +101 -0
- package/dist/libraries/sand/src/sand-world.js +3382 -0
- package/dist/libraries/stickman/src/index.js +7 -0
- package/dist/libraries/stickman/src/library.js +44 -0
- package/dist/libraries/stickman/src/proportions.js +40 -0
- package/dist/libraries/stickman/src/shader.js +113 -0
- package/dist/libraries/stickman/src/skeleton.js +163 -0
- package/dist/libraries/stickman/src/stickman-pass.js +210 -0
- package/dist/libraries/stickman/src/thick-line.js +120 -0
- package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
- package/dist/libraries/surface-nets/src/deformation.js +29 -0
- package/dist/libraries/surface-nets/src/index.js +15 -0
- package/dist/libraries/surface-nets/src/library.js +41 -0
- package/dist/libraries/surface-nets/src/lod.js +6 -0
- package/dist/libraries/surface-nets/src/sab.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
- package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
- package/dist/libraries/surface-nets/src/types.js +1 -0
- package/dist/libraries/water/src/buoyancy.js +80 -0
- package/dist/libraries/water/src/index.js +12 -0
- package/dist/libraries/water/src/library.js +65 -0
- package/dist/libraries/water/src/shore-damping.js +70 -0
- package/dist/libraries/water/src/water-buffer.js +78 -0
- package/dist/libraries/water/src/water-chunks.js +5 -0
- package/dist/libraries/water/src/water-physics.js +315 -0
- package/dist/libraries/water/src/water-renderer.js +736 -0
- package/dist/libraries/water/src/water-sab.js +138 -0
- package/dist/libraries/water/src/wave-sources.js +45 -0
- package/dist/libraries/weather/src/index.js +5 -0
- package/dist/libraries/weather/src/library.js +48 -0
- package/dist/libraries/weather/src/types.js +29 -0
- package/dist/libraries/weather/src/weather-blend.js +108 -0
- package/dist/libraries/weather/src/weather-system.js +275 -0
- package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
- package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
- package/dist/libraries/weatherfx/src/index.js +4 -0
- package/dist/libraries/weatherfx/src/library.js +41 -0
- package/dist/libraries/weatherfx/src/particle-system.js +350 -0
- package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
- package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
- package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
- package/dist/mcp/src/client.js +669 -0
- package/dist/mcp/src/engine-context.js +99 -0
- package/dist/mcp/src/http-transport.js +423 -0
- package/dist/mcp/src/index.js +5 -0
- package/dist/mcp/src/prompts/add-entity.js +39 -0
- package/dist/mcp/src/prompts/create-scene.js +41 -0
- package/dist/mcp/src/prompts/debug-frame.js +36 -0
- package/dist/mcp/src/prompts/index.js +10 -0
- package/dist/mcp/src/resources/asset-list.js +28 -0
- package/dist/mcp/src/resources/checkpoint-list.js +29 -0
- package/dist/mcp/src/resources/entity-state.js +45 -0
- package/dist/mcp/src/resources/gpu-info.js +90 -0
- package/dist/mcp/src/resources/index.js +51 -0
- package/dist/mcp/src/resources/performance.js +33 -0
- package/dist/mcp/src/resources/scene-tree.js +37 -0
- package/dist/mcp/src/server.js +307 -0
- package/dist/mcp/src/tools/animation.js +102 -0
- package/dist/mcp/src/tools/asset.js +146 -0
- package/dist/mcp/src/tools/audio.js +80 -0
- package/dist/mcp/src/tools/build.js +128 -0
- package/dist/mcp/src/tools/camera.js +157 -0
- package/dist/mcp/src/tools/checkpoint.js +90 -0
- package/dist/mcp/src/tools/component.js +176 -0
- package/dist/mcp/src/tools/debug.js +273 -0
- package/dist/mcp/src/tools/entity.js +309 -0
- package/dist/mcp/src/tools/inspect.js +192 -0
- package/dist/mcp/src/tools/lighting.js +239 -0
- package/dist/mcp/src/tools/material.js +225 -0
- package/dist/mcp/src/tools/mesh.js +210 -0
- package/dist/mcp/src/tools/physics.js +251 -0
- package/dist/mcp/src/tools/scene.js +139 -0
- package/dist/mcp/src/tools/script.js +114 -0
- package/dist/mcp/src/types.js +9 -0
- package/dist/mcp/src/undo-redo.js +64 -0
- package/dist/modules/camera-controls/src/index.js +116 -0
- package/dist/modules/controller-ui/src/index.js +149 -0
- package/dist/modules/devtools/src/api.js +317 -0
- package/dist/modules/devtools/src/asset-utils.js +102 -0
- package/dist/modules/devtools/src/bind-debug-store.js +34 -0
- package/dist/modules/devtools/src/blitz/host.js +391 -0
- package/dist/modules/devtools/src/blitz/module.js +65 -0
- package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
- package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
- package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
- package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
- package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
- package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
- package/dist/modules/devtools/src/blitz/theme.js +167 -0
- package/dist/modules/devtools/src/data-bridge.js +247 -0
- package/dist/modules/devtools/src/debug-overlay.js +181 -0
- package/dist/modules/devtools/src/debug-raycast.js +296 -0
- package/dist/modules/devtools/src/debug-store.js +28 -0
- package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
- package/dist/modules/devtools/src/doctor-panel.js +163 -0
- package/dist/modules/devtools/src/gizmo-module.js +95 -0
- package/dist/modules/devtools/src/graph-model.js +387 -0
- package/dist/modules/devtools/src/grid-renderer.js +145 -0
- package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
- package/dist/modules/devtools/src/index.js +46 -0
- package/dist/modules/devtools/src/init.js +204 -0
- package/dist/modules/devtools/src/label-overlay.js +129 -0
- package/dist/modules/devtools/src/material-stats-panel.js +171 -0
- package/dist/modules/devtools/src/profiling-bridge.js +288 -0
- package/dist/modules/devtools/src/profiling-hooks.js +63 -0
- package/dist/modules/devtools/src/renderer-adapter.js +61 -0
- package/dist/modules/devtools/src/scene-inspector.js +571 -0
- package/dist/modules/devtools/src/scene-store.js +212 -0
- package/dist/modules/devtools/src/scene-sync.js +92 -0
- package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
- package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
- package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
- package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
- package/dist/modules/devtools/src/transform-gizmo.js +677 -0
- package/dist/modules/devtools/src/types.js +5 -0
- package/dist/modules/devtools/src/worker-expose.js +59 -0
- package/dist/modules/devtools/src/worker-sync.js +115 -0
- package/dist/modules/editor/src/commands/component.js +151 -0
- package/dist/modules/editor/src/commands/entity.js +253 -0
- package/dist/modules/editor/src/commands/hierarchy.js +79 -0
- package/dist/modules/editor/src/commands/index.js +57 -0
- package/dist/modules/editor/src/commands/prefab.js +149 -0
- package/dist/modules/editor/src/commands/registry.js +246 -0
- package/dist/modules/editor/src/commands/scene-io.js +206 -0
- package/dist/modules/editor/src/commands/selection.js +71 -0
- package/dist/modules/editor/src/commands/transform.js +88 -0
- package/dist/modules/editor/src/ddscene.js +189 -0
- package/dist/modules/editor/src/document.js +96 -0
- package/dist/modules/editor/src/editor-context.js +115 -0
- package/dist/modules/editor/src/index.js +11 -0
- package/dist/modules/editor/src/mcp.js +91 -0
- package/dist/modules/editor/src/module.js +115 -0
- package/dist/modules/editor/src/selection.js +60 -0
- package/dist/modules/editor/src/shell.js +397 -0
- package/dist/modules/editor/src/viewport.js +186 -0
- package/dist/modules/html-ui/src/composite.js +116 -0
- package/dist/modules/html-ui/src/create-html-ui.js +137 -0
- package/dist/modules/html-ui/src/doc-backend.js +518 -0
- package/dist/modules/html-ui/src/host.js +819 -0
- package/dist/modules/html-ui/src/index.js +5 -0
- package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
- package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
- package/dist/modules/html-ui/src/protocol.js +6 -0
- package/dist/modules/html-ui/src/ui-worker.js +10 -0
- package/dist/modules/mcp/src/index.js +62 -0
- package/dist/modules/movement-2d/src/grid-character.js +345 -0
- package/dist/modules/movement-2d/src/index.js +27 -0
- package/dist/modules/movement-3d/src/character-motor.js +166 -0
- package/dist/modules/movement-3d/src/index.js +27 -0
- package/dist/modules/native-osr/src/index.js +12 -0
- package/dist/modules/native-osr/src/input-router.js +335 -0
- package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
- package/dist/modules/native-osr/src/native-texture-source.js +66 -0
- package/dist/modules/native-osr/src/types.js +8 -0
- package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
- package/dist/modules/sailing/src/index.js +39 -0
- package/dist/modules/terrain/src/index.js +44 -0
- package/dist/modules/vitals/src/index.js +25 -0
- package/dist/modules/vitals/src/vitals.js +195 -0
- package/dist/modules/xr/src/camera-rig.js +119 -0
- package/dist/modules/xr/src/debug.js +45 -0
- package/dist/modules/xr/src/frame-loop.js +139 -0
- package/dist/modules/xr/src/index.js +10 -0
- package/dist/modules/xr/src/input.js +164 -0
- package/dist/modules/xr/src/layer.js +100 -0
- package/dist/modules/xr/src/session.js +133 -0
- package/dist/modules/xr/src/sim-module.js +21 -0
- package/dist/modules/xr/src/types.js +4 -0
- package/dist/modules/xr/src/webxr.d.ts +182 -0
- package/dist/modules/xr/src/xr-module.js +134 -0
- package/dist/shader-graph/src/chunks.js +340 -0
- package/dist/shader-graph/src/compiler.js +639 -0
- package/dist/shader-graph/src/compute-compiler.js +384 -0
- package/dist/shader-graph/src/compute-graph.js +55 -0
- package/dist/shader-graph/src/compute-profiles.js +39 -0
- package/dist/shader-graph/src/graph.js +38 -0
- package/dist/shader-graph/src/index.js +15 -0
- package/dist/shader-graph/src/profiles.js +305 -0
- package/dist/shader-graph/src/validator.js +42 -0
- package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
- package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
- package/dist/shader-graph/src/wgsl-struct.js +251 -0
- package/dist/test/src/index.js +1 -0
- package/dist/test/src/vision-test.js +228 -0
- package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
- package/libraries/audio-kira/src/backend.ts +2 -1
- package/libraries/blitz-ui/native/src/shell.rs +35 -1
- package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
- package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
- package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
- package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
- package/libraries/blitz-ui/src/router.ts +3 -1
- package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
- package/libraries/character/src/character-animator.ts +1 -1
- package/libraries/character/src/customization.ts +513 -0
- package/libraries/character/src/index.ts +6 -0
- package/libraries/character/src/inspectable.ts +111 -0
- package/libraries/character/src/loader.ts +38 -13
- package/libraries/character/src/locomotion.ts +13 -1
- package/libraries/character/src/preview.ts +94 -24
- package/libraries/devtools/README.md +16 -18
- package/libraries/devtools/src/backend.ts +505 -0
- package/libraries/devtools/src/cdp-bridge.ts +8 -8
- package/libraries/devtools/src/collectors.ts +41 -37
- package/libraries/devtools/src/index.ts +32 -14
- package/libraries/devtools/src/native-providers.ts +20 -12
- package/libraries/devtools/src/snapshot.ts +77 -0
- package/libraries/devtools/src/web/host.ts +11 -12
- package/libraries/devtools/src/web/mirror.ts +14 -405
- package/libraries/devtools/src/web/server.ts +4 -3
- package/libraries/entities/src/model-renderer.ts +96 -23
- package/libraries/gamepad/src/library.ts +2 -1
- package/libraries/inspectable/src/index.ts +11 -0
- package/libraries/inspectable/src/inspectable.ts +277 -0
- package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
- package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
- package/libraries/models/src/index.ts +1 -0
- package/libraries/models/src/types.ts +22 -0
- package/libraries/persistence/src/autosave-manager.ts +1 -1
- package/libraries/persistence/src/binary-record-store.ts +1 -1
- package/libraries/persistence/src/file-save-store.ts +4 -4
- package/libraries/persistence/src/library.ts +1 -1
- package/libraries/persistence/src/opfs-save-store.ts +5 -5
- package/libraries/persistence/src/save-worker.ts +13 -14
- package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
- package/libraries/postfx/src/post-process-stack.ts +1 -1
- package/libraries/sand/src/sand-step-pool.ts +5 -0
- package/libraries/water/src/water-renderer.ts +1 -1
- package/libraries/weatherfx/src/cloud-system.ts +3 -3
- package/mcp/README.md +20 -0
- package/mcp/src/client.ts +75 -22
- package/mcp/src/undo-redo.ts +2 -2
- package/modules/devtools/src/blitz/host.ts +430 -0
- package/modules/devtools/src/blitz/module.ts +101 -0
- package/modules/devtools/src/blitz/panels/console.ts +223 -0
- package/modules/devtools/src/blitz/panels/elements.ts +92 -0
- package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
- package/modules/devtools/src/blitz/panels/performance.ts +120 -0
- package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
- package/modules/devtools/src/blitz/panels/types.ts +120 -0
- package/modules/devtools/src/blitz/theme.ts +168 -0
- package/modules/devtools/src/data-bridge.ts +1 -1
- package/modules/devtools/src/index.ts +6 -0
- package/modules/devtools/src/profiling-bridge.ts +17 -13
- package/modules/devtools/src/profiling-hooks.ts +22 -13
- package/modules/devtools/src/scene-inspector.ts +1 -1
- package/modules/devtools/src/worker-sync.ts +9 -1
- package/modules/editor/src/commands/registry.ts +2 -2
- package/modules/editor/src/module.ts +1 -1
- package/modules/html-ui/src/composite.ts +1 -1
- package/modules/html-ui/src/create-html-ui.ts +21 -9
- package/modules/html-ui/src/doc-backend.ts +189 -10
- package/modules/html-ui/src/host.ts +354 -40
- package/modules/html-ui/src/index.ts +1 -1
- package/modules/html-ui/src/jsx-runtime.ts +1 -1
- package/modules/html-ui/src/protocol.ts +53 -6
- package/modules/mcp/README.md +6 -0
- package/modules/mcp/src/index.ts +70 -3
- package/modules/movement-3d/src/character-motor.ts +83 -10
- package/package.json +838 -165
- package/shader-graph/README.md +25 -0
- package/test/README.md +16 -0
- package/libraries/blitz-ui/native-osr-spike.ts +0 -70
- package/libraries/devtools/native/Cargo.toml +0 -12
- package/libraries/devtools/native/src/lib.rs +0 -1646
- package/libraries/devtools/native/src/panels/console.rs +0 -338
- package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
- package/libraries/devtools/native/src/panels/generic.rs +0 -317
- package/libraries/devtools/native/src/panels/gpu.rs +0 -107
- package/libraries/devtools/native/src/panels/input.rs +0 -88
- package/libraries/devtools/native/src/panels/mod.rs +0 -154
- package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
- package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
- package/libraries/devtools/native/src/panels/scene.rs +0 -72
- package/libraries/devtools/native/src/state.rs +0 -394
- package/libraries/devtools/src/egui-ffi.ts +0 -804
- package/libraries/devtools/src/egui-renderer.ts +0 -407
- package/libraries/devtools/src/host.ts +0 -363
- package/libraries/devtools/src/mirror.ts +0 -794
- package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
- package/libraries/models/test-fixtures/fbx/README.md +0 -46
- package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
- package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
- package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
- package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
- package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// wgsl-validate: prelude ./fullscreen-vs.wgsl
|
|
2
|
+
// wgsl-validate: prelude ./occluder-chunk.wgsl
|
|
3
|
+
// Watercolor — stylized edge-aware smoothing + paper texture blend.
|
|
4
|
+
// Combines a soft bilateral-like smoothing with edge enhancement and a
|
|
5
|
+
// subtle paper grain overlay for a hand-painted watercolor look.
|
|
6
|
+
struct U {
|
|
7
|
+
texelSize: vec2<f32>,
|
|
8
|
+
edgeStrength: f32, // edge enhancement intensity (0–2)
|
|
9
|
+
paperScale: f32, // paper texture scale (1–10)
|
|
10
|
+
blend: f32, // watercolor blend amount (0–1)
|
|
11
|
+
_p0: f32,
|
|
12
|
+
_p1: f32,
|
|
13
|
+
_p2: f32,
|
|
14
|
+
_p3: f32,
|
|
15
|
+
};
|
|
16
|
+
@group(0) @binding(0) var colorTex: texture_2d<f32>;
|
|
17
|
+
@group(0) @binding(1) var noiseTex: texture_2d<f32>;
|
|
18
|
+
@group(0) @binding(2) var samp: sampler;
|
|
19
|
+
@group(0) @binding(3) var<uniform> u: U;
|
|
20
|
+
|
|
21
|
+
// Hash for procedural paper texture
|
|
22
|
+
fn hash(p: vec2<f32>) -> f32 {
|
|
23
|
+
let h = dot(p, vec2<f32>(127.1, 311.7));
|
|
24
|
+
return fract(sin(h) * 43758.5453);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
fn noise2D(p: vec2<f32>) -> f32 {
|
|
28
|
+
let i = floor(p);
|
|
29
|
+
let f = fract(p);
|
|
30
|
+
let a = hash(i);
|
|
31
|
+
let b = hash(i + vec2<f32>(1.0, 0.0));
|
|
32
|
+
let c = hash(i + vec2<f32>(0.0, 1.0));
|
|
33
|
+
let d = hash(i + vec2<f32>(1.0, 1.0));
|
|
34
|
+
let u = f * f * (3.0 - 2.0 * f);
|
|
35
|
+
return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@fragment
|
|
39
|
+
fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
|
|
40
|
+
if (isOccluded(input.uv)) { discard; }
|
|
41
|
+
let uv = input.uv;
|
|
42
|
+
let ts = u.texelSize;
|
|
43
|
+
let color = textureSample(colorTex, samp, uv).rgb;
|
|
44
|
+
|
|
45
|
+
// ── Edge-aware smoothing: 3x3 weighted blur (edge-preserving) ──
|
|
46
|
+
let tl = textureSample(colorTex, samp, uv + vec2<f32>(-1.0, -1.0) * ts).rgb;
|
|
47
|
+
let tr = textureSample(colorTex, samp, uv + vec2<f32>( 1.0, -1.0) * ts).rgb;
|
|
48
|
+
let bl = textureSample(colorTex, samp, uv + vec2<f32>(-1.0, 1.0) * ts).rgb;
|
|
49
|
+
let br = textureSample(colorTex, samp, uv + vec2<f32>( 1.0, 1.0) * ts).rgb;
|
|
50
|
+
let l = textureSample(colorTex, samp, uv + vec2<f32>(-1.0, 0.0) * ts).rgb;
|
|
51
|
+
let r = textureSample(colorTex, samp, uv + vec2<f32>( 1.0, 0.0) * ts).rgb;
|
|
52
|
+
let t = textureSample(colorTex, samp, uv + vec2<f32>( 0.0, -1.0) * ts).rgb;
|
|
53
|
+
let b = textureSample(colorTex, samp, uv + vec2<f32>( 0.0, 1.0) * ts).rgb;
|
|
54
|
+
|
|
55
|
+
// Edge weight: closer colors get more weight (bilateral-like)
|
|
56
|
+
let centerLuma = dot(color, vec3<f32>(0.299, 0.587, 0.114));
|
|
57
|
+
let neighbors = array<vec3<f32>, 8>(tl, tr, bl, br, l, r, t, b);
|
|
58
|
+
var smoothColor = vec3<f32>(0.0);
|
|
59
|
+
var totalWeight = 0.0;
|
|
60
|
+
for (var i = 0u; i < 8u; i = i + 1u) {
|
|
61
|
+
let nl = dot(neighbors[i], vec3<f32>(0.299, 0.587, 0.114));
|
|
62
|
+
let w = exp(-abs(centerLuma - nl) * 5.0);
|
|
63
|
+
smoothColor += neighbors[i] * w;
|
|
64
|
+
totalWeight += w;
|
|
65
|
+
}
|
|
66
|
+
smoothColor = (smoothColor + color * 2.0) / (totalWeight + 2.0);
|
|
67
|
+
|
|
68
|
+
// ── Edge enhancement (Sobel) ──
|
|
69
|
+
let gx = abs(dot(tr + 2.0 * r + br - tl - 2.0 * l - bl, vec3<f32>(0.299, 0.587, 0.114)));
|
|
70
|
+
let gy = abs(dot(bl + 2.0 * b + br - tl - 2.0 * t - tr, vec3<f32>(0.299, 0.587, 0.114)));
|
|
71
|
+
let edge = sqrt(gx * gx + gy * gy);
|
|
72
|
+
let edgeFactor = 1.0 - clamp(edge * u.edgeStrength, 0.0, 1.0);
|
|
73
|
+
|
|
74
|
+
// ── Paper texture ──
|
|
75
|
+
let paperUV = uv * u.paperScale * 50.0;
|
|
76
|
+
let paper = noise2D(paperUV) * 0.15 + 0.85;
|
|
77
|
+
|
|
78
|
+
// ── Combine: smoothed color darkened at edges, multiplied by paper texture ──
|
|
79
|
+
let watercolor = smoothColor * edgeFactor * paper;
|
|
80
|
+
let result = mix(color, watercolor, u.blend);
|
|
81
|
+
return vec4<f32>(result, 1.0);
|
|
82
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// wgsl-validate: prelude ./fullscreen-vs.wgsl
|
|
2
|
+
// wgsl-validate: prelude ./occluder-chunk.wgsl
|
|
3
|
+
// White balance — temperature (K) + tint adjustment.
|
|
4
|
+
// Applies a white-balance correction by shifting the color temperature
|
|
5
|
+
// (warm/cool) and tint (green/magenta).
|
|
6
|
+
struct U {
|
|
7
|
+
temperature: f32, // -1.0 (cool) to 1.0 (warm), 0 = neutral
|
|
8
|
+
tint: f32, // -1.0 (green) to 1.0 (magenta), 0 = neutral
|
|
9
|
+
_p0: f32,
|
|
10
|
+
_p1: f32,
|
|
11
|
+
_p2: f32,
|
|
12
|
+
_p3: f32,
|
|
13
|
+
_p4: f32,
|
|
14
|
+
_p5: f32,
|
|
15
|
+
};
|
|
16
|
+
@group(0) @binding(0) var colorTex: texture_2d<f32>;
|
|
17
|
+
@group(0) @binding(1) var dummyTex: texture_2d<f32>;
|
|
18
|
+
@group(0) @binding(2) var samp: sampler;
|
|
19
|
+
@group(0) @binding(3) var<uniform> u: U;
|
|
20
|
+
|
|
21
|
+
@fragment
|
|
22
|
+
fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
|
|
23
|
+
if (isOccluded(input.uv)) { discard; }
|
|
24
|
+
let uv = input.uv;
|
|
25
|
+
var color = textureSample(colorTex, samp, uv).rgb;
|
|
26
|
+
|
|
27
|
+
// Temperature: shift warm (R+ B-) or cool (R- B+)
|
|
28
|
+
let tempR = 1.0 + u.temperature * 0.1;
|
|
29
|
+
let tempB = 1.0 - u.temperature * 0.1;
|
|
30
|
+
// Tint: shift green (G+) or magenta (G-)
|
|
31
|
+
let tintG = 1.0 - u.tint * 0.1;
|
|
32
|
+
|
|
33
|
+
color = color * vec3<f32>(tempR, tintG, tempB);
|
|
34
|
+
|
|
35
|
+
// Normalize luminance to avoid overall brightness shift
|
|
36
|
+
let luma = dot(color, vec3<f32>(0.299, 0.587, 0.114));
|
|
37
|
+
let origLuma = dot(textureSample(colorTex, samp, uv).rgb, vec3<f32>(0.299, 0.587, 0.114));
|
|
38
|
+
color = color * (origLuma / max(luma, 0.0001));
|
|
39
|
+
|
|
40
|
+
return vec4<f32>(color, 1.0);
|
|
41
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// RecastBackend — WASM loader + navmesh generation/query wrapper
|
|
3
|
+
//
|
|
4
|
+
// Mirrors the loadPhysicsLib() pattern from @downdraft/engine/libraries/physics-rapier:
|
|
5
|
+
// - cached + coalesced async load (hot-reload/dispose cycles can retry)
|
|
6
|
+
// - WASM import isolated to one module so the rest of the library stays
|
|
7
|
+
// WASM-agnostic and testable.
|
|
8
|
+
//
|
|
9
|
+
// recast-navigation ships as ESM with the .wasm loaded via
|
|
10
|
+
// `new URL(..., import.meta.url)`. It must be excluded from Vite dep
|
|
11
|
+
// pre-bundling (see packages/engine/app/src/vite/index.ts optimizeDeps.exclude).
|
|
12
|
+
// ============================================================================
|
|
13
|
+
import { createLogger } from "@downdraft/engine";
|
|
14
|
+
const log = createLogger();
|
|
15
|
+
let cachedModule = null;
|
|
16
|
+
let cachedGenerators = null;
|
|
17
|
+
let loadingPromise = null;
|
|
18
|
+
/**
|
|
19
|
+
* Loads + initializes the recast-navigation WASM module. Idempotent after the
|
|
20
|
+
* first successful call (recast's `init()` also short-circuits if already
|
|
21
|
+
* initialized). Concurrent callers share the in-flight load; a failed load
|
|
22
|
+
* clears the promise so a retry is possible (important for dev hot-reload).
|
|
23
|
+
*/
|
|
24
|
+
export function loadRecastLib() {
|
|
25
|
+
if (cachedModule)
|
|
26
|
+
return Promise.resolve(cachedModule);
|
|
27
|
+
if (loadingPromise)
|
|
28
|
+
return loadingPromise;
|
|
29
|
+
const p = doLoadRecastLib();
|
|
30
|
+
loadingPromise = p;
|
|
31
|
+
p.then(() => { if (loadingPromise === p)
|
|
32
|
+
loadingPromise = null; })
|
|
33
|
+
.catch(() => { if (loadingPromise === p)
|
|
34
|
+
loadingPromise = null; });
|
|
35
|
+
return p;
|
|
36
|
+
}
|
|
37
|
+
async function doLoadRecastLib() {
|
|
38
|
+
const mod = await import("recast-navigation");
|
|
39
|
+
await mod.init();
|
|
40
|
+
cachedModule = mod;
|
|
41
|
+
cachedGenerators = await import("recast-navigation/generators");
|
|
42
|
+
log.info("recast", "recast-navigation WASM initialized");
|
|
43
|
+
return cachedModule;
|
|
44
|
+
}
|
|
45
|
+
/** Returns the generators submodule (generateSoloNavMesh, etc.). */
|
|
46
|
+
export function getRecastGenerators() {
|
|
47
|
+
if (!cachedGenerators)
|
|
48
|
+
throw new Error("recast-navigation not loaded. Call loadRecastLib() first.");
|
|
49
|
+
return cachedGenerators;
|
|
50
|
+
}
|
|
51
|
+
// ── RecastBackend ──
|
|
52
|
+
/**
|
|
53
|
+
* Wraps a generated recast {@link NavMesh} + a {@link NavMeshQuery}. Created
|
|
54
|
+
* by {@link RecastLib.sim.create} and exposed via the {@link RecastNavMeshTok}
|
|
55
|
+
* DI token. Games call `buildNavMesh(positions, indices, config)` once
|
|
56
|
+
* (typically in `onReady`) to populate the mesh from terrain/level geometry.
|
|
57
|
+
*/
|
|
58
|
+
export class RecastBackend {
|
|
59
|
+
mod = null;
|
|
60
|
+
navMesh = null;
|
|
61
|
+
query = null;
|
|
62
|
+
destroyed = false;
|
|
63
|
+
/** Asynchronously loads the WasM module. Must be called before buildNavMesh. */
|
|
64
|
+
async init() {
|
|
65
|
+
if (this.mod)
|
|
66
|
+
return;
|
|
67
|
+
this.mod = await loadRecastLib();
|
|
68
|
+
}
|
|
69
|
+
ensureMod() {
|
|
70
|
+
if (!this.mod || this.destroyed) {
|
|
71
|
+
throw new Error("RecastBackend not initialized or destroyed. Call init() first.");
|
|
72
|
+
}
|
|
73
|
+
return this.mod;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Builds a solo (single-tile) navmesh from triangle input.
|
|
77
|
+
*
|
|
78
|
+
* @param positions flat array of vertex positions: [x0,y0,z0, x1,y1,z1, ...]
|
|
79
|
+
* @param indices flat array of triangle indices: [i0,i1,i2, i3,i4,i5, ...]
|
|
80
|
+
* @param config optional recast generation config (cell size, agent
|
|
81
|
+
* radius, walkable slope, etc.)
|
|
82
|
+
* @returns `true` on success. On failure, logs the recast error + returns false.
|
|
83
|
+
*/
|
|
84
|
+
buildNavMesh(positions, indices, config) {
|
|
85
|
+
this.ensureMod(); // ensures WASM is loaded
|
|
86
|
+
const generators = getRecastGenerators();
|
|
87
|
+
const result = generators.generateSoloNavMesh(positions, indices, config);
|
|
88
|
+
if (!result.success) {
|
|
89
|
+
log.error("recast", `generateSoloNavMesh failed: ${result.error}`);
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
this.navMesh = result.navMesh;
|
|
93
|
+
this.query = new this.mod.NavMeshQuery(this.navMesh);
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
/** The generated navmesh. Throws if buildNavMesh hasn't succeeded. */
|
|
97
|
+
getNavMesh() {
|
|
98
|
+
if (!this.navMesh)
|
|
99
|
+
throw new Error("RecastBackend: navmesh not built. Call buildNavMesh() first.");
|
|
100
|
+
return this.navMesh;
|
|
101
|
+
}
|
|
102
|
+
/** A NavMeshQuery over the built navmesh. Throws if not built. */
|
|
103
|
+
getQuery() {
|
|
104
|
+
if (!this.query)
|
|
105
|
+
throw new Error("RecastBackend: navmesh not built. Call buildNavMesh() first.");
|
|
106
|
+
return this.query;
|
|
107
|
+
}
|
|
108
|
+
/** Whether buildNavMesh has succeeded and the mesh is usable. */
|
|
109
|
+
isBuilt() {
|
|
110
|
+
return this.navMesh !== null;
|
|
111
|
+
}
|
|
112
|
+
/** The loaded recast-navigation module (for Crowd construction etc.). */
|
|
113
|
+
getModule() {
|
|
114
|
+
return this.ensureMod();
|
|
115
|
+
}
|
|
116
|
+
/** Releases the navmesh + query. The WASM module itself stays cached. */
|
|
117
|
+
destroy() {
|
|
118
|
+
this.destroyed = true;
|
|
119
|
+
// recast NavMesh/NavMeshQuery are GC'd; no explicit destroy on the JS wrappers.
|
|
120
|
+
this.navMesh = null;
|
|
121
|
+
this.query = null;
|
|
122
|
+
this.mod = null;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// RecastCrowdSystem — ECS-integrated wrapper over recast-navigation's Crowd
|
|
3
|
+
//
|
|
4
|
+
// Mirrors the structure of @downdraft/engine/libraries/navmesh's CrowdSystem but uses
|
|
5
|
+
// recast's WASM Crowd (real RVO avoidance + Detour pathfollowing) instead of
|
|
6
|
+
// the hand-rolled boids steering. Defines its own RecastAgent component so
|
|
7
|
+
// the two navmesh libraries can coexist without ECS schema coupling.
|
|
8
|
+
// ============================================================================
|
|
9
|
+
import { Component } from "@downdraft/engine/ecs/component";
|
|
10
|
+
import { Stage, system } from "@downdraft/engine/ecs/system";
|
|
11
|
+
import { PhysicsTransform } from "@downdraft/engine/physics/body";
|
|
12
|
+
// ── ECS component ──
|
|
13
|
+
export const RecastAgent = Component.register("RecastAgent", {
|
|
14
|
+
agentId: -1,
|
|
15
|
+
radius: 0.5,
|
|
16
|
+
height: 1.8,
|
|
17
|
+
maxSpeed: 3.5,
|
|
18
|
+
maxAcceleration: 10,
|
|
19
|
+
target: null,
|
|
20
|
+
state: "idle",
|
|
21
|
+
velocity: [0, 0, 0],
|
|
22
|
+
});
|
|
23
|
+
/**
|
|
24
|
+
* Wraps a recast-navigation {@link Crowd}. Created by the {@link RecastLib}
|
|
25
|
+
* descriptor and exposed via {@link RecastCrowdTok}. Games register it with
|
|
26
|
+
* their ECS world via {@link register}, then add agents with {@link addAgent}
|
|
27
|
+
* and steer them with {@link setTarget}.
|
|
28
|
+
*
|
|
29
|
+
* Each tick the system calls `crowd.update(dt)` then writes agent
|
|
30
|
+
* position/velocity back into the ECS `RecastAgent` + `PhysicsTransform`
|
|
31
|
+
* components (mirroring the read-back pattern in library-navmesh's
|
|
32
|
+
* CrowdSystem).
|
|
33
|
+
*/
|
|
34
|
+
export class RecastCrowdSystem {
|
|
35
|
+
backend;
|
|
36
|
+
config;
|
|
37
|
+
crowd = null;
|
|
38
|
+
world = null;
|
|
39
|
+
query = null;
|
|
40
|
+
/** entity.index → recast CrowdAgent index, for write-back during tick. */
|
|
41
|
+
entityToAgent = new Map();
|
|
42
|
+
/** Per-agent stuck-detection state, keyed by recast agent index. */
|
|
43
|
+
stuckState = new Map();
|
|
44
|
+
// Resolved config (defaults applied once).
|
|
45
|
+
stuckTimeout;
|
|
46
|
+
stuckMoveEpsilon;
|
|
47
|
+
arrivalDistance;
|
|
48
|
+
reachabilityTolerance;
|
|
49
|
+
constructor(backend, config) {
|
|
50
|
+
this.backend = backend;
|
|
51
|
+
this.config = config;
|
|
52
|
+
this.stuckTimeout = config.stuckTimeout ?? 2;
|
|
53
|
+
this.stuckMoveEpsilon = config.stuckMoveEpsilon ?? 0.05;
|
|
54
|
+
this.arrivalDistance = config.arrivalDistance ?? 0.5;
|
|
55
|
+
this.reachabilityTolerance = config.reachabilityTolerance ?? 1.5;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Lazily creates the recast Crowd. The Crowd requires a built NavMesh, so
|
|
59
|
+
* this is called from {@link register} (after the game has built the mesh)
|
|
60
|
+
* or explicitly by the game once the mesh is ready.
|
|
61
|
+
*/
|
|
62
|
+
ensureCrowd() {
|
|
63
|
+
if (this.crowd)
|
|
64
|
+
return this.crowd;
|
|
65
|
+
const mod = this.backend.getModule();
|
|
66
|
+
const navMesh = this.backend.getNavMesh();
|
|
67
|
+
this.crowd = new mod.Crowd(navMesh, {
|
|
68
|
+
maxAgents: this.config.maxAgents,
|
|
69
|
+
maxAgentRadius: this.config.maxAgentRadius,
|
|
70
|
+
});
|
|
71
|
+
return this.crowd;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Registers the per-tick crowd update system with the ECS world.
|
|
75
|
+
* @param world the ECS world
|
|
76
|
+
* @param query a query over `[RecastAgent, PhysicsTransform]`
|
|
77
|
+
*/
|
|
78
|
+
register(world, query) {
|
|
79
|
+
this.world = world;
|
|
80
|
+
this.query = query;
|
|
81
|
+
const crowdSys = system("recast-crowd-agents", Stage.Update, (ctx) => {
|
|
82
|
+
if (!this.query)
|
|
83
|
+
return;
|
|
84
|
+
const crowd = this.crowd;
|
|
85
|
+
if (!crowd)
|
|
86
|
+
return; // mesh not built yet — no-op until ensureCrowd runs
|
|
87
|
+
crowd.update(ctx.dt);
|
|
88
|
+
this.query.iterate(ctx.tick, (entity, components) => {
|
|
89
|
+
const agent = components[0];
|
|
90
|
+
const transform = components[1];
|
|
91
|
+
const agentIdx = this.entityToAgent.get(entity.index);
|
|
92
|
+
if (agentIdx === undefined)
|
|
93
|
+
return;
|
|
94
|
+
const crowdAgent = crowd.getAgent(agentIdx);
|
|
95
|
+
if (!crowdAgent)
|
|
96
|
+
return;
|
|
97
|
+
const pos = crowdAgent.position();
|
|
98
|
+
transform.position[0] = pos.x;
|
|
99
|
+
transform.position[1] = pos.y;
|
|
100
|
+
transform.position[2] = pos.z;
|
|
101
|
+
const vel = crowdAgent.velocity();
|
|
102
|
+
agent.velocity[0] = vel.x;
|
|
103
|
+
agent.velocity[1] = vel.y;
|
|
104
|
+
agent.velocity[2] = vel.z;
|
|
105
|
+
// State heuristic: arrived when within arrivalDistance of the
|
|
106
|
+
// (snapped) target; otherwise seeking, with stuck detection as a
|
|
107
|
+
// backstop for agents that make no progress (e.g. target on an
|
|
108
|
+
// unreachable navmesh island, or wedged against geometry).
|
|
109
|
+
if (agent.target) {
|
|
110
|
+
const dx = agent.target[0] - pos.x;
|
|
111
|
+
const dz = agent.target[2] - pos.z;
|
|
112
|
+
const distSq = dx * dx + dz * dz;
|
|
113
|
+
if (distSq < this.arrivalDistance * this.arrivalDistance) {
|
|
114
|
+
agent.state = "arrived";
|
|
115
|
+
this.stuckState.delete(agentIdx);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
this.updateStuckState(agentIdx, agent, [pos.x, pos.y, pos.z], ctx.dt);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
this.stuckState.delete(agentIdx);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}, { queries: [query] });
|
|
126
|
+
world.schedule.add(crowdSys);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Adds an agent to the crowd. Reads the entity's current `PhysicsTransform`
|
|
130
|
+
* position as the spawn point. Stores the recast agent index on the
|
|
131
|
+
* `RecastAgent` component and in the entity→agent map.
|
|
132
|
+
*/
|
|
133
|
+
addAgent(entity, params) {
|
|
134
|
+
if (!this.world)
|
|
135
|
+
throw new Error("RecastCrowdSystem not registered with a world.");
|
|
136
|
+
const crowd = this.ensureCrowd();
|
|
137
|
+
const transform = this.world.getComponent(entity, PhysicsTransform.id);
|
|
138
|
+
const pos = transform?.position ?? [0, 0, 0];
|
|
139
|
+
const crowdAgent = crowd.addAgent({ x: pos[0], y: pos[1], z: pos[2] }, {
|
|
140
|
+
radius: params?.radius ?? 0.5,
|
|
141
|
+
height: params?.height ?? 1.8,
|
|
142
|
+
maxAcceleration: params?.maxAcceleration ?? 10,
|
|
143
|
+
maxSpeed: params?.maxSpeed ?? 3.5,
|
|
144
|
+
collisionQueryRange: params?.collisionQueryRange ?? 2.5,
|
|
145
|
+
pathOptimizationRange: params?.pathOptimizationRange ?? 0,
|
|
146
|
+
separationWeight: params?.separationWeight ?? 0,
|
|
147
|
+
updateFlags: params?.updateFlags ?? 7,
|
|
148
|
+
obstacleAvoidanceType: params?.obstacleAvoidanceType ?? 0,
|
|
149
|
+
queryFilterType: params?.queryFilterType ?? 0,
|
|
150
|
+
});
|
|
151
|
+
const agentIdx = crowdAgent.agentIndex;
|
|
152
|
+
const agent = this.world.getComponent(entity, RecastAgent.id);
|
|
153
|
+
if (agent) {
|
|
154
|
+
agent.agentId = agentIdx;
|
|
155
|
+
agent.radius = params?.radius ?? agent.radius;
|
|
156
|
+
agent.height = params?.height ?? agent.height;
|
|
157
|
+
agent.maxSpeed = params?.maxSpeed ?? agent.maxSpeed;
|
|
158
|
+
agent.maxAcceleration = params?.maxAcceleration ?? agent.maxAcceleration;
|
|
159
|
+
}
|
|
160
|
+
this.entityToAgent.set(entity.index, agentIdx);
|
|
161
|
+
this.stuckState.delete(agentIdx);
|
|
162
|
+
return agentIdx;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Sets a move target for the agent. The crowd will pathfind + steer to it.
|
|
166
|
+
*
|
|
167
|
+
* The requested target is validated before being issued:
|
|
168
|
+
* 1. It is snapped to the nearest walkable navmesh polygon.
|
|
169
|
+
* 2. A `computePath` is run from the agent's current position to the
|
|
170
|
+
* snapped target. If the path is partial (its final waypoint is
|
|
171
|
+
* farther than `reachabilityTolerance` from the target — i.e. the
|
|
172
|
+
* target lies on a disconnected navmesh island such as the top of an
|
|
173
|
+
* obstacle the agent cannot climb), the target is rejected and
|
|
174
|
+
* `false` is returned. The agent's existing target is left untouched.
|
|
175
|
+
*
|
|
176
|
+
* On success, the *snapped, reachable* endpoint is stored as the agent's
|
|
177
|
+
* target (not the raw input) so the arrival heuristic measures distance to
|
|
178
|
+
* the actual goal rather than a point inside geometry.
|
|
179
|
+
*
|
|
180
|
+
* @returns `true` if the target was accepted and issued to the crowd.
|
|
181
|
+
*/
|
|
182
|
+
setTarget(entity, target) {
|
|
183
|
+
if (!this.world)
|
|
184
|
+
return false;
|
|
185
|
+
const agent = this.world.getComponent(entity, RecastAgent.id);
|
|
186
|
+
if (!agent || agent.agentId < 0)
|
|
187
|
+
return false;
|
|
188
|
+
const crowd = this.crowd;
|
|
189
|
+
if (!crowd)
|
|
190
|
+
return false;
|
|
191
|
+
const crowdAgent = crowd.getAgent(agent.agentId);
|
|
192
|
+
if (!crowdAgent)
|
|
193
|
+
return false;
|
|
194
|
+
// Snap the requested target to the nearest walkable polygon, then verify
|
|
195
|
+
// the agent can actually reach it. Without this, a target inside an
|
|
196
|
+
// obstacle snaps to the nearest navmesh polygon — which may be the
|
|
197
|
+
// obstacle's walkable *top*, a disconnected island the agent cannot climb
|
|
198
|
+
// to — and the crowd spends forever steering into the obstacle base.
|
|
199
|
+
if (this.reachabilityTolerance > 0 && this.backend.isBuilt()) {
|
|
200
|
+
const query = this.backend.getQuery();
|
|
201
|
+
const startPos = crowdAgent.position();
|
|
202
|
+
const path = query.computePath({ x: startPos.x, y: startPos.y, z: startPos.z }, { x: target[0], y: target[1], z: target[2] });
|
|
203
|
+
if (!path.success || path.path.length === 0)
|
|
204
|
+
return false;
|
|
205
|
+
const last = path.path[path.path.length - 1];
|
|
206
|
+
const dx = last.x - target[0];
|
|
207
|
+
const dz = last.z - target[2];
|
|
208
|
+
// Partial path → target is on a disconnected island. Reject it.
|
|
209
|
+
if (Math.hypot(dx, dz) > this.reachabilityTolerance)
|
|
210
|
+
return false;
|
|
211
|
+
// Issue the move target at the reachable endpoint and store the snapped
|
|
212
|
+
// target so arrival detection is accurate.
|
|
213
|
+
const ok = crowdAgent.requestMoveTarget({ x: last.x, y: last.y, z: last.z });
|
|
214
|
+
if (!ok)
|
|
215
|
+
return false;
|
|
216
|
+
agent.target = [last.x, last.y, last.z];
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
// Reachability check disabled: fall back to recast's built-in snapping.
|
|
220
|
+
const ok = crowdAgent.requestMoveTarget({ x: target[0], y: target[1], z: target[2] });
|
|
221
|
+
if (!ok)
|
|
222
|
+
return false;
|
|
223
|
+
agent.target = [target[0], target[1], target[2]];
|
|
224
|
+
}
|
|
225
|
+
agent.state = "seeking";
|
|
226
|
+
this.stuckState.delete(agent.agentId);
|
|
227
|
+
return true;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Per-tick stuck detection. Uses a sliding window: every `stuckTimeout`
|
|
231
|
+
* seconds it checks whether the agent has made appreciable *net* progress
|
|
232
|
+
* from its position at the start of the window. Measuring net displacement
|
|
233
|
+
* (rather than per-tick movement) correctly classifies an agent that
|
|
234
|
+
* oscillates against an obstacle as stuck — it jittered but ended up back
|
|
235
|
+
* where it started. This is a backstop for cases the `setTarget`
|
|
236
|
+
* reachability check cannot catch (dynamic obstacles, crowd local minima,
|
|
237
|
+
* agents wedged against geometry).
|
|
238
|
+
*/
|
|
239
|
+
updateStuckState(agentIdx, agent, pos, dt) {
|
|
240
|
+
if (this.stuckTimeout <= 0 || !Number.isFinite(this.stuckTimeout)) {
|
|
241
|
+
agent.state = "seeking";
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
let s = this.stuckState.get(agentIdx);
|
|
245
|
+
if (!s) {
|
|
246
|
+
s = { lastPos: [pos[0], pos[1], pos[2]], timer: 0 };
|
|
247
|
+
this.stuckState.set(agentIdx, s);
|
|
248
|
+
}
|
|
249
|
+
s.timer += dt;
|
|
250
|
+
if (s.timer >= this.stuckTimeout) {
|
|
251
|
+
// Window elapsed — evaluate net displacement from the window start.
|
|
252
|
+
const moved = Math.hypot(pos[0] - s.lastPos[0], pos[1] - s.lastPos[1], pos[2] - s.lastPos[2]);
|
|
253
|
+
if (moved < this.stuckMoveEpsilon) {
|
|
254
|
+
agent.state = "stuck";
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
// Made progress — start a fresh window from the current position.
|
|
258
|
+
s.lastPos[0] = pos[0];
|
|
259
|
+
s.lastPos[1] = pos[1];
|
|
260
|
+
s.lastPos[2] = pos[2];
|
|
261
|
+
s.timer = 0;
|
|
262
|
+
agent.state = "seeking";
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
agent.state = "seeking";
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/** Clears the agent's move target (it will decelerate to a stop). */
|
|
270
|
+
clearTarget(entity) {
|
|
271
|
+
if (!this.world)
|
|
272
|
+
return;
|
|
273
|
+
const agent = this.world.getComponent(entity, RecastAgent.id);
|
|
274
|
+
if (!agent || agent.agentId < 0)
|
|
275
|
+
return;
|
|
276
|
+
const crowd = this.crowd;
|
|
277
|
+
if (!crowd)
|
|
278
|
+
return;
|
|
279
|
+
const crowdAgent = crowd.getAgent(agent.agentId);
|
|
280
|
+
if (!crowdAgent)
|
|
281
|
+
return;
|
|
282
|
+
crowdAgent.resetMoveTarget();
|
|
283
|
+
agent.target = null;
|
|
284
|
+
agent.state = "idle";
|
|
285
|
+
this.stuckState.delete(agent.agentId);
|
|
286
|
+
}
|
|
287
|
+
/** Removes an agent from the crowd. */
|
|
288
|
+
removeAgent(entity) {
|
|
289
|
+
if (!this.world)
|
|
290
|
+
return;
|
|
291
|
+
const agent = this.world.getComponent(entity, RecastAgent.id);
|
|
292
|
+
if (!agent || agent.agentId < 0)
|
|
293
|
+
return;
|
|
294
|
+
const crowd = this.crowd;
|
|
295
|
+
if (crowd)
|
|
296
|
+
crowd.removeAgent(agent.agentId);
|
|
297
|
+
agent.agentId = -1;
|
|
298
|
+
agent.state = "idle";
|
|
299
|
+
this.entityToAgent.delete(entity.index);
|
|
300
|
+
this.stuckState.delete(agent.agentId);
|
|
301
|
+
}
|
|
302
|
+
/** Releases the recast Crowd. The backend + navmesh are owned by RecastBackend. */
|
|
303
|
+
destroy() {
|
|
304
|
+
this.crowd = null;
|
|
305
|
+
this.world = null;
|
|
306
|
+
this.query = null;
|
|
307
|
+
this.entityToAgent.clear();
|
|
308
|
+
this.stuckState.clear();
|
|
309
|
+
}
|
|
310
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
import { resourceToken } from "@downdraft/engine";
|
|
13
|
+
import { RecastBackend } from "./backend.js";
|
|
14
|
+
import { RecastCrowdSystem } from "./crowd-system.js";
|
|
15
|
+
// ── Typed tokens (DI) ──
|
|
16
|
+
/** Token for the sim-side recast backend (navmesh + query). Inject in sim systems that need pathfinding. */
|
|
17
|
+
export const RecastNavMeshTok = resourceToken("recast:navmesh");
|
|
18
|
+
/** Token for the sim-side recast crowd system. Inject in sim systems that drive agents. */
|
|
19
|
+
export const RecastCrowdTok = resourceToken("recast:crowd");
|
|
20
|
+
// ── Descriptor ──
|
|
21
|
+
export const RecastLib = {
|
|
22
|
+
name: "recast",
|
|
23
|
+
version: "1.0.0",
|
|
24
|
+
// No SAB channels — recast is sim-only, results synced via main SimBuffer.
|
|
25
|
+
sabChannels: [],
|
|
26
|
+
provides: [RecastNavMeshTok, RecastCrowdTok],
|
|
27
|
+
sim: {
|
|
28
|
+
async create(config, ctx) {
|
|
29
|
+
const backend = new RecastBackend();
|
|
30
|
+
await backend.init();
|
|
31
|
+
const crowd = new RecastCrowdSystem(backend, {
|
|
32
|
+
maxAgents: config.maxAgents ?? 512,
|
|
33
|
+
maxAgentRadius: config.maxAgentRadius ?? 0.6,
|
|
34
|
+
stuckTimeout: config.stuckTimeout,
|
|
35
|
+
stuckMoveEpsilon: config.stuckMoveEpsilon,
|
|
36
|
+
arrivalDistance: config.arrivalDistance,
|
|
37
|
+
reachabilityTolerance: config.reachabilityTolerance,
|
|
38
|
+
});
|
|
39
|
+
ctx.provide(RecastNavMeshTok, backend);
|
|
40
|
+
ctx.provide(RecastCrowdTok, crowd);
|
|
41
|
+
return { backend, crowd };
|
|
42
|
+
},
|
|
43
|
+
dispose(system) {
|
|
44
|
+
const { backend, crowd } = system;
|
|
45
|
+
crowd.destroy();
|
|
46
|
+
backend.destroy();
|
|
47
|
+
},
|
|
48
|
+
// tick is game-specific (calls crowd.update via the registered ECS system,
|
|
49
|
+
// setTarget per agent, repathing, etc.) — games wire this via onReady.
|
|
50
|
+
},
|
|
51
|
+
tickPhase: "post-physics",
|
|
52
|
+
// No renderer setup — recast is entirely sim-side.
|
|
53
|
+
defaultConfig: {
|
|
54
|
+
agentRadius: 0.5,
|
|
55
|
+
agentHeight: 1.8,
|
|
56
|
+
maxAgents: 512,
|
|
57
|
+
maxAgentRadius: 0.6,
|
|
58
|
+
},
|
|
59
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
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
|
+
export const FLAG_UPDATED = 0x04; // bit 2 — cell was updated this frame
|
|
12
|
+
export const FLAG_SPARK = 0x08; // bit 3 — this fire is a spark (expires to empty, not smoke)
|
|
13
|
+
export const FLAG_ANCHORED = 0x10; // bit 4 — fire stays put (wax flame, doesn't rise/drift)
|
|
14
|
+
export const FLAG_POPPED = 0x20; // bit 5 — popcorn that has already popped (won't re-pop)
|
|
15
|
+
export const SHADE_MASK = 0x03; // bits 0-1 — shade index (0-3)
|
|
16
|
+
// Precomputed bit position of FLAG_UPDATED within the packed uint32 flags field.
|
|
17
|
+
// OR-ing this into a packed cell value sets FLAG_UPDATED without re-packing.
|
|
18
|
+
export const FLAG_UPDATED_BIT = FLAG_UPDATED << 16;
|
|
19
|
+
export function pack(cell) {
|
|
20
|
+
return (cell.mat & 0xff) | ((cell.lifetime & 0xff) << 8) | ((cell.flags & 0xff) << 16);
|
|
21
|
+
}
|
|
22
|
+
export function unpack(v) {
|
|
23
|
+
return {
|
|
24
|
+
mat: v & 0xff,
|
|
25
|
+
lifetime: (v >> 8) & 0xff,
|
|
26
|
+
flags: (v >> 16) & 0xff,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
/** Pack a cell value from raw components without allocating a Cell object. */
|
|
30
|
+
export function packCell(mat, lifetime, flags) {
|
|
31
|
+
return (mat & 0xff) | ((lifetime & 0xff) << 8) | ((flags & 0xff) << 16);
|
|
32
|
+
}
|