@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,492 @@
|
|
|
1
|
+
export enum Material {
|
|
2
|
+
Empty = 0,
|
|
3
|
+
Sand = 1,
|
|
4
|
+
Water = 2,
|
|
5
|
+
Stone = 3,
|
|
6
|
+
Wood = 4,
|
|
7
|
+
Fire = 5,
|
|
8
|
+
Smoke = 6,
|
|
9
|
+
Oil = 7,
|
|
10
|
+
Gunpowder = 8,
|
|
11
|
+
Iron = 9,
|
|
12
|
+
Lava = 10,
|
|
13
|
+
Steam = 11,
|
|
14
|
+
Plant = 12,
|
|
15
|
+
Flesh = 13,
|
|
16
|
+
// New materials
|
|
17
|
+
Dirt = 14,
|
|
18
|
+
Seed = 15,
|
|
19
|
+
Leaf = 16,
|
|
20
|
+
Antimatter = 17,
|
|
21
|
+
Mystery = 18, // ???
|
|
22
|
+
Flour = 19,
|
|
23
|
+
Gasoline = 20,
|
|
24
|
+
GasVapor = 21, // vaporized gasoline gas
|
|
25
|
+
Hydrogen = 22,
|
|
26
|
+
Plastic = 23,
|
|
27
|
+
Toast = 24,
|
|
28
|
+
Salt = 25,
|
|
29
|
+
Wall = 26,
|
|
30
|
+
Fireflies = 27,
|
|
31
|
+
Grass = 28,
|
|
32
|
+
Snow = 29,
|
|
33
|
+
Honey = 30,
|
|
34
|
+
Mercury = 31,
|
|
35
|
+
Fuse = 32,
|
|
36
|
+
C4 = 33,
|
|
37
|
+
Dynamite = 34,
|
|
38
|
+
Wax = 35,
|
|
39
|
+
ConcretePowder = 36,
|
|
40
|
+
DryIce = 37,
|
|
41
|
+
LiquidNitrogen = 38,
|
|
42
|
+
Plasma = 39,
|
|
43
|
+
Nanobots = 40,
|
|
44
|
+
MagicPowder = 41,
|
|
45
|
+
Glitter = 42,
|
|
46
|
+
Popcorn = 43,
|
|
47
|
+
Rubber = 44,
|
|
48
|
+
Root = 45, // tree root (internal)
|
|
49
|
+
Brine = 46, // salt+water mixture
|
|
50
|
+
MoltenSalt = 47, // heated salt → destructive liquid
|
|
51
|
+
Concrete = 48, // hardened concrete
|
|
52
|
+
TreeWood = 49, // wood grown from seed (same behavior as wood)
|
|
53
|
+
FuseFire = 50, // yellow fuse fire (separate from normal red fire)
|
|
54
|
+
BurningOil = 51, // slow-burning oil fire (flows like liquid, controlled decay/spread)
|
|
55
|
+
// --- Ores (solid, become falling particles when dug) ---
|
|
56
|
+
TinOre = 52,
|
|
57
|
+
CopperOre = 53,
|
|
58
|
+
IronOre = 54, // ore form (distinct from pure-metal Iron block above)
|
|
59
|
+
BauxiteOre = 55,
|
|
60
|
+
SilverOre = 56,
|
|
61
|
+
GoldOre = 57,
|
|
62
|
+
CobaltOre = 58,
|
|
63
|
+
// --- Gases (toxic, rise) ---
|
|
64
|
+
MethaneGas = 59, // flammable, rises
|
|
65
|
+
SulfurGas = 60, // toxic, non-flammable, rises
|
|
66
|
+
// --- Coal (solid, flammable, becomes falling when dug) ---
|
|
67
|
+
Coal = 61,
|
|
68
|
+
// --- Stone debris (from mining stone) ---
|
|
69
|
+
Gravel = 62, // fine crushed stone — flows like a liquid, settles in place
|
|
70
|
+
LooseStone = 63, // coarse stone chunk — falls like a solid, re-settles to Stone
|
|
71
|
+
// --- Ingredients ---
|
|
72
|
+
// Ice (frozen water — produced by cooling)
|
|
73
|
+
Ice = 64,
|
|
74
|
+
// Liquids
|
|
75
|
+
Ether = 65, // ethereal solvent — light, volatile, glowing
|
|
76
|
+
Blood = 66, // viscous, necrotic-tinted
|
|
77
|
+
Syrup = 67, // thick, dense, sweet (binding agent)
|
|
78
|
+
NightshadeExtract = 68,// toxic liquid
|
|
79
|
+
TrollBlood = 69, // viscous, healing + necrotic
|
|
80
|
+
LiquidShadow = 70, // dense, light-absorbing
|
|
81
|
+
LoveEssence = 71, // psychic liquid
|
|
82
|
+
HateEssence = 72, // psychic liquid, corrosive
|
|
83
|
+
DreamMist = 73, // ethereal + psychic, gas-like liquid
|
|
84
|
+
VoidEssence = 74, // dense, necrotic, reality-bending
|
|
85
|
+
// Powders (solid, fall)
|
|
86
|
+
Sulfur = 75, // yellow powder, flammable, corrosive
|
|
87
|
+
GroundEyeOfNewt = 76, // psychic powder
|
|
88
|
+
GroundBatWing = 77, // ethereal powder
|
|
89
|
+
BoneDust = 78, // necrotic powder
|
|
90
|
+
IronFilings = 79, // kinetic + dense powder, magnetic
|
|
91
|
+
MoonstoneDust = 80, // luminous + ethereal powder
|
|
92
|
+
CrystalDust = 81, // luminous + kinetic powder
|
|
93
|
+
MushroomSpores = 82, // toxic + psychic powder, grows
|
|
94
|
+
DragonScale = 83, // thermal + kinetic, very dense
|
|
95
|
+
PhoenixFeather = 84, // thermal + healing, light
|
|
96
|
+
UnicornHorn = 85, // healing + luminous, rare
|
|
97
|
+
MandrakeRoot = 86, // toxic + psychic, solid root
|
|
98
|
+
SpiderSilk = 87, // kinetic + ethereal, very light
|
|
99
|
+
GraveDust = 88, // necrotic + dense
|
|
100
|
+
StarShard = 89, // luminous + ethereal + kinetic, glowing crystal
|
|
101
|
+
TimeSand = 90, // kinetic + ethereal, reality-bending
|
|
102
|
+
// Gases
|
|
103
|
+
EtherealVapor = 91, // ether + fire byproduct, rises, glowing
|
|
104
|
+
AlchemicalSlag = 92, // waste byproduct of failed reactions, dense, inert
|
|
105
|
+
// --- Build materials (placeable by the player) ---
|
|
106
|
+
Scaffolding = 93, // wooden plank — solid, static, stand on it
|
|
107
|
+
Ladder = 94, // wooden ladder — non-solid, climbable
|
|
108
|
+
Rope = 95, // fiber rope — non-solid, climbable
|
|
109
|
+
Torch = 96, // placeable torch — static, emits light
|
|
110
|
+
ColdVapor = 97, // cold white vapor from liquid nitrogen — static, dissipates slowly
|
|
111
|
+
// --- Chemistry: acid + base ---
|
|
112
|
+
Acid = 98, // corrosive liquid — eats adjacent materials, 50% consumed per eat
|
|
113
|
+
Base = 99, // alkaline liquid — neutralizes acid → salt + steam
|
|
114
|
+
// --- Phase-change + exotic materials ---
|
|
115
|
+
Obsidian = 100, // volcanic glass — lava quenched by water/cold (static solid)
|
|
116
|
+
Spore = 101, // floating mold spore — drifts as a gas, germinates into Mold on wood/plant/leaf
|
|
117
|
+
Mold = 102, // grows on wood/plant/leaf, consumes them, releases a spore cloud when starved
|
|
118
|
+
Glitch = 103, // randomly swaps with any neighboring material
|
|
119
|
+
Tar = 104, // very slow, very dense liquid
|
|
120
|
+
Duplicator = 105, // static — locks onto the first material that touches it and clones it forever
|
|
121
|
+
Void = 106, // static — swallows up any material that touches it (like a black hole)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export const MAX_MATERIAL = 256;
|
|
125
|
+
|
|
126
|
+
export interface MaterialDef {
|
|
127
|
+
id: number;
|
|
128
|
+
name: string;
|
|
129
|
+
gravity: number;
|
|
130
|
+
gravityDir: 1 | -1 | 0;
|
|
131
|
+
/**
|
|
132
|
+
* Density in g/cm³. Used for solid-liquid and liquid-liquid displacement:
|
|
133
|
+
* a denser material sinks through a less-dense one. Sand (2.0) sinks in
|
|
134
|
+
* water (1.0) but floats on mercury (13.5). Wood (0.6) floats on water.
|
|
135
|
+
* Gases use ~0 since they're always displaced by solids/liquids.
|
|
136
|
+
*/
|
|
137
|
+
density: number;
|
|
138
|
+
flammable: boolean;
|
|
139
|
+
burnTime: number;
|
|
140
|
+
/** Initial lifetime (in sim ticks) when this material is placed/ignited. 0 = no decay. */
|
|
141
|
+
lifetime: number;
|
|
142
|
+
solid: boolean;
|
|
143
|
+
liquid: boolean;
|
|
144
|
+
gas: boolean;
|
|
145
|
+
magnetic: boolean;
|
|
146
|
+
/**
|
|
147
|
+
* Climbable cells (ladders, ropes) are non-solid so the player can pass
|
|
148
|
+
* through them, but while overlapping one the player can move vertically
|
|
149
|
+
* (climb) and gravity is suspended. Falling sand is still blocked by them
|
|
150
|
+
* (they're non-empty, non-gas, non-liquid, non-solid → trySwap returns
|
|
151
|
+
* false), so they act as physical objects that only the player traverses.
|
|
152
|
+
*/
|
|
153
|
+
climbable: boolean;
|
|
154
|
+
color: [number, number, number, number];
|
|
155
|
+
albedo: number;
|
|
156
|
+
reflectivity: number;
|
|
157
|
+
brightness: number;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
function def(
|
|
161
|
+
id: number, name: string, color: [number, number, number, number],
|
|
162
|
+
opts: Partial<Omit<MaterialDef, "id" | "name" | "color">> = {},
|
|
163
|
+
): MaterialDef {
|
|
164
|
+
return {
|
|
165
|
+
id, name, color,
|
|
166
|
+
gravity: opts.gravity ?? 0,
|
|
167
|
+
gravityDir: opts.gravityDir ?? 0,
|
|
168
|
+
density: opts.density ?? 0,
|
|
169
|
+
flammable: opts.flammable ?? false,
|
|
170
|
+
burnTime: opts.burnTime ?? 0,
|
|
171
|
+
lifetime: opts.lifetime ?? 0,
|
|
172
|
+
solid: opts.solid ?? false,
|
|
173
|
+
liquid: opts.liquid ?? false,
|
|
174
|
+
gas: opts.gas ?? false,
|
|
175
|
+
magnetic: opts.magnetic ?? false,
|
|
176
|
+
climbable: opts.climbable ?? false,
|
|
177
|
+
albedo: opts.albedo ?? 0.5,
|
|
178
|
+
reflectivity: opts.reflectivity ?? 0.05,
|
|
179
|
+
brightness: opts.brightness ?? 1.0,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export const MATERIALS: Record<number, MaterialDef> = {
|
|
184
|
+
// --- Original materials ---
|
|
185
|
+
[Material.Empty]: def(0, "Empty", [0, 0, 0, 0], { density: 0, albedo: 0, reflectivity: 0, brightness: 0, gas: true }),
|
|
186
|
+
[Material.Sand]: def(1, "Sand", [0.76, 0.70, 0.50, 1.0], { gravity: 1, gravityDir: 1, density: 2.0, solid: true, albedo: 0.6 }),
|
|
187
|
+
[Material.Water]: def(2, "Water", [0.12, 0.42, 0.85, 0.9], { gravity: 2, gravityDir: 1, density: 1.0, liquid: true, albedo: 0.3, reflectivity: 0.8, brightness: 0.8 }),
|
|
188
|
+
[Material.Stone]: def(3, "Stone", [0.45, 0.45, 0.48, 1.0], { density: 2.5, solid: true, albedo: 0.5, reflectivity: 0.1 }),
|
|
189
|
+
[Material.Wood]: def(4, "Wood", [0.55, 0.35, 0.18, 1.0], { density: 0.6, solid: true, flammable: true, burnTime: 240, albedo: 0.5 }),
|
|
190
|
+
[Material.Fire]: def(5, "Fire", [1.0, 0.3, 0.05, 1.0], { gravity: 4, gravityDir: -1, density: 0.1, gas: true, burnTime: 30, lifetime: 30, albedo: 0, reflectivity: 0, brightness: 1.5 }),
|
|
191
|
+
[Material.FuseFire]: def(50, "FuseFire", [1.0, 0.85, 0.15, 1.0], { gravity: 2, gravityDir: -1, density: 0.1, gas: true, burnTime: 15, lifetime: 15, albedo: 0, reflectivity: 0, brightness: 1.5 }),
|
|
192
|
+
[Material.BurningOil]: def(51, "Burning Oil", [1.0, 0.35, 0.05, 1.0], { gravity: 1, gravityDir: 1, density: 0.8, liquid: true, lifetime: 60, albedo: 0, reflectivity: 0, brightness: 1.4 }),
|
|
193
|
+
[Material.Smoke]: def(6, "Smoke", [0.5, 0.5, 0.5, 0.7], { gravity: 3, gravityDir: -1, density: 0.3, gas: true, lifetime: 120, albedo: 0.1, brightness: 0.5 }),
|
|
194
|
+
[Material.Oil]: def(7, "Oil", [0.15, 0.12, 0.08, 0.95], { gravity: 1, gravityDir: 1, density: 0.8, liquid: true, flammable: true, burnTime: 300, albedo: 0.2, reflectivity: 0.3, brightness: 0.7 }),
|
|
195
|
+
[Material.Gunpowder]: def(8, "Gunpowder", [0.2, 0.2, 0.2, 1.0], { gravity: 1, gravityDir: 1, density: 1.7, solid: true, flammable: true, burnTime: 10, albedo: 0.3 }),
|
|
196
|
+
[Material.Iron]: def(9, "Iron", [0.65, 0.65, 0.70, 1.0], { gravity: 1, gravityDir: 1, density: 7.8, solid: true, albedo: 0.6, reflectivity: 0.4 }),
|
|
197
|
+
[Material.Lava]: def(10, "Lava", [0.9, 0.25, 0.05, 1.0], { gravity: 3, gravityDir: 1, density: 3.0, liquid: true, albedo: 0.1, reflectivity: 0.2, brightness: 2.5 }),
|
|
198
|
+
[Material.Steam]: def(11, "Steam", [0.85, 0.85, 0.9, 0.5], { gravity: 2, gravityDir: -1, density: 0.2, gas: true, lifetime: 120, albedo: 0.2, brightness: 0.6 }),
|
|
199
|
+
[Material.Plant]: def(12, "Plant", [0.15, 0.65, 0.20, 1.0], { density: 0.8, solid: true, flammable: true, burnTime: 120, albedo: 0.4 }),
|
|
200
|
+
[Material.Flesh]: def(13, "Flesh", [0.85, 0.55, 0.55, 1.0], { gravity: 1, gravityDir: 1, density: 1.0, solid: true, flammable: true, burnTime: 180, albedo: 0.5, reflectivity: 0.1 }),
|
|
201
|
+
|
|
202
|
+
// --- New: Terrain ---
|
|
203
|
+
[Material.Dirt]: def(14, "Dirt", [0.35, 0.25, 0.15, 1.0], { gravity: 1, gravityDir: 1, density: 1.5, solid: true, albedo: 0.5 }),
|
|
204
|
+
[Material.Wall]: def(26, "Wall", [0.3, 0.3, 0.35, 1.0], { density: 3.0, solid: true, albedo: 0.4, reflectivity: 0.15 }),
|
|
205
|
+
[Material.Snow]: def(29, "Snow", [0.92, 0.92, 0.95, 1.0], { gravity: 0.5, gravityDir: 1, density: 0.3, solid: true, albedo: 0.8, reflectivity: 0.2, brightness: 1.1 }),
|
|
206
|
+
[Material.ConcretePowder]: def(36, "Concrete Powder", [0.6, 0.6, 0.58, 1.0], { gravity: 1, gravityDir: 1, density: 1.5, solid: true, albedo: 0.5 }),
|
|
207
|
+
[Material.Concrete]: def(48, "Concrete", [0.55, 0.55, 0.53, 1.0], { density: 2.4, solid: true, albedo: 0.5, reflectivity: 0.1 }),
|
|
208
|
+
|
|
209
|
+
// --- New: Biological ---
|
|
210
|
+
[Material.Seed]: def(15, "Seed", [0.6, 0.5, 0.2, 1.0], { gravity: 1, gravityDir: 1, density: 0.8, solid: true, albedo: 0.5 }),
|
|
211
|
+
[Material.Leaf]: def(16, "Leaf", [0.1, 0.55, 0.15, 1.0], { density: 0.5, solid: true, flammable: true, burnTime: 80, albedo: 0.4 }),
|
|
212
|
+
[Material.Grass]: def(28, "Grass", [0.2, 0.7, 0.15, 1.0], { gravity: 1, gravityDir: 1, density: 0.5, solid: true, flammable: true, burnTime: 60, albedo: 0.4 }),
|
|
213
|
+
[Material.Root]: def(45, "Root", [0.4, 0.3, 0.15, 1.0], { density: 0.8, solid: true, flammable: true, burnTime: 200, albedo: 0.4 }),
|
|
214
|
+
[Material.TreeWood]: def(49, "Tree Wood", [0.5, 0.32, 0.16, 1.0], { density: 0.6, solid: true, flammable: true, burnTime: 240, albedo: 0.5 }),
|
|
215
|
+
[Material.Fireflies]: def(27, "Fireflies", [0.9, 0.85, 0.3, 0.9], { density: 0.1, gas: true, lifetime: 255, albedo: 0, brightness: 1.8 }),
|
|
216
|
+
|
|
217
|
+
// --- New: Liquids ---
|
|
218
|
+
[Material.Honey]: def(30, "Honey", [0.9, 0.65, 0.15, 0.95], { gravity: 1.5, gravityDir: 1, density: 1.4, liquid: true, albedo: 0.3, reflectivity: 0.3, brightness: 0.9 }),
|
|
219
|
+
[Material.Mercury]: def(31, "Mercury", [0.75, 0.75, 0.78, 1.0], { gravity: 4, gravityDir: 1, density: 13.5, liquid: true, albedo: 0.2, reflectivity: 0.9, brightness: 1.0 }),
|
|
220
|
+
[Material.Brine]: def(46, "Brine", [0.2, 0.5, 0.7, 0.9], { gravity: 2.5, gravityDir: 1, density: 1.2, liquid: true, albedo: 0.3, reflectivity: 0.6, brightness: 0.8 }),
|
|
221
|
+
[Material.MoltenSalt]: def(47, "Molten Salt", [0.95, 0.5, 0.2, 1.0], { gravity: 3, gravityDir: 1, density: 1.5, liquid: true, albedo: 0.1, reflectivity: 0.3, brightness: 2.0 }),
|
|
222
|
+
[Material.LiquidNitrogen]: def(38, "Liquid Nitrogen", [0.5, 0.7, 0.9, 0.85], { gravity: 2, gravityDir: 1, density: 0.8, liquid: true, albedo: 0.3, reflectivity: 0.5, brightness: 0.9 }),
|
|
223
|
+
|
|
224
|
+
// --- New: Gases / light ---
|
|
225
|
+
[Material.GasVapor]: def(21, "Gas Vapor", [0.7, 0.7, 0.65, 0.4], { gravity: 1, gravityDir: -1, density: 0.1, gas: true, flammable: true, burnTime: 0, lifetime: 200, albedo: 0.1, brightness: 0.6 }),
|
|
226
|
+
[Material.Hydrogen]: def(22, "Hydrogen", [0.9, 0.9, 0.95, 0.1], { gravity: 1, gravityDir: -1, density: 0.05, gas: true, flammable: true, burnTime: 0, lifetime: 200, albedo: 0, brightness: 0.3 }),
|
|
227
|
+
[Material.Glitter]: def(42, "Glitter", [0.85, 0.75, 0.5, 0.9], { gravity: 0.2, gravityDir: 1, density: 1.0, solid: true, flammable: true, burnTime: 30, albedo: 0.1, reflectivity: 0.8, brightness: 1.3 }),
|
|
228
|
+
[Material.DryIce]: def(37, "Dry Ice", [0.7, 0.8, 0.9, 0.8], { gravity: 1, gravityDir: 1, density: 1.5, solid: true, albedo: 0.3, reflectivity: 0.3, brightness: 0.7 }),
|
|
229
|
+
|
|
230
|
+
// --- New: Explosives / reactive ---
|
|
231
|
+
[Material.Antimatter]: def(17, "Antimatter", [0.9, 0.1, 0.9, 1.0], { gravity: 1, gravityDir: 1, density: 22.0, solid: true, albedo: 0.1, reflectivity: 0.5, brightness: 1.5 }),
|
|
232
|
+
[Material.Mystery]: def(18, "???", [0.6, 0.0, 0.6, 1.0], { gravity: 1, gravityDir: 1, density: 5.0, solid: true, albedo: 0.1, reflectivity: 0.3, brightness: 1.2 }),
|
|
233
|
+
[Material.Plasma]: def(39, "Plasma", [0.2, 0.8, 1.0, 1.0], { gravity: 1, gravityDir: -1, density: 0.05, gas: true, lifetime: 30, albedo: 0, reflectivity: 0, brightness: 3.0 }),
|
|
234
|
+
[Material.Fuse]: def(32, "Fuse", [0.3, 0.2, 0.1, 1.0], { density: 1.5, solid: true, flammable: true, burnTime: 1200, albedo: 0.3 }),
|
|
235
|
+
[Material.C4]: def(33, "C4", [0.8, 0.6, 0.2, 1.0], { density: 1.5, solid: true, flammable: true, burnTime: 400, albedo: 0.4 }),
|
|
236
|
+
[Material.Dynamite]: def(34, "Dynamite", [0.7, 0.2, 0.15, 1.0], { gravity: 1, gravityDir: 1, density: 1.3, solid: true, flammable: true, burnTime: 5, albedo: 0.4 }),
|
|
237
|
+
[Material.Wax]: def(35, "Wax", [0.9, 0.88, 0.7, 1.0], { density: 0.9, solid: true, flammable: true, burnTime: 400, albedo: 0.5, reflectivity: 0.1 }),
|
|
238
|
+
|
|
239
|
+
// --- New: Misc ---
|
|
240
|
+
[Material.Flour]: def(19, "Flour", [0.92, 0.88, 0.75, 1.0], { gravity: 1, gravityDir: 1, density: 1.5, solid: true, flammable: true, burnTime: 15, albedo: 0.6 }),
|
|
241
|
+
[Material.Gasoline]: def(20, "Gasoline", [0.6, 0.5, 0.1, 0.9], { gravity: 1.5, gravityDir: 1, density: 0.7, liquid: true, flammable: true, burnTime: 60, albedo: 0.2, reflectivity: 0.3, brightness: 0.7 }),
|
|
242
|
+
[Material.Plastic]: def(23, "Plastic", [0.8, 0.8, 0.85, 1.0], { density: 1.2, solid: true, flammable: true, burnTime: 100, albedo: 0.5, reflectivity: 0.2 }),
|
|
243
|
+
[Material.Toast]: def(24, "Toast", [0.8, 0.65, 0.35, 1.0], { gravity: 1, gravityDir: 1, density: 0.3, solid: true, flammable: true, burnTime: 80, albedo: 0.5 }),
|
|
244
|
+
[Material.Salt]: def(25, "Salt", [0.95, 0.95, 0.92, 1.0], { gravity: 1, gravityDir: 1, density: 2.2, solid: true, albedo: 0.6, reflectivity: 0.1 }),
|
|
245
|
+
[Material.Nanobots]: def(40, "Nanobots", [0.6, 0.6, 0.65, 0.9], { gravity: 0.5, gravityDir: -1, density: 0.1, gas: true, lifetime: 255, albedo: 0.3, reflectivity: 0.5, brightness: 1.2 }),
|
|
246
|
+
[Material.MagicPowder]: def(41, "Magic Powder", [0.8, 0.3, 0.9, 1.0], { gravity: 1, gravityDir: 1, density: 0.5, solid: true, lifetime: 60, albedo: 0.2, reflectivity: 0.3, brightness: 1.3 }),
|
|
247
|
+
[Material.Popcorn]: def(43, "Popcorn", [0.95, 0.9, 0.7, 1.0], { gravity: 0.3, gravityDir: 1, density: 0.05, solid: true, albedo: 0.5 }),
|
|
248
|
+
[Material.Rubber]: def(44, "Rubber", [0.15, 0.15, 0.15, 1.0], { density: 1.2, solid: true, flammable: true, burnTime: 300, albedo: 0.3, reflectivity: 0.15 }),
|
|
249
|
+
|
|
250
|
+
// --- Ores (solid, fall when dug, non-flammable) ---
|
|
251
|
+
[Material.TinOre]: def(52, "Tin Ore", [0.70, 0.72, 0.74, 1.0], { gravity: 1, gravityDir: 1, density: 7.3, solid: true, albedo: 0.55, reflectivity: 0.35 }),
|
|
252
|
+
[Material.CopperOre]: def(53, "Copper Ore", [0.72, 0.45, 0.25, 1.0], { gravity: 1, gravityDir: 1, density: 8.9, solid: true, albedo: 0.5, reflectivity: 0.3 }),
|
|
253
|
+
[Material.IronOre]: def(54, "Iron Ore", [0.55, 0.45, 0.40, 1.0], { gravity: 1, gravityDir: 1, density: 7.8, solid: true, albedo: 0.45, reflectivity: 0.2 }),
|
|
254
|
+
[Material.BauxiteOre]: def(55, "Bauxite Ore", [0.75, 0.50, 0.40, 1.0], { gravity: 1, gravityDir: 1, density: 2.5, solid: true, albedo: 0.5, reflectivity: 0.15 }),
|
|
255
|
+
[Material.SilverOre]: def(56, "Silver Ore", [0.85, 0.85, 0.88, 1.0], { gravity: 1, gravityDir: 1, density: 10.5, solid: true, albedo: 0.6, reflectivity: 0.6 }),
|
|
256
|
+
[Material.GoldOre]: def(57, "Gold Ore", [0.90, 0.78, 0.20, 1.0], { gravity: 1, gravityDir: 1, density: 19.3, solid: true, albedo: 0.55, reflectivity: 0.5 }),
|
|
257
|
+
[Material.CobaltOre]: def(58, "Cobalt Ore", [0.25, 0.35, 0.80, 1.0], { gravity: 1, gravityDir: 1, density: 8.9, solid: true, albedo: 0.5, reflectivity: 0.3 }),
|
|
258
|
+
|
|
259
|
+
// --- Coal (solid, flammable, falls when dug) ---
|
|
260
|
+
[Material.Coal]: def(61, "Coal", [0.10, 0.10, 0.11, 1.0], { gravity: 1, gravityDir: 1, density: 1.3, solid: true, flammable: true, burnTime: 120, albedo: 0.15, reflectivity: 0.05, brightness: 0.8 }),
|
|
261
|
+
|
|
262
|
+
// --- Stone debris (from mining stone) ---
|
|
263
|
+
// Gravel: fine crushed stone. Marked solid (so it doesn't displace like a
|
|
264
|
+
// liquid) but has special flow logic in SandWorld.tryMove that lets it
|
|
265
|
+
// spread horizontally like a liquid when unsupported, then settle firmly
|
|
266
|
+
// in place when supported from below. Re-settles to Stone after being
|
|
267
|
+
// stationary + stably supported for GRAVEL_SETTLE_TICKS (handled in
|
|
268
|
+
// applyAging via the lifetime field as a settle timer). All mined stone
|
|
269
|
+
// becomes Gravel.
|
|
270
|
+
[Material.Gravel]: def(62, "Gravel", [0.45, 0.45, 0.48, 1.0], { gravity: 1, gravityDir: 1, density: 2.0, solid: true, albedo: 0.5, reflectivity: 0.1 }),
|
|
271
|
+
// LooseStone: legacy coarse stone chunk. No longer created — all stone
|
|
272
|
+
// debris now becomes Gravel. Kept for backwards compat with old saves that
|
|
273
|
+
// still contain LooseStone cells; applyAging still re-settles them to Stone.
|
|
274
|
+
[Material.LooseStone]: def(63, "Loose Stone", [0.45, 0.45, 0.48, 1.0], { gravity: 1, gravityDir: 1, density: 2.5, solid: true, albedo: 0.5, reflectivity: 0.1 }),
|
|
275
|
+
|
|
276
|
+
// --- Gases (toxic, rise) ---
|
|
277
|
+
[Material.MethaneGas]: def(59, "Methane Gas", [0.75, 0.78, 0.65, 0.35], { gravity: 1, gravityDir: -1, density: 0.07, gas: true, flammable: true, burnTime: 0, lifetime: 200, albedo: 0.1, brightness: 0.5 }),
|
|
278
|
+
[Material.SulfurGas]: def(60, "Sulfur Gas", [0.85, 0.80, 0.30, 0.4], { gravity: 1, gravityDir: -1, density: 0.15, gas: true, lifetime: 200, albedo: 0.1, brightness: 0.6 }),
|
|
279
|
+
|
|
280
|
+
// --- Ice (cooling byproduct) ---
|
|
281
|
+
[Material.Ice]: def(64, "Ice", [0.7, 0.85, 0.95, 0.9], { density: 0.92, solid: true, albedo: 0.4, reflectivity: 0.5, brightness: 1.0 }),
|
|
282
|
+
|
|
283
|
+
// --- Liquids ---
|
|
284
|
+
[Material.Ether]: def(65, "Ether", [0.55, 0.45, 0.85, 0.8], { gravity: 1.5, gravityDir: 1, density: 0.7, liquid: true, flammable: true, burnTime: 40, albedo: 0.2, reflectivity: 0.4, brightness: 1.1 }),
|
|
285
|
+
[Material.Blood]: def(66, "Blood", [0.7, 0.05, 0.05, 0.95], { gravity: 2, gravityDir: 1, density: 1.06, liquid: true, albedo: 0.3, reflectivity: 0.2, brightness: 0.8 }),
|
|
286
|
+
[Material.Syrup]: def(67, "Syrup", [0.6, 0.4, 0.15, 0.95], { gravity: 1, gravityDir: 1, density: 1.4, liquid: true, albedo: 0.3, reflectivity: 0.3, brightness: 0.9 }),
|
|
287
|
+
[Material.NightshadeExtract]: def(68, "Nightshade Extract", [0.3, 0.05, 0.35, 0.95], { gravity: 2, gravityDir: 1, density: 1.1, liquid: true, albedo: 0.2, reflectivity: 0.1, brightness: 0.7 }),
|
|
288
|
+
[Material.TrollBlood]: def(69, "Troll Blood", [0.4, 0.2, 0.15, 0.95], { gravity: 2, gravityDir: 1, density: 1.2, liquid: true, albedo: 0.25, reflectivity: 0.15, brightness: 0.8 }),
|
|
289
|
+
[Material.LiquidShadow]: def(70, "Liquid Shadow", [0.05, 0.05, 0.12, 0.98], { gravity: 3, gravityDir: 1, density: 2.0, liquid: true, albedo: 0.0, reflectivity: 0.0, brightness: 0.3 }),
|
|
290
|
+
[Material.LoveEssence]: def(71, "Love Essence", [0.95, 0.4, 0.6, 0.9], { gravity: 1.5, gravityDir: 1, density: 0.9, liquid: true, albedo: 0.3, reflectivity: 0.4, brightness: 1.0 }),
|
|
291
|
+
[Material.HateEssence]: def(72, "Hate Essence", [0.2, 0.1, 0.15, 0.9], { gravity: 2, gravityDir: 1, density: 1.3, liquid: true, albedo: 0.2, reflectivity: 0.2, brightness: 0.7 }),
|
|
292
|
+
[Material.DreamMist]: def(73, "Dream Mist", [0.6, 0.7, 0.95, 0.6], { gravity: 1, gravityDir: -1, density: 0.3, liquid: true, albedo: 0.2, reflectivity: 0.5, brightness: 1.2 }),
|
|
293
|
+
[Material.VoidEssence]: def(74, "Void Essence", [0.1, 0.0, 0.2, 0.95], { gravity: 4, gravityDir: 1, density: 3.0, liquid: true, albedo: 0.0, reflectivity: 0.1, brightness: 0.5 }),
|
|
294
|
+
|
|
295
|
+
// --- Alchemy game: powders (solid, fall) ---
|
|
296
|
+
[Material.Sulfur]: def(75, "Sulfur", [0.9, 0.85, 0.2, 1.0], { gravity: 1, gravityDir: 1, density: 2.0, solid: true, flammable: true, burnTime: 60, albedo: 0.5, reflectivity: 0.1, brightness: 0.9 }),
|
|
297
|
+
[Material.GroundEyeOfNewt]: def(76, "Ground Eye of Newt", [0.5, 0.35, 0.2, 1.0], { gravity: 1, gravityDir: 1, density: 1.2, solid: true, albedo: 0.4, brightness: 0.8 }),
|
|
298
|
+
[Material.GroundBatWing]: def(77, "Ground Bat Wing", [0.3, 0.25, 0.35, 1.0], { gravity: 0.8, gravityDir: 1, density: 0.6, solid: true, albedo: 0.3, brightness: 0.7 }),
|
|
299
|
+
[Material.BoneDust]: def(78, "Bone Dust", [0.85, 0.82, 0.75, 1.0], { gravity: 1, gravityDir: 1, density: 1.5, solid: true, albedo: 0.5, brightness: 0.8 }),
|
|
300
|
+
[Material.IronFilings]: def(79, "Iron Filings", [0.55, 0.55, 0.6, 1.0], { gravity: 1.5, gravityDir: 1, density: 7.8, solid: true, magnetic: true, albedo: 0.5, reflectivity: 0.3 }),
|
|
301
|
+
[Material.MoonstoneDust]: def(80, "Moonstone Dust", [0.8, 0.85, 0.95, 1.0], { gravity: 1, gravityDir: 1, density: 1.0, solid: true, albedo: 0.4, reflectivity: 0.5, brightness: 1.3 }),
|
|
302
|
+
[Material.CrystalDust]: def(81, "Crystal Dust", [0.6, 0.9, 0.95, 1.0], { gravity: 1, gravityDir: 1, density: 2.5, solid: true, albedo: 0.3, reflectivity: 0.6, brightness: 1.2 }),
|
|
303
|
+
[Material.MushroomSpores]: def(82, "Mushroom Spores", [0.6, 0.5, 0.4, 0.9], { gravity: 0.5, gravityDir: 1, density: 0.4, solid: true, albedo: 0.3, brightness: 0.8 }),
|
|
304
|
+
[Material.DragonScale]: def(83, "Dragon Scale", [0.5, 0.15, 0.1, 1.0], { gravity: 1.5, gravityDir: 1, density: 5.0, solid: true, albedo: 0.4, reflectivity: 0.3, brightness: 1.0 }),
|
|
305
|
+
[Material.PhoenixFeather]: def(84, "Phoenix Feather", [0.95, 0.5, 0.15, 0.9], { gravity: 0.3, gravityDir: 1, density: 0.3, solid: true, flammable: true, burnTime: 200, albedo: 0.4, brightness: 1.4 }),
|
|
306
|
+
[Material.UnicornHorn]: def(85, "Unicorn Horn", [0.95, 0.9, 1.0, 1.0], { gravity: 1, gravityDir: 1, density: 1.8, solid: true, albedo: 0.5, reflectivity: 0.5, brightness: 1.5 }),
|
|
307
|
+
[Material.MandrakeRoot]: def(86, "Mandrake Root", [0.5, 0.4, 0.25, 1.0], { gravity: 1, gravityDir: 1, density: 1.3, solid: true, albedo: 0.4, brightness: 0.7 }),
|
|
308
|
+
[Material.SpiderSilk]: def(87, "Spider Silk", [0.9, 0.9, 0.85, 0.8], { gravity: 0.2, gravityDir: 1, density: 0.2, solid: true, albedo: 0.4, reflectivity: 0.2, brightness: 0.9 }),
|
|
309
|
+
[Material.GraveDust]: def(88, "Grave Dust", [0.3, 0.28, 0.25, 1.0], { gravity: 1, gravityDir: 1, density: 1.8, solid: true, albedo: 0.3, brightness: 0.6 }),
|
|
310
|
+
[Material.StarShard]: def(89, "Star Shard", [0.7, 0.8, 1.0, 1.0], { gravity: 1, gravityDir: 1, density: 2.0, solid: true, albedo: 0.3, reflectivity: 0.7, brightness: 1.6 }),
|
|
311
|
+
[Material.TimeSand]: def(90, "Time Sand", [0.4, 0.3, 0.6, 0.9], { gravity: 1, gravityDir: 1, density: 1.5, solid: true, albedo: 0.3, reflectivity: 0.4, brightness: 1.2 }),
|
|
312
|
+
|
|
313
|
+
// --- Alchemy game: gases + byproducts ---
|
|
314
|
+
[Material.EtherealVapor]: def(91, "Ethereal Vapor", [0.6, 0.5, 0.9, 0.5], { gravity: 1, gravityDir: -1, density: 0.08, gas: true, lifetime: 180, albedo: 0.1, brightness: 1.3 }),
|
|
315
|
+
[Material.AlchemicalSlag]: def(92, "Alchemical Slag", [0.25, 0.22, 0.2, 1.0], { gravity: 2, gravityDir: 1, density: 2.8, solid: true, albedo: 0.2, reflectivity: 0.05, brightness: 0.5 }),
|
|
316
|
+
|
|
317
|
+
// --- Mining RPG: build materials (placeable by the player) ---
|
|
318
|
+
// Scaffolding: wooden plank. Solid + static (gravity=0) so the player can
|
|
319
|
+
// stand on it. Flammable. Mined away (cleared, not collected as ore).
|
|
320
|
+
[Material.Scaffolding]: def(93, "Scaffolding", [0.62, 0.42, 0.22, 1.0], { density: 0.6, solid: true, flammable: true, burnTime: 200, albedo: 0.5, reflectivity: 0.05 }),
|
|
321
|
+
// Ladder: wooden ladder. Non-solid + climbable so the player climbs through
|
|
322
|
+
// it; gravity=0 so it stays put. Flammable. Blocks falling particles.
|
|
323
|
+
[Material.Ladder]: def(94, "Ladder", [0.55, 0.36, 0.18, 1.0], { density: 0.5, flammable: true, burnTime: 180, climbable: true, albedo: 0.45 }),
|
|
324
|
+
// Rope: fiber rope. Non-solid + climbable; gravity=0 so it stays put.
|
|
325
|
+
// Flammable. Blocks falling particles.
|
|
326
|
+
[Material.Rope]: def(95, "Rope", [0.78, 0.66, 0.40, 1.0], { density: 0.3, flammable: true, burnTime: 120, climbable: true, albedo: 0.4 }),
|
|
327
|
+
// Torch: placeable light source. Static (gravity=0), non-solid, emits warm
|
|
328
|
+
// orange light (handled by the game's lighting system, not physics).
|
|
329
|
+
// Non-flammable so it doesn't burn away. Bright color so it's visible.
|
|
330
|
+
[Material.Torch]: def(96, "Torch", [0.9, 0.5, 0.2, 1.0], { density: 0.4, albedo: 0.6, brightness: 1.5 }),
|
|
331
|
+
// ColdVapor: visible white vapor produced when liquid nitrogen evaporates.
|
|
332
|
+
// Static (gravityDir=0) so it doesn't rise — cold vapor is denser than air
|
|
333
|
+
// and pools near the ground. MAT_HAS_REACTIONS keeps it in the active list
|
|
334
|
+
// so applyAging can slowly dissipate it (~30 seconds at 60fps).
|
|
335
|
+
[Material.ColdVapor]: def(97, "Cold Vapor", [0.85, 0.85, 0.9, 0.5], { density: 0.8, gas: true, lifetime: 255, albedo: 0.3, brightness: 0.7 }),
|
|
336
|
+
// Acid: corrosive liquid. Flows like water (density 1.2, slightly denser).
|
|
337
|
+
// Eats adjacent materials — each eat destroys the neighbor and has a 50%
|
|
338
|
+
// chance of consuming the acid particle too. So 1000 sand + 1000 acid →
|
|
339
|
+
// ~500 acid remaining. Does NOT eat Wall, Acid, Base, or Empty.
|
|
340
|
+
// Base neutralizes it (acid + base → salt + steam).
|
|
341
|
+
[Material.Acid]: def(98, "Acid", [0.55, 0.95, 0.25, 0.85], { gravity: 2, gravityDir: 1, density: 1.2, liquid: true, albedo: 0.2, reflectivity: 0.4, brightness: 1.0 }),
|
|
342
|
+
// Base: alkaline liquid. Flows like water (density 1.1). Reacts with acid
|
|
343
|
+
// on contact — 1 base + 1 acid → 1 salt + 1 steam (neutralization).
|
|
344
|
+
[Material.Base]: def(99, "Base", [0.85, 0.75, 0.95, 0.85], { gravity: 2, gravityDir: 1, density: 1.1, liquid: true, albedo: 0.2, reflectivity: 0.4, brightness: 0.9 }),
|
|
345
|
+
|
|
346
|
+
// --- Phase-change + exotic materials ---
|
|
347
|
+
// Obsidian: volcanic glass. Produced when lava is quenched rapidly by
|
|
348
|
+
// water, dry ice, liquid nitrogen, ice, or snow. Static solid, denser than
|
|
349
|
+
// stone, non-flammable. Distinct from Stone (the slow-cooling byproduct of
|
|
350
|
+
// the legacy lava+water rule, now repurposed to obsidian for rapid quench).
|
|
351
|
+
[Material.Obsidian]: def(100, "Obsidian", [0.06, 0.05, 0.08, 1.0], { density: 2.6, solid: true, albedo: 0.15, reflectivity: 0.25, brightness: 0.7 }),
|
|
352
|
+
// Spore: floating mold spore. A light gas that drifts upward and lingers.
|
|
353
|
+
// When it touches wood/plant/leaf/tree wood/root/grass it germinates into
|
|
354
|
+
// Mold (the spore is consumed). Long lifetime so it can travel far before
|
|
355
|
+
// landing on a food source; dissipates to empty if it never finds one.
|
|
356
|
+
[Material.Spore]: def(101, "Spore", [0.55, 0.62, 0.35, 0.7], { gravity: 0.5, gravityDir: -1, density: 0.05, gas: true, lifetime: 240, albedo: 0.3, brightness: 0.9 }),
|
|
357
|
+
// Mold: grows on wood/plant/leaf/tree wood/root/grass. Static solid that
|
|
358
|
+
// spreads very slowly to adjacent food cells, consuming them. When no food
|
|
359
|
+
// remains adjacent, it releases a cloud of Spore into surrounding empty
|
|
360
|
+
// space and dies (clears to empty). MAT_HAS_REACTIONS keeps it in the
|
|
361
|
+
// active list even though gravityDir=0.
|
|
362
|
+
[Material.Mold]: def(102, "Mold", [0.35, 0.42, 0.22, 1.0], { density: 0.4, solid: true, albedo: 0.3, brightness: 0.8 }),
|
|
363
|
+
// Glitch: a corrupted cell that randomly swaps places with any neighboring
|
|
364
|
+
// non-empty material. Falls like a normal solid when it can't swap.
|
|
365
|
+
// Visually a harsh magenta/cyan so it reads as "broken".
|
|
366
|
+
[Material.Glitch]: def(103, "Glitch", [0.95, 0.05, 0.75, 1.0], { gravity: 1, gravityDir: 1, density: 1.0, solid: true, albedo: 0.2, reflectivity: 0.1, brightness: 1.2 }),
|
|
367
|
+
// Tar: a very slow, very dense liquid. Sinks through water and most
|
|
368
|
+
// liquids. High friction (handled in tryMove, like honey) so it barely
|
|
369
|
+
// flows — oozes rather than pours.
|
|
370
|
+
[Material.Tar]: def(104, "Tar", [0.07, 0.06, 0.05, 1.0], { gravity: 1, gravityDir: 1, density: 2.0, liquid: true, flammable: true, burnTime: 200, albedo: 0.1, reflectivity: 0.15, brightness: 0.5 }),
|
|
371
|
+
// Duplicator: a static solid that clones the first material to touch it.
|
|
372
|
+
// The locked material id is stored in the lifetime field (0 = not yet
|
|
373
|
+
// locked). Each frame it spawns the locked material into adjacent empty
|
|
374
|
+
// cells. Does not move, does not react otherwise (acid-immune, skipped by
|
|
375
|
+
// antimatter). MAT_HAS_REACTIONS keeps it in the active list.
|
|
376
|
+
[Material.Duplicator]: def(105, "Duplicator", [0.85, 0.85, 0.30, 1.0], { density: 3.0, solid: true, albedo: 0.4, reflectivity: 0.3, brightness: 1.1 }),
|
|
377
|
+
// Void: a static solid that swallows up any material that touches it.
|
|
378
|
+
// Any adjacent non-empty, non-wall, non-void, non-duplicator cell is
|
|
379
|
+
// destroyed (set to empty) each frame. The void itself is permanent —
|
|
380
|
+
// acid-immune, antimatter barrier, never falls. Visually a deep black
|
|
381
|
+
// with a faint purple edge so it reads as a "black hole".
|
|
382
|
+
[Material.Void]: def(106, "Void", [0.02, 0.0, 0.05, 1.0], { density: 5.0, solid: true, albedo: 0.0, reflectivity: 0.0, brightness: 0.3 }),
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
export function getMaterialColor(mat: Material): [number, number, number, number] {
|
|
386
|
+
return MATERIALS[mat]?.color ?? [0, 0, 0, 0];
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// ============================================================================
|
|
390
|
+
// Parallel typed arrays for hot-path material property lookups.
|
|
391
|
+
//
|
|
392
|
+
// These are precomputed from MATERIALS at module load time. In simulation hot
|
|
393
|
+
// loops (millions of cell iterations/sec), indexing a typed array is
|
|
394
|
+
// significantly faster than a Record<number, object> property lookup with
|
|
395
|
+
// optional chaining (MATERIALS[mat]?.gravity). They also avoid any object
|
|
396
|
+
// allocation.
|
|
397
|
+
//
|
|
398
|
+
// MAT_FLAGS packs boolean properties into bits:
|
|
399
|
+
// bit 0 = flammable, bit 1 = solid, bit 2 = liquid, bit 3 = gas,
|
|
400
|
+
// bit 4 = magnetic
|
|
401
|
+
// ============================================================================
|
|
402
|
+
|
|
403
|
+
export const MAT_FLAMMABLE = 0x01;
|
|
404
|
+
export const MAT_SOLID = 0x02;
|
|
405
|
+
export const MAT_LIQUID = 0x04;
|
|
406
|
+
export const MAT_GAS = 0x08;
|
|
407
|
+
export const MAT_MAGNETIC = 0x10;
|
|
408
|
+
export const MAT_CLIMBABLE = 0x20;
|
|
409
|
+
|
|
410
|
+
/** gravity multiplier as float (0-4). 0 = no gravity. */
|
|
411
|
+
export const MAT_GRAVITY = new Float32Array(MAX_MATERIAL);
|
|
412
|
+
/** density in g/cm³. Used for solid-liquid and liquid-liquid displacement. */
|
|
413
|
+
export const MAT_DENSITY = new Float32Array(MAX_MATERIAL);
|
|
414
|
+
/** gravity direction: 1 = down, -1 = up, 0 = static. */
|
|
415
|
+
export const MAT_GRAVITY_DIR = new Int8Array(MAX_MATERIAL);
|
|
416
|
+
/** packed boolean flags (MAT_FLAMMABLE | MAT_SOLID | ...). */
|
|
417
|
+
export const MAT_FLAGS = new Uint8Array(MAX_MATERIAL);
|
|
418
|
+
/** initial lifetime when placed/ignited. */
|
|
419
|
+
export const MAT_LIFETIME = new Uint8Array(MAX_MATERIAL);
|
|
420
|
+
|
|
421
|
+
// Lookup tables for common multi-material neighbor checks.
|
|
422
|
+
// IS_HOT: fire-class + lava + molten salt + plasma (materials that melt snow, boil water, etc.)
|
|
423
|
+
// IS_FIRE: fire-class only (Fire, FuseFire, BurningOil)
|
|
424
|
+
// IS_ACID_IMMUNE: materials that acid cannot eat (Wall, Acid, Base, Empty)
|
|
425
|
+
export const IS_HOT = new Uint8Array(MAX_MATERIAL);
|
|
426
|
+
export const IS_FIRE = new Uint8Array(MAX_MATERIAL);
|
|
427
|
+
export const IS_ACID_IMMUNE = new Uint8Array(MAX_MATERIAL);
|
|
428
|
+
/** Cold materials: actively cool their surroundings. Freeze water → ice,
|
|
429
|
+
* quench lava → obsidian. DryIce and LiquidNitrogen are active coolants;
|
|
430
|
+
* Ice and Snow are cold solids that also quench lava on contact. */
|
|
431
|
+
export const IS_COLD = new Uint8Array(MAX_MATERIAL);
|
|
432
|
+
/** Static materials (gravityDir=0) that still have self-triggered reactions
|
|
433
|
+
* (rule-engine rules or applySpecialReactions handlers). These must remain
|
|
434
|
+
* in the active list even though they can't move — excluding them would
|
|
435
|
+
* skip their reactions. Currently: Ice (melts near heat). Dynamic materials
|
|
436
|
+
* (gravityDir!=0) are always in the active list and don't need to be listed. */
|
|
437
|
+
export const MAT_HAS_REACTIONS = new Uint8Array(MAX_MATERIAL);
|
|
438
|
+
|
|
439
|
+
function buildMaterialTables(): void {
|
|
440
|
+
for (let i = 0; i < MAX_MATERIAL; i++) {
|
|
441
|
+
const def = MATERIALS[i];
|
|
442
|
+
if (!def) continue;
|
|
443
|
+
MAT_GRAVITY[i] = def.gravity;
|
|
444
|
+
MAT_DENSITY[i] = def.density;
|
|
445
|
+
MAT_GRAVITY_DIR[i] = def.gravityDir;
|
|
446
|
+
MAT_LIFETIME[i] = def.lifetime;
|
|
447
|
+
let flags = 0;
|
|
448
|
+
if (def.flammable) flags |= MAT_FLAMMABLE;
|
|
449
|
+
if (def.solid) flags |= MAT_SOLID;
|
|
450
|
+
if (def.liquid) flags |= MAT_LIQUID;
|
|
451
|
+
if (def.gas) flags |= MAT_GAS;
|
|
452
|
+
if (def.magnetic) flags |= MAT_MAGNETIC;
|
|
453
|
+
if (def.climbable) flags |= MAT_CLIMBABLE;
|
|
454
|
+
MAT_FLAGS[i] = flags;
|
|
455
|
+
}
|
|
456
|
+
// Hot materials: melt snow, boil water, ignite flammables, pop popcorn
|
|
457
|
+
IS_HOT[Material.Fire] = 1;
|
|
458
|
+
IS_HOT[Material.FuseFire] = 1;
|
|
459
|
+
IS_HOT[Material.BurningOil] = 1;
|
|
460
|
+
IS_HOT[Material.Lava] = 1;
|
|
461
|
+
IS_HOT[Material.MoltenSalt] = 1;
|
|
462
|
+
IS_HOT[Material.Plasma] = 1;
|
|
463
|
+
// Fire-class: used for extinguish checks, low-temp death, etc.
|
|
464
|
+
IS_FIRE[Material.Fire] = 1;
|
|
465
|
+
IS_FIRE[Material.FuseFire] = 1;
|
|
466
|
+
IS_FIRE[Material.BurningOil] = 1;
|
|
467
|
+
// Cold materials: freeze water on contact, quench lava → obsidian.
|
|
468
|
+
// Only active coolants (DryIce, LiquidNitrogen) are listed here. Ice and
|
|
469
|
+
// Snow are frozen water — they melt from lava's heat (handled by the
|
|
470
|
+
// snow/ice + hot reaction) rather than quenching it to obsidian.
|
|
471
|
+
IS_COLD[Material.DryIce] = 1;
|
|
472
|
+
IS_COLD[Material.LiquidNitrogen] = 1;
|
|
473
|
+
// Acid-immune: acid cannot eat these materials
|
|
474
|
+
IS_ACID_IMMUNE[Material.Empty] = 1;
|
|
475
|
+
IS_ACID_IMMUNE[Material.Wall] = 1;
|
|
476
|
+
IS_ACID_IMMUNE[Material.Acid] = 1;
|
|
477
|
+
IS_ACID_IMMUNE[Material.Base] = 1;
|
|
478
|
+
// Duplicator is immune to acid — it "does not react otherwise" and must
|
|
479
|
+
// persist to keep cloning. Acid eating it would silently destroy it.
|
|
480
|
+
IS_ACID_IMMUNE[Material.Duplicator] = 1;
|
|
481
|
+
// Void is immune to acid — it's a permanent fixture that swallows acid
|
|
482
|
+
// like any other material. Acid can't erode it.
|
|
483
|
+
IS_ACID_IMMUNE[Material.Void] = 1;
|
|
484
|
+
// Static materials with self-triggered reactions (must stay in active list)
|
|
485
|
+
MAT_HAS_REACTIONS[Material.Ice] = 1; // melts near heat / high temp
|
|
486
|
+
MAT_HAS_REACTIONS[Material.ColdVapor] = 1; // dissipates via lifetime decay
|
|
487
|
+
MAT_HAS_REACTIONS[Material.Mold] = 1; // spreads to food + releases spores when starved
|
|
488
|
+
MAT_HAS_REACTIONS[Material.Duplicator] = 1; // clones locked material into adjacent empty cells
|
|
489
|
+
MAT_HAS_REACTIONS[Material.Void] = 1; // swallows adjacent materials each frame
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
buildMaterialTables();
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { Material, MATERIALS, MAX_MATERIAL } from "./materials";
|
|
2
|
+
|
|
3
|
+
export const SHADES_PER_MATERIAL = 4;
|
|
4
|
+
export const PALETTE_SIZE = MAX_MATERIAL;
|
|
5
|
+
|
|
6
|
+
const DEFAULT_SHADES = [0.90, 0.95, 1.0, 1.05];
|
|
7
|
+
const SUBTLE_SHADES = [0.95, 0.98, 1.0, 1.02];
|
|
8
|
+
// Fireflies: dramatic brightness range for visible flickering (dark → bright)
|
|
9
|
+
const FIREFLY_SHADES = [0.15, 0.5, 1.0, 1.6];
|
|
10
|
+
|
|
11
|
+
// Normal fire: red-orange shades (dark red → bright orange-red)
|
|
12
|
+
const FIRE_SHADES: [number, number, number][] = [
|
|
13
|
+
[0.70, 0.15, 0.02],
|
|
14
|
+
[0.85, 0.25, 0.03],
|
|
15
|
+
[1.0, 0.40, 0.05],
|
|
16
|
+
[1.15, 0.60, 0.10],
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
// Fuse fire: bright yellow shades (orange → bright yellow)
|
|
20
|
+
const FUSE_FIRE_SHADES: [number, number, number][] = [
|
|
21
|
+
[1.0, 0.65, 0.05],
|
|
22
|
+
[1.15, 0.85, 0.08],
|
|
23
|
+
[1.25, 1.0, 0.15],
|
|
24
|
+
[1.35, 1.2, 0.45],
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
// Burning oil: deep orange-red shades (darker, smokier than regular fire)
|
|
28
|
+
const BURNING_OIL_SHADES: [number, number, number][] = [
|
|
29
|
+
[0.55, 0.10, 0.01],
|
|
30
|
+
[0.70, 0.18, 0.02],
|
|
31
|
+
[0.85, 0.30, 0.04],
|
|
32
|
+
[1.0, 0.45, 0.08],
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
function shadeFactorsFor(mat: number): number[] {
|
|
36
|
+
if (mat === Material.Water || mat === Material.Sand || mat === Material.Snow ||
|
|
37
|
+
mat === Material.Salt || mat === Material.Flour) return SUBTLE_SHADES;
|
|
38
|
+
if (mat === Material.Fireflies) return FIREFLY_SHADES;
|
|
39
|
+
return DEFAULT_SHADES;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function isFireShaded(mat: number): boolean {
|
|
43
|
+
return mat === Material.Fire || mat === Material.FuseFire || mat === Material.Lava ||
|
|
44
|
+
mat === Material.Plasma || mat === Material.MoltenSalt || mat === Material.BurningOil;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function fireShadesFor(mat: number): [number, number, number][] {
|
|
48
|
+
if (mat === Material.FuseFire) return FUSE_FIRE_SHADES;
|
|
49
|
+
if (mat === Material.BurningOil) return BURNING_OIL_SHADES;
|
|
50
|
+
return FIRE_SHADES;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function clamp8(v: number): number {
|
|
54
|
+
return Math.max(0, Math.min(255, Math.floor(v)));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function buildPalette(): Uint8Array {
|
|
58
|
+
const colors = new Uint8Array(PALETTE_SIZE * SHADES_PER_MATERIAL * 4);
|
|
59
|
+
for (let mat = 0; mat < PALETTE_SIZE; mat++) {
|
|
60
|
+
const m = MATERIALS[mat];
|
|
61
|
+
const c = m?.color ?? [0, 0, 0, 0];
|
|
62
|
+
const factors = shadeFactorsFor(mat);
|
|
63
|
+
for (let shade = 0; shade < SHADES_PER_MATERIAL; shade++) {
|
|
64
|
+
const idx = (mat * SHADES_PER_MATERIAL + shade) * 4;
|
|
65
|
+
if (isFireShaded(mat)) {
|
|
66
|
+
const [rMul, gMul, bMul] = fireShadesFor(mat)[shade];
|
|
67
|
+
colors[idx + 0] = clamp8(c[0] * 255 * rMul);
|
|
68
|
+
colors[idx + 1] = clamp8(c[1] * 255 * gMul);
|
|
69
|
+
colors[idx + 2] = clamp8(c[2] * 255 * bMul);
|
|
70
|
+
colors[idx + 3] = clamp8(c[3] * 255);
|
|
71
|
+
} else {
|
|
72
|
+
const f = factors[shade];
|
|
73
|
+
colors[idx + 0] = clamp8(c[0] * 255 * f);
|
|
74
|
+
colors[idx + 1] = clamp8(c[1] * 255 * f);
|
|
75
|
+
colors[idx + 2] = clamp8(c[2] * 255 * f);
|
|
76
|
+
colors[idx + 3] = clamp8(c[3] * 255);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return colors;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function buildMaterialProps(): Uint8Array {
|
|
84
|
+
const props = new Uint8Array(PALETTE_SIZE * 4);
|
|
85
|
+
for (let mat = 0; mat < PALETTE_SIZE; mat++) {
|
|
86
|
+
const def = MATERIALS[mat];
|
|
87
|
+
props[mat * 4 + 0] = clamp8((def?.albedo ?? 0) * 255);
|
|
88
|
+
props[mat * 4 + 1] = clamp8((def?.reflectivity ?? 0) * 255);
|
|
89
|
+
props[mat * 4 + 2] = clamp8((def?.brightness ?? 1) * 255);
|
|
90
|
+
props[mat * 4 + 3] = 0;
|
|
91
|
+
}
|
|
92
|
+
return props;
|
|
93
|
+
}
|