@downdraft/engine 0.1.0 → 0.1.2-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -0
- package/app/README.md +11 -0
- package/app/src/renderer/bootstrap.ts +295 -19
- package/app/src/renderer/game-module.ts +60 -12
- package/app/src/renderer/hooks.ts +9 -1
- package/app/src/renderer/hot-reload.ts +9 -9
- package/app/src/renderer/mcp-harness.ts +2 -2
- package/app/src/renderer/standard-automation-tools.ts +104 -3
- package/app/src/shared/feature-log.ts +2 -1
- package/app/src/shared/mcp-discovery.ts +8 -3
- package/app/src/shared/mcp-proxy.ts +2 -2
- package/asset-bake/README.md +22 -0
- package/core/README.md +25 -0
- package/core/src/animation/skeleton-animator.ts +23 -5
- package/core/src/assets/manager.ts +4 -4
- package/core/src/ecs/events.ts +1 -1
- package/core/src/ecs/schedule.ts +1 -1
- package/core/src/ecs/world.ts +1 -1
- package/core/src/index.ts +3 -4
- package/core/src/library/host.ts +27 -13
- package/core/src/library/library.ts +13 -5
- package/core/src/module/cross-thread.ts +6 -0
- package/core/src/module/diagnostics.ts +10 -6
- package/core/src/module/host.ts +65 -18
- package/core/src/module/index.ts +1 -0
- package/core/src/module/module.ts +11 -5
- package/core/src/module/renderer-module.ts +15 -0
- package/core/src/physics/safety.ts +1 -1
- package/core/src/platform/bun-preload.ts +7 -2
- package/core/src/platform/glob-polyfill.ts +17 -8
- package/core/src/platform/pkg-root.ts +27 -0
- package/core/src/platform/runtime.ts +38 -0
- package/core/src/plugin/discovery.ts +1 -1
- package/core/src/plugin/extension-loaders.ts +6 -4
- package/core/src/plugin/host.ts +13 -13
- package/core/src/plugin/loader-asset.ts +5 -5
- package/core/src/plugin/loader-quickjs.ts +1 -1
- package/core/src/plugin/loader-wasm.ts +3 -3
- package/core/src/plugin/loader-worker.ts +1 -1
- package/core/src/plugin/manifest.ts +8 -3
- package/core/src/plugin/workshop.ts +3 -3
- package/core/src/profiling/index.ts +1 -1
- package/core/src/profiling/profiling-sab.ts +19 -0
- package/core/src/profiling/warnings.ts +1 -1
- package/core/src/profiling/worker-prelude.ts +1 -1
- package/core/src/render/bindless/frame-bindings.ts +1 -1
- package/core/src/render/bindless/material-manager.ts +2 -2
- package/core/src/render/bindless/texture-registry.ts +2 -2
- package/core/src/render/device.ts +5 -5
- package/core/src/render/frame-graph.ts +2 -2
- package/core/src/render/game-renderer.ts +42 -18
- package/core/src/render/hot-reload.ts +3 -3
- package/core/src/render/renderer-module-host.ts +32 -12
- package/core/src/render/shader-validator.ts +7 -7
- package/core/src/render/surface.ts +1 -1
- package/core/src/sab/errors.ts +1 -1
- package/core/src/sab/sab-polyfill.ts +1 -1
- package/core/src/save/migration-registry.ts +4 -4
- package/core/src/save/schema.ts +1 -1
- package/core/src/scene/prefab.ts +1 -1
- package/core/src/scene/scene-manager.ts +2 -2
- package/core/src/scene/scene.ts +4 -4
- package/core/src/scene/streaming.ts +2 -2
- package/core/src/scripting/hot-reload.ts +2 -2
- package/core/src/sim/hot-reload-pipeline.ts +30 -6
- package/core/src/sim/sim-state-helper.ts +1 -1
- package/core/src/sim/transient-state-registry.ts +1 -1
- package/core/src/sim/worker-loop.ts +2 -2
- package/core/src/telemetry/gpu-profiler.ts +3 -3
- package/core/src/util/index.ts +1 -1
- package/core/src/util/logger.ts +36 -5
- package/core/src/version.ts +13 -0
- package/core/src/worker/base-worker-host.ts +87 -25
- package/core/src/worker/buffer-sync.ts +1 -1
- package/core/src/worker/crash-recovery.ts +2 -2
- package/core/src/worker/instrumented-worker-host.ts +3 -3
- package/core/src/worker/rpc.ts +62 -11
- package/core/src/worker/sim-worker-base.ts +3 -8
- package/core/src/worker/task-pool.ts +2 -2
- package/dist/.dd-manifest.json +4119 -0
- package/dist/app/src/index.js +9 -0
- package/dist/app/src/renderer/bootstrap.js +446 -0
- package/dist/app/src/renderer/downdraft-base.css +93 -0
- package/dist/app/src/renderer/feature-log.js +180 -0
- package/dist/app/src/renderer/game-module.js +562 -0
- package/dist/app/src/renderer/hooks.js +82 -0
- package/dist/app/src/renderer/hot-reload.js +158 -0
- package/dist/app/src/renderer/import-cache.js +77 -0
- package/dist/app/src/renderer/index.js +149 -0
- package/dist/app/src/renderer/mcp-harness.js +112 -0
- package/dist/app/src/renderer/save-store-factory.js +180 -0
- package/dist/app/src/renderer/sim-bridge.js +138 -0
- package/dist/app/src/renderer/standard-automation-tools.js +720 -0
- package/dist/app/src/shared/feature-log.js +54 -0
- package/dist/app/src/shared/gpu-info.js +74 -0
- package/dist/app/src/shared/import-cache-store.js +123 -0
- package/dist/app/src/shared/index.js +4 -0
- package/dist/app/src/shared/mcp-discovery.js +55 -0
- package/dist/app/src/shared/mcp-proxy.js +71 -0
- package/dist/app/src/shared/types.js +13 -0
- package/dist/asset-bake/src/bake-audio.js +103 -0
- package/dist/asset-bake/src/bake-gltf.js +141 -0
- package/dist/asset-bake/src/bake.js +63 -0
- package/dist/asset-bake/src/cache.js +147 -0
- package/dist/asset-bake/src/config.js +93 -0
- package/dist/asset-bake/src/index.js +25 -0
- package/dist/core/src/animation/animation-event.js +24 -0
- package/dist/core/src/animation/bone-mask.js +103 -0
- package/dist/core/src/animation/clip.js +210 -0
- package/dist/core/src/animation/index.js +13 -0
- package/dist/core/src/animation/mixamo.js +78 -0
- package/dist/core/src/animation/morph-target.js +37 -0
- package/dist/core/src/animation/player.js +621 -0
- package/dist/core/src/animation/retarget.js +101 -0
- package/dist/core/src/animation/skeleton-animator.js +1361 -0
- package/dist/core/src/animation/skeleton.js +166 -0
- package/dist/core/src/animation/state-machine.js +252 -0
- package/dist/core/src/assets/blob-store.js +14 -0
- package/dist/core/src/assets/cache.js +168 -0
- package/dist/core/src/assets/cubemap-converter.js +129 -0
- package/dist/core/src/assets/environment-manager.js +84 -0
- package/dist/core/src/assets/import-cache.js +36 -0
- package/dist/core/src/assets/import-settings.js +34 -0
- package/dist/core/src/assets/importer.js +78 -0
- package/dist/core/src/assets/index.js +29 -0
- package/dist/core/src/assets/irradiance-generator.js +179 -0
- package/dist/core/src/assets/loader-audio.js +70 -0
- package/dist/core/src/assets/loader-cubemap.js +141 -0
- package/dist/core/src/assets/loader-dds.js +185 -0
- package/dist/core/src/assets/loader-hdr.js +430 -0
- package/dist/core/src/assets/loader-mesh.js +47 -0
- package/dist/core/src/assets/loader-shader.js +61 -0
- package/dist/core/src/assets/loader-texture.js +264 -0
- package/dist/core/src/assets/lod.js +150 -0
- package/dist/core/src/assets/manager.js +401 -0
- package/dist/core/src/assets/manifest.js +57 -0
- package/dist/core/src/assets/material-bridge.js +160 -0
- package/dist/core/src/assets/model-importer.js +32 -0
- package/dist/core/src/assets/model-normalizer.js +213 -0
- package/dist/core/src/assets/model-to-gpu.js +44 -0
- package/dist/core/src/assets/model-to-mesh.js +171 -0
- package/dist/core/src/assets/prefilter-generator.js +220 -0
- package/dist/core/src/audio/engine.js +153 -0
- package/dist/core/src/audio/interface.js +8 -0
- package/dist/core/src/audio/listener.js +19 -0
- package/dist/core/src/audio/mixer.js +124 -0
- package/dist/core/src/audio/registry.js +43 -0
- package/dist/core/src/audio/sab.js +74 -0
- package/dist/core/src/audio/source.js +60 -0
- package/dist/core/src/change-detection/atomics.js +1 -0
- package/dist/core/src/change-detection/tracker.js +26 -0
- package/dist/core/src/debug-draw/lines.js +27 -0
- package/dist/core/src/debug-draw/points.js +9 -0
- package/dist/core/src/debug-draw/queue.js +77 -0
- package/dist/core/src/debug-draw/text.js +12 -0
- package/dist/core/src/ecs/archetype.js +271 -0
- package/dist/core/src/ecs/component.js +109 -0
- package/dist/core/src/ecs/entity.js +11 -0
- package/dist/core/src/ecs/events.js +73 -0
- package/dist/core/src/ecs/hierarchy.js +104 -0
- package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
- package/dist/core/src/ecs/index.js +14 -0
- package/dist/core/src/ecs/query.js +110 -0
- package/dist/core/src/ecs/resource.js +3 -0
- package/dist/core/src/ecs/schedule.js +157 -0
- package/dist/core/src/ecs/system-params.js +45 -0
- package/dist/core/src/ecs/system.js +18 -0
- package/dist/core/src/ecs/world.js +292 -0
- package/dist/core/src/index.js +191 -0
- package/dist/core/src/input/context.js +69 -0
- package/dist/core/src/input/dom-handler.js +288 -0
- package/dist/core/src/input/local-player-manager.js +145 -0
- package/dist/core/src/input/mapping.js +36 -0
- package/dist/core/src/input/multi-sab-bridge.js +224 -0
- package/dist/core/src/input/multi-state.js +48 -0
- package/dist/core/src/input/sab-bridge.js +66 -0
- package/dist/core/src/input/state.js +108 -0
- package/dist/core/src/input/ui-router.js +76 -0
- package/dist/core/src/library/host.js +291 -0
- package/dist/core/src/library/index.js +1 -0
- package/dist/core/src/library/library.js +20 -0
- package/dist/core/src/material/compiler.js +73 -0
- package/dist/core/src/material/graph-bridge.js +119 -0
- package/dist/core/src/material/index.js +6 -0
- package/dist/core/src/material/library.js +414 -0
- package/dist/core/src/material/material.js +120 -0
- package/dist/core/src/material/variants.js +37 -0
- package/dist/core/src/math/mat4.js +198 -0
- package/dist/core/src/math/perlin-noise-2d.js +66 -0
- package/dist/core/src/math/perlin-noise-3d.js +76 -0
- package/dist/core/src/math/quat.js +29 -0
- package/dist/core/src/math/rng.js +25 -0
- package/dist/core/src/math/trig.js +42 -0
- package/dist/core/src/math/value-noise.js +49 -0
- package/dist/core/src/mesh/builder.js +137 -0
- package/dist/core/src/mesh/csg.js +250 -0
- package/dist/core/src/mesh/greased-line.js +102 -0
- package/dist/core/src/mesh/mesh.js +6 -0
- package/dist/core/src/mesh/parametric.js +392 -0
- package/dist/core/src/mesh/skinning.js +30 -0
- package/dist/core/src/mesh/vertex-layout.js +65 -0
- package/dist/core/src/module/cross-thread.js +126 -0
- package/dist/core/src/module/diagnostics.js +99 -0
- package/dist/core/src/module/host.js +449 -0
- package/dist/core/src/module/index.js +6 -0
- package/dist/core/src/module/module.js +1 -0
- package/dist/core/src/module/registry.js +83 -0
- package/dist/core/src/module/renderer-module.js +13 -0
- package/dist/core/src/module/ts-loader.js +20 -0
- package/dist/core/src/particles/compute-pass.js +329 -0
- package/dist/core/src/particles/emitter.js +113 -0
- package/dist/core/src/particles/index.js +7 -0
- package/dist/core/src/particles/particle-data.js +33 -0
- package/dist/core/src/particles/render-pass.js +338 -0
- package/dist/core/src/particles/simulator.js +224 -0
- package/dist/core/src/particles/system.js +157 -0
- package/dist/core/src/physics/body.js +25 -0
- package/dist/core/src/physics/ccd-heuristic.js +46 -0
- package/dist/core/src/physics/character.js +184 -0
- package/dist/core/src/physics/collider.js +36 -0
- package/dist/core/src/physics/collision-system.js +62 -0
- package/dist/core/src/physics/events.js +74 -0
- package/dist/core/src/physics/index.js +24 -0
- package/dist/core/src/physics/interface.js +14 -0
- package/dist/core/src/physics/interpolation-buffer.js +182 -0
- package/dist/core/src/physics/lifecycle.js +66 -0
- package/dist/core/src/physics/load-shedder.js +155 -0
- package/dist/core/src/physics/physics-accumulator.js +94 -0
- package/dist/core/src/physics/physics-system.js +142 -0
- package/dist/core/src/physics/ragdoll-presets.js +248 -0
- package/dist/core/src/physics/ragdoll-system.js +193 -0
- package/dist/core/src/physics/ragdoll.js +117 -0
- package/dist/core/src/physics/raycast.js +97 -0
- package/dist/core/src/physics/realm-manager.js +431 -0
- package/dist/core/src/physics/realm-worker-pool.js +181 -0
- package/dist/core/src/physics/realm-worker.js +91 -0
- package/dist/core/src/physics/realm.js +137 -0
- package/dist/core/src/physics/registry.js +43 -0
- package/dist/core/src/physics/safety.js +211 -0
- package/dist/core/src/physics/snapshot-manager.js +118 -0
- package/dist/core/src/physics/worker-protocol.js +1 -0
- package/dist/core/src/platform/bun-preload.js +175 -0
- package/dist/core/src/platform/css-stub.js +4 -0
- package/dist/core/src/platform/glob-polyfill.js +137 -0
- package/dist/core/src/platform/hidpi.js +52 -0
- package/dist/core/src/platform/pkg-root.js +27 -0
- package/dist/core/src/platform/render-surface.js +15 -0
- package/dist/core/src/platform/rpc.js +82 -0
- package/dist/core/src/platform/runtime.js +93 -0
- package/dist/core/src/plugin/context.js +144 -0
- package/dist/core/src/plugin/diagnostics.js +20 -0
- package/dist/core/src/plugin/discovery.js +124 -0
- package/dist/core/src/plugin/extension-loaders.js +111 -0
- package/dist/core/src/plugin/host.js +542 -0
- package/dist/core/src/plugin/index.js +19 -0
- package/dist/core/src/plugin/loader-asset.js +105 -0
- package/dist/core/src/plugin/loader-quickjs.js +67 -0
- package/dist/core/src/plugin/loader-wasm.js +385 -0
- package/dist/core/src/plugin/loader-worker.js +228 -0
- package/dist/core/src/plugin/manifest.js +424 -0
- package/dist/core/src/plugin/material-registry.js +44 -0
- package/dist/core/src/plugin/mcp-tools.js +147 -0
- package/dist/core/src/plugin/permissions.js +152 -0
- package/dist/core/src/plugin/quickjs-bridge.js +219 -0
- package/dist/core/src/plugin/registry.js +92 -0
- package/dist/core/src/plugin/sandbox-shim.js +79 -0
- package/dist/core/src/plugin/sandbox-worker.js +194 -0
- package/dist/core/src/plugin/wasm-abi.js +62 -0
- package/dist/core/src/plugin/wasm-worker.js +234 -0
- package/dist/core/src/plugin/workshop.js +131 -0
- package/dist/core/src/profiling/event-loop.js +164 -0
- package/dist/core/src/profiling/index.js +23 -0
- package/dist/core/src/profiling/iops/idb-patch.js +211 -0
- package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
- package/dist/core/src/profiling/profiling-sab.js +632 -0
- package/dist/core/src/profiling/task-latency.js +118 -0
- package/dist/core/src/profiling/thread-metrics.js +103 -0
- package/dist/core/src/profiling/trace-event-writer.js +165 -0
- package/dist/core/src/profiling/warnings.js +304 -0
- package/dist/core/src/profiling/worker-prelude.js +281 -0
- package/dist/core/src/render/bind-group.js +33 -0
- package/dist/core/src/render/bindless/bindless-struct.js +39 -0
- package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
- package/dist/core/src/render/bindless/frame-bindings.js +142 -0
- package/dist/core/src/render/bindless/index.js +6 -0
- package/dist/core/src/render/bindless/material-manager.js +182 -0
- package/dist/core/src/render/bindless/texture-registry.js +498 -0
- package/dist/core/src/render/buffer.js +74 -0
- package/dist/core/src/render/camera-2d.js +151 -0
- package/dist/core/src/render/camera-controller.js +370 -0
- package/dist/core/src/render/camera.js +332 -0
- package/dist/core/src/render/canvas-resize-watcher.js +36 -0
- package/dist/core/src/render/compute-kernel.js +130 -0
- package/dist/core/src/render/constants.js +2 -0
- package/dist/core/src/render/device.js +91 -0
- package/dist/core/src/render/frame-graph.js +594 -0
- package/dist/core/src/render/frustum.js +152 -0
- package/dist/core/src/render/fullscreen-vs.js +24 -0
- package/dist/core/src/render/g-buffer.js +156 -0
- package/dist/core/src/render/game-renderer.js +1165 -0
- package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
- package/dist/core/src/render/gpu-driven/hzb.js +183 -0
- package/dist/core/src/render/gpu-driven/index.js +6 -0
- package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
- package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
- package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
- package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
- package/dist/core/src/render/gpu-utils.js +72 -0
- package/dist/core/src/render/hdr.js +69 -0
- package/dist/core/src/render/hot-reload.js +236 -0
- package/dist/core/src/render/ibl-bind-group.js +232 -0
- package/dist/core/src/render/ibl.js +148 -0
- package/dist/core/src/render/index.js +86 -0
- package/dist/core/src/render/input-manager.js +224 -0
- package/dist/core/src/render/lighting/area-light.js +142 -0
- package/dist/core/src/render/lighting/cluster-grid.js +255 -0
- package/dist/core/src/render/lighting/cluster-types.js +87 -0
- package/dist/core/src/render/lighting/ies-parser.js +111 -0
- package/dist/core/src/render/lighting.js +300 -0
- package/dist/core/src/render/material-types/depth.wgsl +44 -0
- package/dist/core/src/render/material-types/line.wgsl +50 -0
- package/dist/core/src/render/material-types/matcap.wgsl +51 -0
- package/dist/core/src/render/material-types/normal.wgsl +41 -0
- package/dist/core/src/render/material-types/physical.wgsl +152 -0
- package/dist/core/src/render/material-types/sprite.wgsl +46 -0
- package/dist/core/src/render/material-types/sss.wgsl +79 -0
- package/dist/core/src/render/material-types/toon.wgsl +79 -0
- package/dist/core/src/render/passes/README.md +121 -0
- package/dist/core/src/render/passes/atmosphere.js +107 -0
- package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
- package/dist/core/src/render/passes/csm.js +338 -0
- package/dist/core/src/render/passes/cubemap-capture.js +93 -0
- package/dist/core/src/render/passes/debug-viz.js +248 -0
- package/dist/core/src/render/passes/debug.js +500 -0
- package/dist/core/src/render/passes/decal-mesh.js +86 -0
- package/dist/core/src/render/passes/decal-pass.js +344 -0
- package/dist/core/src/render/passes/deferred-lighting.js +406 -0
- package/dist/core/src/render/passes/depth-prepass.js +148 -0
- package/dist/core/src/render/passes/dome-360.js +68 -0
- package/dist/core/src/render/passes/fluid-render.js +116 -0
- package/dist/core/src/render/passes/gi-types.js +78 -0
- package/dist/core/src/render/passes/graph-compute.js +251 -0
- package/dist/core/src/render/passes/greased-line-pass.js +218 -0
- package/dist/core/src/render/passes/morph-target.js +35 -0
- package/dist/core/src/render/passes/opaque.js +966 -0
- package/dist/core/src/render/passes/point-light-shadow.js +221 -0
- package/dist/core/src/render/passes/procedural-texture.js +142 -0
- package/dist/core/src/render/passes/reflection-probe.js +100 -0
- package/dist/core/src/render/passes/rsm-pass.js +228 -0
- package/dist/core/src/render/passes/sdf-text.js +114 -0
- package/dist/core/src/render/passes/shadow-map.js +121 -0
- package/dist/core/src/render/passes/shadow.js +191 -0
- package/dist/core/src/render/passes/skinning-vs.js +102 -0
- package/dist/core/src/render/passes/skinning.js +282 -0
- package/dist/core/src/render/passes/sky-dome.js +380 -0
- package/dist/core/src/render/passes/skybox.js +146 -0
- package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
- package/dist/core/src/render/passes/terrain.js +303 -0
- package/dist/core/src/render/passes/transparent.js +323 -0
- package/dist/core/src/render/passes/underwater-fog.js +173 -0
- package/dist/core/src/render/passes/video-texture.js +58 -0
- package/dist/core/src/render/passes/volumetric-pass.js +278 -0
- package/dist/core/src/render/passes/volumetric-types.js +96 -0
- package/dist/core/src/render/passes/water.js +697 -0
- package/dist/core/src/render/pbr.js +257 -0
- package/dist/core/src/render/pipeline.js +49 -0
- package/dist/core/src/render/render-pass.js +13 -0
- package/dist/core/src/render/renderer-input-bus.js +176 -0
- package/dist/core/src/render/renderer-module-host.js +539 -0
- package/dist/core/src/render/resource-tracker.js +59 -0
- package/dist/core/src/render/sab-canvas-overlay.js +83 -0
- package/dist/core/src/render/shader-validator.js +172 -0
- package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
- package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
- package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
- package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
- package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
- package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
- package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
- package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
- package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
- package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
- package/dist/core/src/render/skybox.js +123 -0
- package/dist/core/src/render/splitscreen.js +60 -0
- package/dist/core/src/render/surface.js +63 -0
- package/dist/core/src/render/tonemap.js +171 -0
- package/dist/core/src/render/tracked-render-pass.js +115 -0
- package/dist/core/src/render/viewport.js +81 -0
- package/dist/core/src/render/wgsl-hmr.js +66 -0
- package/dist/core/src/sab/core-input-channel.js +22 -0
- package/dist/core/src/sab/define.js +127 -0
- package/dist/core/src/sab/errors.js +60 -0
- package/dist/core/src/sab/game-input.js +299 -0
- package/dist/core/src/sab/gamepad-devices.js +205 -0
- package/dist/core/src/sab/grid-buffer.js +91 -0
- package/dist/core/src/sab/input.js +38 -0
- package/dist/core/src/sab/layout.js +160 -0
- package/dist/core/src/sab/multi-input-channel.js +39 -0
- package/dist/core/src/sab/record-buffer.js +130 -0
- package/dist/core/src/sab/sab-polyfill.js +47 -0
- package/dist/core/src/sab/sim-channel.js +397 -0
- package/dist/core/src/sab/slot-buffer.js +140 -0
- package/dist/core/src/sab/types.js +1 -0
- package/dist/core/src/safety/bounds.js +71 -0
- package/dist/core/src/safety/json.js +70 -0
- package/dist/core/src/safety/path.js +151 -0
- package/dist/core/src/save/binary-format.js +95 -0
- package/dist/core/src/save/game-save-system.js +101 -0
- package/dist/core/src/save/grid-save-system.js +102 -0
- package/dist/core/src/save/migrate.js +35 -0
- package/dist/core/src/save/migration-registry.js +66 -0
- package/dist/core/src/save/persist-types.js +4 -0
- package/dist/core/src/save/schema.js +36 -0
- package/dist/core/src/save/serializer.js +139 -0
- package/dist/core/src/scene/builder.js +31 -0
- package/dist/core/src/scene/camera.js +118 -0
- package/dist/core/src/scene/checkpoint.js +84 -0
- package/dist/core/src/scene/game-loop.js +155 -0
- package/dist/core/src/scene/index.js +14 -0
- package/dist/core/src/scene/layer.js +7 -0
- package/dist/core/src/scene/prefab.js +97 -0
- package/dist/core/src/scene/scene-manager.js +141 -0
- package/dist/core/src/scene/scene.js +147 -0
- package/dist/core/src/scene/sky.js +179 -0
- package/dist/core/src/scene/spatial-grid.js +140 -0
- package/dist/core/src/scene/streaming.js +247 -0
- package/dist/core/src/scene/vegetation.js +107 -0
- package/dist/core/src/scene/world.js +66 -0
- package/dist/core/src/scripting/binding.js +85 -0
- package/dist/core/src/scripting/hot-reload.js +123 -0
- package/dist/core/src/scripting/script.js +68 -0
- package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
- package/dist/core/src/sim/sim-state-helper.js +40 -0
- package/dist/core/src/sim/transient-state-registry.js +63 -0
- package/dist/core/src/sim/types.js +4 -0
- package/dist/core/src/sim/worker-loop.js +168 -0
- package/dist/core/src/stores/game-store.js +81 -0
- package/dist/core/src/stores/hot-reload-store.js +19 -0
- package/dist/core/src/telemetry/collector.js +303 -0
- package/dist/core/src/telemetry/gc-controller.js +365 -0
- package/dist/core/src/telemetry/gc-profiler.js +82 -0
- package/dist/core/src/telemetry/gc-tracker.js +63 -0
- package/dist/core/src/telemetry/gpu-profiler.js +554 -0
- package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
- package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
- package/dist/core/src/telemetry/gpu-timer.js +117 -0
- package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
- package/dist/core/src/telemetry/reporter.js +56 -0
- package/dist/core/src/types/engine-types.js +21 -0
- package/dist/core/src/ui-font-scale.js +111 -0
- package/dist/core/src/util/broad-phase-grid.js +77 -0
- package/dist/core/src/util/feature-log.js +176 -0
- package/dist/core/src/util/index.js +4 -0
- package/dist/core/src/util/logger.js +596 -0
- package/dist/core/src/version.js +11 -0
- package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
- package/dist/core/src/worker/base-worker-host.js +212 -0
- package/dist/core/src/worker/buffer-sync.js +454 -0
- package/dist/core/src/worker/crash-recovery.js +153 -0
- package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
- package/dist/core/src/worker/instrumented-worker-host.js +139 -0
- package/dist/core/src/worker/rpc.js +244 -0
- package/dist/core/src/worker/sim-worker-base.js +558 -0
- package/dist/core/src/worker/sim-worker-host.js +271 -0
- package/dist/core/src/worker/task-pool.js +205 -0
- package/dist/core/src/worker/task-worker.js +77 -0
- package/dist/libraries/asset-browser/src/index.js +10 -0
- package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
- package/dist/libraries/audio-kira/src/backend.js +405 -0
- package/dist/libraries/audio-kira/src/index.js +4 -0
- package/dist/libraries/audio-kira/src/library.js +54 -0
- package/dist/libraries/blitz-ui/src/index.js +13 -0
- package/dist/libraries/blitz-ui/src/native-module.js +162 -0
- package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
- package/dist/libraries/blitz-ui/src/router.js +82 -0
- package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
- package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
- package/dist/libraries/character/src/character-animator.js +323 -0
- package/dist/libraries/character/src/customization.js +464 -0
- package/dist/libraries/character/src/index.js +19 -0
- package/dist/libraries/character/src/inspectable.js +77 -0
- package/dist/libraries/character/src/loader.js +336 -0
- package/dist/libraries/character/src/locomotion.js +84 -0
- package/dist/libraries/character/src/preview.js +280 -0
- package/dist/libraries/devtools/src/backend.js +449 -0
- package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
- package/dist/libraries/devtools/src/collectors.js +318 -0
- package/dist/libraries/devtools/src/index.js +31 -0
- package/dist/libraries/devtools/src/native-providers.js +749 -0
- package/dist/libraries/devtools/src/snapshot.js +35 -0
- package/dist/libraries/devtools/src/verify.js +139 -0
- package/dist/libraries/devtools/src/web/browser.js +94 -0
- package/dist/libraries/devtools/src/web/host.js +183 -0
- package/dist/libraries/devtools/src/web/mirror.js +26 -0
- package/dist/libraries/devtools/src/web/server.js +187 -0
- package/dist/libraries/entities/src/index.js +3 -0
- package/dist/libraries/entities/src/library.js +46 -0
- package/dist/libraries/entities/src/model-renderer.js +1307 -0
- package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
- package/dist/libraries/gamepad/src/feed-input.js +54 -0
- package/dist/libraries/gamepad/src/filters.js +44 -0
- package/dist/libraries/gamepad/src/glyphs.js +83 -0
- package/dist/libraries/gamepad/src/hub.js +164 -0
- package/dist/libraries/gamepad/src/index.js +10 -0
- package/dist/libraries/gamepad/src/library.js +56 -0
- package/dist/libraries/gamepad/src/source-sab.js +62 -0
- package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
- package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
- package/dist/libraries/gaussian-splats/src/index.js +8 -0
- package/dist/libraries/gaussian-splats/src/library.js +44 -0
- package/dist/libraries/gaussian-splats/src/parser.js +297 -0
- package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
- package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
- package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
- package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
- package/dist/libraries/gpu-kernels/src/index.js +8 -0
- package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
- package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
- package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
- package/dist/libraries/html-ui-kit/src/components.js +219 -0
- package/dist/libraries/html-ui-kit/src/index.js +17 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
- package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
- package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
- package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
- package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
- package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
- package/dist/libraries/html-ui-kit/src/theme.js +235 -0
- package/dist/libraries/inspectable/src/index.js +6 -0
- package/dist/libraries/inspectable/src/inspectable.js +205 -0
- package/dist/libraries/lighting/src/index.js +4 -0
- package/dist/libraries/lighting/src/library.js +48 -0
- package/dist/libraries/lighting/src/light-system.js +395 -0
- package/dist/libraries/lighting/src/lighting-system.js +57 -0
- package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
- package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
- package/dist/libraries/marching-cubes/src/deformation.js +41 -0
- package/dist/libraries/marching-cubes/src/generator.js +356 -0
- package/dist/libraries/marching-cubes/src/index.js +13 -0
- package/dist/libraries/marching-cubes/src/library.js +54 -0
- package/dist/libraries/marching-cubes/src/lod.js +95 -0
- package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
- package/dist/libraries/marching-cubes/src/sab.js +40 -0
- package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
- package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
- package/dist/libraries/marching-cubes/src/tables.js +314 -0
- package/dist/libraries/marching-cubes/src/types.js +1 -0
- package/dist/libraries/models/src/bake-node-transforms.js +146 -0
- package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
- package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
- package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
- package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
- package/dist/libraries/models/src/codecs/index.js +5 -0
- package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
- package/dist/libraries/models/src/codecs/registry.js +111 -0
- package/dist/libraries/models/src/dae.js +665 -0
- package/dist/libraries/models/src/default-part-selection.js +58 -0
- package/dist/libraries/models/src/dxf.js +235 -0
- package/dist/libraries/models/src/fbx/index.js +438 -0
- package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
- package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
- package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
- package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
- package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
- package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
- package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
- package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
- package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
- package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
- package/dist/libraries/models/src/fbx/types.js +88 -0
- package/dist/libraries/models/src/gltf-extensions.js +121 -0
- package/dist/libraries/models/src/gltf.js +724 -0
- package/dist/libraries/models/src/index.js +46 -0
- package/dist/libraries/models/src/library.js +44 -0
- package/dist/libraries/models/src/loader.js +218 -0
- package/dist/libraries/models/src/material-adapter.js +82 -0
- package/dist/libraries/models/src/mini-xml.js +145 -0
- package/dist/libraries/models/src/normalize.js +168 -0
- package/dist/libraries/models/src/obj.js +247 -0
- package/dist/libraries/models/src/off.js +94 -0
- package/dist/libraries/models/src/ply.js +329 -0
- package/dist/libraries/models/src/pose-sampler.js +183 -0
- package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
- package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
- package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
- package/dist/libraries/models/src/sidecar/resolver.js +112 -0
- package/dist/libraries/models/src/sidecar/types.js +8 -0
- package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
- package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
- package/dist/libraries/models/src/stl.js +129 -0
- package/dist/libraries/models/src/threeds.js +312 -0
- package/dist/libraries/models/src/threemf.js +203 -0
- package/dist/libraries/models/src/types.js +33 -0
- package/dist/libraries/models/src/vtk.js +242 -0
- package/dist/libraries/navmesh/src/crowd-system.js +207 -0
- package/dist/libraries/navmesh/src/debug-viz.js +52 -0
- package/dist/libraries/navmesh/src/index.js +7 -0
- package/dist/libraries/navmesh/src/library.js +47 -0
- package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
- package/dist/libraries/navmesh/src/navmesh.js +141 -0
- package/dist/libraries/navmesh/src/pathfinder.js +221 -0
- package/dist/libraries/navmesh/src/types.js +1 -0
- package/dist/libraries/networking/src/authority.js +107 -0
- package/dist/libraries/networking/src/connection.js +107 -0
- package/dist/libraries/networking/src/discovery.js +314 -0
- package/dist/libraries/networking/src/enhanced-replication.js +282 -0
- package/dist/libraries/networking/src/epic-adapter.js +101 -0
- package/dist/libraries/networking/src/index.js +16 -0
- package/dist/libraries/networking/src/library.js +45 -0
- package/dist/libraries/networking/src/lobby.js +84 -0
- package/dist/libraries/networking/src/platform-adapter.js +92 -0
- package/dist/libraries/networking/src/rcs-adapter.js +100 -0
- package/dist/libraries/networking/src/remote-input.js +162 -0
- package/dist/libraries/networking/src/replication.js +273 -0
- package/dist/libraries/networking/src/rpc.js +172 -0
- package/dist/libraries/networking/src/session.js +129 -0
- package/dist/libraries/networking/src/transport.js +156 -0
- package/dist/libraries/networking/src/webrtc.js +266 -0
- package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
- package/dist/libraries/pathfinding-2d/src/index.js +9 -0
- package/dist/libraries/persistence/src/autosave-manager.js +94 -0
- package/dist/libraries/persistence/src/binary-record-store.js +205 -0
- package/dist/libraries/persistence/src/browser.js +16 -0
- package/dist/libraries/persistence/src/file-save-store.js +507 -0
- package/dist/libraries/persistence/src/hash-utils.js +54 -0
- package/dist/libraries/persistence/src/index.js +17 -0
- package/dist/libraries/persistence/src/library.js +51 -0
- package/dist/libraries/persistence/src/mock-opfs.js +114 -0
- package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
- package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
- package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
- package/dist/libraries/persistence/src/save-worker.js +76 -0
- package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
- package/dist/libraries/physics-native/src/backend.js +960 -0
- package/dist/libraries/physics-native/src/broadphase.js +79 -0
- package/dist/libraries/physics-native/src/index.js +6 -0
- package/dist/libraries/physics-native/src/library.js +57 -0
- package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
- package/dist/libraries/physics-native/src/narrowphase.js +60 -0
- package/dist/libraries/physics-native/src/solver.js +105 -0
- package/dist/libraries/physics-native/src/types.js +4 -0
- package/dist/libraries/physics-rapier/src/api.js +352 -0
- package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
- package/dist/libraries/physics-rapier/src/backend.js +1066 -0
- package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
- package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
- package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
- package/dist/libraries/physics-rapier/src/index.js +9 -0
- package/dist/libraries/physics-rapier/src/library.js +71 -0
- package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
- package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
- package/dist/libraries/postfx/src/index.js +14 -0
- package/dist/libraries/postfx/src/library.js +207 -0
- package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
- package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
- package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
- package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
- package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
- package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
- package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
- package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
- package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
- package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
- package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
- package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
- package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
- package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
- package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
- package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
- package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
- package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
- package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
- package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
- package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
- package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
- package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
- package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
- package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
- package/dist/libraries/recast/src/backend.js +124 -0
- package/dist/libraries/recast/src/crowd-system.js +310 -0
- package/dist/libraries/recast/src/index.js +4 -0
- package/dist/libraries/recast/src/library.js +59 -0
- package/dist/libraries/recast/src/types.js +4 -0
- package/dist/libraries/sand/src/cell.js +32 -0
- package/dist/libraries/sand/src/fields.js +27 -0
- package/dist/libraries/sand/src/fluid-grid.js +267 -0
- package/dist/libraries/sand/src/grid-dims.js +47 -0
- package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
- package/dist/libraries/sand/src/index.js +20 -0
- package/dist/libraries/sand/src/library.js +67 -0
- package/dist/libraries/sand/src/materials.js +437 -0
- package/dist/libraries/sand/src/palette.js +87 -0
- package/dist/libraries/sand/src/particles.js +163 -0
- package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
- package/dist/libraries/sand/src/rng.js +44 -0
- package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
- package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
- package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
- package/dist/libraries/sand/src/rules/rule-types.js +27 -0
- package/dist/libraries/sand/src/sand-step-pool.js +458 -0
- package/dist/libraries/sand/src/sand-step-worker.js +101 -0
- package/dist/libraries/sand/src/sand-world.js +3382 -0
- package/dist/libraries/stickman/src/index.js +7 -0
- package/dist/libraries/stickman/src/library.js +44 -0
- package/dist/libraries/stickman/src/proportions.js +40 -0
- package/dist/libraries/stickman/src/shader.js +113 -0
- package/dist/libraries/stickman/src/skeleton.js +163 -0
- package/dist/libraries/stickman/src/stickman-pass.js +210 -0
- package/dist/libraries/stickman/src/thick-line.js +120 -0
- package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
- package/dist/libraries/surface-nets/src/deformation.js +29 -0
- package/dist/libraries/surface-nets/src/index.js +15 -0
- package/dist/libraries/surface-nets/src/library.js +41 -0
- package/dist/libraries/surface-nets/src/lod.js +6 -0
- package/dist/libraries/surface-nets/src/sab.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
- package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
- package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
- package/dist/libraries/surface-nets/src/types.js +1 -0
- package/dist/libraries/water/src/buoyancy.js +80 -0
- package/dist/libraries/water/src/index.js +12 -0
- package/dist/libraries/water/src/library.js +65 -0
- package/dist/libraries/water/src/shore-damping.js +70 -0
- package/dist/libraries/water/src/water-buffer.js +78 -0
- package/dist/libraries/water/src/water-chunks.js +5 -0
- package/dist/libraries/water/src/water-physics.js +315 -0
- package/dist/libraries/water/src/water-renderer.js +736 -0
- package/dist/libraries/water/src/water-sab.js +138 -0
- package/dist/libraries/water/src/wave-sources.js +45 -0
- package/dist/libraries/weather/src/index.js +5 -0
- package/dist/libraries/weather/src/library.js +48 -0
- package/dist/libraries/weather/src/types.js +29 -0
- package/dist/libraries/weather/src/weather-blend.js +108 -0
- package/dist/libraries/weather/src/weather-system.js +275 -0
- package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
- package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
- package/dist/libraries/weatherfx/src/index.js +4 -0
- package/dist/libraries/weatherfx/src/library.js +41 -0
- package/dist/libraries/weatherfx/src/particle-system.js +350 -0
- package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
- package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
- package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
- package/dist/mcp/src/client.js +669 -0
- package/dist/mcp/src/engine-context.js +99 -0
- package/dist/mcp/src/http-transport.js +423 -0
- package/dist/mcp/src/index.js +5 -0
- package/dist/mcp/src/prompts/add-entity.js +39 -0
- package/dist/mcp/src/prompts/create-scene.js +41 -0
- package/dist/mcp/src/prompts/debug-frame.js +36 -0
- package/dist/mcp/src/prompts/index.js +10 -0
- package/dist/mcp/src/resources/asset-list.js +28 -0
- package/dist/mcp/src/resources/checkpoint-list.js +29 -0
- package/dist/mcp/src/resources/entity-state.js +45 -0
- package/dist/mcp/src/resources/gpu-info.js +90 -0
- package/dist/mcp/src/resources/index.js +51 -0
- package/dist/mcp/src/resources/performance.js +33 -0
- package/dist/mcp/src/resources/scene-tree.js +37 -0
- package/dist/mcp/src/server.js +307 -0
- package/dist/mcp/src/tools/animation.js +102 -0
- package/dist/mcp/src/tools/asset.js +146 -0
- package/dist/mcp/src/tools/audio.js +80 -0
- package/dist/mcp/src/tools/build.js +128 -0
- package/dist/mcp/src/tools/camera.js +157 -0
- package/dist/mcp/src/tools/checkpoint.js +90 -0
- package/dist/mcp/src/tools/component.js +176 -0
- package/dist/mcp/src/tools/debug.js +273 -0
- package/dist/mcp/src/tools/entity.js +309 -0
- package/dist/mcp/src/tools/inspect.js +192 -0
- package/dist/mcp/src/tools/lighting.js +239 -0
- package/dist/mcp/src/tools/material.js +225 -0
- package/dist/mcp/src/tools/mesh.js +210 -0
- package/dist/mcp/src/tools/physics.js +251 -0
- package/dist/mcp/src/tools/scene.js +139 -0
- package/dist/mcp/src/tools/script.js +114 -0
- package/dist/mcp/src/types.js +9 -0
- package/dist/mcp/src/undo-redo.js +64 -0
- package/dist/modules/camera-controls/src/index.js +116 -0
- package/dist/modules/controller-ui/src/index.js +149 -0
- package/dist/modules/devtools/src/api.js +317 -0
- package/dist/modules/devtools/src/asset-utils.js +102 -0
- package/dist/modules/devtools/src/bind-debug-store.js +34 -0
- package/dist/modules/devtools/src/blitz/host.js +391 -0
- package/dist/modules/devtools/src/blitz/module.js +65 -0
- package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
- package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
- package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
- package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
- package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
- package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
- package/dist/modules/devtools/src/blitz/theme.js +167 -0
- package/dist/modules/devtools/src/data-bridge.js +247 -0
- package/dist/modules/devtools/src/debug-overlay.js +181 -0
- package/dist/modules/devtools/src/debug-raycast.js +296 -0
- package/dist/modules/devtools/src/debug-store.js +28 -0
- package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
- package/dist/modules/devtools/src/doctor-panel.js +163 -0
- package/dist/modules/devtools/src/gizmo-module.js +95 -0
- package/dist/modules/devtools/src/graph-model.js +387 -0
- package/dist/modules/devtools/src/grid-renderer.js +145 -0
- package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
- package/dist/modules/devtools/src/index.js +46 -0
- package/dist/modules/devtools/src/init.js +204 -0
- package/dist/modules/devtools/src/label-overlay.js +129 -0
- package/dist/modules/devtools/src/material-stats-panel.js +171 -0
- package/dist/modules/devtools/src/profiling-bridge.js +288 -0
- package/dist/modules/devtools/src/profiling-hooks.js +63 -0
- package/dist/modules/devtools/src/renderer-adapter.js +61 -0
- package/dist/modules/devtools/src/scene-inspector.js +571 -0
- package/dist/modules/devtools/src/scene-store.js +212 -0
- package/dist/modules/devtools/src/scene-sync.js +92 -0
- package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
- package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
- package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
- package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
- package/dist/modules/devtools/src/transform-gizmo.js +677 -0
- package/dist/modules/devtools/src/types.js +5 -0
- package/dist/modules/devtools/src/worker-expose.js +59 -0
- package/dist/modules/devtools/src/worker-sync.js +115 -0
- package/dist/modules/editor/src/commands/component.js +151 -0
- package/dist/modules/editor/src/commands/entity.js +253 -0
- package/dist/modules/editor/src/commands/hierarchy.js +79 -0
- package/dist/modules/editor/src/commands/index.js +57 -0
- package/dist/modules/editor/src/commands/prefab.js +149 -0
- package/dist/modules/editor/src/commands/registry.js +246 -0
- package/dist/modules/editor/src/commands/scene-io.js +206 -0
- package/dist/modules/editor/src/commands/selection.js +71 -0
- package/dist/modules/editor/src/commands/transform.js +88 -0
- package/dist/modules/editor/src/ddscene.js +189 -0
- package/dist/modules/editor/src/document.js +96 -0
- package/dist/modules/editor/src/editor-context.js +115 -0
- package/dist/modules/editor/src/index.js +11 -0
- package/dist/modules/editor/src/mcp.js +91 -0
- package/dist/modules/editor/src/module.js +115 -0
- package/dist/modules/editor/src/selection.js +60 -0
- package/dist/modules/editor/src/shell.js +397 -0
- package/dist/modules/editor/src/viewport.js +186 -0
- package/dist/modules/html-ui/src/composite.js +116 -0
- package/dist/modules/html-ui/src/create-html-ui.js +137 -0
- package/dist/modules/html-ui/src/doc-backend.js +518 -0
- package/dist/modules/html-ui/src/host.js +819 -0
- package/dist/modules/html-ui/src/index.js +5 -0
- package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
- package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
- package/dist/modules/html-ui/src/protocol.js +6 -0
- package/dist/modules/html-ui/src/ui-worker.js +10 -0
- package/dist/modules/mcp/src/index.js +62 -0
- package/dist/modules/movement-2d/src/grid-character.js +345 -0
- package/dist/modules/movement-2d/src/index.js +27 -0
- package/dist/modules/movement-3d/src/character-motor.js +166 -0
- package/dist/modules/movement-3d/src/index.js +27 -0
- package/dist/modules/native-osr/src/index.js +12 -0
- package/dist/modules/native-osr/src/input-router.js +335 -0
- package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
- package/dist/modules/native-osr/src/native-texture-source.js +66 -0
- package/dist/modules/native-osr/src/types.js +8 -0
- package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
- package/dist/modules/sailing/src/index.js +39 -0
- package/dist/modules/terrain/src/index.js +44 -0
- package/dist/modules/vitals/src/index.js +25 -0
- package/dist/modules/vitals/src/vitals.js +195 -0
- package/dist/modules/xr/src/camera-rig.js +119 -0
- package/dist/modules/xr/src/debug.js +45 -0
- package/dist/modules/xr/src/frame-loop.js +139 -0
- package/dist/modules/xr/src/index.js +10 -0
- package/dist/modules/xr/src/input.js +164 -0
- package/dist/modules/xr/src/layer.js +100 -0
- package/dist/modules/xr/src/session.js +133 -0
- package/dist/modules/xr/src/sim-module.js +21 -0
- package/dist/modules/xr/src/types.js +4 -0
- package/dist/modules/xr/src/webxr.d.ts +182 -0
- package/dist/modules/xr/src/xr-module.js +134 -0
- package/dist/shader-graph/src/chunks.js +340 -0
- package/dist/shader-graph/src/compiler.js +639 -0
- package/dist/shader-graph/src/compute-compiler.js +384 -0
- package/dist/shader-graph/src/compute-graph.js +55 -0
- package/dist/shader-graph/src/compute-profiles.js +39 -0
- package/dist/shader-graph/src/graph.js +38 -0
- package/dist/shader-graph/src/index.js +15 -0
- package/dist/shader-graph/src/profiles.js +305 -0
- package/dist/shader-graph/src/validator.js +42 -0
- package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
- package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
- package/dist/shader-graph/src/wgsl-struct.js +251 -0
- package/dist/test/src/index.js +1 -0
- package/dist/test/src/vision-test.js +228 -0
- package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
- package/libraries/audio-kira/src/backend.ts +2 -1
- package/libraries/blitz-ui/native/src/shell.rs +35 -1
- package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
- package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
- package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
- package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
- package/libraries/blitz-ui/src/router.ts +3 -1
- package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
- package/libraries/character/src/character-animator.ts +1 -1
- package/libraries/character/src/customization.ts +513 -0
- package/libraries/character/src/index.ts +6 -0
- package/libraries/character/src/inspectable.ts +111 -0
- package/libraries/character/src/loader.ts +38 -13
- package/libraries/character/src/locomotion.ts +13 -1
- package/libraries/character/src/preview.ts +94 -24
- package/libraries/devtools/README.md +16 -18
- package/libraries/devtools/src/backend.ts +505 -0
- package/libraries/devtools/src/cdp-bridge.ts +8 -8
- package/libraries/devtools/src/collectors.ts +41 -37
- package/libraries/devtools/src/index.ts +32 -14
- package/libraries/devtools/src/native-providers.ts +20 -12
- package/libraries/devtools/src/snapshot.ts +77 -0
- package/libraries/devtools/src/web/host.ts +11 -12
- package/libraries/devtools/src/web/mirror.ts +14 -405
- package/libraries/devtools/src/web/server.ts +4 -3
- package/libraries/entities/src/model-renderer.ts +96 -23
- package/libraries/gamepad/src/library.ts +2 -1
- package/libraries/inspectable/src/index.ts +11 -0
- package/libraries/inspectable/src/inspectable.ts +277 -0
- package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
- package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
- package/libraries/models/src/index.ts +1 -0
- package/libraries/models/src/types.ts +22 -0
- package/libraries/persistence/src/autosave-manager.ts +1 -1
- package/libraries/persistence/src/binary-record-store.ts +1 -1
- package/libraries/persistence/src/file-save-store.ts +4 -4
- package/libraries/persistence/src/library.ts +1 -1
- package/libraries/persistence/src/opfs-save-store.ts +5 -5
- package/libraries/persistence/src/save-worker.ts +13 -14
- package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
- package/libraries/postfx/src/post-process-stack.ts +1 -1
- package/libraries/sand/src/sand-step-pool.ts +5 -0
- package/libraries/water/src/water-renderer.ts +1 -1
- package/libraries/weatherfx/src/cloud-system.ts +3 -3
- package/mcp/README.md +20 -0
- package/mcp/src/client.ts +75 -22
- package/mcp/src/undo-redo.ts +2 -2
- package/modules/devtools/src/blitz/host.ts +430 -0
- package/modules/devtools/src/blitz/module.ts +101 -0
- package/modules/devtools/src/blitz/panels/console.ts +223 -0
- package/modules/devtools/src/blitz/panels/elements.ts +92 -0
- package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
- package/modules/devtools/src/blitz/panels/performance.ts +120 -0
- package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
- package/modules/devtools/src/blitz/panels/types.ts +120 -0
- package/modules/devtools/src/blitz/theme.ts +168 -0
- package/modules/devtools/src/data-bridge.ts +1 -1
- package/modules/devtools/src/index.ts +6 -0
- package/modules/devtools/src/profiling-bridge.ts +17 -13
- package/modules/devtools/src/profiling-hooks.ts +22 -13
- package/modules/devtools/src/scene-inspector.ts +1 -1
- package/modules/devtools/src/worker-sync.ts +9 -1
- package/modules/editor/src/commands/registry.ts +2 -2
- package/modules/editor/src/module.ts +1 -1
- package/modules/html-ui/src/composite.ts +1 -1
- package/modules/html-ui/src/create-html-ui.ts +21 -9
- package/modules/html-ui/src/doc-backend.ts +189 -10
- package/modules/html-ui/src/host.ts +354 -40
- package/modules/html-ui/src/index.ts +1 -1
- package/modules/html-ui/src/jsx-runtime.ts +1 -1
- package/modules/html-ui/src/protocol.ts +53 -6
- package/modules/mcp/README.md +6 -0
- package/modules/mcp/src/index.ts +70 -3
- package/modules/movement-3d/src/character-motor.ts +83 -10
- package/package.json +838 -165
- package/shader-graph/README.md +25 -0
- package/test/README.md +16 -0
- package/libraries/blitz-ui/native-osr-spike.ts +0 -70
- package/libraries/devtools/native/Cargo.toml +0 -12
- package/libraries/devtools/native/src/lib.rs +0 -1646
- package/libraries/devtools/native/src/panels/console.rs +0 -338
- package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
- package/libraries/devtools/native/src/panels/generic.rs +0 -317
- package/libraries/devtools/native/src/panels/gpu.rs +0 -107
- package/libraries/devtools/native/src/panels/input.rs +0 -88
- package/libraries/devtools/native/src/panels/mod.rs +0 -154
- package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
- package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
- package/libraries/devtools/native/src/panels/scene.rs +0 -72
- package/libraries/devtools/native/src/state.rs +0 -394
- package/libraries/devtools/src/egui-ffi.ts +0 -804
- package/libraries/devtools/src/egui-renderer.ts +0 -407
- package/libraries/devtools/src/host.ts +0 -363
- package/libraries/devtools/src/mirror.ts +0 -794
- package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
- package/libraries/models/test-fixtures/fbx/README.md +0 -46
- package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
- package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
- package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
- package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
- package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
- package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// basisu texture codec — transcodes KHR_texture_basisu KTX2 → GPU texture.
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// KHR_texture_basisu points a glTF texture at an image whose bufferView holds
|
|
6
|
+
// KTX2-encoded bytes with Basis Universal supercompression (vkFormat=0). The
|
|
7
|
+
// engine's KTX2 reader (parseKTX2FromBuffer) only handles KTX2 with concrete
|
|
8
|
+
// vkFormats (BC/ASTC/ETC/uncompressed) — it cannot transcode Basisu. This
|
|
9
|
+
// codec bridges that gap: it transcodes Basisu KTX2 → RGBA32 (uncompressed)
|
|
10
|
+
// using @h00w/basis-universal-transcoder (wasm, ~486KB, lazy-loaded).
|
|
11
|
+
//
|
|
12
|
+
// Transcoding to RGBA32 is the universally-compatible first pass: every
|
|
13
|
+
// WebGPU device supports rgba8unorm. The Basisu win is on-disk/download size
|
|
14
|
+
// (ETC1S/UASTC are far smaller than PNG/JPG). A follow-up can transcode to
|
|
15
|
+
// BC7/ASTC per-GPU for VRAM savings (the engine's createGPUTextureFromData
|
|
16
|
+
// already handles compressed formats).
|
|
17
|
+
//
|
|
18
|
+
// The transcoder wasm is loaded lazily on first decode(). In the Vite
|
|
19
|
+
// renderer the wasm URL is resolved via a `?url` import; in Node it is read
|
|
20
|
+
// from the package on disk. Override with configureBasisuWasmPath().
|
|
21
|
+
//
|
|
22
|
+
// Vite resolves this to a hashed asset URL in the renderer build. In Node the
|
|
23
|
+
// import is unused (we read from disk). `vite/client` types declare `*?url`.
|
|
24
|
+
// Loaded lazily: Deno rejects the `?url` package subpath at resolution time.
|
|
25
|
+
let wasmUrlCached = null;
|
|
26
|
+
async function getWasmUrl() {
|
|
27
|
+
if (wasmUrlCached === null) {
|
|
28
|
+
try {
|
|
29
|
+
const mod = await Promise.resolve({ default: import.meta.resolve("@h00w/basis-universal-transcoder/basis_capi_transcoder.wasm") });
|
|
30
|
+
wasmUrlCached = mod.default;
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
wasmUrlCached = "";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return wasmUrlCached;
|
|
37
|
+
}
|
|
38
|
+
let basisuWasmConfig = {};
|
|
39
|
+
/** Override the transcoder wasm source (URL or pre-loaded ArrayBuffer). */
|
|
40
|
+
export function configureBasisuWasmPath(config) {
|
|
41
|
+
basisuWasmConfig = config;
|
|
42
|
+
basisuPromise = null;
|
|
43
|
+
}
|
|
44
|
+
const cTFRGBA32 = 13;
|
|
45
|
+
let basisuPromise = null;
|
|
46
|
+
async function loadBasisu() {
|
|
47
|
+
if (basisuPromise)
|
|
48
|
+
return basisuPromise;
|
|
49
|
+
basisuPromise = (async () => {
|
|
50
|
+
const mod = await import("@h00w/basis-universal-transcoder");
|
|
51
|
+
const { BasisUniversal } = mod;
|
|
52
|
+
const instantiate = async (imports) => {
|
|
53
|
+
// Explicit override wins.
|
|
54
|
+
if (basisuWasmConfig.wasmBinary) {
|
|
55
|
+
return WebAssembly.instantiate(basisuWasmConfig.wasmBinary, imports);
|
|
56
|
+
}
|
|
57
|
+
const url = basisuWasmConfig.wasmUrl ?? (await getWasmUrl());
|
|
58
|
+
// Browser/renderer: fetch the URL if it's a valid http/https URL.
|
|
59
|
+
// The `?url` import produces a real URL in Vite; in Node/bun it may
|
|
60
|
+
// produce an invalid string, so we validate before fetching.
|
|
61
|
+
if (typeof fetch === "function" && /^https?:\/\//.test(url)) {
|
|
62
|
+
const res = await fetch(url);
|
|
63
|
+
const bytes = await res.arrayBuffer();
|
|
64
|
+
return WebAssembly.instantiate(bytes, imports);
|
|
65
|
+
}
|
|
66
|
+
// Node fallback: read the wasm from the package on disk.
|
|
67
|
+
const fs = await import("node:fs");
|
|
68
|
+
const path = await import("node:path");
|
|
69
|
+
const { createRequire } = await import("node:module");
|
|
70
|
+
const require = createRequire(import.meta.url);
|
|
71
|
+
const pkgPath = require.resolve("@h00w/basis-universal-transcoder/package.json");
|
|
72
|
+
const wasmPath = path.join(path.dirname(pkgPath), "dist", "basis_capi_transcoder.wasm");
|
|
73
|
+
const bytes = fs.readFileSync(wasmPath);
|
|
74
|
+
return WebAssembly.instantiate(bytes, imports);
|
|
75
|
+
};
|
|
76
|
+
return BasisUniversal.getInstance(instantiate);
|
|
77
|
+
})();
|
|
78
|
+
return basisuPromise;
|
|
79
|
+
}
|
|
80
|
+
export function createBasisuTextureCodec() {
|
|
81
|
+
return {
|
|
82
|
+
uri: "KHR_texture_basisu",
|
|
83
|
+
async decode(input) {
|
|
84
|
+
const basisu = await loadBasisu();
|
|
85
|
+
const data = input.data;
|
|
86
|
+
const transcoder = basisu.createKTX2Transcoder();
|
|
87
|
+
if (!transcoder.init(data)) {
|
|
88
|
+
transcoder.dispose();
|
|
89
|
+
throw new Error("KHR_texture_basisu: failed to init KTX2 transcoder");
|
|
90
|
+
}
|
|
91
|
+
if (!transcoder.startTranscoding()) {
|
|
92
|
+
transcoder.dispose();
|
|
93
|
+
throw new Error("KHR_texture_basisu: failed to start transcoding");
|
|
94
|
+
}
|
|
95
|
+
const header = transcoder.getHeader();
|
|
96
|
+
const levels = header.levels;
|
|
97
|
+
const w0 = header.width;
|
|
98
|
+
const h0 = header.height;
|
|
99
|
+
// Transcode each mip level to RGBA32 and concatenate.
|
|
100
|
+
const levelBytes = [];
|
|
101
|
+
let totalSize = 0;
|
|
102
|
+
for (let level = 0; level < levels; level++) {
|
|
103
|
+
const result = transcoder.transcodeImageLevel({ format: cTFRGBA32, level });
|
|
104
|
+
if (!result) {
|
|
105
|
+
// Some encoders emit fewer levels than the header claims; stop at
|
|
106
|
+
// the first missing level rather than failing the whole texture.
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
// The wasm memory is invalidated on the next transcode call — copy now.
|
|
110
|
+
const copy = new Uint8Array(result.data);
|
|
111
|
+
levelBytes.push(copy);
|
|
112
|
+
totalSize += copy.byteLength;
|
|
113
|
+
}
|
|
114
|
+
transcoder.dispose();
|
|
115
|
+
if (levelBytes.length === 0) {
|
|
116
|
+
throw new Error("KHR_texture_basisu: no mip levels transcoded");
|
|
117
|
+
}
|
|
118
|
+
const combined = new Uint8Array(totalSize);
|
|
119
|
+
let offset = 0;
|
|
120
|
+
levelBytes.forEach((lb) => {
|
|
121
|
+
combined.set(lb, offset);
|
|
122
|
+
offset += lb.byteLength;
|
|
123
|
+
});
|
|
124
|
+
return {
|
|
125
|
+
data: combined,
|
|
126
|
+
width: w0,
|
|
127
|
+
height: h0,
|
|
128
|
+
format: "rgba8unorm",
|
|
129
|
+
mipLevels: levelBytes.length,
|
|
130
|
+
isHDR: false,
|
|
131
|
+
};
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Draco mesh codec — decodes KHR_draco_mesh_compression primitives.
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// Uses the `draco3dgltf` WASM decoder. The decoder module is loaded lazily on
|
|
6
|
+
// first decode() call and cached for the process lifetime. The WASM binary
|
|
7
|
+
// path is resolved via `locateFile`; see `configureDracoWasmPath()`.
|
|
8
|
+
//
|
|
9
|
+
// KHR_draco_mesh_compression maps each glTF attribute semantic to a Draco
|
|
10
|
+
// attribute unique id. We decode the whole primitive once and return per-
|
|
11
|
+
// attribute typed arrays.
|
|
12
|
+
//
|
|
13
|
+
/// <reference path="./draco3dgltf.d.ts" />
|
|
14
|
+
import { assertCount, MAX_DECOMPRESS_SIZE, MAX_FACE_COUNT, MAX_VERTEX_COUNT } from "@downdraft/engine";
|
|
15
|
+
// Draco component type constants (mirrors glTF componentType).
|
|
16
|
+
const COMPONENT_TYPE_BYTES = {
|
|
17
|
+
5120: 1, // BYTE
|
|
18
|
+
5121: 1, // UNSIGNED_BYTE
|
|
19
|
+
5122: 2, // SHORT
|
|
20
|
+
5123: 2, // UNSIGNED_SHORT
|
|
21
|
+
5125: 4, // UNSIGNED_INT
|
|
22
|
+
5126: 4, // FLOAT
|
|
23
|
+
};
|
|
24
|
+
const TYPE_COMPONENTS = {
|
|
25
|
+
SCALAR: 1, VEC2: 2, VEC3: 3, VEC4: 4, MAT2: 4, MAT3: 9, MAT4: 16,
|
|
26
|
+
};
|
|
27
|
+
// Draco data type enum (subset we care about).
|
|
28
|
+
const DT_FLOAT32 = 9;
|
|
29
|
+
const DT_INT8 = 2;
|
|
30
|
+
const DT_UINT8 = 3;
|
|
31
|
+
const DT_INT16 = 4;
|
|
32
|
+
const DT_UINT16 = 5;
|
|
33
|
+
const DT_INT32 = 6;
|
|
34
|
+
const DT_UINT32 = 7;
|
|
35
|
+
// Map glTF componentType → Draco data type for output array allocation.
|
|
36
|
+
function componentTypeToDracoDataType(componentType) {
|
|
37
|
+
switch (componentType) {
|
|
38
|
+
case 5126: return DT_FLOAT32;
|
|
39
|
+
case 5121: return DT_UINT8;
|
|
40
|
+
case 5120: return DT_INT8;
|
|
41
|
+
case 5123: return DT_UINT16;
|
|
42
|
+
case 5122: return DT_INT16;
|
|
43
|
+
case 5125: return DT_UINT32;
|
|
44
|
+
default: return DT_FLOAT32;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function makeTypedArray(module, ptr, componentType, count) {
|
|
48
|
+
const n = count;
|
|
49
|
+
switch (componentType) {
|
|
50
|
+
case 5126: return module.HEAPF32.subarray(ptr / 4, ptr / 4 + n).slice();
|
|
51
|
+
case 5121: return module.HEAPU8.subarray(ptr, ptr + n).slice();
|
|
52
|
+
case 5120: return new Int8Array(module.HEAPU8.buffer, ptr, n).slice();
|
|
53
|
+
case 5123: {
|
|
54
|
+
const view = new Uint16Array(module.HEAPU8.buffer);
|
|
55
|
+
return view.subarray(ptr / 2, ptr / 2 + n).slice();
|
|
56
|
+
}
|
|
57
|
+
case 5122: {
|
|
58
|
+
const view = new Int16Array(module.HEAPU8.buffer);
|
|
59
|
+
return view.subarray(ptr / 2, ptr / 2 + n).slice();
|
|
60
|
+
}
|
|
61
|
+
case 5125: {
|
|
62
|
+
const view = new Uint32Array(module.HEAPU8.buffer);
|
|
63
|
+
return view.subarray(ptr / 4, ptr / 4 + n).slice();
|
|
64
|
+
}
|
|
65
|
+
default: return module.HEAPF32.subarray(ptr / 4, ptr / 4 + n).slice();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// --- Module loading --------------------------------------------------------
|
|
69
|
+
let modulePromise = null;
|
|
70
|
+
let dracoWasmConfig = {};
|
|
71
|
+
export function configureDracoWasmPath(config) {
|
|
72
|
+
dracoWasmConfig = config;
|
|
73
|
+
// Invalidate cached module so next load uses the new config.
|
|
74
|
+
modulePromise = null;
|
|
75
|
+
}
|
|
76
|
+
async function loadDracoModule() {
|
|
77
|
+
if (modulePromise)
|
|
78
|
+
return modulePromise;
|
|
79
|
+
modulePromise = (async () => {
|
|
80
|
+
// Dynamic import of the CommonJS package; Bun/Node interop returns the
|
|
81
|
+
// module.exports object. In a bundler (Vite) this is converted to ESM.
|
|
82
|
+
const pkg = (await import("draco3dgltf"));
|
|
83
|
+
const factory = pkg.createDecoderModule;
|
|
84
|
+
const config = {};
|
|
85
|
+
if (dracoWasmConfig.wasmBinary) {
|
|
86
|
+
config.wasmBinary = dracoWasmConfig.wasmBinary;
|
|
87
|
+
}
|
|
88
|
+
else if (dracoWasmConfig.wasmUrl) {
|
|
89
|
+
const url = dracoWasmConfig.wasmUrl;
|
|
90
|
+
config.locateFile = (file) => {
|
|
91
|
+
// Only redirect the .wasm file; the JS glue is already loaded.
|
|
92
|
+
if (file.endsWith(".wasm"))
|
|
93
|
+
return url;
|
|
94
|
+
return file;
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
// else: rely on the module's default locateFile (works in Node where the
|
|
98
|
+
// .wasm sits next to the JS glue; in browsers it needs configuration).
|
|
99
|
+
const mod = (await factory(config));
|
|
100
|
+
return mod;
|
|
101
|
+
})();
|
|
102
|
+
return modulePromise;
|
|
103
|
+
}
|
|
104
|
+
// --- Codec -----------------------------------------------------------------
|
|
105
|
+
export function createDracoMeshCodec() {
|
|
106
|
+
return {
|
|
107
|
+
uri: "KHR_draco_mesh_compression",
|
|
108
|
+
async decode(input) {
|
|
109
|
+
const mod = await loadDracoModule();
|
|
110
|
+
const decoderBuffer = new mod.DecoderBuffer();
|
|
111
|
+
decoderBuffer.Init(input.bufferViewData, input.bufferViewData.length);
|
|
112
|
+
const decoder = new mod.Decoder();
|
|
113
|
+
try {
|
|
114
|
+
const geomType = decoder.GetEncodedGeometryType(decoderBuffer);
|
|
115
|
+
const isMesh = geomType === mod.TRIANGULAR_MESH;
|
|
116
|
+
const attributes = new Map();
|
|
117
|
+
let vertexCount = 0;
|
|
118
|
+
let indexCount = 0;
|
|
119
|
+
let indices;
|
|
120
|
+
if (isMesh) {
|
|
121
|
+
const mesh = new mod.Mesh();
|
|
122
|
+
const ok = decoder.DecodeBufferToMesh(decoderBuffer, mesh);
|
|
123
|
+
if (!ok)
|
|
124
|
+
throw new Error("Draco: DecodeBufferToMesh failed");
|
|
125
|
+
vertexCount = mesh.num_points();
|
|
126
|
+
indexCount = mesh.num_faces() * 3;
|
|
127
|
+
assertCount("draco vertices", vertexCount, MAX_VERTEX_COUNT);
|
|
128
|
+
assertCount("draco indices", indexCount, MAX_FACE_COUNT * 3);
|
|
129
|
+
// Decode each attribute by glTF semantic → Draco unique id.
|
|
130
|
+
for (const [semantic, uniqueId] of Object.entries(input.attributes)) {
|
|
131
|
+
const attr = decoder.GetMeshAttribute(mesh, uniqueId);
|
|
132
|
+
if (!attr) {
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
const accessor = input.accessors.get(uniqueId);
|
|
136
|
+
const componentType = accessor?.componentType ?? 5126;
|
|
137
|
+
const components = accessor ? TYPE_COMPONENTS[accessor.type] ?? 1 : attr.num_components();
|
|
138
|
+
const totalComponents = vertexCount * components;
|
|
139
|
+
const bytesPer = COMPONENT_TYPE_BYTES[componentType] ?? 4;
|
|
140
|
+
if (totalComponents * bytesPer > MAX_DECOMPRESS_SIZE) {
|
|
141
|
+
throw new RangeError(`Draco: attribute ${semantic} decoded size ${totalComponents * bytesPer} exceeds max ${MAX_DECOMPRESS_SIZE}`);
|
|
142
|
+
}
|
|
143
|
+
const ptr = mod._malloc(totalComponents * bytesPer);
|
|
144
|
+
try {
|
|
145
|
+
const dataType = componentTypeToDracoDataType(componentType);
|
|
146
|
+
const success = decoder.GetAttributeDataArrayForAllPoints(mesh, attr, dataType, totalComponents * bytesPer, ptr);
|
|
147
|
+
if (!success) {
|
|
148
|
+
throw new Error(`Draco: failed to decode attribute ${semantic}`);
|
|
149
|
+
}
|
|
150
|
+
attributes.set(semantic, makeTypedArray(mod, ptr, componentType, totalComponents));
|
|
151
|
+
}
|
|
152
|
+
finally {
|
|
153
|
+
mod._free(ptr);
|
|
154
|
+
attr.delete();
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Decode indices (faces → triangle index buffer).
|
|
158
|
+
if (input.indices !== undefined) {
|
|
159
|
+
const accessor = input.accessors.get(input.indices);
|
|
160
|
+
const componentType = accessor?.componentType ?? 5123;
|
|
161
|
+
const bytesPer = COMPONENT_TYPE_BYTES[componentType] ?? 2;
|
|
162
|
+
const ptr = mod._malloc(indexCount * bytesPer);
|
|
163
|
+
try {
|
|
164
|
+
// Draco face indices are uint32; we read via GetFaceFromMesh
|
|
165
|
+
// would be slow per-face. Use the typed-array path: Draco
|
|
166
|
+
// exposes mesh indices through the same array API when the
|
|
167
|
+
// "indices" attribute is requested. Fall back to per-face read.
|
|
168
|
+
const indexArray = componentType === 5125
|
|
169
|
+
? new Uint32Array(indexCount)
|
|
170
|
+
: componentType === 5122
|
|
171
|
+
? new Int16Array(indexCount)
|
|
172
|
+
: new Uint16Array(indexCount);
|
|
173
|
+
const faceView = new Int32Array(mod.HEAPU8.buffer);
|
|
174
|
+
const facePtr = mod._malloc(12);
|
|
175
|
+
try {
|
|
176
|
+
for (let f = 0; f < mesh.num_faces(); f++) {
|
|
177
|
+
decoder.GetFaceFromMesh(mesh, f, { ptr: facePtr });
|
|
178
|
+
const i0 = faceView[facePtr / 4];
|
|
179
|
+
const i1 = faceView[facePtr / 4 + 1];
|
|
180
|
+
const i2 = faceView[facePtr / 4 + 2];
|
|
181
|
+
indexArray[f * 3] = i0;
|
|
182
|
+
indexArray[f * 3 + 1] = i1;
|
|
183
|
+
indexArray[f * 3 + 2] = i2;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
mod._free(facePtr);
|
|
188
|
+
}
|
|
189
|
+
indices = indexArray;
|
|
190
|
+
}
|
|
191
|
+
finally {
|
|
192
|
+
mod._free(ptr);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
mesh.delete();
|
|
196
|
+
}
|
|
197
|
+
else {
|
|
198
|
+
// Point cloud (no indices).
|
|
199
|
+
const pc = new mod.PointCloud();
|
|
200
|
+
const ok = decoder.DecodeBufferToPointCloud(decoderBuffer, pc);
|
|
201
|
+
if (!ok)
|
|
202
|
+
throw new Error("Draco: DecodeBufferToPointCloud failed");
|
|
203
|
+
vertexCount = pc.num_points();
|
|
204
|
+
for (const [semantic, uniqueId] of Object.entries(input.attributes)) {
|
|
205
|
+
const attr = decoder.GetMeshAttribute(pc, uniqueId);
|
|
206
|
+
if (!attr)
|
|
207
|
+
continue;
|
|
208
|
+
const accessor = input.accessors.get(uniqueId);
|
|
209
|
+
const componentType = accessor?.componentType ?? 5126;
|
|
210
|
+
const components = accessor ? TYPE_COMPONENTS[accessor.type] ?? 1 : attr.num_components();
|
|
211
|
+
const totalComponents = vertexCount * components;
|
|
212
|
+
const bytesPer = COMPONENT_TYPE_BYTES[componentType] ?? 4;
|
|
213
|
+
const ptr = mod._malloc(totalComponents * bytesPer);
|
|
214
|
+
try {
|
|
215
|
+
const dataType = componentTypeToDracoDataType(componentType);
|
|
216
|
+
const success = decoder.GetAttributeDataArrayForAllPoints(pc, attr, dataType, totalComponents * bytesPer, ptr);
|
|
217
|
+
if (!success)
|
|
218
|
+
throw new Error(`Draco: failed to decode attribute ${semantic}`);
|
|
219
|
+
attributes.set(semantic, makeTypedArray(mod, ptr, componentType, totalComponents));
|
|
220
|
+
}
|
|
221
|
+
finally {
|
|
222
|
+
mod._free(ptr);
|
|
223
|
+
attr.delete();
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
pc.delete();
|
|
227
|
+
}
|
|
228
|
+
return { attributes, indices, vertexCount, indexCount };
|
|
229
|
+
}
|
|
230
|
+
finally {
|
|
231
|
+
decoder.delete();
|
|
232
|
+
decoderBuffer.delete();
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
};
|
|
236
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
declare module "draco3dgltf" {
|
|
2
|
+
interface DracoDecoderModule {
|
|
3
|
+
decoder: any;
|
|
4
|
+
Decoder: any;
|
|
5
|
+
DecoderBuffer: any;
|
|
6
|
+
Mesh: any;
|
|
7
|
+
PointCloud: any;
|
|
8
|
+
AttributeEnum: any;
|
|
9
|
+
STATUS_OK: number;
|
|
10
|
+
ERROR: number;
|
|
11
|
+
INVALID_GEOMETRY_TYPE: number;
|
|
12
|
+
TRIVIAL: number;
|
|
13
|
+
POINT_CLOUD: number;
|
|
14
|
+
TRIANGULAR_MESH: number;
|
|
15
|
+
INVALID_ATTRIBUTE_TYPE: number;
|
|
16
|
+
POSITION: number;
|
|
17
|
+
NORMAL: number;
|
|
18
|
+
COLOR: number;
|
|
19
|
+
TEX_COORD: number;
|
|
20
|
+
GENERIC: number;
|
|
21
|
+
INVALID_DATA_TYPE: number;
|
|
22
|
+
DT_FLOAT: number;
|
|
23
|
+
DT_INT8: number;
|
|
24
|
+
DT_UINT8: number;
|
|
25
|
+
DT_INT16: number;
|
|
26
|
+
DT_UINT16: number;
|
|
27
|
+
DT_INT32: number;
|
|
28
|
+
DT_UINT32: number;
|
|
29
|
+
destroy(obj: any): void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
interface DracoModuleOptions {
|
|
33
|
+
onModuleLoaded?: (module: DracoDecoderModule) => void;
|
|
34
|
+
locateFile?: (path: string, prefix: string) => string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function createDecoderModule(options: DracoModuleOptions): Promise<DracoDecoderModule>;
|
|
38
|
+
export function createEncoderModule(options: DracoModuleOptions): Promise<unknown>;
|
|
39
|
+
export function setDracoDecoderPath(path: string): void;
|
|
40
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// Codec registry + bundled codecs for the glTF asset pipeline.
|
|
2
|
+
export { configureBasisuWasmPath, createBasisuTextureCodec } from "./basisu-codec.js";
|
|
3
|
+
export { configureDracoWasmPath, createDracoMeshCodec } from "./draco-codec.js";
|
|
4
|
+
export { createMeshoptBufferViewCodec } from "./meshopt-codec.js";
|
|
5
|
+
export { getDefaultCodecRegistry, GLTFCodecRegistry, registerDefaultCodecs, setDefaultCodecRegistry } from "./registry.js";
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// meshopt bufferView codec — decodes EXT_meshopt_compression bufferViews.
|
|
3
|
+
// ============================================================================
|
|
4
|
+
//
|
|
5
|
+
// Uses the `meshoptimizer` WASM decoder (`MeshoptDecoder`). The decoder is
|
|
6
|
+
// loaded lazily and its `ready` promise is awaited before first decode.
|
|
7
|
+
//
|
|
8
|
+
// EXT_meshopt_compression sits on a bufferView and describes how to decode it
|
|
9
|
+
// into `count * byteStride` bytes. The decoded bytes are then read by glTF
|
|
10
|
+
// accessors exactly like an uncompressed bufferView. We return the decoded
|
|
11
|
+
// Uint8Array; the parser caches it per-bufferView so all accessors sharing
|
|
12
|
+
// the bufferView reuse one decode.
|
|
13
|
+
//
|
|
14
|
+
import { assertFinite, assertPositive, MAX_DECOMPRESS_SIZE } from "@downdraft/engine";
|
|
15
|
+
let decoderPromise = null;
|
|
16
|
+
async function loadMeshoptDecoder() {
|
|
17
|
+
if (decoderPromise)
|
|
18
|
+
return decoderPromise;
|
|
19
|
+
decoderPromise = (async () => {
|
|
20
|
+
const mod = (await import("meshoptimizer/decoder"));
|
|
21
|
+
const decoder = mod.MeshoptDecoder;
|
|
22
|
+
if (!decoder.supported) {
|
|
23
|
+
throw new Error("meshoptimizer: WebAssembly not supported in this runtime");
|
|
24
|
+
}
|
|
25
|
+
await decoder.ready;
|
|
26
|
+
return decoder;
|
|
27
|
+
})();
|
|
28
|
+
return decoderPromise;
|
|
29
|
+
}
|
|
30
|
+
export function createMeshoptBufferViewCodec() {
|
|
31
|
+
return {
|
|
32
|
+
uri: "EXT_meshopt_compression",
|
|
33
|
+
async decode(input) {
|
|
34
|
+
const decoder = await loadMeshoptDecoder();
|
|
35
|
+
const ext = input.extension;
|
|
36
|
+
const count = ext.count ?? input.accessor.count;
|
|
37
|
+
const byteStride = ext.byteStride ?? input.byteStride;
|
|
38
|
+
const mode = ext.mode ?? "ATTRIBUTES";
|
|
39
|
+
const filter = ext.filter ?? "NONE";
|
|
40
|
+
if (!mode)
|
|
41
|
+
throw new Error("EXT_meshopt_compression: missing mode");
|
|
42
|
+
if (!byteStride)
|
|
43
|
+
throw new Error("EXT_meshopt_compression: missing byteStride");
|
|
44
|
+
// Validate count and byteStride are positive finite numbers
|
|
45
|
+
assertFinite("meshopt count", count);
|
|
46
|
+
assertPositive("meshopt count", count);
|
|
47
|
+
assertFinite("meshopt byteStride", byteStride);
|
|
48
|
+
assertPositive("meshopt byteStride", byteStride);
|
|
49
|
+
// Validate count * byteStride doesn't overflow and is within decompress limit
|
|
50
|
+
const totalSize = count * byteStride;
|
|
51
|
+
if (!Number.isFinite(totalSize) || totalSize > MAX_DECOMPRESS_SIZE) {
|
|
52
|
+
throw new RangeError(`EXT_meshopt_compression: decoded size ${totalSize} exceeds max ${MAX_DECOMPRESS_SIZE}`);
|
|
53
|
+
}
|
|
54
|
+
const target = new Uint8Array(totalSize);
|
|
55
|
+
decoder.decodeGltfBuffer(target, count, byteStride, input.compressedData, mode, filter);
|
|
56
|
+
return target;
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// glTF Codec Registry — extension-URI-keyed decoders for compressed/extended
|
|
3
|
+
// glTF data. This is the second axis of the asset pipeline: AssetManager keys
|
|
4
|
+
// on file extension, the codec registry keys on glTF extension URI.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
//
|
|
7
|
+
// Mesh codecs decode compressed accessor data (Draco, meshopt) into typed
|
|
8
|
+
// arrays. Texture codecs decode extension-encoded image data (basisu/KTX2).
|
|
9
|
+
// Extension processors handle non-codec extensions (texture_transform,
|
|
10
|
+
// material variants, lights punctual) and are registered separately.
|
|
11
|
+
//
|
|
12
|
+
/**
|
|
13
|
+
* Registry of glTF extension codecs. A single shared instance is used by the
|
|
14
|
+
* glTF parser; codecs are registered once at plugin setup.
|
|
15
|
+
*/
|
|
16
|
+
export class GLTFCodecRegistry {
|
|
17
|
+
meshCodecs = new Map();
|
|
18
|
+
bufferViewCodecs = new Map();
|
|
19
|
+
textureCodecs = new Map();
|
|
20
|
+
supportedExtensions = new Set();
|
|
21
|
+
registerMeshCodec(codec) {
|
|
22
|
+
this.meshCodecs.set(codec.uri, codec);
|
|
23
|
+
this.supportedExtensions.add(codec.uri);
|
|
24
|
+
}
|
|
25
|
+
registerBufferViewCodec(codec) {
|
|
26
|
+
this.bufferViewCodecs.set(codec.uri, codec);
|
|
27
|
+
this.supportedExtensions.add(codec.uri);
|
|
28
|
+
}
|
|
29
|
+
registerTextureCodec(codec) {
|
|
30
|
+
this.textureCodecs.set(codec.uri, codec);
|
|
31
|
+
this.supportedExtensions.add(codec.uri);
|
|
32
|
+
}
|
|
33
|
+
/** Declare support for a non-codec extension (e.g. KHR_texture_transform). */
|
|
34
|
+
declareSupported(uri) {
|
|
35
|
+
this.supportedExtensions.add(uri);
|
|
36
|
+
}
|
|
37
|
+
getMeshCodec(uri) {
|
|
38
|
+
return this.meshCodecs.get(uri);
|
|
39
|
+
}
|
|
40
|
+
getBufferViewCodec(uri) {
|
|
41
|
+
return this.bufferViewCodecs.get(uri);
|
|
42
|
+
}
|
|
43
|
+
getTextureCodec(uri) {
|
|
44
|
+
return this.textureCodecs.get(uri);
|
|
45
|
+
}
|
|
46
|
+
hasMeshCodec(uri) {
|
|
47
|
+
return this.meshCodecs.has(uri);
|
|
48
|
+
}
|
|
49
|
+
hasBufferViewCodec(uri) {
|
|
50
|
+
return this.bufferViewCodecs.has(uri);
|
|
51
|
+
}
|
|
52
|
+
hasTextureCodec(uri) {
|
|
53
|
+
return this.textureCodecs.has(uri);
|
|
54
|
+
}
|
|
55
|
+
listSupported() {
|
|
56
|
+
return Array.from(this.supportedExtensions).sort();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let defaultRegistry = null;
|
|
60
|
+
/** Lazily-created process-wide registry with default codecs registered. */
|
|
61
|
+
export function getDefaultCodecRegistry() {
|
|
62
|
+
if (!defaultRegistry) {
|
|
63
|
+
defaultRegistry = new GLTFCodecRegistry();
|
|
64
|
+
registerDefaultCodecs(defaultRegistry);
|
|
65
|
+
}
|
|
66
|
+
return defaultRegistry;
|
|
67
|
+
}
|
|
68
|
+
/** Replace the default registry (useful for tests with isolated codec sets). */
|
|
69
|
+
export function setDefaultCodecRegistry(registry) {
|
|
70
|
+
defaultRegistry = registry;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Register the bundled default codecs (Draco, meshopt, basisu) and declare
|
|
74
|
+
* support for non-codec extensions handled directly by the parser
|
|
75
|
+
* (texture_transform, mesh_quantization, material_variants, lights_punctual).
|
|
76
|
+
*
|
|
77
|
+
* WASM paths are resolved lazily; if a codec's WASM module cannot be loaded
|
|
78
|
+
* (e.g. missing asset path in a given runtime), that codec is simply absent
|
|
79
|
+
* and the parser will surface a clear error on assets that require it.
|
|
80
|
+
*/
|
|
81
|
+
export function registerDefaultCodecs(registry) {
|
|
82
|
+
// Codec-backed extensions (registered lazily on first use to avoid pulling
|
|
83
|
+
// WASM modules in environments that never load compressed assets).
|
|
84
|
+
registry.registerMeshCodec(createLazyDracoMeshCodec());
|
|
85
|
+
registry.registerBufferViewCodec(createLazyMeshoptBufferViewCodec());
|
|
86
|
+
registry.registerTextureCodec(createLazyBasisuTextureCodec());
|
|
87
|
+
// Non-codec extensions handled directly in the parser/extension processors.
|
|
88
|
+
registry.declareSupported("KHR_texture_transform");
|
|
89
|
+
registry.declareSupported("KHR_mesh_quantization");
|
|
90
|
+
registry.declareSupported("KHR_materials_variants");
|
|
91
|
+
registry.declareSupported("KHR_lights_punctual");
|
|
92
|
+
registry.declareSupported("KHR_materials_pbrSpecularGlossiness");
|
|
93
|
+
registry.declareSupported("KHR_materials_unlit");
|
|
94
|
+
registry.declareSupported("KHR_materials_emissive_strength");
|
|
95
|
+
}
|
|
96
|
+
// --- Lazy codec factories -------------------------------------------------
|
|
97
|
+
// These are split into their own modules but referenced here so the registry
|
|
98
|
+
// wires them on first access. Each factory returns a codec that loads its
|
|
99
|
+
// WASM/JS glue only when decode() is first called.
|
|
100
|
+
import { createDracoMeshCodec } from "./draco-codec.js";
|
|
101
|
+
import { createMeshoptBufferViewCodec } from "./meshopt-codec.js";
|
|
102
|
+
import { createBasisuTextureCodec } from "./basisu-codec.js";
|
|
103
|
+
function createLazyDracoMeshCodec() {
|
|
104
|
+
return createDracoMeshCodec();
|
|
105
|
+
}
|
|
106
|
+
function createLazyMeshoptBufferViewCodec() {
|
|
107
|
+
return createMeshoptBufferViewCodec();
|
|
108
|
+
}
|
|
109
|
+
function createLazyBasisuTextureCodec() {
|
|
110
|
+
return createBasisuTextureCodec();
|
|
111
|
+
}
|