@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,25 @@
|
|
|
1
|
+
# `@downdraft/engine/libraries/stickman`
|
|
2
|
+
|
|
3
|
+
Stickman/figure animation helpers — procedural character figures for prototyping and tests.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
bun add @downdraft/engine/libraries/stickman
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Key exports
|
|
12
|
+
|
|
13
|
+
- `ARM_LEN`
|
|
14
|
+
- `ARM_SWING`
|
|
15
|
+
- `DEFAULT_LINE_WIDTH`
|
|
16
|
+
- `ELBOW_BEND`
|
|
17
|
+
- `FOOT_LIFT`
|
|
18
|
+
- `HEAD_CY`
|
|
19
|
+
- `HEAD_R`
|
|
20
|
+
- `HEAD_SEGMENTS`
|
|
21
|
+
- `HIP_Y`
|
|
22
|
+
- `IDLE_ARM_OUT`
|
|
23
|
+
- …and 25 more
|
|
24
|
+
|
|
25
|
+
See the [Downdraft engine repository](https://github.com/knackstedt/downdraft) for architecture docs and examples.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export {
|
|
2
|
+
ARM_LEN, ARM_SWING, DEFAULT_LINE_WIDTH, ELBOW_BEND,
|
|
3
|
+
FOOT_LIFT, HEAD_CY,
|
|
4
|
+
HEAD_R,
|
|
5
|
+
HEAD_SEGMENTS, HIP_Y, IDLE_ARM_OUT, IDLE_SWING, JUMP_ARM_SWING, JUMP_LEG_SWING, KNEE_BEND, LEG_LEN, LEG_SWING, NECK_Y, PLAYER_H, PLAYER_W, SHOULDER_Y, UPPER_LIMB_FRAC
|
|
6
|
+
} from "./proportions";
|
|
7
|
+
|
|
8
|
+
export {
|
|
9
|
+
computeSkeleton, getHeadRadius, STICKMAN_FLOATS_PER_SEGMENT, STICKMAN_SEGMENT_COUNT, STICKMAN_SKELETON_FLOATS, type StickmanPose
|
|
10
|
+
} from "./skeleton";
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
buildThickLineIndices,
|
|
14
|
+
buildThickLineVertices, STICKMAN_INDEX_COUNT, STICKMAN_VERTEX_COUNT, STICKMAN_VERTEX_STRIDE, type ThickLineGeometry
|
|
15
|
+
} from "./thick-line";
|
|
16
|
+
|
|
17
|
+
export { STICKMAN_WGSL } from "./shader";
|
|
18
|
+
|
|
19
|
+
export { StickmanPass } from "./stickman-pass";
|
|
20
|
+
export type { StickmanDrawState } from "./stickman-pass";
|
|
21
|
+
|
|
22
|
+
// Declarative library descriptor
|
|
23
|
+
export { StickmanLib, StickmanTok } from "./library";
|
|
24
|
+
export type { StickmanLibConfig } from "./library";
|
|
25
|
+
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// StickmanLib — declarative engine library descriptor for @downdraft/engine/libraries/stickman
|
|
3
|
+
//
|
|
4
|
+
// Games declare `libraries: [StickmanLib]` in their GameModule. The host
|
|
5
|
+
// provides the stickman skeleton computation function (sim-side) via a typed
|
|
6
|
+
// token.
|
|
7
|
+
//
|
|
8
|
+
// Games that need full control can still import computeSkeleton, the
|
|
9
|
+
// thick-line geometry builders, and STICKMAN_WGSL directly (escape hatch).
|
|
10
|
+
//
|
|
11
|
+
// NOTE: This package does not declare a dependency on @downdraft/engine in its
|
|
12
|
+
// package.json. We use a type-only import for EngineLibrary (erased at compile
|
|
13
|
+
// time) and a relative import for the resourceToken runtime function.
|
|
14
|
+
// ============================================================================
|
|
15
|
+
|
|
16
|
+
import { resourceToken, type EngineLibrary } from "@downdraft/engine";
|
|
17
|
+
import { computeSkeleton } from "./skeleton";
|
|
18
|
+
|
|
19
|
+
// ── Config ──
|
|
20
|
+
|
|
21
|
+
export interface StickmanLibConfig {
|
|
22
|
+
// Stickman is a pure computation utility — no runtime config needed.
|
|
23
|
+
// Config slot reserved for future options (e.g. custom proportions).
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// ── Typed tokens (DI) ──
|
|
27
|
+
|
|
28
|
+
/** Token for the sim-side stickman skeleton computation function. */
|
|
29
|
+
export const StickmanTok = resourceToken<typeof computeSkeleton>("stickman:skeleton");
|
|
30
|
+
|
|
31
|
+
// ── Descriptor ──
|
|
32
|
+
|
|
33
|
+
export const StickmanLib: EngineLibrary<StickmanLibConfig> = {
|
|
34
|
+
name: "stickman",
|
|
35
|
+
version: "1.0.0",
|
|
36
|
+
|
|
37
|
+
provides: [StickmanTok],
|
|
38
|
+
|
|
39
|
+
sim: {
|
|
40
|
+
create(_config, ctx) {
|
|
41
|
+
// The stickman library is a pure computation utility — no stateful
|
|
42
|
+
// system to instantiate. We provide the computeSkeleton function so
|
|
43
|
+
// sim systems can inject it and call it per-entity per-tick.
|
|
44
|
+
ctx.provide(StickmanTok, computeSkeleton);
|
|
45
|
+
return computeSkeleton;
|
|
46
|
+
},
|
|
47
|
+
dispose(_system) {
|
|
48
|
+
// Pure function — no resources to free.
|
|
49
|
+
},
|
|
50
|
+
// tick is game-specific (calls computeSkeleton per player entity with
|
|
51
|
+
// the entity's pose, uploads the result to a thick-line vertex buffer)
|
|
52
|
+
// — games wire this via onReady.
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
tickPhase: "post-physics",
|
|
56
|
+
|
|
57
|
+
// No renderer setup — stickman rendering is game-specific (the game
|
|
58
|
+
// creates a render pass using STICKMAN_WGSL + thick-line geometry).
|
|
59
|
+
|
|
60
|
+
defaultConfig: {},
|
|
61
|
+
};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Stickman proportions in world-cell units.
|
|
2
|
+
//
|
|
3
|
+
// All offsets are relative to `topY = py` (the top of the player's bounding
|
|
4
|
+
// box) and `cx = px` (the horizontal center). `py` increases downward (screen
|
|
5
|
+
// convention), so larger Y = lower on screen. The player's bounding box is
|
|
6
|
+
// PLAYER_W cells wide and PLAYER_H cells tall; the feet land at
|
|
7
|
+
// `topY + PLAYER_H`.
|
|
8
|
+
//
|
|
9
|
+
// These constants are the single source of truth shared by:
|
|
10
|
+
// - the WGSL stickman shader (via computeSkeleton)
|
|
11
|
+
// - the DOM/SVG NPC overlay in games that use stickman rendering
|
|
12
|
+
//
|
|
13
|
+
// Keep them in sync with the player collision box in each game.
|
|
14
|
+
|
|
15
|
+
export const PLAYER_W = 3;
|
|
16
|
+
export const PLAYER_H = 7;
|
|
17
|
+
|
|
18
|
+
// Vertical joint offsets from topY (top of bounding box).
|
|
19
|
+
export const HEAD_CY = 1.0; // head center Y
|
|
20
|
+
export const HEAD_R = 0.8; // head radius (cells)
|
|
21
|
+
export const HEAD_SEGMENTS = 24; // circle outline segment count (smooth circle)
|
|
22
|
+
export const NECK_Y = 1.8; // neck (top of spine)
|
|
23
|
+
export const SHOULDER_Y = 2.2; // shoulder pivot
|
|
24
|
+
export const HIP_Y = 4.5; // hip pivot (bottom of spine)
|
|
25
|
+
export const ARM_LEN = 1.5; // full arm length (shoulder -> hand)
|
|
26
|
+
export const LEG_LEN = 2.5; // full leg length (hip -> foot) — reaches AABB bottom
|
|
27
|
+
|
|
28
|
+
// 2-segment limb split: upper segment (shoulder->elbow / hip->knee) is this
|
|
29
|
+
// fraction of the full limb length; the remainder is the lower segment.
|
|
30
|
+
export const UPPER_LIMB_FRAC = 0.55;
|
|
31
|
+
|
|
32
|
+
// Walk-cycle / pose amplitudes (in cells, applied per-limb).
|
|
33
|
+
export const LEG_SWING = 0.5; // forward/back foot offset
|
|
34
|
+
export const ARM_SWING = 0.4; // forward/back hand offset
|
|
35
|
+
export const KNEE_BEND = 0.35; // knee lateral offset during walk
|
|
36
|
+
export const ELBOW_BEND = 0.25; // elbow lateral offset during walk
|
|
37
|
+
export const FOOT_LIFT = 0.45; // vertical foot lift during swing phase
|
|
38
|
+
export const IDLE_SWING = 0.05; // idle breathing amplitude
|
|
39
|
+
export const IDLE_ARM_OUT = 0.35; // idle: hands rest this far out from center
|
|
40
|
+
export const JUMP_LEG_SWING = 0.3;
|
|
41
|
+
export const JUMP_ARM_SWING = 0.5;
|
|
42
|
+
|
|
43
|
+
// Render defaults. Line width is in cell units so strokes scale with zoom
|
|
44
|
+
// (matches the SVG NPC overlay's strokeW = max(1, scale * 0.25)).
|
|
45
|
+
export const DEFAULT_LINE_WIDTH = 0.3;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Shared thick-line + SDF-circle stickman WGSL shader.
|
|
2
|
+
//
|
|
3
|
+
// Both games use this single shader. The per-game coordinate transform is
|
|
4
|
+
// baked into a uniform affine `u.transform` (cell coords -> NDC):
|
|
5
|
+
//
|
|
6
|
+
// ndc.xy = worldPos.xy * transform.xy + transform.zw
|
|
7
|
+
//
|
|
8
|
+
// 2D grid games: transform = (2/gridW, -2/gridH, -1, +1)
|
|
9
|
+
//
|
|
10
|
+
// Two segment types (detected via endpointB.z > 0):
|
|
11
|
+
// Line: extrudes a thick stroke perpendicular to the segment.
|
|
12
|
+
// Circle (head): expands quad to bounding box, fragment shader uses SDF
|
|
13
|
+
// to draw a perfect anti-aliased circle ring.
|
|
14
|
+
//
|
|
15
|
+
// Light/volumetric textures are sampled at the player's world position
|
|
16
|
+
// (half-res, matching the game's light-accum pass). 2D grid games may bind
|
|
17
|
+
// 1x1 white dummy textures so lighting is identity.
|
|
18
|
+
|
|
19
|
+
import type { WgslStruct } from "@downdraft/engine/shader-graph";
|
|
20
|
+
import { f32, vec2f, vec3f, vec4f, wgsl } from "@downdraft/engine/shader-graph";
|
|
21
|
+
|
|
22
|
+
// ─── Uniform structs (single source of truth for layout) ───────────────────
|
|
23
|
+
const StickmanUniformsStruct: WgslStruct = wgsl.struct("StickmanUniforms", {
|
|
24
|
+
transform: vec4f,
|
|
25
|
+
screenSize: vec2f,
|
|
26
|
+
lineWidth: f32,
|
|
27
|
+
color: vec3f,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export const STICKMAN_WGSL = /* wgsl */`
|
|
31
|
+
|
|
32
|
+
${StickmanUniformsStruct.wgsl}
|
|
33
|
+
|
|
34
|
+
@group(0) @binding(0) var<uniform> u: StickmanUniforms;
|
|
35
|
+
@group(0) @binding(1) var lightTex: texture_2d<f32>;
|
|
36
|
+
@group(0) @binding(2) var volumetricTex: texture_2d<f32>;
|
|
37
|
+
|
|
38
|
+
struct VertexInput {
|
|
39
|
+
@location(0) endpointA: vec3<f32>,
|
|
40
|
+
@location(1) endpointB: vec3<f32>,
|
|
41
|
+
@location(2) cornerVec: vec2<f32>,
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
struct VSOut {
|
|
45
|
+
@builtin(position) pos: vec4<f32>,
|
|
46
|
+
@location(0) color: vec3<f32>,
|
|
47
|
+
@location(1) worldPos: vec2<f32>,
|
|
48
|
+
@location(2) circleCenter: vec2<f32>, // valid only for circle segments
|
|
49
|
+
@location(3) circleRadius: f32, // > 0 for circle, 0 for line
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
fn worldToNdc(p: vec2<f32>) -> vec2<f32> {
|
|
53
|
+
return p * u.transform.xy + u.transform.zw;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@vertex
|
|
57
|
+
fn vs_main(input: VertexInput) -> VSOut {
|
|
58
|
+
let isCircle = input.endpointB.z > 0.0;
|
|
59
|
+
|
|
60
|
+
var out: VSOut;
|
|
61
|
+
out.color = u.color;
|
|
62
|
+
out.circleCenter = vec2<f32>(0.0, 0.0);
|
|
63
|
+
out.circleRadius = 0.0;
|
|
64
|
+
|
|
65
|
+
if (isCircle) {
|
|
66
|
+
// Head circle: expand quad to bounding box (center ± radius).
|
|
67
|
+
let center = input.endpointA.xy;
|
|
68
|
+
let radius = input.endpointB.z;
|
|
69
|
+
let worldPos = center + input.cornerVec * radius;
|
|
70
|
+
let ndcPos = worldToNdc(worldPos);
|
|
71
|
+
out.pos = vec4<f32>(ndcPos, 0.0, 1.0);
|
|
72
|
+
out.worldPos = worldPos;
|
|
73
|
+
out.circleCenter = center;
|
|
74
|
+
out.circleRadius = radius;
|
|
75
|
+
} else {
|
|
76
|
+
// Line segment: extrude thick stroke.
|
|
77
|
+
let a = input.endpointA.xy;
|
|
78
|
+
let b = input.endpointB.xy;
|
|
79
|
+
let ndcA = worldToNdc(a);
|
|
80
|
+
let ndcB = worldToNdc(b);
|
|
81
|
+
let dir = normalize(ndcB - ndcA);
|
|
82
|
+
let perp = vec2<f32>(-dir.y, dir.x);
|
|
83
|
+
let halfWidthNdc = u.lineWidth * abs(u.transform.x);
|
|
84
|
+
let offset = perp * input.cornerVec.y * halfWidthNdc;
|
|
85
|
+
let t = input.cornerVec.x;
|
|
86
|
+
let ndcPos = mix(ndcA, ndcB, t) + offset;
|
|
87
|
+
out.pos = vec4<f32>(ndcPos, 0.0, 1.0);
|
|
88
|
+
out.worldPos = mix(a, b, t);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@fragment
|
|
95
|
+
fn fs_main(in: VSOut) -> @location(0) vec4<f32> {
|
|
96
|
+
// Sample light + volumetric at the player's world position (half-res).
|
|
97
|
+
let lc = vec2<i32>(i32(in.worldPos.x) / 2, i32(in.worldPos.y) / 2);
|
|
98
|
+
let light = textureLoad(lightTex, lc, 0);
|
|
99
|
+
let vol = textureLoad(volumetricTex, lc, 0);
|
|
100
|
+
let lighting = light.rgb + vol.rgb;
|
|
101
|
+
|
|
102
|
+
if (in.circleRadius > 0.0) {
|
|
103
|
+
// Filled head disc with a soft anti-aliased rim (a thin ring read as a
|
|
104
|
+
// floating block at game zooms).
|
|
105
|
+
let dist = distance(in.worldPos, in.circleCenter);
|
|
106
|
+
let aa = 0.5;
|
|
107
|
+
let alpha = 1.0 - smoothstep(in.circleRadius - aa, in.circleRadius, dist);
|
|
108
|
+
if (alpha < 0.01) {
|
|
109
|
+
discard;
|
|
110
|
+
}
|
|
111
|
+
return vec4<f32>(in.color * lighting, alpha);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Line segment: opaque.
|
|
115
|
+
return vec4<f32>(in.color * lighting, 1.0);
|
|
116
|
+
}
|
|
117
|
+
`;
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
// Stickman skeleton computation — shared between games.
|
|
2
|
+
//
|
|
3
|
+
// Produces a flat list of line segments `[ax, ay, bx, by, ...]` in world-cell
|
|
4
|
+
// coordinates, given a pose. The wrapper uploads these into a thick-line quad
|
|
5
|
+
// vertex buffer each frame. Segment count is constant, so GPU buffers can be
|
|
6
|
+
// allocated once.
|
|
7
|
+
//
|
|
8
|
+
// Segment types:
|
|
9
|
+
// - Line segments: endpointA = start, endpointB = end (z=0), cornerVec = (t, side)
|
|
10
|
+
// - Circle segment (head): endpointA = (cx, cy, 0), endpointB = (cx, cy, radius),
|
|
11
|
+
// cornerVec = (cornerX, cornerY) where each is ±1. The shader detects
|
|
12
|
+
// circle mode via endpointB.z > 0 and renders a perfect SDF circle ring.
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
ARM_LEN,
|
|
16
|
+
ARM_SWING,
|
|
17
|
+
ELBOW_BEND,
|
|
18
|
+
FOOT_LIFT,
|
|
19
|
+
HEAD_CY,
|
|
20
|
+
HEAD_R,
|
|
21
|
+
HIP_Y,
|
|
22
|
+
IDLE_ARM_OUT,
|
|
23
|
+
IDLE_SWING,
|
|
24
|
+
JUMP_ARM_SWING,
|
|
25
|
+
JUMP_LEG_SWING,
|
|
26
|
+
KNEE_BEND,
|
|
27
|
+
LEG_LEN,
|
|
28
|
+
LEG_SWING,
|
|
29
|
+
NECK_Y,
|
|
30
|
+
SHOULDER_Y,
|
|
31
|
+
UPPER_LIMB_FRAC,
|
|
32
|
+
} from "./proportions";
|
|
33
|
+
|
|
34
|
+
export interface StickmanPose {
|
|
35
|
+
/** player center X in world cell coords */
|
|
36
|
+
cx: number;
|
|
37
|
+
/** player top-of-bounding-box Y in world cell coords (increases downward) */
|
|
38
|
+
topY: number;
|
|
39
|
+
/** 1 = facing right, -1 = facing left */
|
|
40
|
+
facing: number;
|
|
41
|
+
/** animation frame counter (ticks) */
|
|
42
|
+
animFrame: number;
|
|
43
|
+
/** horizontal velocity (cells/tick) — drives walk vs idle */
|
|
44
|
+
vx: number;
|
|
45
|
+
/** true if the player is on the ground */
|
|
46
|
+
onGround: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Segment layout: 1 head circle + 1 spine + 4 arm segs + 4 leg segs = 10.
|
|
50
|
+
export const STICKMAN_SEGMENT_COUNT = 1 + 1 + 4 + 4;
|
|
51
|
+
export const STICKMAN_FLOATS_PER_SEGMENT = 4;
|
|
52
|
+
export const STICKMAN_SKELETON_FLOATS = STICKMAN_SEGMENT_COUNT * STICKMAN_FLOATS_PER_SEGMENT;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Compute the stickman skeleton as a flat Float32Array of segment endpoints.
|
|
56
|
+
* The returned array is a fresh, exactly-sized buffer; reuse it via the
|
|
57
|
+
* optional `out` argument to avoid per-frame allocation.
|
|
58
|
+
*
|
|
59
|
+
* Segment 0 is the head circle: [centerX, centerY, centerX, centerY + radius*0].
|
|
60
|
+
* The thick-line builder encodes the radius in endpointB.z (see thick-line.ts).
|
|
61
|
+
*/
|
|
62
|
+
export function computeSkeleton(pose: StickmanPose, out?: Float32Array): Float32Array {
|
|
63
|
+
const seg = out && out.length >= STICKMAN_SKELETON_FLOATS ? out : new Float32Array(STICKMAN_SKELETON_FLOATS);
|
|
64
|
+
const { cx, topY, facing: f, animFrame, vx, onGround } = pose;
|
|
65
|
+
|
|
66
|
+
const headCx = cx;
|
|
67
|
+
const headCy = topY + HEAD_CY;
|
|
68
|
+
const neckX = cx, neckY = topY + NECK_Y;
|
|
69
|
+
const hipX = cx, hipY = topY + HIP_Y;
|
|
70
|
+
const shoulderX = cx, shoulderY = topY + SHOULDER_Y;
|
|
71
|
+
|
|
72
|
+
// --- Pose / swing ---
|
|
73
|
+
const moving = Math.abs(vx) > 0.01;
|
|
74
|
+
const inAir = !onGround;
|
|
75
|
+
const t = animFrame * 0.25;
|
|
76
|
+
const s = Math.sin(t);
|
|
77
|
+
|
|
78
|
+
let legSwingL: number, legSwingR: number, armSwingL: number, armSwingR: number;
|
|
79
|
+
let liftL: number, liftR: number;
|
|
80
|
+
// Bend amounts scale with pose: 0 at idle (straight limbs), dynamic during
|
|
81
|
+
// walk (more bend when foot is lifted), 1 during jump.
|
|
82
|
+
let kneeBendL: number, kneeBendR: number;
|
|
83
|
+
let elbowBendL: number, elbowBendR: number;
|
|
84
|
+
// At idle the hands rest slightly outward from the body center.
|
|
85
|
+
let armOutL: number, armOutR: number;
|
|
86
|
+
// Body bob: vertical offset during walk (whole skeleton dips and rises).
|
|
87
|
+
let bodyBob: number;
|
|
88
|
+
|
|
89
|
+
if (inAir) {
|
|
90
|
+
// Jump: legs apart + tucked, arms out.
|
|
91
|
+
legSwingL = JUMP_LEG_SWING; legSwingR = -JUMP_LEG_SWING;
|
|
92
|
+
armSwingL = -JUMP_ARM_SWING; armSwingR = JUMP_ARM_SWING;
|
|
93
|
+
liftL = FOOT_LIFT * 0.6; liftR = FOOT_LIFT * 0.6;
|
|
94
|
+
kneeBendL = 1; kneeBendR = 1;
|
|
95
|
+
elbowBendL = 1; elbowBendR = 1;
|
|
96
|
+
armOutL = 0; armOutR = 0;
|
|
97
|
+
bodyBob = 0;
|
|
98
|
+
} else if (moving) {
|
|
99
|
+
legSwingL = s * LEG_SWING; legSwingR = -s * LEG_SWING;
|
|
100
|
+
armSwingL = -s * ARM_SWING; armSwingR = s * ARM_SWING;
|
|
101
|
+
// Lift each foot during its forward swing phase.
|
|
102
|
+
const liftPhaseL = Math.max(0, s);
|
|
103
|
+
const liftPhaseR = Math.max(0, -s);
|
|
104
|
+
liftL = liftPhaseL * FOOT_LIFT;
|
|
105
|
+
liftR = liftPhaseR * FOOT_LIFT;
|
|
106
|
+
// Knee bends more when the foot is lifted, straightens when planted.
|
|
107
|
+
kneeBendL = liftPhaseL;
|
|
108
|
+
kneeBendR = liftPhaseR;
|
|
109
|
+
// Elbows bend slightly and constantly during walk.
|
|
110
|
+
elbowBendL = 0.5; elbowBendR = 0.5;
|
|
111
|
+
armOutL = 0; armOutR = 0;
|
|
112
|
+
// Body bobs up when a foot is lifted (mid-step), dips when both feet are near ground.
|
|
113
|
+
bodyBob = (liftPhaseL + liftPhaseR) * 0.15;
|
|
114
|
+
} else {
|
|
115
|
+
// Idle: gentle breathing sway, straight legs, arms resting outward.
|
|
116
|
+
const idle = Math.sin(animFrame * 0.05) * IDLE_SWING;
|
|
117
|
+
legSwingL = idle; legSwingR = -idle;
|
|
118
|
+
armSwingL = -idle; armSwingR = idle;
|
|
119
|
+
liftL = 0; liftR = 0;
|
|
120
|
+
kneeBendL = 0; kneeBendR = 0;
|
|
121
|
+
elbowBendL = 0; elbowBendR = 0;
|
|
122
|
+
armOutL = -IDLE_ARM_OUT + idle;
|
|
123
|
+
armOutR = IDLE_ARM_OUT - idle;
|
|
124
|
+
bodyBob = 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Apply body bob to the whole skeleton (shifts all joints up by bodyBob).
|
|
128
|
+
const bobY = -bodyBob; // negative = up (Y increases downward)
|
|
129
|
+
|
|
130
|
+
const headCyB = headCy + bobY;
|
|
131
|
+
const neckYB = neckY + bobY;
|
|
132
|
+
const shoulderYB = shoulderY + bobY;
|
|
133
|
+
const hipYB = hipY + bobY;
|
|
134
|
+
|
|
135
|
+
// --- Limb joints ---
|
|
136
|
+
const upperLegLen = LEG_LEN * UPPER_LIMB_FRAC;
|
|
137
|
+
const upperArmLen = ARM_LEN * UPPER_LIMB_FRAC;
|
|
138
|
+
|
|
139
|
+
// Knees: on the hip->foot line when bend=0 (straight leg); biased forward
|
|
140
|
+
// by KNEE_BEND when bend>0 (walk/jump). The knee X interpolates between
|
|
141
|
+
// the hip X (straight) and the foot X (fully bent forward).
|
|
142
|
+
const kneeLx = cx + legSwingL * f * UPPER_LIMB_FRAC + KNEE_BEND * f * kneeBendL;
|
|
143
|
+
const kneeLy = hipYB + upperLegLen;
|
|
144
|
+
const kneeRx = cx + legSwingR * f * UPPER_LIMB_FRAC - KNEE_BEND * f * kneeBendR;
|
|
145
|
+
const kneeRy = hipYB + upperLegLen;
|
|
146
|
+
|
|
147
|
+
const footLx = cx + legSwingL * f;
|
|
148
|
+
const footLy = hipYB + LEG_LEN - liftL;
|
|
149
|
+
const footRx = cx + legSwingR * f;
|
|
150
|
+
const footRy = hipYB + LEG_LEN - liftR;
|
|
151
|
+
|
|
152
|
+
// Hands + elbows.
|
|
153
|
+
const handLx = cx + armSwingL * f + armOutL;
|
|
154
|
+
const handLy = shoulderYB + ARM_LEN;
|
|
155
|
+
const handRx = cx + armSwingR * f + armOutR;
|
|
156
|
+
const handRy = shoulderYB + ARM_LEN;
|
|
157
|
+
|
|
158
|
+
const elbowLx = cx + armSwingL * f * UPPER_LIMB_FRAC + armOutL * UPPER_LIMB_FRAC - ELBOW_BEND * f * elbowBendL;
|
|
159
|
+
const elbowLy = shoulderYB + upperArmLen;
|
|
160
|
+
const elbowRx = cx + armSwingR * f * UPPER_LIMB_FRAC + armOutR * UPPER_LIMB_FRAC + ELBOW_BEND * f * elbowBendR;
|
|
161
|
+
const elbowRy = shoulderYB + upperArmLen;
|
|
162
|
+
|
|
163
|
+
// --- Emit segments ---
|
|
164
|
+
let i = 0;
|
|
165
|
+
const push = (ax: number, ay: number, bx: number, by: number) => {
|
|
166
|
+
seg[i++] = ax; seg[i++] = ay; seg[i++] = bx; seg[i++] = by;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
// Head circle: encoded as [centerX, centerY, centerX, centerY].
|
|
170
|
+
// The thick-line builder puts the radius in endpointB.z (see thick-line.ts).
|
|
171
|
+
push(headCx, headCyB, headCx, headCyB);
|
|
172
|
+
|
|
173
|
+
// Spine (neck -> hip).
|
|
174
|
+
push(neckX, neckYB, hipX, hipYB);
|
|
175
|
+
|
|
176
|
+
// Arms: shoulder -> elbow -> hand (2 segments each).
|
|
177
|
+
push(shoulderX, shoulderYB, elbowLx, elbowLy);
|
|
178
|
+
push(elbowLx, elbowLy, handLx, handLy);
|
|
179
|
+
push(shoulderX, shoulderYB, elbowRx, elbowRy);
|
|
180
|
+
push(elbowRx, elbowRy, handRx, handRy);
|
|
181
|
+
|
|
182
|
+
// Legs: hip -> knee -> foot (2 segments each).
|
|
183
|
+
push(hipX, hipYB, kneeLx, kneeLy);
|
|
184
|
+
push(kneeLx, kneeLy, footLx, footLy);
|
|
185
|
+
push(hipX, hipYB, kneeRx, kneeRy);
|
|
186
|
+
push(kneeRx, kneeRy, footRx, footRy);
|
|
187
|
+
|
|
188
|
+
return seg;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Get the head circle radius (used by the thick-line builder to encode it
|
|
193
|
+
* in the vertex data).
|
|
194
|
+
*/
|
|
195
|
+
export function getHeadRadius(): number {
|
|
196
|
+
return HEAD_R;
|
|
197
|
+
}
|