@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,107 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Plugin registry — tracks discovered plugins and resolves load order.
|
|
3
|
+
//
|
|
4
|
+
// Mirrors `ModuleRegistry` but operates on `PluginManifest`s and resolves
|
|
5
|
+
// order over BOTH `dependencies` (other plugin ids) and `requires` (stringly-
|
|
6
|
+
// typed plugin resource keys). A plugin that `requires` a key must load
|
|
7
|
+
// after whichever plugin `provides` it.
|
|
8
|
+
// ============================================================================
|
|
9
|
+
|
|
10
|
+
import type { PluginManifest } from "./manifest";
|
|
11
|
+
|
|
12
|
+
export class PluginRegistry {
|
|
13
|
+
private manifests: Map<string, PluginManifest> = new Map();
|
|
14
|
+
private loadOrder: string[] = [];
|
|
15
|
+
|
|
16
|
+
register(manifest: PluginManifest): void {
|
|
17
|
+
if (this.manifests.has(manifest.id)) {
|
|
18
|
+
throw new Error(`Plugin "${manifest.id}" is already registered`);
|
|
19
|
+
}
|
|
20
|
+
this.manifests.set(manifest.id, manifest);
|
|
21
|
+
this.loadOrder.push(manifest.id);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
unregister(id: string): void {
|
|
25
|
+
this.manifests.delete(id);
|
|
26
|
+
const idx = this.loadOrder.indexOf(id);
|
|
27
|
+
if (idx >= 0) this.loadOrder.splice(idx, 1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
get(id: string): PluginManifest | undefined {
|
|
31
|
+
return this.manifests.get(id);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
has(id: string): boolean {
|
|
35
|
+
return this.manifests.has(id);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
getAll(): PluginManifest[] {
|
|
39
|
+
return this.loadOrder.map((id) => this.manifests.get(id)!).filter(Boolean);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Resolve load order via topological sort over `dependencies` + `requires`.
|
|
44
|
+
* Plugins with no dependencies/providers come first.
|
|
45
|
+
*
|
|
46
|
+
* Throws on:
|
|
47
|
+
* - missing dependency (declared dep not registered)
|
|
48
|
+
* - missing provider (requires a key nobody provides)
|
|
49
|
+
* - cycle
|
|
50
|
+
*/
|
|
51
|
+
resolveOrder(): string[] {
|
|
52
|
+
// Build provider map: resourceKey → plugin id that provides it.
|
|
53
|
+
const providers = new Map<string, string>();
|
|
54
|
+
for (const m of this.getAll()) {
|
|
55
|
+
(m.provides ?? []).forEach((key) => {
|
|
56
|
+
if (providers.has(key)) {
|
|
57
|
+
throw new Error(
|
|
58
|
+
`Plugin resource "${key}" is provided by both "${providers.get(key)}" and "${m.id}".`,
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
providers.set(key, m.id);
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const visited = new Set<string>();
|
|
66
|
+
const result: string[] = [];
|
|
67
|
+
const visiting = new Set<string>();
|
|
68
|
+
|
|
69
|
+
const visit = (id: string): void => {
|
|
70
|
+
if (visited.has(id)) return;
|
|
71
|
+
if (visiting.has(id)) {
|
|
72
|
+
throw new Error(`Plugin dependency cycle detected at "${id}"`);
|
|
73
|
+
}
|
|
74
|
+
const m = this.manifests.get(id);
|
|
75
|
+
if (!m) {
|
|
76
|
+
throw new Error(`Plugin "${id}" is not registered (required as a dependency)`);
|
|
77
|
+
}
|
|
78
|
+
visiting.add(id);
|
|
79
|
+
|
|
80
|
+
// dependencies (other plugin ids)
|
|
81
|
+
(m.dependencies ?? []).forEach((dep) => {
|
|
82
|
+
const depId = dep.split("@")[0];
|
|
83
|
+
if (!this.manifests.has(depId)) {
|
|
84
|
+
throw new Error(`Plugin "${id}" depends on "${depId}" which is not registered`);
|
|
85
|
+
}
|
|
86
|
+
visit(depId);
|
|
87
|
+
});
|
|
88
|
+
// requires (resource keys → provider plugin id)
|
|
89
|
+
(m.requires ?? []).forEach((key) => {
|
|
90
|
+
const providerId = providers.get(key);
|
|
91
|
+
if (!providerId) {
|
|
92
|
+
throw new Error(
|
|
93
|
+
`Plugin "${id}" requires resource "${key}" which no registered plugin provides`,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
if (providerId !== id) visit(providerId);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
visiting.delete(id);
|
|
100
|
+
visited.add(id);
|
|
101
|
+
result.push(id);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
this.loadOrder.forEach((id) => { visit(id);; });
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Sandbox shim — worker-side global restriction.
|
|
3
|
+
//
|
|
4
|
+
// Runs INSIDE the plugin's sandbox worker (sandbox-worker.ts) BEFORE the
|
|
5
|
+
// plugin's entry module is imported. It deletes/overrides every global on
|
|
6
|
+
// `self` that is NOT in the granted allowlist, then dynamically imports the
|
|
7
|
+
// plugin entry.
|
|
8
|
+
//
|
|
9
|
+
// This is best-effort same-origin isolation. For strong security, remote
|
|
10
|
+
// workshop plugins run from a blob:/data: origin with CSP (Phase 2).
|
|
11
|
+
// ============================================================================
|
|
12
|
+
|
|
13
|
+
import type { PluginPermission } from "./manifest";
|
|
14
|
+
import { BASELINE_GLOBALS, computeGlobalAllowlist } from "./permissions";
|
|
15
|
+
|
|
16
|
+
/** Result of restrictGlobals: the kept allowlist plus a restore() that puts
|
|
17
|
+
* every trapped/deleted global back. Callers that restrict a shared thread
|
|
18
|
+
* (InlinePluginLoader) must run restore() when the plugin unloads. */
|
|
19
|
+
export interface RestrictResult {
|
|
20
|
+
keep: Set<string>;
|
|
21
|
+
restore: () => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Restrict `self` globals to the allowlist computed from `granted`.
|
|
26
|
+
* Replaces stripped globals with a throwing trap so a plugin that reaches for
|
|
27
|
+
* a denied capability gets a clear error rather than `undefined`.
|
|
28
|
+
*/
|
|
29
|
+
export function restrictGlobals(granted: ReadonlySet<PluginPermission>): RestrictResult {
|
|
30
|
+
const keep = computeGlobalAllowlist(granted);
|
|
31
|
+
const self = globalThis as Record<string, unknown>;
|
|
32
|
+
// Collect own + inherited enumerable keys of self.
|
|
33
|
+
const allKeys = new Set<string>();
|
|
34
|
+
for (const k of Object.getOwnPropertyNames(self)) allKeys.add(k);
|
|
35
|
+
// Don't strip the host bridge or baseline runtime globals.
|
|
36
|
+
BASELINE_GLOBALS.forEach((g) => { keep.add(g);; });
|
|
37
|
+
// Snapshot the original descriptors so the globals can be restored later.
|
|
38
|
+
const originals = new Map<string, PropertyDescriptor | undefined>();
|
|
39
|
+
for (const key of allKeys.values()) {
|
|
40
|
+
if (keep.has(key)) continue;
|
|
41
|
+
// Skip non-configurable / non-writable props silently (can't delete them).
|
|
42
|
+
const desc = Object.getOwnPropertyDescriptor(self, key);
|
|
43
|
+
if (desc && !desc.configurable && !desc.writable) continue;
|
|
44
|
+
if (!originals.has(key)) originals.set(key, desc);
|
|
45
|
+
try {
|
|
46
|
+
// Replace with a throwing trap so access yields a clear error.
|
|
47
|
+
Object.defineProperty(self, key, {
|
|
48
|
+
configurable: true,
|
|
49
|
+
get() {
|
|
50
|
+
throw new Error(
|
|
51
|
+
`[downdraft:plugin-sandbox] global "${key}" is not available — permission not granted.`,
|
|
52
|
+
);
|
|
53
|
+
},
|
|
54
|
+
set() {
|
|
55
|
+
throw new Error(
|
|
56
|
+
`[downdraft:plugin-sandbox] global "${key}" is not available — permission not granted.`,
|
|
57
|
+
);
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
} catch {
|
|
61
|
+
// If defineProperty fails, try a plain delete.
|
|
62
|
+
try {
|
|
63
|
+
delete self[key];
|
|
64
|
+
} catch {
|
|
65
|
+
/* give up — leave as-is */
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
keep,
|
|
71
|
+
restore() {
|
|
72
|
+
for (const [key, desc] of originals.entries()) {
|
|
73
|
+
try {
|
|
74
|
+
if (desc) {
|
|
75
|
+
Object.defineProperty(self, key, desc);
|
|
76
|
+
} else {
|
|
77
|
+
delete self[key];
|
|
78
|
+
}
|
|
79
|
+
} catch {
|
|
80
|
+
/* property may be non-configurable — leave as-is */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
originals.clear();
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Sandbox worker entry — runs inside a dedicated Web Worker per worker-js
|
|
3
|
+
// plugin. Receives an init message with the plugin entry URL + granted
|
|
4
|
+
// permissions, restricts globals, then imports the entry and calls its
|
|
5
|
+
// register() with a bridge-backed context.
|
|
6
|
+
//
|
|
7
|
+
// Bridge model: every host capability crosses the boundary as an async
|
|
8
|
+
// `__bridgeCall`/`__bridgeResponse` pair correlated by `callId`. The host
|
|
9
|
+
// side enforces an allowlist of methods and each context API enforces the
|
|
10
|
+
// plugin's permission grant — this worker just forwards calls.
|
|
11
|
+
//
|
|
12
|
+
// This file is the worker entry. The host spawns it with:
|
|
13
|
+
// new Worker(new URL("./sandbox-worker.ts", import.meta.url), { type: "module" })
|
|
14
|
+
// (the loader does this inline per the BaseWorkerHost Vite rule).
|
|
15
|
+
// ============================================================================
|
|
16
|
+
|
|
17
|
+
import type { PluginEntry, PluginHostCalls, ScriptPluginContext } from "./context";
|
|
18
|
+
import type { PluginPermission } from "./manifest";
|
|
19
|
+
import { restrictGlobals } from "./sandbox-shim";
|
|
20
|
+
|
|
21
|
+
/** Init message from the host. */
|
|
22
|
+
export interface SandboxInitMessage {
|
|
23
|
+
entryUrl: string;
|
|
24
|
+
granted: PluginPermission[];
|
|
25
|
+
/** Serialized context method names the host supports (for proxy wiring). */
|
|
26
|
+
contextId: string;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ── Bridge call machinery ──
|
|
30
|
+
|
|
31
|
+
let contextId = "";
|
|
32
|
+
let nextCallId = 1;
|
|
33
|
+
const pendingCalls = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void }>();
|
|
34
|
+
|
|
35
|
+
/** Invoke an allowlisted host method. Awaits the host's response. */
|
|
36
|
+
function bridgeCall(method: string, args: unknown[]): Promise<unknown> {
|
|
37
|
+
const callId = nextCallId++;
|
|
38
|
+
return new Promise((resolve, reject) => {
|
|
39
|
+
pendingCalls.set(callId, { resolve, reject });
|
|
40
|
+
(self as any).postMessage({ __bridgeCall: true, contextId, callId, method, args });
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Fire-and-forget bridge call (publish, subscribe — no meaningful result). */
|
|
45
|
+
function bridgeNotify(method: string, args: unknown[]): void {
|
|
46
|
+
(self as any).postMessage({ __bridgeCall: true, contextId, method, args });
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ── Worker-local state ──
|
|
50
|
+
|
|
51
|
+
const tickCallbacks = new Set<(dt: number, t: number) => void>();
|
|
52
|
+
const disposeCallbacks: Array<() => void> = [];
|
|
53
|
+
const eventHandlers = new Map<string, Set<(data: unknown) => void>>();
|
|
54
|
+
/** Local KV mirror — get/set/delete/keys are synchronous; save()/load()
|
|
55
|
+
* round-trip to the host's store via the bridge. */
|
|
56
|
+
const localState = new Map<string, unknown>();
|
|
57
|
+
|
|
58
|
+
// ── Message handling ──
|
|
59
|
+
|
|
60
|
+
self.addEventListener("message", (ev: MessageEvent) => {
|
|
61
|
+
const msg = ev.data;
|
|
62
|
+
if (!msg) return;
|
|
63
|
+
|
|
64
|
+
if (msg.__sandboxInit) {
|
|
65
|
+
void runPlugin(msg as SandboxInitMessage & { __sandboxInit: true });
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
if (msg.__bridgeResponse) {
|
|
69
|
+
const pending = pendingCalls.get(msg.callId);
|
|
70
|
+
if (pending) {
|
|
71
|
+
pendingCalls.delete(msg.callId);
|
|
72
|
+
if (msg.error !== undefined) {
|
|
73
|
+
pending.reject(new Error(msg.error));
|
|
74
|
+
} else {
|
|
75
|
+
pending.resolve(msg.result);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
// Host-driven tick → ctx.tick.onTick callbacks.
|
|
81
|
+
if (msg.__tick) {
|
|
82
|
+
for (const cb of tickCallbacks.values()) cb(msg.dt, msg.elapsedTime);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// Host-published event → local subscribers (registered via ctx.events.subscribe).
|
|
86
|
+
if (msg.__event) {
|
|
87
|
+
const set = eventHandlers.get(msg.event);
|
|
88
|
+
if (set) for (const h of set.values()) h(msg.data);
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (msg.__dispose) {
|
|
92
|
+
disposeCallbacks.forEach((cb) => {
|
|
93
|
+
try { cb(); } catch { /* dispose errors are non-fatal */ }
|
|
94
|
+
});
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
async function runPlugin(init: SandboxInitMessage): Promise<void> {
|
|
100
|
+
try {
|
|
101
|
+
contextId = init.contextId;
|
|
102
|
+
// 1. Restrict globals based on granted permissions.
|
|
103
|
+
restrictGlobals(new Set<PluginPermission>(init.granted));
|
|
104
|
+
|
|
105
|
+
// 2. Build the bridge-backed context and expose it as `ddPlugin`.
|
|
106
|
+
const ctx = makeBridgeContext(init.contextId, new Set(init.granted));
|
|
107
|
+
(self as any).ddPlugin = { ctx };
|
|
108
|
+
|
|
109
|
+
// 3. Dynamically import the plugin entry. @vite-ignore because the URL is
|
|
110
|
+
// dynamic (not statically analyzable).
|
|
111
|
+
const mod = await import(/* @vite-ignore */ init.entryUrl);
|
|
112
|
+
const entry: PluginEntry = mod.default ?? mod;
|
|
113
|
+
if (typeof entry.register !== "function") {
|
|
114
|
+
throw new Error(`Plugin entry "${init.entryUrl}" has no register() function`);
|
|
115
|
+
}
|
|
116
|
+
// 4. Call register.
|
|
117
|
+
await entry.register(ctx);
|
|
118
|
+
// 5. Notify host that registration completed.
|
|
119
|
+
(self as any).postMessage({ __sandboxReady: true, contextId: init.contextId });
|
|
120
|
+
} catch (e) {
|
|
121
|
+
// Report failures so the host's ready-wait rejects instead of hanging.
|
|
122
|
+
const err = e as Error;
|
|
123
|
+
(self as any).postMessage({
|
|
124
|
+
__sandboxError: true,
|
|
125
|
+
contextId: init.contextId,
|
|
126
|
+
error: `${err.message}\n${err.stack ?? ""}`,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Permissions that map to host-call methods (game mutation API). */
|
|
132
|
+
const HOST_CALL_PERMS: PluginPermission[] = ["assets", "ecs", "physics"];
|
|
133
|
+
const HOST_CALL_METHODS = [
|
|
134
|
+
"spawnProp",
|
|
135
|
+
"removeProp",
|
|
136
|
+
"setPhysics",
|
|
137
|
+
"getPhysics",
|
|
138
|
+
"applyImpulse",
|
|
139
|
+
"applyTorque",
|
|
140
|
+
"getAssetRef",
|
|
141
|
+
] as const;
|
|
142
|
+
|
|
143
|
+
/** Build a ScriptPluginContext that forwards calls to the host via postMessage. */
|
|
144
|
+
function makeBridgeContext(
|
|
145
|
+
pluginId: string,
|
|
146
|
+
granted: ReadonlySet<PluginPermission>,
|
|
147
|
+
): ScriptPluginContext {
|
|
148
|
+
const ctx: ScriptPluginContext = {
|
|
149
|
+
id: pluginId,
|
|
150
|
+
events: {
|
|
151
|
+
subscribe(event, handler) {
|
|
152
|
+
let set = eventHandlers.get(event);
|
|
153
|
+
if (!set) {
|
|
154
|
+
set = new Set();
|
|
155
|
+
eventHandlers.set(event, set);
|
|
156
|
+
// First local subscriber for this event — subscribe host-side too.
|
|
157
|
+
bridgeNotify("events.subscribe", [event]);
|
|
158
|
+
}
|
|
159
|
+
set.add(handler as (data: unknown) => void);
|
|
160
|
+
return () => set!.delete(handler as (data: unknown) => void);
|
|
161
|
+
},
|
|
162
|
+
publish(event, data) {
|
|
163
|
+
// Route through the host's shared bus — it echoes back to every
|
|
164
|
+
// subscriber (including this worker's own, if subscribed), so
|
|
165
|
+
// publish semantics match the in-process bus exactly.
|
|
166
|
+
bridgeNotify("events.publish", [event, data]);
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
state: {
|
|
170
|
+
get: <T>(key: string) => localState.get(key) as T | undefined,
|
|
171
|
+
set: (key, value) => { localState.set(key, value); },
|
|
172
|
+
delete: (key) => { localState.delete(key); },
|
|
173
|
+
keys: () => [...localState.keys()],
|
|
174
|
+
// Persist to the host's store (storage permission enforced host-side).
|
|
175
|
+
save: async () => { await bridgeCall("state.save", [[...localState.entries()]]); },
|
|
176
|
+
load: async () => {
|
|
177
|
+
const entries = (await bridgeCall("state.load", [])) as Array<[string, unknown]> | undefined;
|
|
178
|
+
if (entries) {
|
|
179
|
+
localState.clear();
|
|
180
|
+
entries.forEach(([k, v]) => { localState.set(k, v);; });
|
|
181
|
+
}
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
tick: {
|
|
185
|
+
onTick(fn) {
|
|
186
|
+
const wrapped = (dt: number, t: number) => fn(dt, t);
|
|
187
|
+
tickCallbacks.add(wrapped);
|
|
188
|
+
return () => tickCallbacks.delete(wrapped);
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
log: {
|
|
192
|
+
info: (m) => (self as any).postMessage({ __pluginLog: true, level: "info", msg: m }),
|
|
193
|
+
warn: (m) => (self as any).postMessage({ __pluginLog: true, level: "warn", msg: m }),
|
|
194
|
+
error: (m) => (self as any).postMessage({ __pluginLog: true, level: "error", msg: m }),
|
|
195
|
+
debug: (m) => (self as any).postMessage({ __pluginLog: true, level: "debug", msg: m }),
|
|
196
|
+
},
|
|
197
|
+
onDispose: (fn) => disposeCallbacks.push(fn),
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// Expose the host-call bridge when the plugin was granted any host-call
|
|
201
|
+
// permission. Each method forwards over the bridge; the host enforces the
|
|
202
|
+
// allowlist + per-method permission gate. Script-tier contexts reject with
|
|
203
|
+
// "not available on this context".
|
|
204
|
+
const hasHostCallPerm = HOST_CALL_PERMS.some((p) => granted.has(p));
|
|
205
|
+
if (hasHostCallPerm) {
|
|
206
|
+
const hostCalls: Record<string, (...args: unknown[]) => Promise<unknown>> = {};
|
|
207
|
+
HOST_CALL_METHODS.forEach((m) => {
|
|
208
|
+
hostCalls[m] = (...args: unknown[]) => bridgeCall(m, args) as Promise<never>;
|
|
209
|
+
});
|
|
210
|
+
(ctx as ScriptPluginContext & { hostCalls: PluginHostCalls }).hostCalls =
|
|
211
|
+
hostCalls as unknown as PluginHostCalls;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return ctx;
|
|
215
|
+
}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// WASM plugin ABI v3 — the contract between the host and WASM plugin modules.
|
|
3
|
+
//
|
|
4
|
+
// WASM plugins always run in their own dedicated worker (stability isolation).
|
|
5
|
+
// The ABI uses WebAssembly linear memory for string/data passing:
|
|
6
|
+
// - The host provides an `env` import module with functions for logging,
|
|
7
|
+
// state access, event publishing, and game mutation (host calls).
|
|
8
|
+
// - The plugin exports `register`, and optionally `tick`, `dispose`,
|
|
9
|
+
// `on_event`, and `alloc` (for the host to allocate strings in the
|
|
10
|
+
// plugin's memory).
|
|
11
|
+
//
|
|
12
|
+
// v3 adds host-call imports for game mutation (spawn_prop, remove_prop,
|
|
13
|
+
// set_physics, get_physics, apply_impulse, apply_torque, get_asset_ref).
|
|
14
|
+
// These are async on the host side (forwarded to the game's PluginHostCalls);
|
|
15
|
+
// the host-call imports return a u32 request id, and the host posts the
|
|
16
|
+
// result back via the `on_host_call_result` export (ptr+len for JSON result,
|
|
17
|
+
// or 0 for void / error). v2 imports are unchanged — a v2 plugin works as-is.
|
|
18
|
+
//
|
|
19
|
+
// All string/data passing uses (ptr, len) pairs into the plugin's linear
|
|
20
|
+
// memory. The host calls `alloc(size)` to get a pointer, writes the data,
|
|
21
|
+
// then calls the plugin function.
|
|
22
|
+
// ============================================================================
|
|
23
|
+
|
|
24
|
+
/** ABI version — incremented on breaking changes. v3 adds host-call imports. */
|
|
25
|
+
export const WASM_PLUGIN_ABI_VERSION = 3;
|
|
26
|
+
|
|
27
|
+
/** Host-provided import module (the `env` namespace). */
|
|
28
|
+
export interface WasmPluginImports {
|
|
29
|
+
env: {
|
|
30
|
+
/** Log functions: (str_ptr, str_len) → void */
|
|
31
|
+
log_info: (ptr: number, len: number) => void;
|
|
32
|
+
log_warn: (ptr: number, len: number) => void;
|
|
33
|
+
log_error: (ptr: number, len: number) => void;
|
|
34
|
+
log_debug: (ptr: number, len: number) => void;
|
|
35
|
+
/** State: get(key_ptr, key_len) → value_ptr (0 if not found).
|
|
36
|
+
* The value length is stored at [value_ptr-4] as a u32. */
|
|
37
|
+
state_get: (keyPtr: number, keyLen: number) => number;
|
|
38
|
+
/** State: set(key_ptr, key_len, val_ptr, val_len) → void */
|
|
39
|
+
state_set: (keyPtr: number, keyLen: number, valPtr: number, valLen: number) => void;
|
|
40
|
+
/** State: delete(key_ptr, key_len) → void */
|
|
41
|
+
state_delete: (keyPtr: number, keyLen: number) => void;
|
|
42
|
+
/** Events: publish(name_ptr, name_len, data_ptr, data_len) → void */
|
|
43
|
+
event_publish: (namePtr: number, nameLen: number, dataPtr: number, dataLen: number) => void;
|
|
44
|
+
/** Events: subscribe(name_ptr, name_len) → subscription_id (u32).
|
|
45
|
+
* The host calls `on_event(sub_id, data_ptr, data_len)` when the event fires. */
|
|
46
|
+
event_subscribe: (namePtr: number, nameLen: number) => number;
|
|
47
|
+
/** Events: unsubscribe(sub_id) → void */
|
|
48
|
+
event_unsubscribe: (subId: number) => void;
|
|
49
|
+
// ── Host-call bridge (v3): game mutation ──
|
|
50
|
+
// Each returns a u32 request id. The host calls `on_host_call_result`
|
|
51
|
+
// (export) with the result when the async host call completes.
|
|
52
|
+
/** Spawn a prop: (content_id_ptr, content_id_len, x, y, z, qx, qy, qz, qw, scale) → request_id.
|
|
53
|
+
* Result: JSON { entityId } or { error }. */
|
|
54
|
+
spawn_prop: (
|
|
55
|
+
contentIdPtr: number, contentIdLen: number,
|
|
56
|
+
x: number, y: number, z: number,
|
|
57
|
+
qx: number, qy: number, qz: number, qw: number,
|
|
58
|
+
scale: number,
|
|
59
|
+
) => number;
|
|
60
|
+
/** Remove a prop: (entity_id) → request_id. Result: void or { error }. */
|
|
61
|
+
remove_prop: (entityId: number) => number;
|
|
62
|
+
/** Set physics: (entity_id, mass, restitution, friction, gravity_scale) → request_id.
|
|
63
|
+
* Pass NaN for any field to leave it unchanged. Result: void or { error }. */
|
|
64
|
+
set_physics: (
|
|
65
|
+
entityId: number, mass: number, restitution: number, friction: number, gravityScale: number,
|
|
66
|
+
) => number;
|
|
67
|
+
/** Get physics: (entity_id) → request_id. Result: JSON { mass, restitution, friction, gravityScale }. */
|
|
68
|
+
get_physics: (entityId: number) => number;
|
|
69
|
+
/** Apply impulse: (entity_id, x, y, z) → request_id. Result: void or { error }. */
|
|
70
|
+
apply_impulse: (entityId: number, x: number, y: number, z: number) => number;
|
|
71
|
+
/** Apply torque: (entity_id, x, y, z) → request_id. Result: void or { error }. */
|
|
72
|
+
apply_torque: (entityId: number, x: number, y: number, z: number) => number;
|
|
73
|
+
/** Get asset ref: (asset_id_ptr, asset_id_len) → request_id. Result: JSON { handle } or { error }. */
|
|
74
|
+
get_asset_ref: (assetIdPtr: number, assetIdLen: number) => number;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Plugin module exports (resolved after instantiation). */
|
|
79
|
+
export interface WasmPluginExports {
|
|
80
|
+
/** Allocate `size` bytes in the plugin's linear memory. Returns a pointer. */
|
|
81
|
+
alloc: (size: number) => number;
|
|
82
|
+
/** Called once on load. The plugin can register systems, subscribe to events, etc. */
|
|
83
|
+
register: () => void;
|
|
84
|
+
/** Called every tick (if present). dt + elapsedTime in seconds. */
|
|
85
|
+
tick?: (dt: number, elapsedTime: number) => void;
|
|
86
|
+
/** Called on unload (if present). */
|
|
87
|
+
dispose?: () => void;
|
|
88
|
+
/** Called when a subscribed event fires (if present).
|
|
89
|
+
* sub_id matches the id returned by `env.event_subscribe`. */
|
|
90
|
+
on_event?: (subId: number, dataPtr: number, dataLen: number) => void;
|
|
91
|
+
/** Called when a host-call (v3) completes (if present).
|
|
92
|
+
* request_id matches the id returned by the host-call import.
|
|
93
|
+
* resultPtr/resultLen point to a JSON result string (or 0,0 for void).
|
|
94
|
+
* errorPtr/errorLen point to an error string (or 0,0 on success). */
|
|
95
|
+
on_host_call_result?: (
|
|
96
|
+
requestId: number,
|
|
97
|
+
resultPtr: number, resultLen: number,
|
|
98
|
+
errorPtr: number, errorLen: number,
|
|
99
|
+
) => void;
|
|
100
|
+
/** The plugin's linear memory (for reading/writing strings). */
|
|
101
|
+
memory?: WebAssembly.Memory;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/** Helper: write a string into the plugin's linear memory.
|
|
105
|
+
* Returns [ptr, len] or null if alloc failed. */
|
|
106
|
+
export function writeStringToMemory(
|
|
107
|
+
exports: WasmPluginExports,
|
|
108
|
+
str: string,
|
|
109
|
+
): [number, number] | null {
|
|
110
|
+
if (!exports.memory || !exports.alloc) return null;
|
|
111
|
+
const encoder = new TextEncoder();
|
|
112
|
+
const bytes = encoder.encode(str);
|
|
113
|
+
const ptr = exports.alloc(bytes.length);
|
|
114
|
+
if (ptr === 0) return null;
|
|
115
|
+
const view = new Uint8Array(exports.memory.buffer, ptr, bytes.length);
|
|
116
|
+
view.set(bytes);
|
|
117
|
+
return [ptr, bytes.length];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Helper: read a string from the plugin's linear memory. */
|
|
121
|
+
export function readStringFromMemory(
|
|
122
|
+
exports: WasmPluginExports,
|
|
123
|
+
ptr: number,
|
|
124
|
+
len: number,
|
|
125
|
+
): string {
|
|
126
|
+
if (!exports.memory) return "";
|
|
127
|
+
const view = new Uint8Array(exports.memory.buffer, ptr, len);
|
|
128
|
+
return new TextDecoder().decode(view);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Helper: write a byte array into the plugin's linear memory. */
|
|
132
|
+
export function writeBytesToMemory(
|
|
133
|
+
exports: WasmPluginExports,
|
|
134
|
+
bytes: Uint8Array,
|
|
135
|
+
): [number, number] | null {
|
|
136
|
+
if (!exports.memory || !exports.alloc) return null;
|
|
137
|
+
const ptr = exports.alloc(bytes.length);
|
|
138
|
+
if (ptr === 0) return null;
|
|
139
|
+
const view = new Uint8Array(exports.memory.buffer, ptr, bytes.length);
|
|
140
|
+
view.set(bytes);
|
|
141
|
+
return [ptr, bytes.length];
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Helper: read a byte array from the plugin's linear memory. */
|
|
145
|
+
export function readBytesFromMemory(
|
|
146
|
+
exports: WasmPluginExports,
|
|
147
|
+
ptr: number,
|
|
148
|
+
len: number,
|
|
149
|
+
): Uint8Array {
|
|
150
|
+
if (!exports.memory) return new Uint8Array(0);
|
|
151
|
+
return new Uint8Array(exports.memory.buffer, ptr, len).slice();
|
|
152
|
+
}
|