@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,245 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// wgsl-struct-validator — drift detection between external .wgsl files and
|
|
3
|
+
// WgslStruct definitions.
|
|
4
|
+
//
|
|
5
|
+
// For external .wgsl files (imported via ?raw) where we don't want to split the
|
|
6
|
+
// struct out of the shader file, this parser extracts `struct Foo { ... }`
|
|
7
|
+
// blocks from a WGSL source string, computes the layout, and compares it
|
|
8
|
+
// against a WgslStruct definition. In DOWNDRAFT_STRICT mode a mismatch throws;
|
|
9
|
+
// otherwise it logs a warning.
|
|
10
|
+
//
|
|
11
|
+
// Comments (line `//...` and block `slash-star ... star-slash`) are stripped.
|
|
12
|
+
// ============================================================================
|
|
13
|
+
|
|
14
|
+
import { createLogger } from "@downdraft/engine/util/logger";
|
|
15
|
+
import { wgsl, type WgslStruct, type WgslType } from "./wgsl-struct";
|
|
16
|
+
|
|
17
|
+
const log = createLogger("info");
|
|
18
|
+
|
|
19
|
+
// ─── WGSL struct parser ─────────────────────────────────────────────────────
|
|
20
|
+
|
|
21
|
+
export interface ParsedWgslField {
|
|
22
|
+
name: string;
|
|
23
|
+
typeWgsl: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface ParsedWgslStruct {
|
|
27
|
+
name: string;
|
|
28
|
+
fields: ParsedWgslField[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Parse all `struct Name { ... }` blocks from a WGSL source string.
|
|
33
|
+
* Handles attributes on fields (e.g. `@location(0)`) and struct attributes.
|
|
34
|
+
* Comments are stripped first (line and block).
|
|
35
|
+
*/
|
|
36
|
+
export function parseWgslStructs(source: string): ParsedWgslStruct[] {
|
|
37
|
+
// Strip block comments.
|
|
38
|
+
let cleaned = source.replace(/\/\*[\s\S]*?\*\//g, "");
|
|
39
|
+
// Strip line comments.
|
|
40
|
+
cleaned = cleaned.replace(/\/\/[^\n]*/g, "");
|
|
41
|
+
|
|
42
|
+
const structs: ParsedWgslStruct[] = [];
|
|
43
|
+
// Match: struct Name { fields }
|
|
44
|
+
// Fields may have attributes like @location(0) @builtin(position).
|
|
45
|
+
const structRegex = /struct\s+(\w+)\s*\{([^}]*)\}/g;
|
|
46
|
+
let m: RegExpExecArray | null;
|
|
47
|
+
while ((m = structRegex.exec(cleaned)) !== null) {
|
|
48
|
+
const name = m[1];
|
|
49
|
+
const body = m[2];
|
|
50
|
+
const fields = parseStructBody(body);
|
|
51
|
+
structs.push({ name, fields });
|
|
52
|
+
}
|
|
53
|
+
return structs;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function parseStructBody(body: string): ParsedWgslField[] {
|
|
57
|
+
const fields: ParsedWgslField[] = [];
|
|
58
|
+
// Split on commas (top-level — struct bodies here don't nest commas in
|
|
59
|
+
// practice; array sizes are numeric literals).
|
|
60
|
+
const parts = body.split(",").map((s) => s.trim()).filter((s) => s.length > 0);
|
|
61
|
+
for (let _i = 0, _it = parts, _n = _it.length; _i < _n; _i++) { const part = _it[_i];
|
|
62
|
+
// Strip leading attributes: @location(0), @builtin(x), @align(16), etc.
|
|
63
|
+
const stripped = part.replace(/@\w+(\([^)]*\))?/g, "").trim();
|
|
64
|
+
if (!stripped) continue;
|
|
65
|
+
// Field: name: type
|
|
66
|
+
const colonIdx = stripped.indexOf(":");
|
|
67
|
+
if (colonIdx < 0) continue;
|
|
68
|
+
const fieldName = stripped.slice(0, colonIdx).trim();
|
|
69
|
+
const typeWgsl = stripped.slice(colonIdx + 1).trim();
|
|
70
|
+
if (!fieldName || !typeWgsl) continue;
|
|
71
|
+
fields.push({ name: fieldName, typeWgsl });
|
|
72
|
+
}
|
|
73
|
+
return fields;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ─── WGSL type string → WgslType descriptor ─────────────────────────────────
|
|
77
|
+
|
|
78
|
+
/** Map a WGSL type expression string to a WgslType descriptor. */
|
|
79
|
+
export function wgslTypeFromString(typeWgsl: string): WgslType {
|
|
80
|
+
const t = typeWgsl.trim();
|
|
81
|
+
|
|
82
|
+
// Scalars
|
|
83
|
+
if (t === "f32") return wgsl.f32;
|
|
84
|
+
if (t === "u32") return wgsl.u32;
|
|
85
|
+
if (t === "i32") return wgsl.i32;
|
|
86
|
+
if (t === "f16") return wgsl.f16;
|
|
87
|
+
|
|
88
|
+
// Vectors: vecN<T>
|
|
89
|
+
const vecMatch = /^vec(\d)<(f32|f16|u32|i32)>$/.exec(t);
|
|
90
|
+
if (vecMatch) {
|
|
91
|
+
const n = Number(vecMatch[1]);
|
|
92
|
+
const el = vecMatch[2] as "f32" | "f16" | "u32" | "i32";
|
|
93
|
+
const isInt = el === "u32" || el === "i32";
|
|
94
|
+
if (n === 2) return el === "f32" ? wgsl.vec2f : isInt ? (el === "u32" ? wgsl.vec2u : wgsl.vec2i) : wgsl.vec2f;
|
|
95
|
+
if (n === 3) return el === "f32" ? wgsl.vec3f : isInt ? (el === "u32" ? wgsl.vec3u : wgsl.vec3i) : wgsl.vec3f;
|
|
96
|
+
if (n === 4) return el === "f32" ? wgsl.vec4f : isInt ? (el === "u32" ? wgsl.vec4u : wgsl.vec4i) : wgsl.vec4f;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
// Matrices: matCxR<T>
|
|
100
|
+
const matMatch = /^mat(\d)x(\d)<(f32|f16)>$/.exec(t);
|
|
101
|
+
if (matMatch) {
|
|
102
|
+
const c = Number(matMatch[1]);
|
|
103
|
+
const r = Number(matMatch[2]);
|
|
104
|
+
const el = matMatch[3] as "f32" | "f16";
|
|
105
|
+
if (el === "f32") {
|
|
106
|
+
if (c === 4 && r === 4) return wgsl.mat4x4f;
|
|
107
|
+
if (c === 3 && r === 3) return wgsl.mat3x3f;
|
|
108
|
+
if (c === 4 && r === 3) return wgsl.mat4x3f;
|
|
109
|
+
if (c === 3 && r === 4) return wgsl.mat3x4f;
|
|
110
|
+
if (c === 2 && r === 2) return wgsl.mat2x2f;
|
|
111
|
+
if (c === 2 && r === 4) return wgsl.mat2x4f;
|
|
112
|
+
if (c === 4 && r === 2) return wgsl.mat4x2f;
|
|
113
|
+
}
|
|
114
|
+
throw new Error(`wgslTypeFromString: unsupported matrix ${t}`);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Arrays: array<T, N> or array<T>
|
|
118
|
+
const arrMatch = /^array<(.+),\s*(\d+)>$/.exec(t);
|
|
119
|
+
if (arrMatch) {
|
|
120
|
+
const elType = wgslTypeFromString(arrMatch[1]);
|
|
121
|
+
const count = Number(arrMatch[2]);
|
|
122
|
+
return wgsl.array(elType, count);
|
|
123
|
+
}
|
|
124
|
+
const arrRuntimeMatch = /^array<(.+)>$/.exec(t);
|
|
125
|
+
if (arrRuntimeMatch) {
|
|
126
|
+
// Runtime-sized array — treat as 1 element for layout (the host sizes it).
|
|
127
|
+
const elType = wgslTypeFromString(arrRuntimeMatch[1]);
|
|
128
|
+
return wgsl.array(elType, 1);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
throw new Error(`wgslTypeFromString: unrecognized type "${t}"`);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// ─── Drift detection ────────────────────────────────────────────────────────
|
|
135
|
+
|
|
136
|
+
export interface StructMismatch {
|
|
137
|
+
structName: string;
|
|
138
|
+
errors: string[];
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Compare a parsed WGSL struct against a WgslStruct definition.
|
|
143
|
+
* Returns a list of mismatch errors (empty if they match).
|
|
144
|
+
*
|
|
145
|
+
* Checks: field names (set equality), per-field type, per-field offset,
|
|
146
|
+
* struct size. Field ORDER is not enforced (WGSL layout is order-dependent,
|
|
147
|
+
* but if both sides compute layout from the same field order we get the same
|
|
148
|
+
* offsets — so we compare offsets, not order).
|
|
149
|
+
*/
|
|
150
|
+
export function compareStruct(
|
|
151
|
+
parsed: ParsedWgslStruct,
|
|
152
|
+
def: WgslStruct,
|
|
153
|
+
): StructMismatch {
|
|
154
|
+
const errors: string[] = [];
|
|
155
|
+
|
|
156
|
+
if (parsed.name !== def.name) {
|
|
157
|
+
errors.push(`struct name: wgsl "${parsed.name}" vs def "${def.name}"`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Build a layout from the parsed fields using the same rules.
|
|
161
|
+
let offset = 0;
|
|
162
|
+
let structAlign = 4;
|
|
163
|
+
const parsedLayout: { name: string; offset: number; type: WgslType }[] = [];
|
|
164
|
+
for (let _i = 0, _it = parsed.fields, _n = _it.length; _i < _n; _i++) { const f = _it[_i];
|
|
165
|
+
let type: WgslType;
|
|
166
|
+
try {
|
|
167
|
+
type = wgslTypeFromString(f.typeWgsl);
|
|
168
|
+
} catch (e) {
|
|
169
|
+
errors.push(`field "${f.name}": cannot parse type "${f.typeWgsl}" (${(e as Error).message})`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
const align = type.align;
|
|
173
|
+
offset = (offset + align - 1) & ~(align - 1);
|
|
174
|
+
parsedLayout.push({ name: f.name, offset, type });
|
|
175
|
+
offset += type.size;
|
|
176
|
+
if (align > structAlign) structAlign = align;
|
|
177
|
+
}
|
|
178
|
+
const parsedSize = (offset + structAlign - 1) & ~(structAlign - 1);
|
|
179
|
+
|
|
180
|
+
// Compare field sets.
|
|
181
|
+
const defNames = new Set(def.fieldMap.keys());
|
|
182
|
+
const parsedNames = new Set(parsed.fields.map((f) => f.name));
|
|
183
|
+
for (const n of defNames.values()) {
|
|
184
|
+
if (!parsedNames.has(n)) errors.push(`field "${n}" missing in wgsl`);
|
|
185
|
+
}
|
|
186
|
+
for (const n of parsedNames.values()) {
|
|
187
|
+
if (!defNames.has(n)) errors.push(`field "${n}" missing in def`);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Compare offsets + types for shared fields.
|
|
191
|
+
for (let _i = 0, _it = parsedLayout, _n = _it.length; _i < _n; _i++) { const pl = _it[_i];
|
|
192
|
+
const df = def.fieldMap.get(pl.name);
|
|
193
|
+
if (!df) continue;
|
|
194
|
+
if (df.offset !== pl.offset) {
|
|
195
|
+
errors.push(
|
|
196
|
+
`field "${pl.name}": offset wgsl ${pl.offset} vs def ${df.offset}`,
|
|
197
|
+
);
|
|
198
|
+
}
|
|
199
|
+
if (df.type.wgsl !== pl.type.wgsl) {
|
|
200
|
+
errors.push(
|
|
201
|
+
`field "${pl.name}": type wgsl "${pl.type.wgsl}" vs def "${df.type.wgsl}"`,
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if (parsedSize !== def.size) {
|
|
207
|
+
errors.push(`struct size: wgsl ${parsedSize} vs def ${def.size}`);
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
return { structName: parsed.name, errors };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* Assert that a WgslStruct definition matches the corresponding struct in a
|
|
215
|
+
* WGSL source string. In DOWNDRAFT_STRICT mode (env var = "1"), throws on
|
|
216
|
+
* mismatch. Otherwise logs a warning.
|
|
217
|
+
*
|
|
218
|
+
* @param wgslSource Raw WGSL source (e.g. imported via `?raw`).
|
|
219
|
+
* @param def The WgslStruct definition to compare against.
|
|
220
|
+
*/
|
|
221
|
+
export function assertWgslStructMatches(wgslSource: string, def: WgslStruct): void {
|
|
222
|
+
const parsed = parseWgslStructs(wgslSource);
|
|
223
|
+
const match = parsed.find((s) => s.name === def.name);
|
|
224
|
+
if (!match) {
|
|
225
|
+
const msg = `assertWgslStructMatches: struct "${def.name}" not found in WGSL source`;
|
|
226
|
+
if (isStrict()) throw new Error(msg);
|
|
227
|
+
log.warn("wgsl-struct-validator", msg);
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
const result = compareStruct(match, def);
|
|
231
|
+
if (result.errors.length > 0) {
|
|
232
|
+
const msg =
|
|
233
|
+
`assertWgslStructMatches: struct "${def.name}" drift:\n` +
|
|
234
|
+
result.errors.map((e) => ` - ${e}`).join("\n");
|
|
235
|
+
if (isStrict()) throw new Error(msg);
|
|
236
|
+
log.warn("wgsl-struct-validator", msg);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function isStrict(): boolean {
|
|
241
|
+
return (
|
|
242
|
+
process?.env?.DOWNDRAFT_STRICT === "1" ||
|
|
243
|
+
(typeof import.meta !== "undefined" && (import.meta as any).env?.DEV)
|
|
244
|
+
);
|
|
245
|
+
}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// wgsl-struct — typed WGSL struct definitions with computed layout
|
|
3
|
+
//
|
|
4
|
+
// Single source of truth for uniform/storage struct layout. Define a struct
|
|
5
|
+
// once in TS; the layout (offsets/alignment/padding/size) is computed at module
|
|
6
|
+
// load per the WGSL spec §14.4 (uniform address space). The struct emits its
|
|
7
|
+
// own WGSL declaration string, and a zero-copy typed view wraps a Float32Array
|
|
8
|
+
// with named field setters (type-checked at the TS level).
|
|
9
|
+
//
|
|
10
|
+
// This replaces the hand-mirrored struct + magic-offset buffer-write pattern
|
|
11
|
+
// (e.g. `data.set(viewProj, 0); data.set(prevViewProj, 16); ...`) that relies
|
|
12
|
+
// on "MUST match the WGSL below" comments.
|
|
13
|
+
// ============================================================================
|
|
14
|
+
|
|
15
|
+
// ─── Type descriptors ──────────────────────────────────────────────────────
|
|
16
|
+
|
|
17
|
+
export type WgslScalar = "f32" | "f16" | "u32" | "i32";
|
|
18
|
+
export type WgslVecCmp = "f32" | "f16" | "u32" | "i32";
|
|
19
|
+
|
|
20
|
+
/** A leaf WGSL type descriptor (scalar, vector, matrix, array, or struct ref). */
|
|
21
|
+
export interface WgslType {
|
|
22
|
+
/** WGSL type expression string, e.g. "mat4x4<f32>", "vec3<f32>", "f32". */
|
|
23
|
+
readonly wgsl: string;
|
|
24
|
+
/** Byte alignment (uniform address space). */
|
|
25
|
+
readonly align: number;
|
|
26
|
+
/** Byte size (uniform address space, including trailing pad to align). */
|
|
27
|
+
readonly size: number;
|
|
28
|
+
/** Element stride for matrices (per-column) and arrays (per-element), else size. */
|
|
29
|
+
readonly stride: number;
|
|
30
|
+
/** Number of float32 slots this type occupies (size / 4). Convenience. */
|
|
31
|
+
readonly floatCount: number;
|
|
32
|
+
/** Whether this is a u32/i32 scalar (drives setU32 vs set on the view). */
|
|
33
|
+
readonly isInt: boolean;
|
|
34
|
+
/** Whether this is a struct reference (used by nested-struct layout). */
|
|
35
|
+
readonly isStruct: boolean;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ─── Layout helpers ─────────────────────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
const roundUp = (alignment: number, n: number): number =>
|
|
41
|
+
(n + alignment - 1) & ~(alignment - 1);
|
|
42
|
+
|
|
43
|
+
function makeType(
|
|
44
|
+
wgsl: string,
|
|
45
|
+
align: number,
|
|
46
|
+
size: number,
|
|
47
|
+
stride: number = size,
|
|
48
|
+
isInt = false,
|
|
49
|
+
isStruct = false,
|
|
50
|
+
): WgslType {
|
|
51
|
+
return Object.freeze({
|
|
52
|
+
wgsl,
|
|
53
|
+
align,
|
|
54
|
+
size,
|
|
55
|
+
stride,
|
|
56
|
+
floatCount: size / 4,
|
|
57
|
+
isInt,
|
|
58
|
+
isStruct,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ─── Scalar type descriptors ────────────────────────────────────────────────
|
|
63
|
+
|
|
64
|
+
export const f32 = makeType("f32", 4, 4);
|
|
65
|
+
export const u32 = makeType("u32", 4, 4, 4, true);
|
|
66
|
+
export const i32 = makeType("i32", 4, 4, 4, true);
|
|
67
|
+
export const f16 = makeType("f16", 2, 2);
|
|
68
|
+
|
|
69
|
+
// ─── Vector type descriptors ────────────────────────────────────────────────
|
|
70
|
+
// Per WGSL §14.4: vec2<T> align 8 size 8; vec3<T> align 16 size 12;
|
|
71
|
+
// vec4<T> align 16 size 16. (For f16 element the align/size differ, but the
|
|
72
|
+
// engine only uses f32/u32/i32 vectors — keep it simple.)
|
|
73
|
+
|
|
74
|
+
function vec(n: number, el: WgslScalar, isInt: boolean): WgslType {
|
|
75
|
+
const elSize = el === "f16" ? 2 : 4;
|
|
76
|
+
const elAlign = elSize;
|
|
77
|
+
if (n === 2) {
|
|
78
|
+
return makeType(`vec2<${el}>`, Math.max(8, elAlign * 2), elSize * 2, elSize * 2, isInt);
|
|
79
|
+
}
|
|
80
|
+
if (n === 3) {
|
|
81
|
+
// vec3: align 16 (for f32/u32/i32), size 12.
|
|
82
|
+
return makeType(`vec3<${el}>`, 16, elSize * 3, 16, isInt);
|
|
83
|
+
}
|
|
84
|
+
if (n === 4) {
|
|
85
|
+
return makeType(`vec4<${el}>`, 16, elSize * 4, elSize * 4, isInt);
|
|
86
|
+
}
|
|
87
|
+
throw new Error(`wgsl: unsupported vector length ${n}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export const vec2f = vec(2, "f32", false);
|
|
91
|
+
export const vec3f = vec(3, "f32", false);
|
|
92
|
+
export const vec4f = vec(4, "f32", false);
|
|
93
|
+
export const vec2u = vec(2, "u32", true);
|
|
94
|
+
export const vec3u = vec(3, "u32", true);
|
|
95
|
+
export const vec4u = vec(4, "u32", true);
|
|
96
|
+
export const vec2i = vec(2, "i32", true);
|
|
97
|
+
export const vec3i = vec(3, "i32", true);
|
|
98
|
+
export const vec4i = vec(4, "i32", true);
|
|
99
|
+
|
|
100
|
+
// ─── Matrix type descriptors ────────────────────────────────────────────────
|
|
101
|
+
// Per WGSL §14.4: matCxR<T> has alignment = alignment of vecR<T>, and size =
|
|
102
|
+
// C * RoundUp(16, stride) where stride = size of vecR<T> rounded up to 16.
|
|
103
|
+
// For mat4x4<f32>: align 16, size 4*16 = 64, stride 16.
|
|
104
|
+
// For mat3x3<f32>: align 16, size 3*16 = 48, stride 16 (vec3 size 12 → 16).
|
|
105
|
+
// For mat4x3<f32>: align 16, size 4*16 = 64, stride 16.
|
|
106
|
+
// For mat3x4<f32>: align 16, size 3*16 = 48, stride 16.
|
|
107
|
+
|
|
108
|
+
function mat(cols: number, rows: number, el: WgslScalar = "f32"): WgslType {
|
|
109
|
+
if (el !== "f32" && el !== "f16") {
|
|
110
|
+
throw new Error(`wgsl: matrix element type must be f32 or f16, got ${el}`);
|
|
111
|
+
}
|
|
112
|
+
const elSize = el === "f16" ? 2 : 4;
|
|
113
|
+
// Column type is vec<rows, el>. Its align and padded stride:
|
|
114
|
+
let colAlign: number;
|
|
115
|
+
let colStride: number;
|
|
116
|
+
if (rows === 2) {
|
|
117
|
+
colAlign = Math.max(8, elSize * 2);
|
|
118
|
+
colStride = roundUp(16, elSize * 2);
|
|
119
|
+
} else if (rows === 3) {
|
|
120
|
+
colAlign = 16;
|
|
121
|
+
colStride = 16; // vec3 size 12 → padded to 16
|
|
122
|
+
} else if (rows === 4) {
|
|
123
|
+
colAlign = 16;
|
|
124
|
+
colStride = elSize * 4; // = 16 for f32
|
|
125
|
+
colStride = roundUp(16, colStride);
|
|
126
|
+
} else {
|
|
127
|
+
throw new Error(`wgsl: unsupported matrix row count ${rows}`);
|
|
128
|
+
}
|
|
129
|
+
const size = cols * colStride;
|
|
130
|
+
return makeType(`mat${cols}x${rows}<${el}>`, colAlign, size, colStride);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const mat4x4f = mat(4, 4);
|
|
134
|
+
export const mat3x3f = mat(3, 3);
|
|
135
|
+
export const mat4x3f = mat(4, 3);
|
|
136
|
+
export const mat3x4f = mat(3, 4);
|
|
137
|
+
export const mat2x2f = mat(2, 2);
|
|
138
|
+
export const mat2x4f = mat(2, 4);
|
|
139
|
+
export const mat4x2f = mat(4, 2);
|
|
140
|
+
|
|
141
|
+
// ─── Array type descriptor ──────────────────────────────────────────────────
|
|
142
|
+
|
|
143
|
+
/** `array<T, N>` — fixed-size array. Stride = RoundUp(alignof(T), sizeOf(T)). */
|
|
144
|
+
export function arrayOf<T extends WgslType>(element: T, count: number): WgslType {
|
|
145
|
+
const stride = roundUp(element.align, element.size);
|
|
146
|
+
const size = stride * count;
|
|
147
|
+
const wgsl = `array<${element.wgsl}, ${count}>`;
|
|
148
|
+
return makeType(wgsl, element.align, size, stride, element.isInt);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ─── Struct definition ──────────────────────────────────────────────────────
|
|
152
|
+
|
|
153
|
+
export interface WgslFieldLayout {
|
|
154
|
+
/** Field name (as declared in the struct). */
|
|
155
|
+
name: string;
|
|
156
|
+
/** Byte offset from the start of the struct. */
|
|
157
|
+
offset: number;
|
|
158
|
+
/** The type descriptor. */
|
|
159
|
+
type: WgslType;
|
|
160
|
+
/** Whether this field is a u32/i32 (drives setU32 on the view). */
|
|
161
|
+
isInt: boolean;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
export interface WgslStruct<Fields extends string = string> {
|
|
165
|
+
/** Struct name (as declared in WGSL). */
|
|
166
|
+
readonly name: string;
|
|
167
|
+
/** Byte size (including trailing pad to struct alignment). */
|
|
168
|
+
readonly size: number;
|
|
169
|
+
/** Byte alignment (max of member alignments). */
|
|
170
|
+
readonly align: number;
|
|
171
|
+
/** Number of float32 slots (size / 4). Convenience for buffer sizing. */
|
|
172
|
+
readonly floatCount: number;
|
|
173
|
+
/** Field layouts in declaration order. */
|
|
174
|
+
readonly fields: ReadonlyArray<WgslFieldLayout>;
|
|
175
|
+
/** Field names (for type-safe view access). */
|
|
176
|
+
readonly fieldNames: readonly Fields[];
|
|
177
|
+
/** Map field name → layout (for fast lookup by the view). */
|
|
178
|
+
readonly fieldMap: ReadonlyMap<string, WgslFieldLayout>;
|
|
179
|
+
/** WGSL struct declaration string (including `struct Name { ... }`). */
|
|
180
|
+
readonly wgsl: string;
|
|
181
|
+
/** Create a typed view over a Float32Array (zero-copy). */
|
|
182
|
+
view(buffer: Float32Array): StructView<Fields>;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// ─── Struct builder ─────────────────────────────────────────────────────────
|
|
186
|
+
|
|
187
|
+
type WgslFieldDefs = Record<string, WgslType>;
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Define a WGSL struct. Layout is computed once at call time per WGSL §14.4
|
|
191
|
+
* (uniform address space). Returns a frozen `WgslStruct` descriptor.
|
|
192
|
+
*
|
|
193
|
+
* @example
|
|
194
|
+
* const CameraUniforms = wgsl.struct("CameraUniforms", {
|
|
195
|
+
* viewProj: wgsl.mat4x4f,
|
|
196
|
+
* prevViewProj: wgsl.mat4x4f,
|
|
197
|
+
* });
|
|
198
|
+
* CameraUniforms.size; // 128
|
|
199
|
+
* CameraUniforms.wgsl; // "struct CameraUniforms {\n viewProj: mat4x4<f32>,\n ...\n}\n"
|
|
200
|
+
*/
|
|
201
|
+
export const wgsl = {
|
|
202
|
+
// Scalar/vector/matrix/array descriptors re-exported for ergonomics.
|
|
203
|
+
f32, u32, i32, f16,
|
|
204
|
+
vec2f, vec3f, vec4f, vec2u, vec3u, vec4u, vec2i, vec3i, vec4i,
|
|
205
|
+
mat4x4f, mat3x3f, mat4x3f, mat3x4f, mat2x2f, mat2x4f, mat4x2f,
|
|
206
|
+
array: arrayOf,
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Reference a previously-defined `WgslStruct` as a field type inside another
|
|
210
|
+
* struct (nested-struct layout). The emitted WGSL field line uses the struct
|
|
211
|
+
* name (e.g. `inner: Inner,`); the nested struct's own declaration must be
|
|
212
|
+
* emitted separately via `inner.wgsl`.
|
|
213
|
+
*/
|
|
214
|
+
ref(s: WgslStruct): WgslType {
|
|
215
|
+
return makeType(s.name, s.align, s.size, s.size, false, true);
|
|
216
|
+
},
|
|
217
|
+
|
|
218
|
+
struct<T extends WgslFieldDefs>(name: string, fields: T): WgslStruct<keyof T & string> {
|
|
219
|
+
const layouts: WgslFieldLayout[] = [];
|
|
220
|
+
let offset = 0;
|
|
221
|
+
let structAlign = 4; // minimum alignment is 4 (size of largest scalar)
|
|
222
|
+
|
|
223
|
+
for (const [fieldName, type] of Object.entries(fields)) {
|
|
224
|
+
// Advance offset to the field's alignment boundary.
|
|
225
|
+
offset = roundUp(type.align, offset);
|
|
226
|
+
layouts.push({
|
|
227
|
+
name: fieldName,
|
|
228
|
+
offset,
|
|
229
|
+
type,
|
|
230
|
+
isInt: type.isInt,
|
|
231
|
+
});
|
|
232
|
+
offset += type.size;
|
|
233
|
+
if (type.align > structAlign) structAlign = type.align;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// Struct size = round up to struct alignment (trailing pad).
|
|
237
|
+
const size = roundUp(structAlign, offset);
|
|
238
|
+
|
|
239
|
+
// Build the WGSL declaration string.
|
|
240
|
+
const fieldLines = layouts.map((f) => ` ${f.name}: ${f.type.wgsl},`).join("\n");
|
|
241
|
+
const wgslStr = `struct ${name} {\n${fieldLines}\n}`;
|
|
242
|
+
|
|
243
|
+
const fieldMap = new Map<string, WgslFieldLayout>();
|
|
244
|
+
layouts.forEach((f) => { fieldMap.set(f.name, f);; });
|
|
245
|
+
const fieldNames = layouts.map((f) => f.name as (keyof T & string));
|
|
246
|
+
|
|
247
|
+
const descriptor = {
|
|
248
|
+
name,
|
|
249
|
+
size,
|
|
250
|
+
align: structAlign,
|
|
251
|
+
floatCount: size / 4,
|
|
252
|
+
fields: Object.freeze(layouts),
|
|
253
|
+
fieldNames: Object.freeze(fieldNames) as readonly (keyof T & string)[],
|
|
254
|
+
fieldMap,
|
|
255
|
+
wgsl: wgslStr,
|
|
256
|
+
view(buffer: Float32Array): StructView<keyof T & string> {
|
|
257
|
+
return new StructViewImpl(descriptor, buffer) as unknown as StructView<keyof T & string>;
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
|
|
261
|
+
return Object.freeze(descriptor) as WgslStruct<keyof T & string>;
|
|
262
|
+
},
|
|
263
|
+
};
|
|
264
|
+
|
|
265
|
+
// ─── Typed view ─────────────────────────────────────────────────────────────
|
|
266
|
+
|
|
267
|
+
/**
|
|
268
|
+
* Zero-copy typed view over a Float32Array backing a struct. Field setters
|
|
269
|
+
* write at computed offsets; u32/i32 fields write through a shared Uint32Array
|
|
270
|
+
* view (same ArrayBuffer) so the shader reads correct u32 bit patterns.
|
|
271
|
+
*
|
|
272
|
+
* Field accessors are type-checked at the TS level — the `Fields` generic
|
|
273
|
+
* carries the struct's field names (inferred from the `wgsl.struct()` call).
|
|
274
|
+
*/
|
|
275
|
+
export interface StructView<Fields extends string = string> {
|
|
276
|
+
/** The underlying Float32Array (writes via setters land here). */
|
|
277
|
+
readonly floats: Float32Array;
|
|
278
|
+
/** The struct descriptor. */
|
|
279
|
+
readonly struct: WgslStruct<Fields>;
|
|
280
|
+
/** Byte size of the struct (convenience). */
|
|
281
|
+
readonly size: number;
|
|
282
|
+
|
|
283
|
+
/** Set a float-typed field (f32, vec*, mat*). Value type depends on field. */
|
|
284
|
+
set(field: Fields, value: number | ArrayLike<number> | Float32Array): void;
|
|
285
|
+
|
|
286
|
+
/** Set a u32/i32 scalar field via the Uint32Array view (correct bit pattern). */
|
|
287
|
+
setU32(field: Fields, value: number): void;
|
|
288
|
+
|
|
289
|
+
/** Read a field as a Float32Array subarray view (zero-copy). */
|
|
290
|
+
get(field: Fields): Float32Array;
|
|
291
|
+
|
|
292
|
+
/** Read a u32/i32 scalar field. */
|
|
293
|
+
getU32(field: Fields): number;
|
|
294
|
+
|
|
295
|
+
/** Zero the entire struct region. */
|
|
296
|
+
zero(): void;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
class StructViewImpl {
|
|
300
|
+
readonly struct: WgslStruct;
|
|
301
|
+
readonly floats: Float32Array;
|
|
302
|
+
private u32s: Uint32Array | null = null;
|
|
303
|
+
|
|
304
|
+
constructor(struct: WgslStruct, buffer: Float32Array) {
|
|
305
|
+
if (buffer.length * 4 < struct.size) {
|
|
306
|
+
throw new Error(
|
|
307
|
+
`StructView: buffer too small for struct "${struct.name}" ` +
|
|
308
|
+
`(need ${struct.size} bytes / ${struct.floatCount} floats, got ${buffer.length} floats)`,
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
this.struct = struct;
|
|
312
|
+
this.floats = buffer;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
private u32View(): Uint32Array {
|
|
316
|
+
if (!this.u32s) {
|
|
317
|
+
this.u32s = new Uint32Array(
|
|
318
|
+
this.floats.buffer,
|
|
319
|
+
this.floats.byteOffset,
|
|
320
|
+
this.floats.length,
|
|
321
|
+
);
|
|
322
|
+
}
|
|
323
|
+
return this.u32s;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
private fieldOffset(field: string): number {
|
|
327
|
+
const f = this.struct.fieldMap.get(field);
|
|
328
|
+
if (!f) {
|
|
329
|
+
throw new Error(
|
|
330
|
+
`StructView("${this.struct.name}"): unknown field "${field}". ` +
|
|
331
|
+
`Known: ${[...this.struct.fieldMap.keys()].join(", ")}`,
|
|
332
|
+
);
|
|
333
|
+
}
|
|
334
|
+
return f.offset / 4; // float index
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
set(field: string, value: number | ArrayLike<number> | Float32Array): void {
|
|
338
|
+
const f = this.struct.fieldMap.get(field);
|
|
339
|
+
if (!f) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
`StructView("${this.struct.name}"): unknown field "${field}"`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
const start = f.offset / 4;
|
|
345
|
+
if (typeof value === "number") {
|
|
346
|
+
this.floats[start] = value;
|
|
347
|
+
} else {
|
|
348
|
+
this.floats.set(value as ArrayLike<number>, start);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
setU32(field: string, value: number): void {
|
|
353
|
+
const f = this.struct.fieldMap.get(field);
|
|
354
|
+
if (!f) {
|
|
355
|
+
throw new Error(
|
|
356
|
+
`StructView("${this.struct.name}"): unknown field "${field}"`,
|
|
357
|
+
);
|
|
358
|
+
}
|
|
359
|
+
if (!f.isInt && f.type.wgsl !== "u32" && f.type.wgsl !== "i32") {
|
|
360
|
+
// Allow setU32 on any field but warn in strict? For packed-handle fields
|
|
361
|
+
// the engine uses u32. Keep it permissive — the caller knows the field.
|
|
362
|
+
}
|
|
363
|
+
const start = f.offset / 4;
|
|
364
|
+
this.u32View()[start] = value >>> 0;
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
get(field: string): Float32Array {
|
|
368
|
+
const f = this.struct.fieldMap.get(field);
|
|
369
|
+
if (!f) {
|
|
370
|
+
throw new Error(
|
|
371
|
+
`StructView("${this.struct.name}"): unknown field "${field}"`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
const start = f.offset / 4;
|
|
375
|
+
const count = f.type.size / 4;
|
|
376
|
+
return this.floats.subarray(start, start + count);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
getU32(field: string): number {
|
|
380
|
+
const f = this.struct.fieldMap.get(field);
|
|
381
|
+
if (!f) {
|
|
382
|
+
throw new Error(
|
|
383
|
+
`StructView("${this.struct.name}"): unknown field "${field}"`,
|
|
384
|
+
);
|
|
385
|
+
}
|
|
386
|
+
const start = f.offset / 4;
|
|
387
|
+
return this.u32View()[start];
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
zero(): void {
|
|
391
|
+
this.floats.fill(0, 0, this.struct.floatCount);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
get size(): number {
|
|
395
|
+
return this.struct.size;
|
|
396
|
+
}
|
|
397
|
+
}
|