@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,375 @@
|
|
|
1
|
+
struct Uniforms {
|
|
2
|
+
viewProj: mat4x4<f32>,
|
|
3
|
+
cameraPos: vec3<f32>,
|
|
4
|
+
time: f32,
|
|
5
|
+
modelPos: vec3<f32>,
|
|
6
|
+
modelScale: vec3<f32>,
|
|
7
|
+
modelRot: vec4<f32>,
|
|
8
|
+
materialIndex: u32,
|
|
9
|
+
lightDirX: f32,
|
|
10
|
+
lightDirY: f32,
|
|
11
|
+
lightDirZ: f32,
|
|
12
|
+
lightAmbient: f32,
|
|
13
|
+
lightIntensity: f32,
|
|
14
|
+
// Per-draw highlight mode: 0 = normal shading, 1 = ghost hologram (cyan,
|
|
15
|
+
// used for the physgun's no-collision grab), 2 = hover outline (drawn by a
|
|
16
|
+
// separate inverted-hull pipeline — see vs_outline / fs_outline).
|
|
17
|
+
// Values >= 3 encode per-prop material overrides (spawn settings):
|
|
18
|
+
// combined = u32(highlight) - 3
|
|
19
|
+
// shaderMode = combined & 3 (0=Standard 1=Toon 2=Hologram 3=Outline)
|
|
20
|
+
// texMode = combined >> 2 (0=Default 1=Wireframe 2=Checker)
|
|
21
|
+
highlight: f32,
|
|
22
|
+
// Inverted-hull outline parameters (used by vs_outline / fs_outline only).
|
|
23
|
+
outlineWidth: f32,
|
|
24
|
+
outlineColor: vec3<f32>,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
@group(0) @binding(0) var<uniform> uniforms: Uniforms;
|
|
28
|
+
|
|
29
|
+
// Skin matrices for skinned meshes (@group(1)). A dynamic storage buffer of
|
|
30
|
+
// mat4x4<f32>, one per bone. Updated per-frame by the renderer via
|
|
31
|
+
// updateSkinMatrices(). Only bound when drawing skinned meshes.
|
|
32
|
+
@group(1) @binding(0) var<storage, read> skinMatrices: array<mat4x4<f32>>;
|
|
33
|
+
|
|
34
|
+
// Frame-global lighting (@group(2)): sun color, hemisphere ambient, point lights.
|
|
35
|
+
// Games that want colored lighting provide a compatible uniform buffer; the
|
|
36
|
+
// default bind group supplies a neutral white sun + no point lights so existing
|
|
37
|
+
// consumers see no visual change.
|
|
38
|
+
struct FrameLighting {
|
|
39
|
+
sunDir: vec3<f32>,
|
|
40
|
+
ambientIntensity: f32,
|
|
41
|
+
sunColor: vec3<f32>,
|
|
42
|
+
pointLightCount: u32,
|
|
43
|
+
skyAmbient: vec3<f32>,
|
|
44
|
+
_pad0: u32,
|
|
45
|
+
groundAmbient: vec3<f32>,
|
|
46
|
+
_pad1: u32,
|
|
47
|
+
pointLights: array<vec4<f32>, 16>,
|
|
48
|
+
};
|
|
49
|
+
@group(2) @binding(0) var<uniform> frameLighting: FrameLighting;
|
|
50
|
+
|
|
51
|
+
// Bindless material binding model (@group(3)):
|
|
52
|
+
// binding 0: material SSBO (read-only storage)
|
|
53
|
+
// bindings 1..8: texture_2d_array pages (rgba8unorm color textures)
|
|
54
|
+
// binding 9: shared sampler (repeat)
|
|
55
|
+
// binding 10: shared sampler (clamp)
|
|
56
|
+
struct BindlessMaterial {
|
|
57
|
+
baseColor: vec4<f32>,
|
|
58
|
+
roughness: f32,
|
|
59
|
+
metallic: f32,
|
|
60
|
+
emissiveIntensity: f32,
|
|
61
|
+
hasTexTransform: f32,
|
|
62
|
+
albedoTex: u32,
|
|
63
|
+
normalTex: u32,
|
|
64
|
+
metallicRoughnessTex: u32,
|
|
65
|
+
aoEmissiveTex: u32,
|
|
66
|
+
texOffset: vec2<f32>,
|
|
67
|
+
texScale: vec2<f32>,
|
|
68
|
+
texRotation: f32,
|
|
69
|
+
_pad0: f32,
|
|
70
|
+
_pad1: f32,
|
|
71
|
+
_pad2: f32,
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
@group(3) @binding(0) var<storage, read> bindlessMaterials: array<BindlessMaterial>;
|
|
75
|
+
@group(3) @binding(1) var albedoArray0: texture_2d_array<f32>;
|
|
76
|
+
@group(3) @binding(2) var albedoArray1: texture_2d_array<f32>;
|
|
77
|
+
@group(3) @binding(3) var albedoArray2: texture_2d_array<f32>;
|
|
78
|
+
@group(3) @binding(4) var albedoArray3: texture_2d_array<f32>;
|
|
79
|
+
@group(3) @binding(5) var albedoArray4: texture_2d_array<f32>;
|
|
80
|
+
@group(3) @binding(6) var albedoArray5: texture_2d_array<f32>;
|
|
81
|
+
@group(3) @binding(7) var albedoArray6: texture_2d_array<f32>;
|
|
82
|
+
@group(3) @binding(8) var albedoArray7: texture_2d_array<f32>;
|
|
83
|
+
@group(3) @binding(9) var bindlessSamplerRepeat: sampler;
|
|
84
|
+
@group(3) @binding(10) var bindlessSamplerClamp: sampler;
|
|
85
|
+
|
|
86
|
+
fn unpackArrayIndex(handle: u32) -> u32 { return (handle >> 16u) & 0xFFFFu; }
|
|
87
|
+
fn unpackLayerIndex(handle: u32) -> u32 { return handle & 0xFFFFu; }
|
|
88
|
+
|
|
89
|
+
fn sampleBindlessArray(arr: u32, uv: vec2<f32>, layer: u32) -> vec4<f32> {
|
|
90
|
+
// textureSample (auto-LOD) so mipmapped registrations actually filter;
|
|
91
|
+
// single-mip textures behave identically to textureSampleLevel(..., 0.0).
|
|
92
|
+
switch (arr) {
|
|
93
|
+
case 0u: { return textureSample(albedoArray0, bindlessSamplerRepeat, uv, layer); }
|
|
94
|
+
case 1u: { return textureSample(albedoArray1, bindlessSamplerRepeat, uv, layer); }
|
|
95
|
+
case 2u: { return textureSample(albedoArray2, bindlessSamplerRepeat, uv, layer); }
|
|
96
|
+
case 3u: { return textureSample(albedoArray3, bindlessSamplerRepeat, uv, layer); }
|
|
97
|
+
case 4u: { return textureSample(albedoArray4, bindlessSamplerRepeat, uv, layer); }
|
|
98
|
+
case 5u: { return textureSample(albedoArray5, bindlessSamplerRepeat, uv, layer); }
|
|
99
|
+
case 6u: { return textureSample(albedoArray6, bindlessSamplerRepeat, uv, layer); }
|
|
100
|
+
case 7u: { return textureSample(albedoArray7, bindlessSamplerRepeat, uv, layer); }
|
|
101
|
+
default: { return vec4<f32>(1.0, 1.0, 1.0, 1.0); }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
struct VertexInput {
|
|
106
|
+
@location(0) position: vec3<f32>,
|
|
107
|
+
@location(1) normal: vec3<f32>,
|
|
108
|
+
@location(2) uv: vec2<f32>,
|
|
109
|
+
@location(3) color: vec3<f32>,
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Skinned vertex input — extends VertexInput with joints (4 bone indices,
|
|
113
|
+
// packed as vec4<u32>) and weights (4 normalized bone weights). Lives in a
|
|
114
|
+
// second vertex buffer slot (buffer index 1).
|
|
115
|
+
struct SkinnedVertexInput {
|
|
116
|
+
@location(0) position: vec3<f32>,
|
|
117
|
+
@location(1) normal: vec3<f32>,
|
|
118
|
+
@location(2) uv: vec2<f32>,
|
|
119
|
+
@location(3) color: vec3<f32>,
|
|
120
|
+
@location(4) joints: vec4<u32>,
|
|
121
|
+
@location(5) weights: vec4<f32>,
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
struct VertexOutput {
|
|
125
|
+
@builtin(position) clipPos: vec4<f32>,
|
|
126
|
+
@location(0) worldPos: vec3<f32>,
|
|
127
|
+
@location(1) normal: vec3<f32>,
|
|
128
|
+
@location(2) uv: vec2<f32>,
|
|
129
|
+
@location(3) color: vec3<f32>,
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// Build a tangent basis from the geometric normal. Uses a reference vector
|
|
133
|
+
// instead of screen-space derivatives (dpdx/dpdy) which can produce NaN on
|
|
134
|
+
// some implementations / degenerate UVs. The tangent direction is arbitrary
|
|
135
|
+
// (determined by the reference vector) but is sufficient for normal mapping
|
|
136
|
+
// on meshes without explicit tangent attributes.
|
|
137
|
+
fn buildTangentBasis(N: vec3<f32>, worldPos: vec4<f32>, uv: vec2<f32>) -> mat3x3<f32> {
|
|
138
|
+
var refVec = vec3<f32>(0.0, 1.0, 0.0);
|
|
139
|
+
if (abs(N.y) >= 0.99) {
|
|
140
|
+
refVec = vec3<f32>(1.0, 0.0, 0.0);
|
|
141
|
+
}
|
|
142
|
+
let T = normalize(cross(refVec, N));
|
|
143
|
+
let B = cross(N, T);
|
|
144
|
+
return mat3x3<f32>(T, B, N);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Sample the normal map and perturb the geometric normal. Returns the
|
|
148
|
+
// perturbed world-space normal. If the material has no normal map (normalTex
|
|
149
|
+
// points at the default white texture), the sampled tangent-space normal is
|
|
150
|
+
// (0.5, 0.5, 1.0) → unpacked to (0, 0, 1) → no perturbation.
|
|
151
|
+
fn perturbNormal(N: vec3<f32>, worldPos: vec4<f32>, uv: vec2<f32>, normalTexHandle: u32) -> vec3<f32> {
|
|
152
|
+
let arr = unpackArrayIndex(normalTexHandle);
|
|
153
|
+
let layer = unpackLayerIndex(normalTexHandle);
|
|
154
|
+
let sampled = sampleBindlessArray(arr, uv, layer);
|
|
155
|
+
let tangentNormal = sampled.xyz * 2.0 - 1.0;
|
|
156
|
+
let basis = buildTangentBasis(N, worldPos, uv);
|
|
157
|
+
return normalize(basis * tangentNormal);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
fn qrotate(q: vec4<f32>, v: vec3<f32>) -> vec3<f32> {
|
|
161
|
+
return v + 2.0 * cross(q.xyz, cross(q.xyz, v) + q.w * v);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Accumulate the 4-bone skinning matrix: sum(weights[i] * skinMatrices[joint[i]]).
|
|
165
|
+
// If all weights are zero (vertex has no bone assignment), return identity so
|
|
166
|
+
// the vertex renders at its baked position instead of collapsing to the origin.
|
|
167
|
+
fn skinMatrix(j: vec4<u32>, w: vec4<f32>) -> mat4x4<f32> {
|
|
168
|
+
let m = skinMatrices[j.x] * w.x
|
|
169
|
+
+ skinMatrices[j.y] * w.y
|
|
170
|
+
+ skinMatrices[j.z] * w.z
|
|
171
|
+
+ skinMatrices[j.w] * w.w;
|
|
172
|
+
let wsum = w.x + w.y + w.z + w.w;
|
|
173
|
+
if (wsum < 0.001) {
|
|
174
|
+
return mat4x4<f32>(
|
|
175
|
+
vec4(1.0, 0.0, 0.0, 0.0),
|
|
176
|
+
vec4(0.0, 1.0, 0.0, 0.0),
|
|
177
|
+
vec4(0.0, 0.0, 1.0, 0.0),
|
|
178
|
+
vec4(0.0, 0.0, 0.0, 1.0),
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
return m;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
@vertex
|
|
185
|
+
fn vs_main(input: VertexInput) -> VertexOutput {
|
|
186
|
+
var output: VertexOutput;
|
|
187
|
+
let scaled = input.position * uniforms.modelScale;
|
|
188
|
+
let rotated = qrotate(uniforms.modelRot, scaled);
|
|
189
|
+
let worldPos = rotated + uniforms.modelPos;
|
|
190
|
+
output.worldPos = worldPos;
|
|
191
|
+
output.clipPos = uniforms.viewProj * vec4<f32>(worldPos, 1.0);
|
|
192
|
+
output.normal = normalize(qrotate(uniforms.modelRot, input.normal));
|
|
193
|
+
output.uv = input.uv;
|
|
194
|
+
output.color = input.color;
|
|
195
|
+
return output;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Skinned vertex entry point. Applies linear blend skinning in model space
|
|
199
|
+
// (skinMatrices already encode bone-world * inverseBind), then the same
|
|
200
|
+
// model transform (scale/rot/pos) as vs_main.
|
|
201
|
+
@vertex
|
|
202
|
+
fn vs_skinned(input: SkinnedVertexInput) -> VertexOutput {
|
|
203
|
+
var output: VertexOutput;
|
|
204
|
+
let sm = skinMatrix(input.joints, input.weights);
|
|
205
|
+
let skinnedPos = (sm * vec4<f32>(input.position, 1.0)).xyz;
|
|
206
|
+
let skinnedNormal = (sm * vec4<f32>(input.normal, 0.0)).xyz;
|
|
207
|
+
|
|
208
|
+
let scaled = skinnedPos * uniforms.modelScale;
|
|
209
|
+
let rotated = qrotate(uniforms.modelRot, scaled);
|
|
210
|
+
let worldPos = rotated + uniforms.modelPos;
|
|
211
|
+
output.worldPos = worldPos;
|
|
212
|
+
output.clipPos = uniforms.viewProj * vec4<f32>(worldPos, 1.0);
|
|
213
|
+
output.normal = normalize(qrotate(uniforms.modelRot, normalize(skinnedNormal)));
|
|
214
|
+
output.uv = input.uv;
|
|
215
|
+
output.color = input.color;
|
|
216
|
+
return output;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
@fragment
|
|
220
|
+
fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
|
|
221
|
+
let geometricN = normalize(input.normal);
|
|
222
|
+
|
|
223
|
+
// Bindless material lookup (needed for normal map handle + albedo).
|
|
224
|
+
let m = bindlessMaterials[uniforms.materialIndex];
|
|
225
|
+
|
|
226
|
+
// Perturb the normal using the material's normal map (if any). Materials
|
|
227
|
+
// without a normal map use the default flat-normal texture (0.5,0.5,1.0)
|
|
228
|
+
// → unpacked to (0,0,1) → no perturbation.
|
|
229
|
+
let N = perturbNormal(geometricN, vec4<f32>(input.worldPos, 1.0), input.uv, m.normalTex);
|
|
230
|
+
|
|
231
|
+
// Decode per-prop material overrides (highlight >= 3).
|
|
232
|
+
var shaderMode = 0u;
|
|
233
|
+
var texMode = 0u;
|
|
234
|
+
if (uniforms.highlight >= 3.0) {
|
|
235
|
+
let combined = u32(uniforms.highlight) - 3u;
|
|
236
|
+
shaderMode = combined & 3u;
|
|
237
|
+
texMode = combined >> 2u;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Colored directional sun light — matches the procedural cube/sphere shader.
|
|
241
|
+
let sunDir = normalize(frameLighting.sunDir);
|
|
242
|
+
var ndotl = max(dot(N, sunDir), 0.0);
|
|
243
|
+
// Toon shader override: quantize the sun term into discrete bands.
|
|
244
|
+
if (shaderMode == 1u) {
|
|
245
|
+
ndotl = floor(ndotl * 3.0 + 0.5) / 3.0;
|
|
246
|
+
ndotl = max(ndotl, 0.15);
|
|
247
|
+
}
|
|
248
|
+
let sunDiffuse = ndotl * frameLighting.sunColor;
|
|
249
|
+
|
|
250
|
+
// Hemisphere ambient: blend sky/ground based on normal.y (same as cube shader).
|
|
251
|
+
let hemiMix = N.y * 0.5 + 0.5;
|
|
252
|
+
let hemisphere = mix(frameLighting.groundAmbient, frameLighting.skyAmbient, hemiMix);
|
|
253
|
+
let ambient = hemisphere * frameLighting.ambientIntensity;
|
|
254
|
+
|
|
255
|
+
// Bindless albedo sample: index the material SSBO by materialIndex, then
|
|
256
|
+
// sample the texture_2d_array page/layer the material points at.
|
|
257
|
+
let arr = unpackArrayIndex(m.albedoTex);
|
|
258
|
+
let layer = unpackLayerIndex(m.albedoTex);
|
|
259
|
+
let texColor = sampleBindlessArray(arr, input.uv, layer);
|
|
260
|
+
|
|
261
|
+
// All inputs are sRGB: texture (rgba8unorm), vertex color (white), and
|
|
262
|
+
// baseColor (parser converts FBX linear DiffuseColor to sRGB). The swapchain
|
|
263
|
+
// is non-sRGB (bgra8unorm), so output sRGB directly.
|
|
264
|
+
var baseColor = texColor.rgb * input.color * m.baseColor.rgb;
|
|
265
|
+
|
|
266
|
+
// ── Texture override modes ──
|
|
267
|
+
// Wireframe: darken albedo, UV-grid lines overlaid after lighting.
|
|
268
|
+
// Checker: two-tone checkerboard over the UVs.
|
|
269
|
+
var texLine = 0.0;
|
|
270
|
+
if (texMode == 1u) {
|
|
271
|
+
let g = fract(input.uv * 6.0);
|
|
272
|
+
let lx = min(g.x, 1.0 - g.x);
|
|
273
|
+
let ly = min(g.y, 1.0 - g.y);
|
|
274
|
+
texLine = 1.0 - smoothstep(0.0, 0.08, min(lx, ly));
|
|
275
|
+
baseColor = baseColor * 0.15;
|
|
276
|
+
} else if (texMode == 2u) {
|
|
277
|
+
let cell = floor(input.uv * 8.0);
|
|
278
|
+
let check = (cell.x + cell.y) - floor((cell.x + cell.y) * 0.5) * 2.0;
|
|
279
|
+
baseColor = mix(baseColor * 0.35, baseColor * 1.4 + vec3<f32>(0.08), check);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
// Channel-inspection modes — bypass lighting entirely for material review.
|
|
283
|
+
// 3 = perturbed normals (normal-map contribution visible), 4 = unlit albedo
|
|
284
|
+
// (texture/baseColor only), 5 = geometric normals (no normal map).
|
|
285
|
+
if (texMode == 3u) { return vec4<f32>(N * 0.5 + vec3<f32>(0.5), 1.0); }
|
|
286
|
+
if (texMode == 4u) { return vec4<f32>(baseColor, 1.0); }
|
|
287
|
+
if (texMode == 5u) { return vec4<f32>(geometricN * 0.5 + vec3<f32>(0.5), 1.0); }
|
|
288
|
+
|
|
289
|
+
var litColor = baseColor * (ambient + sunDiffuse);
|
|
290
|
+
|
|
291
|
+
// Point lights (up to 8). Each light is 2 vec4s: (pos.xyz, radius) + (color.rgb, intensity).
|
|
292
|
+
let plCount = frameLighting.pointLightCount;
|
|
293
|
+
for (var i = 0u; i < plCount; i++) {
|
|
294
|
+
let pl0 = frameLighting.pointLights[i * 2u];
|
|
295
|
+
let pl1 = frameLighting.pointLights[i * 2u + 1u];
|
|
296
|
+
let plPos = pl0.xyz;
|
|
297
|
+
let plRadius = pl0.w;
|
|
298
|
+
let plColor = pl1.xyz;
|
|
299
|
+
let plIntensity = pl1.w;
|
|
300
|
+
let L = plPos - input.worldPos;
|
|
301
|
+
let dist = length(L);
|
|
302
|
+
if (dist < plRadius) {
|
|
303
|
+
let atten = 1.0 / (1.0 + dist * dist / (plRadius * plRadius));
|
|
304
|
+
let ndotl_pl = max(dot(N, normalize(L)), 0.0);
|
|
305
|
+
litColor += baseColor * plColor * plIntensity * atten * ndotl_pl;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
// Wireframe overlay: paint the UV-grid lines in a bright tint.
|
|
310
|
+
if (texLine > 0.0) {
|
|
311
|
+
litColor = mix(litColor, vec3<f32>(0.55, 0.95, 1.0), texLine * 0.9);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// Distance fog — anchored to the camera→model distance so it scales with
|
|
315
|
+
// the subject instead of a fixed 400m absolute (a 200m model viewed from
|
|
316
|
+
// 500m would otherwise fog to the ambient color entirely). Small models
|
|
317
|
+
// near the camera keep the original ~400m reach.
|
|
318
|
+
let modelDist = length(uniforms.cameraPos - uniforms.modelPos);
|
|
319
|
+
let fogStart = max(modelDist * 1.5, 60.0);
|
|
320
|
+
let fogEnd = max(modelDist * 4.0, 400.0);
|
|
321
|
+
let dist = length(uniforms.cameraPos - input.worldPos);
|
|
322
|
+
let fog = clamp(1.0 - (dist - fogStart) / (fogEnd - fogStart), 0.0, 1.0);
|
|
323
|
+
var outColor = mix(frameLighting.skyAmbient, litColor, fog);
|
|
324
|
+
|
|
325
|
+
// Outline shader override (shaderMode == 3): darken the body and add a
|
|
326
|
+
// bright fresnel rim so the prop reads with a bold cel edge.
|
|
327
|
+
if (shaderMode == 3u) {
|
|
328
|
+
let viewDir = normalize(uniforms.cameraPos - input.worldPos);
|
|
329
|
+
let fresnel = pow(1.0 - max(dot(N, viewDir), 0.0), 3.0);
|
|
330
|
+
outColor = outColor * 0.7 + vec3<f32>(1.0, 0.95, 0.6) * smoothstep(0.35, 0.9, fresnel);
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
// Hologram shader override (shaderMode == 2): fresnel rim + scanline pulse
|
|
334
|
+
// tinted toward the prop's own base color. Opaque output (the pipeline has
|
|
335
|
+
// no blend state) but reads as a hologram.
|
|
336
|
+
if (shaderMode == 2u) {
|
|
337
|
+
let viewDir = normalize(uniforms.cameraPos - input.worldPos);
|
|
338
|
+
let fresnel = pow(1.0 - max(dot(N, viewDir), 0.0), 2.5);
|
|
339
|
+
let pulse = 0.65 + 0.35 * sin(uniforms.time * 5.0 + input.worldPos.y * 3.0);
|
|
340
|
+
let scan = 0.5 + 0.5 * sin((input.worldPos.y + uniforms.time * 2.0) * 20.0);
|
|
341
|
+
let holoBase = baseColor * vec3<f32>(0.3, 0.9, 1.1) + vec3<f32>(0.05, 0.2, 0.25);
|
|
342
|
+
let holoRim = vec3<f32>(0.7, 1.0, 1.0);
|
|
343
|
+
var holoCol = mix(holoBase, holoRim, fresnel) * pulse;
|
|
344
|
+
holoCol = holoCol + holoRim * scan * 0.15 * fresnel;
|
|
345
|
+
return vec4<f32>(holoCol, 1.0);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
// Ghost hologram override (highlight == 1): render the prop as a
|
|
349
|
+
// translucent-looking cyan shell with a fresnel rim and a vertical
|
|
350
|
+
// scanline pulse so it's visually distinct from normally-grabbed (solid)
|
|
351
|
+
// props. Opaque output (the pipeline has no blend state) but reads as a
|
|
352
|
+
// hologram. Hover outline (highlight == 2) is handled by a separate
|
|
353
|
+
// inverted-hull draw — see vs_outline / fs_outline below.
|
|
354
|
+
if (uniforms.highlight > 0.5 && uniforms.highlight < 1.5) {
|
|
355
|
+
let viewDir = normalize(uniforms.cameraPos - input.worldPos);
|
|
356
|
+
let fresnel = pow(1.0 - max(dot(N, viewDir), 0.0), 2.5);
|
|
357
|
+
let pulse = 0.65 + 0.35 * sin(uniforms.time * 5.0 + input.worldPos.y * 3.0);
|
|
358
|
+
let scan = 0.5 + 0.5 * sin((input.worldPos.y + uniforms.time * 2.0) * 20.0);
|
|
359
|
+
let ghostBase = vec3<f32>(0.15, 0.75, 0.95);
|
|
360
|
+
let ghostRim = vec3<f32>(0.7, 1.0, 1.0);
|
|
361
|
+
var ghostCol = mix(ghostBase, ghostRim, fresnel) * pulse;
|
|
362
|
+
ghostCol = ghostCol + ghostRim * scan * 0.15 * fresnel;
|
|
363
|
+
return vec4<f32>(ghostCol, 1.0);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
return vec4<f32>(outColor, 1.0);
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
// ── Mask entry point for post-process outline ──
|
|
370
|
+
// Renders the model as solid white to a mask texture. Uses the same
|
|
371
|
+
// vertex shader as the normal render (vs_main / vs_skinned).
|
|
372
|
+
@fragment
|
|
373
|
+
fn fs_mask() -> @location(0) vec4f {
|
|
374
|
+
return vec4f(1.0, 1.0, 1.0, 1.0);
|
|
375
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// feed-input — bridge from the 'gamepad-devices' device table into the
|
|
3
|
+
// per-player 'game-input' channel (InputBufferWriter). Renderer-side helper:
|
|
4
|
+
// games call this once per player per frame inside their input pass.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
|
|
7
|
+
import { INP_FLAG, type InputBufferWriter } from "@downdraft/engine/sab/game-input";
|
|
8
|
+
import {
|
|
9
|
+
GamepadDevicesReader,
|
|
10
|
+
type GamepadDeviceSlot,
|
|
11
|
+
} from "@downdraft/engine/sab/gamepad-devices";
|
|
12
|
+
|
|
13
|
+
const AXIS_COUNT = 8;
|
|
14
|
+
const BTN_COUNT = 32;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Synthesize a keyboard key-press from a pad control. Lets games keep their
|
|
18
|
+
* existing key-driven sims/UI while gaining controller support — the pad
|
|
19
|
+
* writes real key bits into the same `keys` bitmask.
|
|
20
|
+
*/
|
|
21
|
+
export interface PadKeyBinding {
|
|
22
|
+
/** KEY.* code to set in the input channel when the pad control is active. */
|
|
23
|
+
key: number;
|
|
24
|
+
/** GP_BTN bit index that activates the key. */
|
|
25
|
+
button?: number;
|
|
26
|
+
/** GP_AXIS index that activates the key (one half of the axis). */
|
|
27
|
+
axis?: number;
|
|
28
|
+
/** Which direction of the axis activates: -1 = negative, +1 = positive. */
|
|
29
|
+
axisDir?: -1 | 1;
|
|
30
|
+
/** Axis magnitude required to activate (default 0.5). */
|
|
31
|
+
threshold?: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Write one device-table slot into a player's game-input fields:
|
|
36
|
+
* axes 0..7 → gpAxes (lx ly rx ry lt rt dpadX dpadY)
|
|
37
|
+
* buttonsLo → gpBtn bitmask (W3C standard order)
|
|
38
|
+
* bindings → optional synthesized key bits (applied on top of DOM keys)
|
|
39
|
+
* sets/clears the INP_FLAG.HAS_GAMEPAD flag accordingly.
|
|
40
|
+
*/
|
|
41
|
+
export function writePadToInput(
|
|
42
|
+
writer: InputBufferWriter,
|
|
43
|
+
reader: GamepadDevicesReader,
|
|
44
|
+
playerIdx: number,
|
|
45
|
+
deviceSlot: number,
|
|
46
|
+
bindings?: readonly PadKeyBinding[],
|
|
47
|
+
out?: Partial<GamepadDeviceSlot>,
|
|
48
|
+
): void {
|
|
49
|
+
const d = reader.readSlot(deviceSlot, out);
|
|
50
|
+
if (!d) {
|
|
51
|
+
for (let i = 0; i < AXIS_COUNT; i++) writer.setGamepadAxis(playerIdx, i, 0);
|
|
52
|
+
for (let b = 0; b < BTN_COUNT; b++) writer.setGamepadButton(playerIdx, b, false);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
for (let i = 0; i < AXIS_COUNT; i++) writer.setGamepadAxis(playerIdx, i, d.axes[i]);
|
|
56
|
+
for (let b = 0; b < BTN_COUNT; b++) {
|
|
57
|
+
writer.setGamepadButton(playerIdx, b, (d.buttonsLo & (1 << b)) !== 0);
|
|
58
|
+
}
|
|
59
|
+
if (bindings) {
|
|
60
|
+
for (const bind of bindings) {
|
|
61
|
+
let active = false;
|
|
62
|
+
if (bind.button !== undefined) {
|
|
63
|
+
active = (d.buttonsLo & (1 << bind.button)) !== 0;
|
|
64
|
+
}
|
|
65
|
+
if (!active && bind.axis !== undefined) {
|
|
66
|
+
const v = d.axes[bind.axis];
|
|
67
|
+
const dir = bind.axisDir ?? 1;
|
|
68
|
+
const t = bind.threshold ?? 0.5;
|
|
69
|
+
active = dir > 0 ? v >= t : v <= -t;
|
|
70
|
+
}
|
|
71
|
+
if (active) writer.setKey(playerIdx, bind.key, true);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Get the reader for the host-provided gamepad channel, or null when the
|
|
77
|
+
* native backend isn't loaded. Memoized — construct once. */
|
|
78
|
+
export function getHostGamepadReader(): GamepadDevicesReader | null {
|
|
79
|
+
const sab = (globalThis as { __ddGamepad?: { sab?: SharedArrayBuffer } }).__ddGamepad?.sab;
|
|
80
|
+
return sab ? new GamepadDevicesReader(sab) : null;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export { INP_FLAG };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Device classification filters — ported from Ember's evdev.ts heuristics.
|
|
3
|
+
// Used to flag auxiliary devices (motion sensors, touchpads, IR cameras)
|
|
4
|
+
// that enumerate alongside a pad's primary input node, and to sanity-check
|
|
5
|
+
// whether a name looks gamepad-like at all.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
|
|
8
|
+
/** Name substrings that mark an aux node of a composite controller. */
|
|
9
|
+
const AUX_NAME_PATTERNS = [
|
|
10
|
+
"motion sensors",
|
|
11
|
+
"motion sensor",
|
|
12
|
+
"touchpad",
|
|
13
|
+
"accelerometer",
|
|
14
|
+
"gyro",
|
|
15
|
+
"gyroscope",
|
|
16
|
+
"imu",
|
|
17
|
+
"ir camera",
|
|
18
|
+
"nintendo wii remote accelerometer",
|
|
19
|
+
"msi amblink",
|
|
20
|
+
"sensor hub",
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
/** Name substrings indicating something that isn't a gamepad at all. */
|
|
24
|
+
const NON_GAMEPAD_PATTERNS = [
|
|
25
|
+
"keyboard",
|
|
26
|
+
"mouse",
|
|
27
|
+
"consumer control",
|
|
28
|
+
"system control",
|
|
29
|
+
"power button",
|
|
30
|
+
"video bus",
|
|
31
|
+
"lidar",
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
export function isAuxDeviceName(name: string): boolean {
|
|
35
|
+
const n = name.toLowerCase();
|
|
36
|
+
return AUX_NAME_PATTERNS.some((p) => n.includes(p));
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function isLikelyGamepadName(name: string): boolean {
|
|
40
|
+
const n = name.toLowerCase();
|
|
41
|
+
if (NON_GAMEPAD_PATTERNS.some((p) => n.includes(p))) return false;
|
|
42
|
+
return (
|
|
43
|
+
n.includes("gamepad") ||
|
|
44
|
+
n.includes("controller") ||
|
|
45
|
+
n.includes("joystick") ||
|
|
46
|
+
n.includes("pad") ||
|
|
47
|
+
n.includes("remote")
|
|
48
|
+
);
|
|
49
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Button glyph naming — pad-type-aware labels for UI prompts.
|
|
3
|
+
// Returns `{ set, glyph }` where `set` identifies the icon family a UI
|
|
4
|
+
// toolkit should draw from ("xbox", "playstation", "switch", ...) and `glyph`
|
|
5
|
+
// is the key inside it ("a", "cross", "dpad-up", ...).
|
|
6
|
+
// ============================================================================
|
|
7
|
+
|
|
8
|
+
import { GP_BTN, PadType, type PadTypeValue } from "@downdraft/engine/sab/gamepad-devices";
|
|
9
|
+
|
|
10
|
+
export interface GlyphResult {
|
|
11
|
+
set: string;
|
|
12
|
+
glyph: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const FACE: Record<string, [string, string, string, string]> = {
|
|
16
|
+
// south east west north
|
|
17
|
+
xbox: ["a", "b", "x", "y"],
|
|
18
|
+
playstation: ["cross", "circle", "square", "triangle"],
|
|
19
|
+
switch: ["b", "a", "y", "x"],
|
|
20
|
+
gamecube: ["a", "b", "x", "y"],
|
|
21
|
+
n64: ["a", "b", "c", "c"],
|
|
22
|
+
generic: ["a", "b", "x", "y"],
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const COMMON: Record<number, string> = {
|
|
26
|
+
[GP_BTN.LEFT_SHOULDER]: "lb",
|
|
27
|
+
[GP_BTN.RIGHT_SHOULDER]: "rb",
|
|
28
|
+
[GP_BTN.LEFT_TRIGGER_BTN]: "lt",
|
|
29
|
+
[GP_BTN.RIGHT_TRIGGER_BTN]: "rt",
|
|
30
|
+
[GP_BTN.SELECT]: "select",
|
|
31
|
+
[GP_BTN.START]: "start",
|
|
32
|
+
[GP_BTN.HOME]: "home",
|
|
33
|
+
[GP_BTN.LEFT_STICK]: "l3",
|
|
34
|
+
[GP_BTN.RIGHT_STICK]: "r3",
|
|
35
|
+
[GP_BTN.DPAD_UP]: "dpad-up",
|
|
36
|
+
[GP_BTN.DPAD_DOWN]: "dpad-down",
|
|
37
|
+
[GP_BTN.DPAD_LEFT]: "dpad-left",
|
|
38
|
+
[GP_BTN.DPAD_RIGHT]: "dpad-right",
|
|
39
|
+
[GP_BTN.CAPTURE]: "capture",
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
function setForType(t: PadTypeValue): string {
|
|
43
|
+
switch (t) {
|
|
44
|
+
case PadType.PS3:
|
|
45
|
+
case PadType.PS4:
|
|
46
|
+
case PadType.PS5:
|
|
47
|
+
return "playstation";
|
|
48
|
+
case PadType.SWITCH:
|
|
49
|
+
return "switch";
|
|
50
|
+
case PadType.GAMECUBE:
|
|
51
|
+
return "gamecube";
|
|
52
|
+
case PadType.N64:
|
|
53
|
+
return "n64";
|
|
54
|
+
case PadType.WIIMOTE:
|
|
55
|
+
return "wiimote";
|
|
56
|
+
case PadType.XBOX:
|
|
57
|
+
case PadType.STEAM:
|
|
58
|
+
case PadType.GENERIC:
|
|
59
|
+
return "xbox";
|
|
60
|
+
default:
|
|
61
|
+
return "generic";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** Glyph for a standard button bit on a pad of the given type. */
|
|
66
|
+
export function glyphFor(padType: PadTypeValue, bit: number): GlyphResult {
|
|
67
|
+
const set = setForType(padType);
|
|
68
|
+
if (bit >= GP_BTN.SOUTH && bit <= GP_BTN.NORTH) {
|
|
69
|
+
const face = FACE[set] ?? FACE.generic;
|
|
70
|
+
return { set, glyph: face[bit] };
|
|
71
|
+
}
|
|
72
|
+
const common = COMMON[bit];
|
|
73
|
+
if (common) {
|
|
74
|
+
// PlayStation names differ on shoulders/triggers/menu buttons.
|
|
75
|
+
if (set === "playstation") {
|
|
76
|
+
const ps: Record<string, string> = {
|
|
77
|
+
lb: "l1", rb: "r1", lt: "l2", rt: "r2",
|
|
78
|
+
select: "share", start: "options", home: "ps",
|
|
79
|
+
l3: "l3", r3: "r3", capture: "share",
|
|
80
|
+
};
|
|
81
|
+
return { set, glyph: ps[common] ?? common };
|
|
82
|
+
}
|
|
83
|
+
if (set === "switch") {
|
|
84
|
+
const sw: Record<string, string> = {
|
|
85
|
+
lb: "l", rb: "r", lt: "zl", rt: "zr",
|
|
86
|
+
select: "minus", start: "plus", home: "home", capture: "capture",
|
|
87
|
+
};
|
|
88
|
+
return { set, glyph: sw[common] ?? common };
|
|
89
|
+
}
|
|
90
|
+
return { set, glyph: common };
|
|
91
|
+
}
|
|
92
|
+
return { set, glyph: `btn-${bit}` };
|
|
93
|
+
}
|