@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.
Files changed (908) hide show
  1. package/README.md +33 -0
  2. package/app/src/index.ts +10 -0
  3. package/app/src/renderer/bootstrap.ts +271 -0
  4. package/app/src/renderer/downdraft-base.css +93 -0
  5. package/app/src/renderer/feature-log.ts +200 -0
  6. package/app/src/renderer/game-module.ts +923 -0
  7. package/app/src/renderer/hooks.ts +88 -0
  8. package/app/src/renderer/hot-reload.ts +178 -0
  9. package/app/src/renderer/import-cache.ts +88 -0
  10. package/app/src/renderer/index.ts +206 -0
  11. package/app/src/renderer/mcp-harness.ts +144 -0
  12. package/app/src/renderer/save-store-factory.ts +239 -0
  13. package/app/src/renderer/sim-bridge.ts +183 -0
  14. package/app/src/renderer/standard-automation-tools.ts +771 -0
  15. package/app/src/shared/feature-log.ts +71 -0
  16. package/app/src/shared/gpu-info.ts +82 -0
  17. package/app/src/shared/import-cache-store.ts +142 -0
  18. package/app/src/shared/index.ts +6 -0
  19. package/app/src/shared/mcp-discovery.ts +47 -0
  20. package/app/src/shared/mcp-proxy.ts +82 -0
  21. package/app/src/shared/types.ts +324 -0
  22. package/asset-bake/src/bake-audio.ts +119 -0
  23. package/asset-bake/src/bake-gltf.ts +172 -0
  24. package/asset-bake/src/bake.ts +78 -0
  25. package/asset-bake/src/cache.ts +188 -0
  26. package/asset-bake/src/config.ts +186 -0
  27. package/asset-bake/src/index.ts +36 -0
  28. package/core/src/animation/animation-event.ts +41 -0
  29. package/core/src/animation/bone-mask.ts +122 -0
  30. package/core/src/animation/clip.ts +252 -0
  31. package/core/src/animation/index.ts +22 -0
  32. package/core/src/animation/mixamo.ts +113 -0
  33. package/core/src/animation/morph-target.ts +69 -0
  34. package/core/src/animation/player.ts +697 -0
  35. package/core/src/animation/retarget.ts +158 -0
  36. package/core/src/animation/skeleton-animator.ts +1399 -0
  37. package/core/src/animation/skeleton.ts +214 -0
  38. package/core/src/animation/state-machine.ts +280 -0
  39. package/core/src/assets/blob-store.ts +66 -0
  40. package/core/src/assets/cache.ts +186 -0
  41. package/core/src/assets/cubemap-converter.ts +155 -0
  42. package/core/src/assets/environment-manager.ts +121 -0
  43. package/core/src/assets/import-cache.ts +65 -0
  44. package/core/src/assets/import-settings.ts +72 -0
  45. package/core/src/assets/importer.ts +108 -0
  46. package/core/src/assets/index.ts +74 -0
  47. package/core/src/assets/irradiance-generator.ts +198 -0
  48. package/core/src/assets/loader-audio.ts +86 -0
  49. package/core/src/assets/loader-cubemap.ts +211 -0
  50. package/core/src/assets/loader-dds.ts +236 -0
  51. package/core/src/assets/loader-hdr.ts +474 -0
  52. package/core/src/assets/loader-mesh.ts +143 -0
  53. package/core/src/assets/loader-shader.ts +73 -0
  54. package/core/src/assets/loader-texture.ts +349 -0
  55. package/core/src/assets/lod.ts +198 -0
  56. package/core/src/assets/manager.ts +480 -0
  57. package/core/src/assets/manifest.ts +81 -0
  58. package/core/src/assets/material-bridge.ts +186 -0
  59. package/core/src/assets/model-importer.ts +72 -0
  60. package/core/src/assets/model-normalizer.ts +248 -0
  61. package/core/src/assets/model-to-gpu.ts +70 -0
  62. package/core/src/assets/model-to-mesh.ts +237 -0
  63. package/core/src/assets/prefilter-generator.ts +250 -0
  64. package/core/src/audio/engine.ts +177 -0
  65. package/core/src/audio/interface.ts +130 -0
  66. package/core/src/audio/listener.ts +32 -0
  67. package/core/src/audio/mixer.ts +141 -0
  68. package/core/src/audio/registry.ts +52 -0
  69. package/core/src/audio/sab.ts +87 -0
  70. package/core/src/audio/source.ts +89 -0
  71. package/core/src/change-detection/atomics.ts +1 -0
  72. package/core/src/change-detection/tracker.ts +47 -0
  73. package/core/src/debug-draw/lines.ts +64 -0
  74. package/core/src/debug-draw/points.ts +17 -0
  75. package/core/src/debug-draw/queue.ts +124 -0
  76. package/core/src/debug-draw/text.ts +25 -0
  77. package/core/src/ecs/archetype.ts +323 -0
  78. package/core/src/ecs/component.ts +188 -0
  79. package/core/src/ecs/entity.ts +25 -0
  80. package/core/src/ecs/events.ts +93 -0
  81. package/core/src/ecs/hierarchy.ts +124 -0
  82. package/core/src/ecs/hmr-swap-registry.ts +22 -0
  83. package/core/src/ecs/index.ts +25 -0
  84. package/core/src/ecs/query.ts +141 -0
  85. package/core/src/ecs/resource.ts +8 -0
  86. package/core/src/ecs/schedule.ts +181 -0
  87. package/core/src/ecs/system-params.ts +99 -0
  88. package/core/src/ecs/system.ts +42 -0
  89. package/core/src/ecs/world.ts +348 -0
  90. package/core/src/index.ts +352 -0
  91. package/core/src/input/context.ts +73 -0
  92. package/core/src/input/dom-handler.ts +380 -0
  93. package/core/src/input/local-player-manager.ts +218 -0
  94. package/core/src/input/mapping.ts +40 -0
  95. package/core/src/input/multi-sab-bridge.ts +276 -0
  96. package/core/src/input/multi-state.ts +54 -0
  97. package/core/src/input/sab-bridge.ts +71 -0
  98. package/core/src/input/state.ts +132 -0
  99. package/core/src/input/ui-router.ts +87 -0
  100. package/core/src/library/host.ts +317 -0
  101. package/core/src/library/index.ts +16 -0
  102. package/core/src/library/library.ts +292 -0
  103. package/core/src/material/compiler.ts +80 -0
  104. package/core/src/material/graph-bridge.ts +172 -0
  105. package/core/src/material/index.ts +9 -0
  106. package/core/src/material/library.ts +442 -0
  107. package/core/src/material/material.ts +156 -0
  108. package/core/src/material/variants.ts +61 -0
  109. package/core/src/math/mat4.ts +202 -0
  110. package/core/src/math/perlin-noise-2d.ts +77 -0
  111. package/core/src/math/perlin-noise-3d.ts +110 -0
  112. package/core/src/math/quat.ts +33 -0
  113. package/core/src/math/rng.ts +29 -0
  114. package/core/src/math/trig.ts +47 -0
  115. package/core/src/math/value-noise.ts +67 -0
  116. package/core/src/mesh/builder.ts +177 -0
  117. package/core/src/mesh/csg.ts +312 -0
  118. package/core/src/mesh/greased-line.ts +145 -0
  119. package/core/src/mesh/mesh.ts +17 -0
  120. package/core/src/mesh/parametric.ts +501 -0
  121. package/core/src/mesh/skinning.ts +67 -0
  122. package/core/src/mesh/vertex-layout.ts +91 -0
  123. package/core/src/module/cross-thread.ts +163 -0
  124. package/core/src/module/diagnostics.ts +123 -0
  125. package/core/src/module/host.ts +451 -0
  126. package/core/src/module/index.ts +22 -0
  127. package/core/src/module/module.ts +109 -0
  128. package/core/src/module/registry.ts +94 -0
  129. package/core/src/module/renderer-module.ts +247 -0
  130. package/core/src/module/ts-loader.ts +26 -0
  131. package/core/src/particles/compute-pass.ts +378 -0
  132. package/core/src/particles/emitter.ts +156 -0
  133. package/core/src/particles/index.ts +11 -0
  134. package/core/src/particles/particle-data.ts +47 -0
  135. package/core/src/particles/render-pass.ts +365 -0
  136. package/core/src/particles/simulator.ts +264 -0
  137. package/core/src/particles/system.ts +193 -0
  138. package/core/src/physics/body.ts +59 -0
  139. package/core/src/physics/ccd-heuristic.ts +55 -0
  140. package/core/src/physics/character.ts +282 -0
  141. package/core/src/physics/collider.ts +55 -0
  142. package/core/src/physics/collision-system.ts +91 -0
  143. package/core/src/physics/events.ts +133 -0
  144. package/core/src/physics/index.ts +34 -0
  145. package/core/src/physics/interface.ts +473 -0
  146. package/core/src/physics/interpolation-buffer.ts +192 -0
  147. package/core/src/physics/lifecycle.ts +87 -0
  148. package/core/src/physics/load-shedder.ts +164 -0
  149. package/core/src/physics/physics-accumulator.ts +101 -0
  150. package/core/src/physics/physics-system.ts +240 -0
  151. package/core/src/physics/ragdoll-presets.ts +272 -0
  152. package/core/src/physics/ragdoll-system.ts +220 -0
  153. package/core/src/physics/ragdoll.ts +182 -0
  154. package/core/src/physics/raycast.ts +143 -0
  155. package/core/src/physics/realm-manager.ts +499 -0
  156. package/core/src/physics/realm-worker-pool.ts +191 -0
  157. package/core/src/physics/realm-worker.ts +102 -0
  158. package/core/src/physics/realm.ts +189 -0
  159. package/core/src/physics/registry.ts +52 -0
  160. package/core/src/physics/safety.ts +247 -0
  161. package/core/src/physics/snapshot-manager.ts +141 -0
  162. package/core/src/physics/worker-protocol.ts +30 -0
  163. package/core/src/platform/bun-preload.ts +169 -0
  164. package/core/src/platform/css-stub.ts +4 -0
  165. package/core/src/platform/glob-polyfill.ts +124 -0
  166. package/core/src/platform/hidpi.ts +57 -0
  167. package/core/src/platform/render-surface.ts +77 -0
  168. package/core/src/platform/rpc.ts +98 -0
  169. package/core/src/platform/runtime.ts +132 -0
  170. package/core/src/plugin/context.ts +364 -0
  171. package/core/src/plugin/diagnostics.ts +61 -0
  172. package/core/src/plugin/discovery.ts +186 -0
  173. package/core/src/plugin/extension-loaders.ts +172 -0
  174. package/core/src/plugin/host.ts +659 -0
  175. package/core/src/plugin/index.ts +106 -0
  176. package/core/src/plugin/loader-asset.ts +124 -0
  177. package/core/src/plugin/loader-quickjs.ts +84 -0
  178. package/core/src/plugin/loader-wasm.ts +411 -0
  179. package/core/src/plugin/loader-worker.ts +261 -0
  180. package/core/src/plugin/manifest.ts +653 -0
  181. package/core/src/plugin/material-registry.ts +65 -0
  182. package/core/src/plugin/mcp-tools.ts +165 -0
  183. package/core/src/plugin/permissions.ts +175 -0
  184. package/core/src/plugin/quickjs-bridge.ts +294 -0
  185. package/core/src/plugin/registry.ts +107 -0
  186. package/core/src/plugin/sandbox-shim.ts +86 -0
  187. package/core/src/plugin/sandbox-worker.ts +215 -0
  188. package/core/src/plugin/wasm-abi.ts +152 -0
  189. package/core/src/plugin/wasm-worker.ts +229 -0
  190. package/core/src/plugin/workshop.ts +169 -0
  191. package/core/src/profiling/event-loop.ts +180 -0
  192. package/core/src/profiling/index.ts +69 -0
  193. package/core/src/profiling/iops/idb-patch.ts +242 -0
  194. package/core/src/profiling/iops/opfs-patch.ts +276 -0
  195. package/core/src/profiling/profiling-sab.ts +839 -0
  196. package/core/src/profiling/task-latency.ts +134 -0
  197. package/core/src/profiling/thread-metrics.ts +126 -0
  198. package/core/src/profiling/trace-event-writer.ts +205 -0
  199. package/core/src/profiling/warnings.ts +423 -0
  200. package/core/src/profiling/worker-prelude.ts +376 -0
  201. package/core/src/render/bind-group.ts +38 -0
  202. package/core/src/render/bindless/bindless-struct.ts +42 -0
  203. package/core/src/render/bindless/bindless.wgsl.ts +167 -0
  204. package/core/src/render/bindless/frame-bindings.ts +176 -0
  205. package/core/src/render/bindless/index.ts +10 -0
  206. package/core/src/render/bindless/material-manager.ts +257 -0
  207. package/core/src/render/bindless/texture-registry.ts +609 -0
  208. package/core/src/render/buffer.ts +82 -0
  209. package/core/src/render/camera-2d.ts +217 -0
  210. package/core/src/render/camera-controller.ts +440 -0
  211. package/core/src/render/camera.ts +409 -0
  212. package/core/src/render/canvas-resize-watcher.ts +46 -0
  213. package/core/src/render/compute-kernel.ts +172 -0
  214. package/core/src/render/constants.ts +2 -0
  215. package/core/src/render/device.ts +111 -0
  216. package/core/src/render/frame-graph.ts +768 -0
  217. package/core/src/render/frustum.ts +185 -0
  218. package/core/src/render/fullscreen-vs.ts +25 -0
  219. package/core/src/render/g-buffer.ts +186 -0
  220. package/core/src/render/game-renderer.ts +1452 -0
  221. package/core/src/render/gpu-driven/cull-pass.ts +394 -0
  222. package/core/src/render/gpu-driven/hzb.ts +215 -0
  223. package/core/src/render/gpu-driven/index.ts +7 -0
  224. package/core/src/render/gpu-driven/indirect-draw-pass.ts +324 -0
  225. package/core/src/render/gpu-driven/instance-buffer.ts +178 -0
  226. package/core/src/render/gpu-driven/mesh-table.ts +175 -0
  227. package/core/src/render/gpu-driven/passes/hzb-build-pass.ts +47 -0
  228. package/core/src/render/gpu-utils.ts +96 -0
  229. package/core/src/render/hdr.ts +88 -0
  230. package/core/src/render/hot-reload.ts +295 -0
  231. package/core/src/render/ibl-bind-group.ts +266 -0
  232. package/core/src/render/ibl.ts +180 -0
  233. package/core/src/render/index.ts +163 -0
  234. package/core/src/render/input-manager.ts +259 -0
  235. package/core/src/render/lighting/area-light.ts +196 -0
  236. package/core/src/render/lighting/cluster-grid.ts +288 -0
  237. package/core/src/render/lighting/cluster-types.ts +193 -0
  238. package/core/src/render/lighting/ies-parser.ts +162 -0
  239. package/core/src/render/lighting.ts +454 -0
  240. package/core/src/render/material-types/depth.wgsl +44 -0
  241. package/core/src/render/material-types/line.wgsl +50 -0
  242. package/core/src/render/material-types/matcap.wgsl +51 -0
  243. package/core/src/render/material-types/normal.wgsl +41 -0
  244. package/core/src/render/material-types/physical.wgsl +152 -0
  245. package/core/src/render/material-types/sprite.wgsl +46 -0
  246. package/core/src/render/material-types/sss.wgsl +79 -0
  247. package/core/src/render/material-types/toon.wgsl +79 -0
  248. package/core/src/render/passes/README.md +121 -0
  249. package/core/src/render/passes/atmosphere.ts +152 -0
  250. package/core/src/render/passes/cluster-lighting-pass.ts +476 -0
  251. package/core/src/render/passes/csm.ts +408 -0
  252. package/core/src/render/passes/cubemap-capture.ts +114 -0
  253. package/core/src/render/passes/debug-viz.ts +278 -0
  254. package/core/src/render/passes/debug.ts +538 -0
  255. package/core/src/render/passes/decal-mesh.ts +111 -0
  256. package/core/src/render/passes/decal-pass.ts +377 -0
  257. package/core/src/render/passes/deferred-lighting.ts +434 -0
  258. package/core/src/render/passes/depth-prepass.ts +163 -0
  259. package/core/src/render/passes/dome-360.ts +83 -0
  260. package/core/src/render/passes/fluid-render.ts +137 -0
  261. package/core/src/render/passes/gi-types.ts +118 -0
  262. package/core/src/render/passes/graph-compute.ts +300 -0
  263. package/core/src/render/passes/greased-line-pass.ts +232 -0
  264. package/core/src/render/passes/morph-target.ts +40 -0
  265. package/core/src/render/passes/opaque.ts +1028 -0
  266. package/core/src/render/passes/point-light-shadow.ts +266 -0
  267. package/core/src/render/passes/procedural-texture.ts +185 -0
  268. package/core/src/render/passes/reflection-probe.ts +140 -0
  269. package/core/src/render/passes/rsm-pass.ts +248 -0
  270. package/core/src/render/passes/sdf-text.ts +155 -0
  271. package/core/src/render/passes/shadow-map.ts +163 -0
  272. package/core/src/render/passes/shadow.ts +220 -0
  273. package/core/src/render/passes/skinning-vs.ts +121 -0
  274. package/core/src/render/passes/skinning.ts +326 -0
  275. package/core/src/render/passes/sky-dome.ts +404 -0
  276. package/core/src/render/passes/skybox.ts +162 -0
  277. package/core/src/render/passes/spot-light-shadow.ts +273 -0
  278. package/core/src/render/passes/terrain.ts +326 -0
  279. package/core/src/render/passes/transparent.ts +353 -0
  280. package/core/src/render/passes/underwater-fog.ts +185 -0
  281. package/core/src/render/passes/video-texture.ts +79 -0
  282. package/core/src/render/passes/volumetric-pass.ts +312 -0
  283. package/core/src/render/passes/volumetric-types.ts +171 -0
  284. package/core/src/render/passes/water.ts +753 -0
  285. package/core/src/render/pbr.ts +296 -0
  286. package/core/src/render/pipeline.ts +52 -0
  287. package/core/src/render/render-pass.ts +30 -0
  288. package/core/src/render/renderer-input-bus.ts +220 -0
  289. package/core/src/render/renderer-module-host.ts +623 -0
  290. package/core/src/render/resource-tracker.ts +67 -0
  291. package/core/src/render/sab-canvas-overlay.ts +122 -0
  292. package/core/src/render/shader-validator.ts +200 -0
  293. package/core/src/render/shaders/debug/debug-line.wgsl +27 -0
  294. package/core/src/render/shaders/debug/debug-point.wgsl +30 -0
  295. package/core/src/render/shaders/debug/debug-text.wgsl +42 -0
  296. package/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
  297. package/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
  298. package/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
  299. package/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
  300. package/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
  301. package/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
  302. package/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
  303. package/core/src/render/shaders/shadow-chunks.ts +135 -0
  304. package/core/src/render/skybox.ts +146 -0
  305. package/core/src/render/splitscreen.ts +85 -0
  306. package/core/src/render/surface.ts +78 -0
  307. package/core/src/render/tonemap.ts +180 -0
  308. package/core/src/render/tracked-render-pass.ts +158 -0
  309. package/core/src/render/viewport.ts +109 -0
  310. package/core/src/render/wgsl-hmr.ts +70 -0
  311. package/core/src/sab/core-input-channel.ts +23 -0
  312. package/core/src/sab/define.ts +239 -0
  313. package/core/src/sab/errors.ts +76 -0
  314. package/core/src/sab/game-input.ts +343 -0
  315. package/core/src/sab/gamepad-devices.ts +259 -0
  316. package/core/src/sab/grid-buffer.ts +117 -0
  317. package/core/src/sab/input.ts +55 -0
  318. package/core/src/sab/layout.ts +219 -0
  319. package/core/src/sab/multi-input-channel.ts +50 -0
  320. package/core/src/sab/record-buffer.ts +155 -0
  321. package/core/src/sab/sab-polyfill.ts +56 -0
  322. package/core/src/sab/sim-channel.ts +453 -0
  323. package/core/src/sab/slot-buffer.ts +190 -0
  324. package/core/src/sab/types.ts +158 -0
  325. package/core/src/safety/bounds.ts +76 -0
  326. package/core/src/safety/json.ts +80 -0
  327. package/core/src/safety/path.ts +167 -0
  328. package/core/src/save/binary-format.ts +117 -0
  329. package/core/src/save/game-save-system.ts +161 -0
  330. package/core/src/save/grid-save-system.ts +158 -0
  331. package/core/src/save/migrate.ts +44 -0
  332. package/core/src/save/migration-registry.ts +94 -0
  333. package/core/src/save/persist-types.ts +208 -0
  334. package/core/src/save/schema.ts +46 -0
  335. package/core/src/save/serializer.ts +180 -0
  336. package/core/src/scene/builder.ts +65 -0
  337. package/core/src/scene/camera.ts +142 -0
  338. package/core/src/scene/checkpoint.ts +109 -0
  339. package/core/src/scene/game-loop.ts +198 -0
  340. package/core/src/scene/index.ts +24 -0
  341. package/core/src/scene/layer.ts +6 -0
  342. package/core/src/scene/prefab.ts +145 -0
  343. package/core/src/scene/scene-manager.ts +157 -0
  344. package/core/src/scene/scene.ts +192 -0
  345. package/core/src/scene/sky.ts +256 -0
  346. package/core/src/scene/spatial-grid.ts +176 -0
  347. package/core/src/scene/streaming.ts +304 -0
  348. package/core/src/scene/vegetation.ts +163 -0
  349. package/core/src/scene/world.ts +89 -0
  350. package/core/src/scripting/binding.ts +129 -0
  351. package/core/src/scripting/hot-reload.ts +144 -0
  352. package/core/src/scripting/script.ts +99 -0
  353. package/core/src/sim/hot-reload-pipeline.ts +49 -0
  354. package/core/src/sim/sim-state-helper.ts +47 -0
  355. package/core/src/sim/transient-state-registry.ts +77 -0
  356. package/core/src/sim/types.ts +113 -0
  357. package/core/src/sim/worker-loop.ts +222 -0
  358. package/core/src/stores/game-store.ts +158 -0
  359. package/core/src/stores/hot-reload-store.ts +44 -0
  360. package/core/src/telemetry/collector.ts +410 -0
  361. package/core/src/telemetry/gc-controller.ts +453 -0
  362. package/core/src/telemetry/gc-profiler.ts +126 -0
  363. package/core/src/telemetry/gc-tracker.ts +69 -0
  364. package/core/src/telemetry/gpu-profiler.ts +703 -0
  365. package/core/src/telemetry/gpu-resource-tracker.ts +285 -0
  366. package/core/src/telemetry/gpu-timer-pool.ts +234 -0
  367. package/core/src/telemetry/gpu-timer.ts +123 -0
  368. package/core/src/telemetry/gpu-timestamp-gate.ts +21 -0
  369. package/core/src/telemetry/reporter.ts +62 -0
  370. package/core/src/types/engine-types.ts +129 -0
  371. package/core/src/ui-font-scale.ts +112 -0
  372. package/core/src/util/broad-phase-grid.ts +82 -0
  373. package/core/src/util/feature-log.ts +220 -0
  374. package/core/src/util/index.ts +17 -0
  375. package/core/src/util/logger.ts +604 -0
  376. package/core/src/webgpu-destroy-augmentation.d.ts +25 -0
  377. package/core/src/worker/base-worker-host.ts +183 -0
  378. package/core/src/worker/buffer-sync.ts +550 -0
  379. package/core/src/worker/crash-recovery.ts +201 -0
  380. package/core/src/worker/entity-sim-worker-host.ts +190 -0
  381. package/core/src/worker/instrumented-worker-host.ts +171 -0
  382. package/core/src/worker/rpc.ts +253 -0
  383. package/core/src/worker/sim-worker-base.ts +913 -0
  384. package/core/src/worker/sim-worker-host.ts +358 -0
  385. package/core/src/worker/task-pool.ts +256 -0
  386. package/core/src/worker/task-worker.ts +83 -0
  387. package/libraries/asset-browser/src/index.ts +11 -0
  388. package/libraries/asset-browser/src/software-thumbnails.ts +949 -0
  389. package/libraries/audio-kira/README.md +17 -0
  390. package/libraries/audio-kira/native/Cargo.toml +14 -0
  391. package/libraries/audio-kira/native/src/engine.rs +27 -0
  392. package/libraries/audio-kira/native/src/lib.rs +185 -0
  393. package/libraries/audio-kira/native/src/mixer.rs +11 -0
  394. package/libraries/audio-kira/native/src/source.rs +80 -0
  395. package/libraries/audio-kira/src/backend.ts +469 -0
  396. package/libraries/audio-kira/src/index.ts +8 -0
  397. package/libraries/audio-kira/src/library.ts +82 -0
  398. package/libraries/blitz-ui/native/Cargo.toml +33 -0
  399. package/libraries/blitz-ui/native/assets/DejaVuSans.woff2 +0 -0
  400. package/libraries/blitz-ui/native/src/bridge.rs +100 -0
  401. package/libraries/blitz-ui/native/src/fonts.rs +20 -0
  402. package/libraries/blitz-ui/native/src/input.rs +80 -0
  403. package/libraries/blitz-ui/native/src/lib.rs +96 -0
  404. package/libraries/blitz-ui/native/src/shell.rs +301 -0
  405. package/libraries/blitz-ui/native-osr/Cargo.toml +24 -0
  406. package/libraries/blitz-ui/native-osr/src/events.rs +237 -0
  407. package/libraries/blitz-ui/native-osr/src/lib.rs +846 -0
  408. package/libraries/blitz-ui/native-osr/src/mutate.rs +385 -0
  409. package/libraries/blitz-ui/native-osr/src/resources.rs +45 -0
  410. package/libraries/blitz-ui/native-osr-spike.ts +70 -0
  411. package/libraries/blitz-ui/src/index.ts +15 -0
  412. package/libraries/blitz-ui/src/native-module.ts +221 -0
  413. package/libraries/blitz-ui/src/native-osr-ffi.ts +423 -0
  414. package/libraries/blitz-ui/src/router.ts +101 -0
  415. package/libraries/blitz-ui/src/shaders/ui-blit.wgsl.ts +35 -0
  416. package/libraries/blitz-ui/src/ui-blit-pass.ts +116 -0
  417. package/libraries/character/README.md +25 -0
  418. package/libraries/character/src/character-animator.ts +374 -0
  419. package/libraries/character/src/index.ts +24 -0
  420. package/libraries/character/src/loader.ts +375 -0
  421. package/libraries/character/src/locomotion.ts +124 -0
  422. package/libraries/character/src/preview.ts +287 -0
  423. package/libraries/devtools/README.md +51 -0
  424. package/libraries/devtools/native/Cargo.toml +12 -0
  425. package/libraries/devtools/native/src/lib.rs +1646 -0
  426. package/libraries/devtools/native/src/panels/console.rs +338 -0
  427. package/libraries/devtools/native/src/panels/dom_tree.rs +47 -0
  428. package/libraries/devtools/native/src/panels/generic.rs +317 -0
  429. package/libraries/devtools/native/src/panels/gpu.rs +107 -0
  430. package/libraries/devtools/native/src/panels/input.rs +88 -0
  431. package/libraries/devtools/native/src/panels/mod.rs +154 -0
  432. package/libraries/devtools/native/src/panels/perf_metrics.rs +91 -0
  433. package/libraries/devtools/native/src/panels/perf_recorder.rs +158 -0
  434. package/libraries/devtools/native/src/panels/scene.rs +72 -0
  435. package/libraries/devtools/native/src/state.rs +394 -0
  436. package/libraries/devtools/src/cdp-bridge.ts +349 -0
  437. package/libraries/devtools/src/collectors.ts +346 -0
  438. package/libraries/devtools/src/egui-ffi.ts +804 -0
  439. package/libraries/devtools/src/egui-renderer.ts +407 -0
  440. package/libraries/devtools/src/host.ts +363 -0
  441. package/libraries/devtools/src/index.ts +40 -0
  442. package/libraries/devtools/src/mirror.ts +794 -0
  443. package/libraries/devtools/src/native-providers.ts +744 -0
  444. package/libraries/devtools/src/verify.ts +167 -0
  445. package/libraries/devtools/src/web/browser.ts +102 -0
  446. package/libraries/devtools/src/web/host.ts +212 -0
  447. package/libraries/devtools/src/web/mirror.ts +430 -0
  448. package/libraries/devtools/src/web/server.ts +198 -0
  449. package/libraries/entities/README.md +17 -0
  450. package/libraries/entities/src/index.ts +4 -0
  451. package/libraries/entities/src/library.ts +64 -0
  452. package/libraries/entities/src/model-renderer.ts +1345 -0
  453. package/libraries/entities/src/shaders/model.wgsl +375 -0
  454. package/libraries/gamepad/src/feed-input.ts +83 -0
  455. package/libraries/gamepad/src/filters.ts +49 -0
  456. package/libraries/gamepad/src/glyphs.ts +93 -0
  457. package/libraries/gamepad/src/hub.ts +206 -0
  458. package/libraries/gamepad/src/index.ts +22 -0
  459. package/libraries/gamepad/src/library.ts +68 -0
  460. package/libraries/gamepad/src/source-sab.ts +70 -0
  461. package/libraries/gamepad/src/sysfs-enrich.ts +138 -0
  462. package/libraries/gaussian-splats/README.md +25 -0
  463. package/libraries/gaussian-splats/src/gpu-sort.ts +595 -0
  464. package/libraries/gaussian-splats/src/index.ts +31 -0
  465. package/libraries/gaussian-splats/src/library.ts +60 -0
  466. package/libraries/gaussian-splats/src/parser.ts +382 -0
  467. package/libraries/gaussian-splats/src/renderer.ts +427 -0
  468. package/libraries/gaussian-splats/src/sh-eval.ts +211 -0
  469. package/libraries/gaussian-splats/src/sorter.ts +110 -0
  470. package/libraries/gaussian-splats/src/tile-raster.ts +473 -0
  471. package/libraries/gpu-kernels/README.md +154 -0
  472. package/libraries/gpu-kernels/src/index.ts +11 -0
  473. package/libraries/gpu-kernels/src/kernel.ts +696 -0
  474. package/libraries/gpu-kernels/src/transpile.ts +958 -0
  475. package/libraries/html-ui-kit/src/behaviors.ts +250 -0
  476. package/libraries/html-ui-kit/src/components.ts +309 -0
  477. package/libraries/html-ui-kit/src/index.ts +30 -0
  478. package/libraries/html-ui-kit/src/nav/nav-controller.ts +238 -0
  479. package/libraries/html-ui-kit/src/nav/nav-input.ts +145 -0
  480. package/libraries/html-ui-kit/src/nav/osk.ts +153 -0
  481. package/libraries/html-ui-kit/src/nav/router.ts +167 -0
  482. package/libraries/html-ui-kit/src/nav/vcursor.ts +203 -0
  483. package/libraries/html-ui-kit/src/ten-foot.ts +182 -0
  484. package/libraries/html-ui-kit/src/theme.ts +238 -0
  485. package/libraries/lighting/README.md +20 -0
  486. package/libraries/lighting/src/index.ts +5 -0
  487. package/libraries/lighting/src/library.ts +66 -0
  488. package/libraries/lighting/src/light-system.ts +452 -0
  489. package/libraries/lighting/src/lighting-system.ts +68 -0
  490. package/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
  491. package/libraries/marching-cubes/README.md +25 -0
  492. package/libraries/marching-cubes/src/chunked-field.ts +177 -0
  493. package/libraries/marching-cubes/src/deformation.ts +63 -0
  494. package/libraries/marching-cubes/src/generator.ts +407 -0
  495. package/libraries/marching-cubes/src/index.ts +32 -0
  496. package/libraries/marching-cubes/src/library.ts +80 -0
  497. package/libraries/marching-cubes/src/lod.ts +122 -0
  498. package/libraries/marching-cubes/src/marching-tetrahedra.ts +252 -0
  499. package/libraries/marching-cubes/src/sab.ts +45 -0
  500. package/libraries/marching-cubes/src/streaming-config.ts +48 -0
  501. package/libraries/marching-cubes/src/streaming-manager.ts +686 -0
  502. package/libraries/marching-cubes/src/tables.ts +323 -0
  503. package/libraries/marching-cubes/src/types.ts +18 -0
  504. package/libraries/models/README.md +25 -0
  505. package/libraries/models/src/bake-node-transforms.ts +171 -0
  506. package/libraries/models/src/codecs/basisu-codec.ts +180 -0
  507. package/libraries/models/src/codecs/draco-codec.ts +372 -0
  508. package/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
  509. package/libraries/models/src/codecs/index.ts +22 -0
  510. package/libraries/models/src/codecs/meshopt-codec.ts +91 -0
  511. package/libraries/models/src/codecs/registry.ts +221 -0
  512. package/libraries/models/src/dae.ts +753 -0
  513. package/libraries/models/src/default-part-selection.ts +56 -0
  514. package/libraries/models/src/dxf.ts +200 -0
  515. package/libraries/models/src/fbx/index.ts +457 -0
  516. package/libraries/models/src/fbx/interpreter/animation.ts +431 -0
  517. package/libraries/models/src/fbx/interpreter/blend-shapes.ts +323 -0
  518. package/libraries/models/src/fbx/interpreter/connections.ts +166 -0
  519. package/libraries/models/src/fbx/interpreter/diagnostics.ts +65 -0
  520. package/libraries/models/src/fbx/interpreter/geometry.ts +535 -0
  521. package/libraries/models/src/fbx/interpreter/global-settings.ts +92 -0
  522. package/libraries/models/src/fbx/interpreter/materials.ts +265 -0
  523. package/libraries/models/src/fbx/interpreter/nodes.ts +197 -0
  524. package/libraries/models/src/fbx/interpreter/skeleton.ts +476 -0
  525. package/libraries/models/src/fbx/parsers/binary-parser.ts +244 -0
  526. package/libraries/models/src/fbx/types.ts +119 -0
  527. package/libraries/models/src/gltf-extensions.ts +196 -0
  528. package/libraries/models/src/gltf.ts +935 -0
  529. package/libraries/models/src/index.ts +87 -0
  530. package/libraries/models/src/library.ts +75 -0
  531. package/libraries/models/src/loader.ts +265 -0
  532. package/libraries/models/src/material-adapter.ts +108 -0
  533. package/libraries/models/src/mini-xml.ts +174 -0
  534. package/libraries/models/src/normalize.ts +216 -0
  535. package/libraries/models/src/obj.ts +264 -0
  536. package/libraries/models/src/off.ts +95 -0
  537. package/libraries/models/src/ply.ts +348 -0
  538. package/libraries/models/src/pose-sampler.ts +219 -0
  539. package/libraries/models/src/sidecar/blender-extras.ts +37 -0
  540. package/libraries/models/src/sidecar/ddmeta.ts +114 -0
  541. package/libraries/models/src/sidecar/godot-import.ts +86 -0
  542. package/libraries/models/src/sidecar/resolver.ts +145 -0
  543. package/libraries/models/src/sidecar/types.ts +11 -0
  544. package/libraries/models/src/sidecar/unity-meta.ts +61 -0
  545. package/libraries/models/src/skeleton-synthesis.ts +132 -0
  546. package/libraries/models/src/stl.ts +149 -0
  547. package/libraries/models/src/threeds.ts +363 -0
  548. package/libraries/models/src/threemf.ts +201 -0
  549. package/libraries/models/src/types.ts +188 -0
  550. package/libraries/models/src/vtk.ts +218 -0
  551. package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +24 -0
  552. package/libraries/models/test-fixtures/fbx/README.md +46 -0
  553. package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
  554. package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
  555. package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
  556. package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
  557. package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
  558. package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
  559. package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
  560. package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
  561. package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
  562. package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
  563. package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
  564. package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
  565. package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
  566. package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
  567. package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
  568. package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
  569. package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
  570. package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
  571. package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
  572. package/libraries/navmesh/README.md +23 -0
  573. package/libraries/navmesh/src/crowd-system.ts +240 -0
  574. package/libraries/navmesh/src/debug-viz.ts +74 -0
  575. package/libraries/navmesh/src/index.ts +15 -0
  576. package/libraries/navmesh/src/library.ts +64 -0
  577. package/libraries/navmesh/src/navmesh-generator.ts +407 -0
  578. package/libraries/navmesh/src/navmesh.ts +159 -0
  579. package/libraries/navmesh/src/pathfinder.ts +252 -0
  580. package/libraries/navmesh/src/types.ts +63 -0
  581. package/libraries/networking/README.md +25 -0
  582. package/libraries/networking/src/authority.ts +121 -0
  583. package/libraries/networking/src/connection.ts +139 -0
  584. package/libraries/networking/src/discovery.ts +373 -0
  585. package/libraries/networking/src/enhanced-replication.ts +355 -0
  586. package/libraries/networking/src/epic-adapter.ts +129 -0
  587. package/libraries/networking/src/index.ts +45 -0
  588. package/libraries/networking/src/library.ts +69 -0
  589. package/libraries/networking/src/lobby.ts +108 -0
  590. package/libraries/networking/src/platform-adapter.ts +163 -0
  591. package/libraries/networking/src/rcs-adapter.ts +127 -0
  592. package/libraries/networking/src/remote-input.ts +188 -0
  593. package/libraries/networking/src/replication.ts +327 -0
  594. package/libraries/networking/src/rpc.ts +188 -0
  595. package/libraries/networking/src/session.ts +173 -0
  596. package/libraries/networking/src/transport.ts +201 -0
  597. package/libraries/networking/src/webrtc.ts +323 -0
  598. package/libraries/pathfinding-2d/README.md +15 -0
  599. package/libraries/pathfinding-2d/src/astar-grid.ts +312 -0
  600. package/libraries/pathfinding-2d/src/index.ts +11 -0
  601. package/libraries/persistence/README.md +25 -0
  602. package/libraries/persistence/src/autosave-manager.ts +112 -0
  603. package/libraries/persistence/src/binary-record-store.ts +244 -0
  604. package/libraries/persistence/src/browser.ts +51 -0
  605. package/libraries/persistence/src/file-save-store.ts +553 -0
  606. package/libraries/persistence/src/hash-utils.ts +59 -0
  607. package/libraries/persistence/src/index.ts +57 -0
  608. package/libraries/persistence/src/library.ts +74 -0
  609. package/libraries/persistence/src/mock-opfs.ts +141 -0
  610. package/libraries/persistence/src/node-fs-directory-handle.ts +161 -0
  611. package/libraries/persistence/src/opfs-save-store.ts +745 -0
  612. package/libraries/persistence/src/save-worker-proxy.ts +127 -0
  613. package/libraries/persistence/src/save-worker.ts +99 -0
  614. package/libraries/persistence/src/xxh3-ts.d.ts +10 -0
  615. package/libraries/physics-native/README.md +21 -0
  616. package/libraries/physics-native/native/Cargo.toml +11 -0
  617. package/libraries/physics-native/native/src/body.rs +403 -0
  618. package/libraries/physics-native/native/src/character.rs +226 -0
  619. package/libraries/physics-native/native/src/collider.rs +299 -0
  620. package/libraries/physics-native/native/src/joint.rs +81 -0
  621. package/libraries/physics-native/native/src/lib.rs +830 -0
  622. package/libraries/physics-native/native/src/query.rs +261 -0
  623. package/libraries/physics-native/native/src/realm.rs +33 -0
  624. package/libraries/physics-native/native/src/step.rs +54 -0
  625. package/libraries/physics-native/native/src/world.rs +148 -0
  626. package/libraries/physics-native/src/backend.ts +1046 -0
  627. package/libraries/physics-native/src/broadphase.ts +101 -0
  628. package/libraries/physics-native/src/ffi-spike-worker.ts +71 -0
  629. package/libraries/physics-native/src/index.ts +11 -0
  630. package/libraries/physics-native/src/library.ts +79 -0
  631. package/libraries/physics-native/src/narrowphase-shapes.ts +420 -0
  632. package/libraries/physics-native/src/narrowphase.ts +123 -0
  633. package/libraries/physics-native/src/solver.ts +141 -0
  634. package/libraries/physics-native/src/types.ts +76 -0
  635. package/libraries/physics-rapier/README.md +21 -0
  636. package/libraries/physics-rapier/bench/ffi-bench.ts +79 -0
  637. package/libraries/physics-rapier/bench/wasm-baseline.ts +90 -0
  638. package/libraries/physics-rapier/src/api.ts +452 -0
  639. package/libraries/physics-rapier/src/auto-backend.ts +59 -0
  640. package/libraries/physics-rapier/src/backend.ts +1207 -0
  641. package/libraries/physics-rapier/src/bulk-ops.ts +68 -0
  642. package/libraries/physics-rapier/src/ffi-backend.ts +21 -0
  643. package/libraries/physics-rapier/src/ffi-lib.ts +597 -0
  644. package/libraries/physics-rapier/src/index.ts +12 -0
  645. package/libraries/physics-rapier/src/library.ts +107 -0
  646. package/libraries/physics-rapier/src/rapier-backend.ts +1052 -0
  647. package/libraries/physics-rapier/src/realm-worker-script.ts +237 -0
  648. package/libraries/postfx/README.md +17 -0
  649. package/libraries/postfx/src/index.ts +19 -0
  650. package/libraries/postfx/src/library.ts +337 -0
  651. package/libraries/postfx/src/post-process-stack.ts +1752 -0
  652. package/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
  653. package/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
  654. package/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
  655. package/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
  656. package/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
  657. package/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
  658. package/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
  659. package/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
  660. package/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
  661. package/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
  662. package/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
  663. package/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
  664. package/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
  665. package/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
  666. package/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
  667. package/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
  668. package/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
  669. package/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
  670. package/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
  671. package/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
  672. package/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
  673. package/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
  674. package/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
  675. package/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
  676. package/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
  677. package/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
  678. package/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
  679. package/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
  680. package/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
  681. package/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
  682. package/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
  683. package/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
  684. package/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
  685. package/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
  686. package/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
  687. package/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
  688. package/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
  689. package/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
  690. package/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
  691. package/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
  692. package/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
  693. package/libraries/recast/README.md +21 -0
  694. package/libraries/recast/src/backend.ts +150 -0
  695. package/libraries/recast/src/crowd-system.ts +352 -0
  696. package/libraries/recast/src/index.ts +12 -0
  697. package/libraries/recast/src/library.ts +91 -0
  698. package/libraries/recast/src/types.ts +86 -0
  699. package/libraries/sand/README.md +25 -0
  700. package/libraries/sand/src/cell.ts +43 -0
  701. package/libraries/sand/src/fields.ts +29 -0
  702. package/libraries/sand/src/fluid-grid.ts +261 -0
  703. package/libraries/sand/src/grid-dims.ts +74 -0
  704. package/libraries/sand/src/grid-sim-buffer.ts +271 -0
  705. package/libraries/sand/src/index.ts +81 -0
  706. package/libraries/sand/src/library.ts +92 -0
  707. package/libraries/sand/src/materials.ts +492 -0
  708. package/libraries/sand/src/palette.ts +93 -0
  709. package/libraries/sand/src/particles.ts +185 -0
  710. package/libraries/sand/src/render/sand-grid-pass.ts +430 -0
  711. package/libraries/sand/src/rng.ts +51 -0
  712. package/libraries/sand/src/rules/builtin-rules.ts +132 -0
  713. package/libraries/sand/src/rules/rule-compiler.ts +162 -0
  714. package/libraries/sand/src/rules/rule-engine.ts +231 -0
  715. package/libraries/sand/src/rules/rule-types.ts +87 -0
  716. package/libraries/sand/src/sand-step-pool.ts +484 -0
  717. package/libraries/sand/src/sand-step-worker.ts +97 -0
  718. package/libraries/sand/src/sand-world.ts +3227 -0
  719. package/libraries/stickman/README.md +25 -0
  720. package/libraries/stickman/src/index.ts +25 -0
  721. package/libraries/stickman/src/library.ts +61 -0
  722. package/libraries/stickman/src/proportions.ts +45 -0
  723. package/libraries/stickman/src/shader.ts +117 -0
  724. package/libraries/stickman/src/skeleton.ts +197 -0
  725. package/libraries/stickman/src/stickman-pass.ts +255 -0
  726. package/libraries/stickman/src/thick-line.ts +123 -0
  727. package/libraries/surface-nets/README.md +25 -0
  728. package/libraries/surface-nets/src/chunked-field.ts +14 -0
  729. package/libraries/surface-nets/src/deformation.ts +45 -0
  730. package/libraries/surface-nets/src/index.ts +36 -0
  731. package/libraries/surface-nets/src/library.ts +59 -0
  732. package/libraries/surface-nets/src/lod.ts +7 -0
  733. package/libraries/surface-nets/src/sab.ts +4 -0
  734. package/libraries/surface-nets/src/streaming-config.ts +5 -0
  735. package/libraries/surface-nets/src/streaming-manager.ts +15 -0
  736. package/libraries/surface-nets/src/surface-nets.ts +334 -0
  737. package/libraries/surface-nets/src/types.ts +23 -0
  738. package/libraries/water/README.md +25 -0
  739. package/libraries/water/src/buoyancy.ts +103 -0
  740. package/libraries/water/src/index.ts +43 -0
  741. package/libraries/water/src/library.ts +85 -0
  742. package/libraries/water/src/shore-damping.ts +93 -0
  743. package/libraries/water/src/water-buffer.ts +89 -0
  744. package/libraries/water/src/water-chunks.ts +13 -0
  745. package/libraries/water/src/water-physics.ts +376 -0
  746. package/libraries/water/src/water-renderer.ts +809 -0
  747. package/libraries/water/src/water-sab.ts +161 -0
  748. package/libraries/water/src/wave-sources.ts +84 -0
  749. package/libraries/weather/README.md +20 -0
  750. package/libraries/weather/src/index.ts +9 -0
  751. package/libraries/weather/src/library.ts +72 -0
  752. package/libraries/weather/src/types.ts +64 -0
  753. package/libraries/weather/src/weather-blend.ts +112 -0
  754. package/libraries/weather/src/weather-system.ts +271 -0
  755. package/libraries/weatherfx/README.md +24 -0
  756. package/libraries/weatherfx/src/cloud-provider.ts +31 -0
  757. package/libraries/weatherfx/src/cloud-system.ts +372 -0
  758. package/libraries/weatherfx/src/index.ts +9 -0
  759. package/libraries/weatherfx/src/library.ts +58 -0
  760. package/libraries/weatherfx/src/particle-system.ts +434 -0
  761. package/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
  762. package/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
  763. package/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
  764. package/lint-plugin.mjs +41 -0
  765. package/mcp/src/client.ts +703 -0
  766. package/mcp/src/engine-context.ts +186 -0
  767. package/mcp/src/http-transport.ts +471 -0
  768. package/mcp/src/index.ts +13 -0
  769. package/mcp/src/prompts/add-entity.ts +42 -0
  770. package/mcp/src/prompts/create-scene.ts +44 -0
  771. package/mcp/src/prompts/debug-frame.ts +39 -0
  772. package/mcp/src/prompts/index.ts +12 -0
  773. package/mcp/src/resources/asset-list.ts +32 -0
  774. package/mcp/src/resources/checkpoint-list.ts +33 -0
  775. package/mcp/src/resources/entity-state.ts +55 -0
  776. package/mcp/src/resources/gpu-info.ts +103 -0
  777. package/mcp/src/resources/index.ts +57 -0
  778. package/mcp/src/resources/performance.ts +37 -0
  779. package/mcp/src/resources/scene-tree.ts +43 -0
  780. package/mcp/src/server.ts +375 -0
  781. package/mcp/src/tools/animation.ts +118 -0
  782. package/mcp/src/tools/asset.ts +161 -0
  783. package/mcp/src/tools/audio.ts +96 -0
  784. package/mcp/src/tools/build.ts +143 -0
  785. package/mcp/src/tools/camera.ts +167 -0
  786. package/mcp/src/tools/checkpoint.ts +100 -0
  787. package/mcp/src/tools/component.ts +199 -0
  788. package/mcp/src/tools/debug.ts +300 -0
  789. package/mcp/src/tools/entity.ts +361 -0
  790. package/mcp/src/tools/inspect.ts +210 -0
  791. package/mcp/src/tools/lighting.ts +263 -0
  792. package/mcp/src/tools/material.ts +243 -0
  793. package/mcp/src/tools/mesh.ts +239 -0
  794. package/mcp/src/tools/physics.ts +266 -0
  795. package/mcp/src/tools/scene.ts +153 -0
  796. package/mcp/src/tools/script.ts +122 -0
  797. package/mcp/src/types.ts +92 -0
  798. package/mcp/src/undo-redo.ts +77 -0
  799. package/modules/camera-controls/README.md +20 -0
  800. package/modules/camera-controls/src/index.ts +161 -0
  801. package/modules/controller-ui/src/index.ts +164 -0
  802. package/modules/devtools/README.md +25 -0
  803. package/modules/devtools/src/api.ts +461 -0
  804. package/modules/devtools/src/asset-utils.ts +105 -0
  805. package/modules/devtools/src/bind-debug-store.ts +48 -0
  806. package/modules/devtools/src/data-bridge.ts +286 -0
  807. package/modules/devtools/src/debug-overlay.ts +238 -0
  808. package/modules/devtools/src/debug-raycast.ts +328 -0
  809. package/modules/devtools/src/debug-store.ts +92 -0
  810. package/modules/devtools/src/debug-view-descriptors.ts +59 -0
  811. package/modules/devtools/src/doctor-panel.ts +182 -0
  812. package/modules/devtools/src/gizmo-module.ts +136 -0
  813. package/modules/devtools/src/graph-model.ts +509 -0
  814. package/modules/devtools/src/grid-renderer.ts +157 -0
  815. package/modules/devtools/src/height-ruler-renderer.ts +216 -0
  816. package/modules/devtools/src/index.ts +81 -0
  817. package/modules/devtools/src/init.ts +261 -0
  818. package/modules/devtools/src/label-overlay.ts +154 -0
  819. package/modules/devtools/src/material-stats-panel.ts +188 -0
  820. package/modules/devtools/src/profiling-bridge.ts +377 -0
  821. package/modules/devtools/src/profiling-hooks.ts +98 -0
  822. package/modules/devtools/src/renderer-adapter.ts +76 -0
  823. package/modules/devtools/src/scene-inspector.ts +637 -0
  824. package/modules/devtools/src/scene-store.ts +320 -0
  825. package/modules/devtools/src/scene-sync.ts +116 -0
  826. package/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
  827. package/modules/devtools/src/sim-stats-panel.ts +272 -0
  828. package/modules/devtools/src/sim-stats-provider.ts +105 -0
  829. package/modules/devtools/src/skeleton-renderer.ts +351 -0
  830. package/modules/devtools/src/transform-gizmo.ts +928 -0
  831. package/modules/devtools/src/types.ts +290 -0
  832. package/modules/devtools/src/worker-expose.ts +67 -0
  833. package/modules/devtools/src/worker-sync.ts +137 -0
  834. package/modules/editor/src/commands/component.ts +156 -0
  835. package/modules/editor/src/commands/entity.ts +287 -0
  836. package/modules/editor/src/commands/hierarchy.ts +83 -0
  837. package/modules/editor/src/commands/index.ts +61 -0
  838. package/modules/editor/src/commands/prefab.ts +163 -0
  839. package/modules/editor/src/commands/registry.ts +331 -0
  840. package/modules/editor/src/commands/scene-io.ts +211 -0
  841. package/modules/editor/src/commands/selection.ts +73 -0
  842. package/modules/editor/src/commands/transform.ts +91 -0
  843. package/modules/editor/src/ddscene.ts +267 -0
  844. package/modules/editor/src/document.ts +123 -0
  845. package/modules/editor/src/editor-context.ts +172 -0
  846. package/modules/editor/src/index.ts +41 -0
  847. package/modules/editor/src/mcp.ts +103 -0
  848. package/modules/editor/src/module.ts +148 -0
  849. package/modules/editor/src/selection.ts +70 -0
  850. package/modules/editor/src/shell.ts +456 -0
  851. package/modules/editor/src/viewport.ts +199 -0
  852. package/modules/html-ui/src/composite.ts +135 -0
  853. package/modules/html-ui/src/create-html-ui.ts +188 -0
  854. package/modules/html-ui/src/doc-backend.ts +343 -0
  855. package/modules/html-ui/src/host.ts +646 -0
  856. package/modules/html-ui/src/index.ts +13 -0
  857. package/modules/html-ui/src/jsx-dev-runtime.ts +12 -0
  858. package/modules/html-ui/src/jsx-runtime.ts +126 -0
  859. package/modules/html-ui/src/protocol.ts +88 -0
  860. package/modules/html-ui/src/ui-worker.ts +16 -0
  861. package/modules/mcp/README.md +18 -0
  862. package/modules/mcp/src/index.ts +27 -0
  863. package/modules/movement-2d/README.md +19 -0
  864. package/modules/movement-2d/src/grid-character.ts +455 -0
  865. package/modules/movement-2d/src/index.ts +45 -0
  866. package/modules/movement-3d/README.md +21 -0
  867. package/modules/movement-3d/src/character-motor.ts +230 -0
  868. package/modules/movement-3d/src/index.ts +46 -0
  869. package/modules/native-osr/src/index.ts +22 -0
  870. package/modules/native-osr/src/input-router.ts +401 -0
  871. package/modules/native-osr/src/native-osr-manager.ts +247 -0
  872. package/modules/native-osr/src/native-texture-source.ts +86 -0
  873. package/modules/native-osr/src/types.ts +112 -0
  874. package/modules/native-osr/src/world-space-ui-pass.ts +351 -0
  875. package/modules/sailing/README.md +18 -0
  876. package/modules/sailing/src/index.ts +51 -0
  877. package/modules/terrain/README.md +18 -0
  878. package/modules/terrain/src/index.ts +78 -0
  879. package/modules/vitals/README.md +17 -0
  880. package/modules/vitals/src/index.ts +43 -0
  881. package/modules/vitals/src/vitals.ts +265 -0
  882. package/modules/xr/README.md +25 -0
  883. package/modules/xr/src/camera-rig.ts +146 -0
  884. package/modules/xr/src/debug.ts +59 -0
  885. package/modules/xr/src/frame-loop.ts +197 -0
  886. package/modules/xr/src/index.ts +16 -0
  887. package/modules/xr/src/input.ts +208 -0
  888. package/modules/xr/src/layer.ts +140 -0
  889. package/modules/xr/src/session.ts +156 -0
  890. package/modules/xr/src/sim-module.ts +23 -0
  891. package/modules/xr/src/types.ts +32 -0
  892. package/modules/xr/src/webxr.d.ts +182 -0
  893. package/modules/xr/src/xr-module.ts +179 -0
  894. package/package.json +232 -3
  895. package/shader-graph/src/chunks.ts +349 -0
  896. package/shader-graph/src/compiler.ts +732 -0
  897. package/shader-graph/src/compute-compiler.ts +453 -0
  898. package/shader-graph/src/compute-graph.ts +112 -0
  899. package/shader-graph/src/compute-profiles.ts +54 -0
  900. package/shader-graph/src/graph.ts +52 -0
  901. package/shader-graph/src/index.ts +53 -0
  902. package/shader-graph/src/profiles.ts +407 -0
  903. package/shader-graph/src/validator.ts +48 -0
  904. package/shader-graph/src/wgsl-binding-validator.ts +143 -0
  905. package/shader-graph/src/wgsl-struct-validator.ts +245 -0
  906. package/shader-graph/src/wgsl-struct.ts +397 -0
  907. package/test/src/index.ts +7 -0
  908. 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
+ }