@downdraft/engine 0.1.1 → 0.1.2-alpha.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1021) hide show
  1. package/app/README.md +11 -0
  2. package/app/src/renderer/bootstrap.ts +295 -19
  3. package/app/src/renderer/game-module.ts +60 -12
  4. package/app/src/renderer/hooks.ts +9 -1
  5. package/app/src/renderer/hot-reload.ts +9 -9
  6. package/app/src/renderer/mcp-harness.ts +2 -2
  7. package/app/src/renderer/standard-automation-tools.ts +104 -3
  8. package/app/src/shared/feature-log.ts +2 -1
  9. package/app/src/shared/mcp-discovery.ts +8 -3
  10. package/app/src/shared/mcp-proxy.ts +2 -2
  11. package/asset-bake/README.md +22 -0
  12. package/core/README.md +25 -0
  13. package/core/src/animation/skeleton-animator.ts +23 -5
  14. package/core/src/assets/manager.ts +4 -4
  15. package/core/src/ecs/events.ts +1 -1
  16. package/core/src/ecs/schedule.ts +1 -1
  17. package/core/src/ecs/world.ts +1 -1
  18. package/core/src/index.ts +3 -4
  19. package/core/src/library/host.ts +27 -13
  20. package/core/src/library/library.ts +13 -5
  21. package/core/src/module/cross-thread.ts +6 -0
  22. package/core/src/module/diagnostics.ts +10 -6
  23. package/core/src/module/host.ts +65 -18
  24. package/core/src/module/index.ts +1 -0
  25. package/core/src/module/module.ts +11 -5
  26. package/core/src/module/renderer-module.ts +15 -0
  27. package/core/src/physics/safety.ts +1 -1
  28. package/core/src/platform/bun-preload.ts +7 -2
  29. package/core/src/platform/glob-polyfill.ts +17 -8
  30. package/core/src/platform/pkg-root.ts +27 -0
  31. package/core/src/platform/runtime.ts +29 -0
  32. package/core/src/plugin/discovery.ts +1 -1
  33. package/core/src/plugin/extension-loaders.ts +6 -4
  34. package/core/src/plugin/host.ts +13 -13
  35. package/core/src/plugin/loader-asset.ts +5 -5
  36. package/core/src/plugin/loader-quickjs.ts +1 -1
  37. package/core/src/plugin/loader-wasm.ts +3 -3
  38. package/core/src/plugin/loader-worker.ts +1 -1
  39. package/core/src/plugin/manifest.ts +8 -3
  40. package/core/src/plugin/workshop.ts +3 -3
  41. package/core/src/profiling/index.ts +1 -1
  42. package/core/src/profiling/profiling-sab.ts +19 -0
  43. package/core/src/profiling/warnings.ts +1 -1
  44. package/core/src/profiling/worker-prelude.ts +1 -1
  45. package/core/src/render/bindless/frame-bindings.ts +1 -1
  46. package/core/src/render/bindless/material-manager.ts +2 -2
  47. package/core/src/render/bindless/texture-registry.ts +2 -2
  48. package/core/src/render/device.ts +5 -5
  49. package/core/src/render/frame-graph.ts +2 -2
  50. package/core/src/render/game-renderer.ts +42 -18
  51. package/core/src/render/hot-reload.ts +3 -3
  52. package/core/src/render/renderer-module-host.ts +32 -12
  53. package/core/src/render/shader-validator.ts +7 -7
  54. package/core/src/render/surface.ts +1 -1
  55. package/core/src/sab/errors.ts +1 -1
  56. package/core/src/sab/sab-polyfill.ts +1 -1
  57. package/core/src/save/migration-registry.ts +4 -4
  58. package/core/src/save/schema.ts +1 -1
  59. package/core/src/scene/prefab.ts +1 -1
  60. package/core/src/scene/scene-manager.ts +2 -2
  61. package/core/src/scene/scene.ts +4 -4
  62. package/core/src/scene/streaming.ts +2 -2
  63. package/core/src/scripting/hot-reload.ts +2 -2
  64. package/core/src/sim/hot-reload-pipeline.ts +30 -6
  65. package/core/src/sim/sim-state-helper.ts +1 -1
  66. package/core/src/sim/transient-state-registry.ts +1 -1
  67. package/core/src/sim/worker-loop.ts +2 -2
  68. package/core/src/telemetry/gpu-profiler.ts +3 -3
  69. package/core/src/util/index.ts +1 -1
  70. package/core/src/util/logger.ts +36 -5
  71. package/core/src/version.ts +13 -0
  72. package/core/src/worker/base-worker-host.ts +87 -25
  73. package/core/src/worker/buffer-sync.ts +1 -1
  74. package/core/src/worker/crash-recovery.ts +2 -2
  75. package/core/src/worker/instrumented-worker-host.ts +3 -3
  76. package/core/src/worker/rpc.ts +62 -11
  77. package/core/src/worker/sim-worker-base.ts +3 -8
  78. package/core/src/worker/task-pool.ts +2 -2
  79. package/dist/.dd-manifest.json +4119 -0
  80. package/dist/app/src/index.js +9 -0
  81. package/dist/app/src/renderer/bootstrap.js +446 -0
  82. package/dist/app/src/renderer/downdraft-base.css +93 -0
  83. package/dist/app/src/renderer/feature-log.js +180 -0
  84. package/dist/app/src/renderer/game-module.js +562 -0
  85. package/dist/app/src/renderer/hooks.js +82 -0
  86. package/dist/app/src/renderer/hot-reload.js +158 -0
  87. package/dist/app/src/renderer/import-cache.js +77 -0
  88. package/dist/app/src/renderer/index.js +149 -0
  89. package/dist/app/src/renderer/mcp-harness.js +112 -0
  90. package/dist/app/src/renderer/save-store-factory.js +180 -0
  91. package/dist/app/src/renderer/sim-bridge.js +138 -0
  92. package/dist/app/src/renderer/standard-automation-tools.js +720 -0
  93. package/dist/app/src/shared/feature-log.js +54 -0
  94. package/dist/app/src/shared/gpu-info.js +74 -0
  95. package/dist/app/src/shared/import-cache-store.js +123 -0
  96. package/dist/app/src/shared/index.js +4 -0
  97. package/dist/app/src/shared/mcp-discovery.js +55 -0
  98. package/dist/app/src/shared/mcp-proxy.js +71 -0
  99. package/dist/app/src/shared/types.js +13 -0
  100. package/dist/asset-bake/src/bake-audio.js +103 -0
  101. package/dist/asset-bake/src/bake-gltf.js +141 -0
  102. package/dist/asset-bake/src/bake.js +63 -0
  103. package/dist/asset-bake/src/cache.js +147 -0
  104. package/dist/asset-bake/src/config.js +93 -0
  105. package/dist/asset-bake/src/index.js +25 -0
  106. package/dist/core/src/animation/animation-event.js +24 -0
  107. package/dist/core/src/animation/bone-mask.js +103 -0
  108. package/dist/core/src/animation/clip.js +210 -0
  109. package/dist/core/src/animation/index.js +13 -0
  110. package/dist/core/src/animation/mixamo.js +78 -0
  111. package/dist/core/src/animation/morph-target.js +37 -0
  112. package/dist/core/src/animation/player.js +621 -0
  113. package/dist/core/src/animation/retarget.js +101 -0
  114. package/dist/core/src/animation/skeleton-animator.js +1361 -0
  115. package/dist/core/src/animation/skeleton.js +166 -0
  116. package/dist/core/src/animation/state-machine.js +252 -0
  117. package/dist/core/src/assets/blob-store.js +14 -0
  118. package/dist/core/src/assets/cache.js +168 -0
  119. package/dist/core/src/assets/cubemap-converter.js +129 -0
  120. package/dist/core/src/assets/environment-manager.js +84 -0
  121. package/dist/core/src/assets/import-cache.js +36 -0
  122. package/dist/core/src/assets/import-settings.js +34 -0
  123. package/dist/core/src/assets/importer.js +78 -0
  124. package/dist/core/src/assets/index.js +29 -0
  125. package/dist/core/src/assets/irradiance-generator.js +179 -0
  126. package/dist/core/src/assets/loader-audio.js +70 -0
  127. package/dist/core/src/assets/loader-cubemap.js +141 -0
  128. package/dist/core/src/assets/loader-dds.js +185 -0
  129. package/dist/core/src/assets/loader-hdr.js +430 -0
  130. package/dist/core/src/assets/loader-mesh.js +47 -0
  131. package/dist/core/src/assets/loader-shader.js +61 -0
  132. package/dist/core/src/assets/loader-texture.js +264 -0
  133. package/dist/core/src/assets/lod.js +150 -0
  134. package/dist/core/src/assets/manager.js +401 -0
  135. package/dist/core/src/assets/manifest.js +57 -0
  136. package/dist/core/src/assets/material-bridge.js +160 -0
  137. package/dist/core/src/assets/model-importer.js +32 -0
  138. package/dist/core/src/assets/model-normalizer.js +213 -0
  139. package/dist/core/src/assets/model-to-gpu.js +44 -0
  140. package/dist/core/src/assets/model-to-mesh.js +171 -0
  141. package/dist/core/src/assets/prefilter-generator.js +220 -0
  142. package/dist/core/src/audio/engine.js +153 -0
  143. package/dist/core/src/audio/interface.js +8 -0
  144. package/dist/core/src/audio/listener.js +19 -0
  145. package/dist/core/src/audio/mixer.js +124 -0
  146. package/dist/core/src/audio/registry.js +43 -0
  147. package/dist/core/src/audio/sab.js +74 -0
  148. package/dist/core/src/audio/source.js +60 -0
  149. package/dist/core/src/change-detection/atomics.js +1 -0
  150. package/dist/core/src/change-detection/tracker.js +26 -0
  151. package/dist/core/src/debug-draw/lines.js +27 -0
  152. package/dist/core/src/debug-draw/points.js +9 -0
  153. package/dist/core/src/debug-draw/queue.js +77 -0
  154. package/dist/core/src/debug-draw/text.js +12 -0
  155. package/dist/core/src/ecs/archetype.js +271 -0
  156. package/dist/core/src/ecs/component.js +109 -0
  157. package/dist/core/src/ecs/entity.js +11 -0
  158. package/dist/core/src/ecs/events.js +73 -0
  159. package/dist/core/src/ecs/hierarchy.js +104 -0
  160. package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
  161. package/dist/core/src/ecs/index.js +14 -0
  162. package/dist/core/src/ecs/query.js +110 -0
  163. package/dist/core/src/ecs/resource.js +3 -0
  164. package/dist/core/src/ecs/schedule.js +157 -0
  165. package/dist/core/src/ecs/system-params.js +45 -0
  166. package/dist/core/src/ecs/system.js +18 -0
  167. package/dist/core/src/ecs/world.js +292 -0
  168. package/dist/core/src/index.js +191 -0
  169. package/dist/core/src/input/context.js +69 -0
  170. package/dist/core/src/input/dom-handler.js +288 -0
  171. package/dist/core/src/input/local-player-manager.js +145 -0
  172. package/dist/core/src/input/mapping.js +36 -0
  173. package/dist/core/src/input/multi-sab-bridge.js +224 -0
  174. package/dist/core/src/input/multi-state.js +48 -0
  175. package/dist/core/src/input/sab-bridge.js +66 -0
  176. package/dist/core/src/input/state.js +108 -0
  177. package/dist/core/src/input/ui-router.js +76 -0
  178. package/dist/core/src/library/host.js +291 -0
  179. package/dist/core/src/library/index.js +1 -0
  180. package/dist/core/src/library/library.js +20 -0
  181. package/dist/core/src/material/compiler.js +73 -0
  182. package/dist/core/src/material/graph-bridge.js +119 -0
  183. package/dist/core/src/material/index.js +6 -0
  184. package/dist/core/src/material/library.js +414 -0
  185. package/dist/core/src/material/material.js +120 -0
  186. package/dist/core/src/material/variants.js +37 -0
  187. package/dist/core/src/math/mat4.js +198 -0
  188. package/dist/core/src/math/perlin-noise-2d.js +66 -0
  189. package/dist/core/src/math/perlin-noise-3d.js +76 -0
  190. package/dist/core/src/math/quat.js +29 -0
  191. package/dist/core/src/math/rng.js +25 -0
  192. package/dist/core/src/math/trig.js +42 -0
  193. package/dist/core/src/math/value-noise.js +49 -0
  194. package/dist/core/src/mesh/builder.js +137 -0
  195. package/dist/core/src/mesh/csg.js +250 -0
  196. package/dist/core/src/mesh/greased-line.js +102 -0
  197. package/dist/core/src/mesh/mesh.js +6 -0
  198. package/dist/core/src/mesh/parametric.js +392 -0
  199. package/dist/core/src/mesh/skinning.js +30 -0
  200. package/dist/core/src/mesh/vertex-layout.js +65 -0
  201. package/dist/core/src/module/cross-thread.js +126 -0
  202. package/dist/core/src/module/diagnostics.js +99 -0
  203. package/dist/core/src/module/host.js +449 -0
  204. package/dist/core/src/module/index.js +6 -0
  205. package/dist/core/src/module/module.js +1 -0
  206. package/dist/core/src/module/registry.js +83 -0
  207. package/dist/core/src/module/renderer-module.js +13 -0
  208. package/dist/core/src/module/ts-loader.js +20 -0
  209. package/dist/core/src/particles/compute-pass.js +329 -0
  210. package/dist/core/src/particles/emitter.js +113 -0
  211. package/dist/core/src/particles/index.js +7 -0
  212. package/dist/core/src/particles/particle-data.js +33 -0
  213. package/dist/core/src/particles/render-pass.js +338 -0
  214. package/dist/core/src/particles/simulator.js +224 -0
  215. package/dist/core/src/particles/system.js +157 -0
  216. package/dist/core/src/physics/body.js +25 -0
  217. package/dist/core/src/physics/ccd-heuristic.js +46 -0
  218. package/dist/core/src/physics/character.js +184 -0
  219. package/dist/core/src/physics/collider.js +36 -0
  220. package/dist/core/src/physics/collision-system.js +62 -0
  221. package/dist/core/src/physics/events.js +74 -0
  222. package/dist/core/src/physics/index.js +24 -0
  223. package/dist/core/src/physics/interface.js +14 -0
  224. package/dist/core/src/physics/interpolation-buffer.js +182 -0
  225. package/dist/core/src/physics/lifecycle.js +66 -0
  226. package/dist/core/src/physics/load-shedder.js +155 -0
  227. package/dist/core/src/physics/physics-accumulator.js +94 -0
  228. package/dist/core/src/physics/physics-system.js +142 -0
  229. package/dist/core/src/physics/ragdoll-presets.js +248 -0
  230. package/dist/core/src/physics/ragdoll-system.js +193 -0
  231. package/dist/core/src/physics/ragdoll.js +117 -0
  232. package/dist/core/src/physics/raycast.js +97 -0
  233. package/dist/core/src/physics/realm-manager.js +431 -0
  234. package/dist/core/src/physics/realm-worker-pool.js +181 -0
  235. package/dist/core/src/physics/realm-worker.js +91 -0
  236. package/dist/core/src/physics/realm.js +137 -0
  237. package/dist/core/src/physics/registry.js +43 -0
  238. package/dist/core/src/physics/safety.js +211 -0
  239. package/dist/core/src/physics/snapshot-manager.js +118 -0
  240. package/dist/core/src/physics/worker-protocol.js +1 -0
  241. package/dist/core/src/platform/bun-preload.js +175 -0
  242. package/dist/core/src/platform/css-stub.js +4 -0
  243. package/dist/core/src/platform/glob-polyfill.js +137 -0
  244. package/dist/core/src/platform/hidpi.js +52 -0
  245. package/dist/core/src/platform/pkg-root.js +27 -0
  246. package/dist/core/src/platform/render-surface.js +15 -0
  247. package/dist/core/src/platform/rpc.js +82 -0
  248. package/dist/core/src/platform/runtime.js +93 -0
  249. package/dist/core/src/plugin/context.js +144 -0
  250. package/dist/core/src/plugin/diagnostics.js +20 -0
  251. package/dist/core/src/plugin/discovery.js +124 -0
  252. package/dist/core/src/plugin/extension-loaders.js +111 -0
  253. package/dist/core/src/plugin/host.js +542 -0
  254. package/dist/core/src/plugin/index.js +19 -0
  255. package/dist/core/src/plugin/loader-asset.js +105 -0
  256. package/dist/core/src/plugin/loader-quickjs.js +67 -0
  257. package/dist/core/src/plugin/loader-wasm.js +385 -0
  258. package/dist/core/src/plugin/loader-worker.js +228 -0
  259. package/dist/core/src/plugin/manifest.js +424 -0
  260. package/dist/core/src/plugin/material-registry.js +44 -0
  261. package/dist/core/src/plugin/mcp-tools.js +147 -0
  262. package/dist/core/src/plugin/permissions.js +152 -0
  263. package/dist/core/src/plugin/quickjs-bridge.js +219 -0
  264. package/dist/core/src/plugin/registry.js +92 -0
  265. package/dist/core/src/plugin/sandbox-shim.js +79 -0
  266. package/dist/core/src/plugin/sandbox-worker.js +194 -0
  267. package/dist/core/src/plugin/wasm-abi.js +62 -0
  268. package/dist/core/src/plugin/wasm-worker.js +234 -0
  269. package/dist/core/src/plugin/workshop.js +131 -0
  270. package/dist/core/src/profiling/event-loop.js +164 -0
  271. package/dist/core/src/profiling/index.js +23 -0
  272. package/dist/core/src/profiling/iops/idb-patch.js +211 -0
  273. package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
  274. package/dist/core/src/profiling/profiling-sab.js +632 -0
  275. package/dist/core/src/profiling/task-latency.js +118 -0
  276. package/dist/core/src/profiling/thread-metrics.js +103 -0
  277. package/dist/core/src/profiling/trace-event-writer.js +165 -0
  278. package/dist/core/src/profiling/warnings.js +304 -0
  279. package/dist/core/src/profiling/worker-prelude.js +281 -0
  280. package/dist/core/src/render/bind-group.js +33 -0
  281. package/dist/core/src/render/bindless/bindless-struct.js +39 -0
  282. package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
  283. package/dist/core/src/render/bindless/frame-bindings.js +142 -0
  284. package/dist/core/src/render/bindless/index.js +6 -0
  285. package/dist/core/src/render/bindless/material-manager.js +182 -0
  286. package/dist/core/src/render/bindless/texture-registry.js +498 -0
  287. package/dist/core/src/render/buffer.js +74 -0
  288. package/dist/core/src/render/camera-2d.js +151 -0
  289. package/dist/core/src/render/camera-controller.js +370 -0
  290. package/dist/core/src/render/camera.js +332 -0
  291. package/dist/core/src/render/canvas-resize-watcher.js +36 -0
  292. package/dist/core/src/render/compute-kernel.js +130 -0
  293. package/dist/core/src/render/constants.js +2 -0
  294. package/dist/core/src/render/device.js +91 -0
  295. package/dist/core/src/render/frame-graph.js +594 -0
  296. package/dist/core/src/render/frustum.js +152 -0
  297. package/dist/core/src/render/fullscreen-vs.js +24 -0
  298. package/dist/core/src/render/g-buffer.js +156 -0
  299. package/dist/core/src/render/game-renderer.js +1165 -0
  300. package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
  301. package/dist/core/src/render/gpu-driven/hzb.js +183 -0
  302. package/dist/core/src/render/gpu-driven/index.js +6 -0
  303. package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
  304. package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
  305. package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
  306. package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
  307. package/dist/core/src/render/gpu-utils.js +72 -0
  308. package/dist/core/src/render/hdr.js +69 -0
  309. package/dist/core/src/render/hot-reload.js +236 -0
  310. package/dist/core/src/render/ibl-bind-group.js +232 -0
  311. package/dist/core/src/render/ibl.js +148 -0
  312. package/dist/core/src/render/index.js +86 -0
  313. package/dist/core/src/render/input-manager.js +224 -0
  314. package/dist/core/src/render/lighting/area-light.js +142 -0
  315. package/dist/core/src/render/lighting/cluster-grid.js +255 -0
  316. package/dist/core/src/render/lighting/cluster-types.js +87 -0
  317. package/dist/core/src/render/lighting/ies-parser.js +111 -0
  318. package/dist/core/src/render/lighting.js +300 -0
  319. package/dist/core/src/render/material-types/depth.wgsl +44 -0
  320. package/dist/core/src/render/material-types/line.wgsl +50 -0
  321. package/dist/core/src/render/material-types/matcap.wgsl +51 -0
  322. package/dist/core/src/render/material-types/normal.wgsl +41 -0
  323. package/dist/core/src/render/material-types/physical.wgsl +152 -0
  324. package/dist/core/src/render/material-types/sprite.wgsl +46 -0
  325. package/dist/core/src/render/material-types/sss.wgsl +79 -0
  326. package/dist/core/src/render/material-types/toon.wgsl +79 -0
  327. package/dist/core/src/render/passes/README.md +121 -0
  328. package/dist/core/src/render/passes/atmosphere.js +107 -0
  329. package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
  330. package/dist/core/src/render/passes/csm.js +338 -0
  331. package/dist/core/src/render/passes/cubemap-capture.js +93 -0
  332. package/dist/core/src/render/passes/debug-viz.js +248 -0
  333. package/dist/core/src/render/passes/debug.js +500 -0
  334. package/dist/core/src/render/passes/decal-mesh.js +86 -0
  335. package/dist/core/src/render/passes/decal-pass.js +344 -0
  336. package/dist/core/src/render/passes/deferred-lighting.js +406 -0
  337. package/dist/core/src/render/passes/depth-prepass.js +148 -0
  338. package/dist/core/src/render/passes/dome-360.js +68 -0
  339. package/dist/core/src/render/passes/fluid-render.js +116 -0
  340. package/dist/core/src/render/passes/gi-types.js +78 -0
  341. package/dist/core/src/render/passes/graph-compute.js +251 -0
  342. package/dist/core/src/render/passes/greased-line-pass.js +218 -0
  343. package/dist/core/src/render/passes/morph-target.js +35 -0
  344. package/dist/core/src/render/passes/opaque.js +966 -0
  345. package/dist/core/src/render/passes/point-light-shadow.js +221 -0
  346. package/dist/core/src/render/passes/procedural-texture.js +142 -0
  347. package/dist/core/src/render/passes/reflection-probe.js +100 -0
  348. package/dist/core/src/render/passes/rsm-pass.js +228 -0
  349. package/dist/core/src/render/passes/sdf-text.js +114 -0
  350. package/dist/core/src/render/passes/shadow-map.js +121 -0
  351. package/dist/core/src/render/passes/shadow.js +191 -0
  352. package/dist/core/src/render/passes/skinning-vs.js +102 -0
  353. package/dist/core/src/render/passes/skinning.js +282 -0
  354. package/dist/core/src/render/passes/sky-dome.js +380 -0
  355. package/dist/core/src/render/passes/skybox.js +146 -0
  356. package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
  357. package/dist/core/src/render/passes/terrain.js +303 -0
  358. package/dist/core/src/render/passes/transparent.js +323 -0
  359. package/dist/core/src/render/passes/underwater-fog.js +173 -0
  360. package/dist/core/src/render/passes/video-texture.js +58 -0
  361. package/dist/core/src/render/passes/volumetric-pass.js +278 -0
  362. package/dist/core/src/render/passes/volumetric-types.js +96 -0
  363. package/dist/core/src/render/passes/water.js +697 -0
  364. package/dist/core/src/render/pbr.js +257 -0
  365. package/dist/core/src/render/pipeline.js +49 -0
  366. package/dist/core/src/render/render-pass.js +13 -0
  367. package/dist/core/src/render/renderer-input-bus.js +176 -0
  368. package/dist/core/src/render/renderer-module-host.js +539 -0
  369. package/dist/core/src/render/resource-tracker.js +59 -0
  370. package/dist/core/src/render/sab-canvas-overlay.js +83 -0
  371. package/dist/core/src/render/shader-validator.js +172 -0
  372. package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
  373. package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
  374. package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
  375. package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
  376. package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
  377. package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
  378. package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
  379. package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
  380. package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
  381. package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
  382. package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
  383. package/dist/core/src/render/skybox.js +123 -0
  384. package/dist/core/src/render/splitscreen.js +60 -0
  385. package/dist/core/src/render/surface.js +63 -0
  386. package/dist/core/src/render/tonemap.js +171 -0
  387. package/dist/core/src/render/tracked-render-pass.js +115 -0
  388. package/dist/core/src/render/viewport.js +81 -0
  389. package/dist/core/src/render/wgsl-hmr.js +66 -0
  390. package/dist/core/src/sab/core-input-channel.js +22 -0
  391. package/dist/core/src/sab/define.js +127 -0
  392. package/dist/core/src/sab/errors.js +60 -0
  393. package/dist/core/src/sab/game-input.js +299 -0
  394. package/dist/core/src/sab/gamepad-devices.js +205 -0
  395. package/dist/core/src/sab/grid-buffer.js +91 -0
  396. package/dist/core/src/sab/input.js +38 -0
  397. package/dist/core/src/sab/layout.js +160 -0
  398. package/dist/core/src/sab/multi-input-channel.js +39 -0
  399. package/dist/core/src/sab/record-buffer.js +130 -0
  400. package/dist/core/src/sab/sab-polyfill.js +47 -0
  401. package/dist/core/src/sab/sim-channel.js +397 -0
  402. package/dist/core/src/sab/slot-buffer.js +140 -0
  403. package/dist/core/src/sab/types.js +1 -0
  404. package/dist/core/src/safety/bounds.js +71 -0
  405. package/dist/core/src/safety/json.js +70 -0
  406. package/dist/core/src/safety/path.js +151 -0
  407. package/dist/core/src/save/binary-format.js +95 -0
  408. package/dist/core/src/save/game-save-system.js +101 -0
  409. package/dist/core/src/save/grid-save-system.js +102 -0
  410. package/dist/core/src/save/migrate.js +35 -0
  411. package/dist/core/src/save/migration-registry.js +66 -0
  412. package/dist/core/src/save/persist-types.js +4 -0
  413. package/dist/core/src/save/schema.js +36 -0
  414. package/dist/core/src/save/serializer.js +139 -0
  415. package/dist/core/src/scene/builder.js +31 -0
  416. package/dist/core/src/scene/camera.js +118 -0
  417. package/dist/core/src/scene/checkpoint.js +84 -0
  418. package/dist/core/src/scene/game-loop.js +155 -0
  419. package/dist/core/src/scene/index.js +14 -0
  420. package/dist/core/src/scene/layer.js +7 -0
  421. package/dist/core/src/scene/prefab.js +97 -0
  422. package/dist/core/src/scene/scene-manager.js +141 -0
  423. package/dist/core/src/scene/scene.js +147 -0
  424. package/dist/core/src/scene/sky.js +179 -0
  425. package/dist/core/src/scene/spatial-grid.js +140 -0
  426. package/dist/core/src/scene/streaming.js +247 -0
  427. package/dist/core/src/scene/vegetation.js +107 -0
  428. package/dist/core/src/scene/world.js +66 -0
  429. package/dist/core/src/scripting/binding.js +85 -0
  430. package/dist/core/src/scripting/hot-reload.js +123 -0
  431. package/dist/core/src/scripting/script.js +68 -0
  432. package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
  433. package/dist/core/src/sim/sim-state-helper.js +40 -0
  434. package/dist/core/src/sim/transient-state-registry.js +63 -0
  435. package/dist/core/src/sim/types.js +4 -0
  436. package/dist/core/src/sim/worker-loop.js +168 -0
  437. package/dist/core/src/stores/game-store.js +81 -0
  438. package/dist/core/src/stores/hot-reload-store.js +19 -0
  439. package/dist/core/src/telemetry/collector.js +303 -0
  440. package/dist/core/src/telemetry/gc-controller.js +365 -0
  441. package/dist/core/src/telemetry/gc-profiler.js +82 -0
  442. package/dist/core/src/telemetry/gc-tracker.js +63 -0
  443. package/dist/core/src/telemetry/gpu-profiler.js +554 -0
  444. package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
  445. package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
  446. package/dist/core/src/telemetry/gpu-timer.js +117 -0
  447. package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
  448. package/dist/core/src/telemetry/reporter.js +56 -0
  449. package/dist/core/src/types/engine-types.js +21 -0
  450. package/dist/core/src/ui-font-scale.js +111 -0
  451. package/dist/core/src/util/broad-phase-grid.js +77 -0
  452. package/dist/core/src/util/feature-log.js +176 -0
  453. package/dist/core/src/util/index.js +4 -0
  454. package/dist/core/src/util/logger.js +596 -0
  455. package/dist/core/src/version.js +11 -0
  456. package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
  457. package/dist/core/src/worker/base-worker-host.js +212 -0
  458. package/dist/core/src/worker/buffer-sync.js +454 -0
  459. package/dist/core/src/worker/crash-recovery.js +153 -0
  460. package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
  461. package/dist/core/src/worker/instrumented-worker-host.js +139 -0
  462. package/dist/core/src/worker/rpc.js +244 -0
  463. package/dist/core/src/worker/sim-worker-base.js +558 -0
  464. package/dist/core/src/worker/sim-worker-host.js +271 -0
  465. package/dist/core/src/worker/task-pool.js +205 -0
  466. package/dist/core/src/worker/task-worker.js +77 -0
  467. package/dist/libraries/asset-browser/src/index.js +10 -0
  468. package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
  469. package/dist/libraries/audio-kira/src/backend.js +405 -0
  470. package/dist/libraries/audio-kira/src/index.js +4 -0
  471. package/dist/libraries/audio-kira/src/library.js +54 -0
  472. package/dist/libraries/blitz-ui/src/index.js +13 -0
  473. package/dist/libraries/blitz-ui/src/native-module.js +162 -0
  474. package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
  475. package/dist/libraries/blitz-ui/src/router.js +82 -0
  476. package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
  477. package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
  478. package/dist/libraries/character/src/character-animator.js +323 -0
  479. package/dist/libraries/character/src/customization.js +464 -0
  480. package/dist/libraries/character/src/index.js +19 -0
  481. package/dist/libraries/character/src/inspectable.js +77 -0
  482. package/dist/libraries/character/src/loader.js +336 -0
  483. package/dist/libraries/character/src/locomotion.js +84 -0
  484. package/dist/libraries/character/src/preview.js +280 -0
  485. package/dist/libraries/devtools/src/backend.js +449 -0
  486. package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
  487. package/dist/libraries/devtools/src/collectors.js +318 -0
  488. package/dist/libraries/devtools/src/index.js +31 -0
  489. package/dist/libraries/devtools/src/native-providers.js +749 -0
  490. package/dist/libraries/devtools/src/snapshot.js +35 -0
  491. package/dist/libraries/devtools/src/verify.js +139 -0
  492. package/dist/libraries/devtools/src/web/browser.js +94 -0
  493. package/dist/libraries/devtools/src/web/host.js +183 -0
  494. package/dist/libraries/devtools/src/web/mirror.js +26 -0
  495. package/dist/libraries/devtools/src/web/server.js +187 -0
  496. package/dist/libraries/entities/src/index.js +3 -0
  497. package/dist/libraries/entities/src/library.js +46 -0
  498. package/dist/libraries/entities/src/model-renderer.js +1307 -0
  499. package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
  500. package/dist/libraries/gamepad/src/feed-input.js +54 -0
  501. package/dist/libraries/gamepad/src/filters.js +44 -0
  502. package/dist/libraries/gamepad/src/glyphs.js +83 -0
  503. package/dist/libraries/gamepad/src/hub.js +164 -0
  504. package/dist/libraries/gamepad/src/index.js +10 -0
  505. package/dist/libraries/gamepad/src/library.js +56 -0
  506. package/dist/libraries/gamepad/src/source-sab.js +62 -0
  507. package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
  508. package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
  509. package/dist/libraries/gaussian-splats/src/index.js +8 -0
  510. package/dist/libraries/gaussian-splats/src/library.js +44 -0
  511. package/dist/libraries/gaussian-splats/src/parser.js +297 -0
  512. package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
  513. package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
  514. package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
  515. package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
  516. package/dist/libraries/gpu-kernels/src/index.js +8 -0
  517. package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
  518. package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
  519. package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
  520. package/dist/libraries/html-ui-kit/src/components.js +219 -0
  521. package/dist/libraries/html-ui-kit/src/index.js +17 -0
  522. package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
  523. package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
  524. package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
  525. package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
  526. package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
  527. package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
  528. package/dist/libraries/html-ui-kit/src/theme.js +235 -0
  529. package/dist/libraries/inspectable/src/index.js +6 -0
  530. package/dist/libraries/inspectable/src/inspectable.js +205 -0
  531. package/dist/libraries/lighting/src/index.js +4 -0
  532. package/dist/libraries/lighting/src/library.js +48 -0
  533. package/dist/libraries/lighting/src/light-system.js +395 -0
  534. package/dist/libraries/lighting/src/lighting-system.js +57 -0
  535. package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
  536. package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
  537. package/dist/libraries/marching-cubes/src/deformation.js +41 -0
  538. package/dist/libraries/marching-cubes/src/generator.js +356 -0
  539. package/dist/libraries/marching-cubes/src/index.js +13 -0
  540. package/dist/libraries/marching-cubes/src/library.js +54 -0
  541. package/dist/libraries/marching-cubes/src/lod.js +95 -0
  542. package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
  543. package/dist/libraries/marching-cubes/src/sab.js +40 -0
  544. package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
  545. package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
  546. package/dist/libraries/marching-cubes/src/tables.js +314 -0
  547. package/dist/libraries/marching-cubes/src/types.js +1 -0
  548. package/dist/libraries/models/src/bake-node-transforms.js +146 -0
  549. package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
  550. package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
  551. package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
  552. package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
  553. package/dist/libraries/models/src/codecs/index.js +5 -0
  554. package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
  555. package/dist/libraries/models/src/codecs/registry.js +111 -0
  556. package/dist/libraries/models/src/dae.js +665 -0
  557. package/dist/libraries/models/src/default-part-selection.js +58 -0
  558. package/dist/libraries/models/src/dxf.js +235 -0
  559. package/dist/libraries/models/src/fbx/index.js +438 -0
  560. package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
  561. package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
  562. package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
  563. package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
  564. package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
  565. package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
  566. package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
  567. package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
  568. package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
  569. package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
  570. package/dist/libraries/models/src/fbx/types.js +88 -0
  571. package/dist/libraries/models/src/gltf-extensions.js +121 -0
  572. package/dist/libraries/models/src/gltf.js +724 -0
  573. package/dist/libraries/models/src/index.js +46 -0
  574. package/dist/libraries/models/src/library.js +44 -0
  575. package/dist/libraries/models/src/loader.js +218 -0
  576. package/dist/libraries/models/src/material-adapter.js +82 -0
  577. package/dist/libraries/models/src/mini-xml.js +145 -0
  578. package/dist/libraries/models/src/normalize.js +168 -0
  579. package/dist/libraries/models/src/obj.js +247 -0
  580. package/dist/libraries/models/src/off.js +94 -0
  581. package/dist/libraries/models/src/ply.js +329 -0
  582. package/dist/libraries/models/src/pose-sampler.js +183 -0
  583. package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
  584. package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
  585. package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
  586. package/dist/libraries/models/src/sidecar/resolver.js +112 -0
  587. package/dist/libraries/models/src/sidecar/types.js +8 -0
  588. package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
  589. package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
  590. package/dist/libraries/models/src/stl.js +129 -0
  591. package/dist/libraries/models/src/threeds.js +312 -0
  592. package/dist/libraries/models/src/threemf.js +203 -0
  593. package/dist/libraries/models/src/types.js +33 -0
  594. package/dist/libraries/models/src/vtk.js +242 -0
  595. package/dist/libraries/navmesh/src/crowd-system.js +207 -0
  596. package/dist/libraries/navmesh/src/debug-viz.js +52 -0
  597. package/dist/libraries/navmesh/src/index.js +7 -0
  598. package/dist/libraries/navmesh/src/library.js +47 -0
  599. package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
  600. package/dist/libraries/navmesh/src/navmesh.js +141 -0
  601. package/dist/libraries/navmesh/src/pathfinder.js +221 -0
  602. package/dist/libraries/navmesh/src/types.js +1 -0
  603. package/dist/libraries/networking/src/authority.js +107 -0
  604. package/dist/libraries/networking/src/connection.js +107 -0
  605. package/dist/libraries/networking/src/discovery.js +314 -0
  606. package/dist/libraries/networking/src/enhanced-replication.js +282 -0
  607. package/dist/libraries/networking/src/epic-adapter.js +101 -0
  608. package/dist/libraries/networking/src/index.js +16 -0
  609. package/dist/libraries/networking/src/library.js +45 -0
  610. package/dist/libraries/networking/src/lobby.js +84 -0
  611. package/dist/libraries/networking/src/platform-adapter.js +92 -0
  612. package/dist/libraries/networking/src/rcs-adapter.js +100 -0
  613. package/dist/libraries/networking/src/remote-input.js +162 -0
  614. package/dist/libraries/networking/src/replication.js +273 -0
  615. package/dist/libraries/networking/src/rpc.js +172 -0
  616. package/dist/libraries/networking/src/session.js +129 -0
  617. package/dist/libraries/networking/src/transport.js +156 -0
  618. package/dist/libraries/networking/src/webrtc.js +266 -0
  619. package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
  620. package/dist/libraries/pathfinding-2d/src/index.js +9 -0
  621. package/dist/libraries/persistence/src/autosave-manager.js +94 -0
  622. package/dist/libraries/persistence/src/binary-record-store.js +205 -0
  623. package/dist/libraries/persistence/src/browser.js +16 -0
  624. package/dist/libraries/persistence/src/file-save-store.js +507 -0
  625. package/dist/libraries/persistence/src/hash-utils.js +54 -0
  626. package/dist/libraries/persistence/src/index.js +17 -0
  627. package/dist/libraries/persistence/src/library.js +51 -0
  628. package/dist/libraries/persistence/src/mock-opfs.js +114 -0
  629. package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
  630. package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
  631. package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
  632. package/dist/libraries/persistence/src/save-worker.js +76 -0
  633. package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
  634. package/dist/libraries/physics-native/src/backend.js +960 -0
  635. package/dist/libraries/physics-native/src/broadphase.js +79 -0
  636. package/dist/libraries/physics-native/src/index.js +6 -0
  637. package/dist/libraries/physics-native/src/library.js +57 -0
  638. package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
  639. package/dist/libraries/physics-native/src/narrowphase.js +60 -0
  640. package/dist/libraries/physics-native/src/solver.js +105 -0
  641. package/dist/libraries/physics-native/src/types.js +4 -0
  642. package/dist/libraries/physics-rapier/src/api.js +352 -0
  643. package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
  644. package/dist/libraries/physics-rapier/src/backend.js +1066 -0
  645. package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
  646. package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
  647. package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
  648. package/dist/libraries/physics-rapier/src/index.js +9 -0
  649. package/dist/libraries/physics-rapier/src/library.js +71 -0
  650. package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
  651. package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
  652. package/dist/libraries/postfx/src/index.js +14 -0
  653. package/dist/libraries/postfx/src/library.js +207 -0
  654. package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
  655. package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
  656. package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
  657. package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
  658. package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
  659. package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
  660. package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
  661. package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
  662. package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
  663. package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
  664. package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
  665. package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
  666. package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
  667. package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
  668. package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
  669. package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
  670. package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
  671. package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
  672. package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
  673. package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
  674. package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
  675. package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
  676. package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
  677. package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
  678. package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
  679. package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
  680. package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
  681. package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
  682. package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
  683. package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
  684. package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
  685. package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
  686. package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
  687. package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
  688. package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
  689. package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
  690. package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
  691. package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
  692. package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
  693. package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
  694. package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
  695. package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
  696. package/dist/libraries/recast/src/backend.js +124 -0
  697. package/dist/libraries/recast/src/crowd-system.js +310 -0
  698. package/dist/libraries/recast/src/index.js +4 -0
  699. package/dist/libraries/recast/src/library.js +59 -0
  700. package/dist/libraries/recast/src/types.js +4 -0
  701. package/dist/libraries/sand/src/cell.js +32 -0
  702. package/dist/libraries/sand/src/fields.js +27 -0
  703. package/dist/libraries/sand/src/fluid-grid.js +267 -0
  704. package/dist/libraries/sand/src/grid-dims.js +47 -0
  705. package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
  706. package/dist/libraries/sand/src/index.js +20 -0
  707. package/dist/libraries/sand/src/library.js +67 -0
  708. package/dist/libraries/sand/src/materials.js +437 -0
  709. package/dist/libraries/sand/src/palette.js +87 -0
  710. package/dist/libraries/sand/src/particles.js +163 -0
  711. package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
  712. package/dist/libraries/sand/src/rng.js +44 -0
  713. package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
  714. package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
  715. package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
  716. package/dist/libraries/sand/src/rules/rule-types.js +27 -0
  717. package/dist/libraries/sand/src/sand-step-pool.js +458 -0
  718. package/dist/libraries/sand/src/sand-step-worker.js +101 -0
  719. package/dist/libraries/sand/src/sand-world.js +3382 -0
  720. package/dist/libraries/stickman/src/index.js +7 -0
  721. package/dist/libraries/stickman/src/library.js +44 -0
  722. package/dist/libraries/stickman/src/proportions.js +40 -0
  723. package/dist/libraries/stickman/src/shader.js +113 -0
  724. package/dist/libraries/stickman/src/skeleton.js +163 -0
  725. package/dist/libraries/stickman/src/stickman-pass.js +210 -0
  726. package/dist/libraries/stickman/src/thick-line.js +120 -0
  727. package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
  728. package/dist/libraries/surface-nets/src/deformation.js +29 -0
  729. package/dist/libraries/surface-nets/src/index.js +15 -0
  730. package/dist/libraries/surface-nets/src/library.js +41 -0
  731. package/dist/libraries/surface-nets/src/lod.js +6 -0
  732. package/dist/libraries/surface-nets/src/sab.js +4 -0
  733. package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
  734. package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
  735. package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
  736. package/dist/libraries/surface-nets/src/types.js +1 -0
  737. package/dist/libraries/water/src/buoyancy.js +80 -0
  738. package/dist/libraries/water/src/index.js +12 -0
  739. package/dist/libraries/water/src/library.js +65 -0
  740. package/dist/libraries/water/src/shore-damping.js +70 -0
  741. package/dist/libraries/water/src/water-buffer.js +78 -0
  742. package/dist/libraries/water/src/water-chunks.js +5 -0
  743. package/dist/libraries/water/src/water-physics.js +315 -0
  744. package/dist/libraries/water/src/water-renderer.js +736 -0
  745. package/dist/libraries/water/src/water-sab.js +138 -0
  746. package/dist/libraries/water/src/wave-sources.js +45 -0
  747. package/dist/libraries/weather/src/index.js +5 -0
  748. package/dist/libraries/weather/src/library.js +48 -0
  749. package/dist/libraries/weather/src/types.js +29 -0
  750. package/dist/libraries/weather/src/weather-blend.js +108 -0
  751. package/dist/libraries/weather/src/weather-system.js +275 -0
  752. package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
  753. package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
  754. package/dist/libraries/weatherfx/src/index.js +4 -0
  755. package/dist/libraries/weatherfx/src/library.js +41 -0
  756. package/dist/libraries/weatherfx/src/particle-system.js +350 -0
  757. package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
  758. package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
  759. package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
  760. package/dist/mcp/src/client.js +669 -0
  761. package/dist/mcp/src/engine-context.js +99 -0
  762. package/dist/mcp/src/http-transport.js +423 -0
  763. package/dist/mcp/src/index.js +5 -0
  764. package/dist/mcp/src/prompts/add-entity.js +39 -0
  765. package/dist/mcp/src/prompts/create-scene.js +41 -0
  766. package/dist/mcp/src/prompts/debug-frame.js +36 -0
  767. package/dist/mcp/src/prompts/index.js +10 -0
  768. package/dist/mcp/src/resources/asset-list.js +28 -0
  769. package/dist/mcp/src/resources/checkpoint-list.js +29 -0
  770. package/dist/mcp/src/resources/entity-state.js +45 -0
  771. package/dist/mcp/src/resources/gpu-info.js +90 -0
  772. package/dist/mcp/src/resources/index.js +51 -0
  773. package/dist/mcp/src/resources/performance.js +33 -0
  774. package/dist/mcp/src/resources/scene-tree.js +37 -0
  775. package/dist/mcp/src/server.js +307 -0
  776. package/dist/mcp/src/tools/animation.js +102 -0
  777. package/dist/mcp/src/tools/asset.js +146 -0
  778. package/dist/mcp/src/tools/audio.js +80 -0
  779. package/dist/mcp/src/tools/build.js +128 -0
  780. package/dist/mcp/src/tools/camera.js +157 -0
  781. package/dist/mcp/src/tools/checkpoint.js +90 -0
  782. package/dist/mcp/src/tools/component.js +176 -0
  783. package/dist/mcp/src/tools/debug.js +273 -0
  784. package/dist/mcp/src/tools/entity.js +309 -0
  785. package/dist/mcp/src/tools/inspect.js +192 -0
  786. package/dist/mcp/src/tools/lighting.js +239 -0
  787. package/dist/mcp/src/tools/material.js +225 -0
  788. package/dist/mcp/src/tools/mesh.js +210 -0
  789. package/dist/mcp/src/tools/physics.js +251 -0
  790. package/dist/mcp/src/tools/scene.js +139 -0
  791. package/dist/mcp/src/tools/script.js +114 -0
  792. package/dist/mcp/src/types.js +9 -0
  793. package/dist/mcp/src/undo-redo.js +64 -0
  794. package/dist/modules/camera-controls/src/index.js +116 -0
  795. package/dist/modules/controller-ui/src/index.js +149 -0
  796. package/dist/modules/devtools/src/api.js +317 -0
  797. package/dist/modules/devtools/src/asset-utils.js +102 -0
  798. package/dist/modules/devtools/src/bind-debug-store.js +34 -0
  799. package/dist/modules/devtools/src/blitz/host.js +391 -0
  800. package/dist/modules/devtools/src/blitz/module.js +65 -0
  801. package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
  802. package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
  803. package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
  804. package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
  805. package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
  806. package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
  807. package/dist/modules/devtools/src/blitz/theme.js +167 -0
  808. package/dist/modules/devtools/src/data-bridge.js +247 -0
  809. package/dist/modules/devtools/src/debug-overlay.js +181 -0
  810. package/dist/modules/devtools/src/debug-raycast.js +296 -0
  811. package/dist/modules/devtools/src/debug-store.js +28 -0
  812. package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
  813. package/dist/modules/devtools/src/doctor-panel.js +163 -0
  814. package/dist/modules/devtools/src/gizmo-module.js +95 -0
  815. package/dist/modules/devtools/src/graph-model.js +387 -0
  816. package/dist/modules/devtools/src/grid-renderer.js +145 -0
  817. package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
  818. package/dist/modules/devtools/src/index.js +46 -0
  819. package/dist/modules/devtools/src/init.js +204 -0
  820. package/dist/modules/devtools/src/label-overlay.js +129 -0
  821. package/dist/modules/devtools/src/material-stats-panel.js +171 -0
  822. package/dist/modules/devtools/src/profiling-bridge.js +288 -0
  823. package/dist/modules/devtools/src/profiling-hooks.js +63 -0
  824. package/dist/modules/devtools/src/renderer-adapter.js +61 -0
  825. package/dist/modules/devtools/src/scene-inspector.js +571 -0
  826. package/dist/modules/devtools/src/scene-store.js +212 -0
  827. package/dist/modules/devtools/src/scene-sync.js +92 -0
  828. package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
  829. package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
  830. package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
  831. package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
  832. package/dist/modules/devtools/src/transform-gizmo.js +677 -0
  833. package/dist/modules/devtools/src/types.js +5 -0
  834. package/dist/modules/devtools/src/worker-expose.js +59 -0
  835. package/dist/modules/devtools/src/worker-sync.js +115 -0
  836. package/dist/modules/editor/src/commands/component.js +151 -0
  837. package/dist/modules/editor/src/commands/entity.js +253 -0
  838. package/dist/modules/editor/src/commands/hierarchy.js +79 -0
  839. package/dist/modules/editor/src/commands/index.js +57 -0
  840. package/dist/modules/editor/src/commands/prefab.js +149 -0
  841. package/dist/modules/editor/src/commands/registry.js +246 -0
  842. package/dist/modules/editor/src/commands/scene-io.js +206 -0
  843. package/dist/modules/editor/src/commands/selection.js +71 -0
  844. package/dist/modules/editor/src/commands/transform.js +88 -0
  845. package/dist/modules/editor/src/ddscene.js +189 -0
  846. package/dist/modules/editor/src/document.js +96 -0
  847. package/dist/modules/editor/src/editor-context.js +115 -0
  848. package/dist/modules/editor/src/index.js +11 -0
  849. package/dist/modules/editor/src/mcp.js +91 -0
  850. package/dist/modules/editor/src/module.js +115 -0
  851. package/dist/modules/editor/src/selection.js +60 -0
  852. package/dist/modules/editor/src/shell.js +397 -0
  853. package/dist/modules/editor/src/viewport.js +186 -0
  854. package/dist/modules/html-ui/src/composite.js +116 -0
  855. package/dist/modules/html-ui/src/create-html-ui.js +137 -0
  856. package/dist/modules/html-ui/src/doc-backend.js +518 -0
  857. package/dist/modules/html-ui/src/host.js +819 -0
  858. package/dist/modules/html-ui/src/index.js +5 -0
  859. package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
  860. package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
  861. package/dist/modules/html-ui/src/protocol.js +6 -0
  862. package/dist/modules/html-ui/src/ui-worker.js +10 -0
  863. package/dist/modules/mcp/src/index.js +62 -0
  864. package/dist/modules/movement-2d/src/grid-character.js +345 -0
  865. package/dist/modules/movement-2d/src/index.js +27 -0
  866. package/dist/modules/movement-3d/src/character-motor.js +166 -0
  867. package/dist/modules/movement-3d/src/index.js +27 -0
  868. package/dist/modules/native-osr/src/index.js +12 -0
  869. package/dist/modules/native-osr/src/input-router.js +335 -0
  870. package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
  871. package/dist/modules/native-osr/src/native-texture-source.js +66 -0
  872. package/dist/modules/native-osr/src/types.js +8 -0
  873. package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
  874. package/dist/modules/sailing/src/index.js +39 -0
  875. package/dist/modules/terrain/src/index.js +44 -0
  876. package/dist/modules/vitals/src/index.js +25 -0
  877. package/dist/modules/vitals/src/vitals.js +195 -0
  878. package/dist/modules/xr/src/camera-rig.js +119 -0
  879. package/dist/modules/xr/src/debug.js +45 -0
  880. package/dist/modules/xr/src/frame-loop.js +139 -0
  881. package/dist/modules/xr/src/index.js +10 -0
  882. package/dist/modules/xr/src/input.js +164 -0
  883. package/dist/modules/xr/src/layer.js +100 -0
  884. package/dist/modules/xr/src/session.js +133 -0
  885. package/dist/modules/xr/src/sim-module.js +21 -0
  886. package/dist/modules/xr/src/types.js +4 -0
  887. package/dist/modules/xr/src/webxr.d.ts +182 -0
  888. package/dist/modules/xr/src/xr-module.js +134 -0
  889. package/dist/shader-graph/src/chunks.js +340 -0
  890. package/dist/shader-graph/src/compiler.js +639 -0
  891. package/dist/shader-graph/src/compute-compiler.js +384 -0
  892. package/dist/shader-graph/src/compute-graph.js +55 -0
  893. package/dist/shader-graph/src/compute-profiles.js +39 -0
  894. package/dist/shader-graph/src/graph.js +38 -0
  895. package/dist/shader-graph/src/index.js +15 -0
  896. package/dist/shader-graph/src/profiles.js +305 -0
  897. package/dist/shader-graph/src/validator.js +42 -0
  898. package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
  899. package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
  900. package/dist/shader-graph/src/wgsl-struct.js +251 -0
  901. package/dist/test/src/index.js +1 -0
  902. package/dist/test/src/vision-test.js +228 -0
  903. package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
  904. package/libraries/audio-kira/src/backend.ts +2 -1
  905. package/libraries/blitz-ui/native/src/shell.rs +35 -1
  906. package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
  907. package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
  908. package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
  909. package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
  910. package/libraries/blitz-ui/src/router.ts +3 -1
  911. package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
  912. package/libraries/character/src/character-animator.ts +1 -1
  913. package/libraries/character/src/customization.ts +513 -0
  914. package/libraries/character/src/index.ts +6 -0
  915. package/libraries/character/src/inspectable.ts +111 -0
  916. package/libraries/character/src/loader.ts +38 -13
  917. package/libraries/character/src/locomotion.ts +13 -1
  918. package/libraries/character/src/preview.ts +94 -24
  919. package/libraries/devtools/README.md +16 -18
  920. package/libraries/devtools/src/backend.ts +505 -0
  921. package/libraries/devtools/src/cdp-bridge.ts +8 -8
  922. package/libraries/devtools/src/collectors.ts +41 -37
  923. package/libraries/devtools/src/index.ts +32 -14
  924. package/libraries/devtools/src/native-providers.ts +20 -12
  925. package/libraries/devtools/src/snapshot.ts +77 -0
  926. package/libraries/devtools/src/web/host.ts +11 -12
  927. package/libraries/devtools/src/web/mirror.ts +14 -405
  928. package/libraries/devtools/src/web/server.ts +4 -3
  929. package/libraries/entities/src/model-renderer.ts +96 -23
  930. package/libraries/gamepad/src/library.ts +2 -1
  931. package/libraries/inspectable/src/index.ts +11 -0
  932. package/libraries/inspectable/src/inspectable.ts +277 -0
  933. package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
  934. package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
  935. package/libraries/models/src/index.ts +1 -0
  936. package/libraries/models/src/types.ts +22 -0
  937. package/libraries/persistence/src/autosave-manager.ts +1 -1
  938. package/libraries/persistence/src/binary-record-store.ts +1 -1
  939. package/libraries/persistence/src/file-save-store.ts +4 -4
  940. package/libraries/persistence/src/library.ts +1 -1
  941. package/libraries/persistence/src/opfs-save-store.ts +5 -5
  942. package/libraries/persistence/src/save-worker.ts +13 -14
  943. package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
  944. package/libraries/postfx/src/post-process-stack.ts +1 -1
  945. package/libraries/sand/src/sand-step-pool.ts +5 -0
  946. package/libraries/water/src/water-renderer.ts +1 -1
  947. package/libraries/weatherfx/src/cloud-system.ts +3 -3
  948. package/mcp/README.md +20 -0
  949. package/mcp/src/client.ts +75 -22
  950. package/mcp/src/undo-redo.ts +2 -2
  951. package/modules/devtools/src/blitz/host.ts +430 -0
  952. package/modules/devtools/src/blitz/module.ts +101 -0
  953. package/modules/devtools/src/blitz/panels/console.ts +223 -0
  954. package/modules/devtools/src/blitz/panels/elements.ts +92 -0
  955. package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
  956. package/modules/devtools/src/blitz/panels/performance.ts +120 -0
  957. package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
  958. package/modules/devtools/src/blitz/panels/types.ts +120 -0
  959. package/modules/devtools/src/blitz/theme.ts +168 -0
  960. package/modules/devtools/src/data-bridge.ts +1 -1
  961. package/modules/devtools/src/index.ts +6 -0
  962. package/modules/devtools/src/profiling-bridge.ts +17 -13
  963. package/modules/devtools/src/profiling-hooks.ts +22 -13
  964. package/modules/devtools/src/scene-inspector.ts +1 -1
  965. package/modules/devtools/src/worker-sync.ts +9 -1
  966. package/modules/editor/src/commands/registry.ts +2 -2
  967. package/modules/editor/src/module.ts +1 -1
  968. package/modules/html-ui/src/composite.ts +1 -1
  969. package/modules/html-ui/src/create-html-ui.ts +21 -9
  970. package/modules/html-ui/src/doc-backend.ts +189 -10
  971. package/modules/html-ui/src/host.ts +354 -40
  972. package/modules/html-ui/src/index.ts +1 -1
  973. package/modules/html-ui/src/jsx-runtime.ts +1 -1
  974. package/modules/html-ui/src/protocol.ts +53 -6
  975. package/modules/mcp/README.md +6 -0
  976. package/modules/mcp/src/index.ts +70 -3
  977. package/modules/movement-3d/src/character-motor.ts +83 -10
  978. package/package.json +838 -165
  979. package/shader-graph/README.md +25 -0
  980. package/test/README.md +16 -0
  981. package/libraries/blitz-ui/native-osr-spike.ts +0 -70
  982. package/libraries/devtools/native/Cargo.toml +0 -12
  983. package/libraries/devtools/native/src/lib.rs +0 -1646
  984. package/libraries/devtools/native/src/panels/console.rs +0 -338
  985. package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
  986. package/libraries/devtools/native/src/panels/generic.rs +0 -317
  987. package/libraries/devtools/native/src/panels/gpu.rs +0 -107
  988. package/libraries/devtools/native/src/panels/input.rs +0 -88
  989. package/libraries/devtools/native/src/panels/mod.rs +0 -154
  990. package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
  991. package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
  992. package/libraries/devtools/native/src/panels/scene.rs +0 -72
  993. package/libraries/devtools/native/src/state.rs +0 -394
  994. package/libraries/devtools/src/egui-ffi.ts +0 -804
  995. package/libraries/devtools/src/egui-renderer.ts +0 -407
  996. package/libraries/devtools/src/host.ts +0 -363
  997. package/libraries/devtools/src/mirror.ts +0 -794
  998. package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
  999. package/libraries/models/test-fixtures/fbx/README.md +0 -46
  1000. package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
  1001. package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
  1002. package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
  1003. package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
  1004. package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
  1005. package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
  1006. package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
  1007. package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
  1008. package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
  1009. package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
  1010. package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
  1011. package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
  1012. package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
  1013. package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
  1014. package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
  1015. package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
  1016. package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
  1017. package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
  1018. package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
  1019. package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
  1020. package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
  1021. package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
@@ -0,0 +1,458 @@
1
+ // ============================================================================
2
+ // Sand step pool — multi-threaded coordinator for SandWorld.step().
3
+ //
4
+ // Runs inside the mining worker. Spawns N sand-step workers, each processing
5
+ // a vertical strip of the grid. The grid + fields + deferred mask are backed
6
+ // by a single SharedArrayBuffer shared across all workers.
7
+ //
8
+ // Per step:
9
+ // 1. Dispatch step messages to all workers (postMessage, fire-and-forget).
10
+ // 2. Wait for all workers to report done (Promise.all of message events).
11
+ // 3. Boundary cleanup: re-run the movement pass on boundary columns, but
12
+ // ONLY for cells whose cross-strip move was deferred by the write guard
13
+ // (marked in the shared deferredMask). Write bounds are restricted to
14
+ // the adjacent strip so only cross-strip moves are attempted, and RNG
15
+ // gates are skipped (boundaryPass mode) to avoid giving boundary cells
16
+ // an unfair second movement chance.
17
+ //
18
+ // The boundary cleanup runs on the coordinator's own SandWorld instance
19
+ // but only iterates the boundary columns and only the deferred cells within
20
+ // them. This is O(boundaryColumns * H) — typically 2*(N-1) columns —
21
+ // much cheaper than the full O(W*H) step.
22
+ // ============================================================================
23
+ import { MAT_GRAVITY, MAT_GRAVITY_DIR, SandWorld } from "./sand-world.js";
24
+ export class SandStepPool {
25
+ workers = [];
26
+ W;
27
+ H;
28
+ numWorkers;
29
+ sab;
30
+ gridOffset;
31
+ fieldsOffset;
32
+ skipMaskOffset;
33
+ deferredMaskOffset;
34
+ histogramOffset;
35
+ strips = [];
36
+ // The coordinator's own SandWorld for boundary cleanup. It shares the same
37
+ // SAB-backed grid as the workers but has full-grid write bounds.
38
+ boundaryWorld;
39
+ workerUrl;
40
+ initialized = false;
41
+ // In-flight init() promise — deduplicates concurrent init() calls so that
42
+ // two callers (e.g. loadGrid + onTick racing) share one initialization
43
+ // instead of each spawning a full set of workers. Without this, concurrent
44
+ // init() calls each push numWorkers workers into `this.workers`, leaving
45
+ // workers.length > strips.length and crashing step() on `strip.startX`.
46
+ initPromise = null;
47
+ gravityOverrides;
48
+ // Rebalance throttle: only rebalance every N steps to avoid overhead.
49
+ stepCount = 0;
50
+ REBALANCE_INTERVAL = 8;
51
+ constructor(opts) {
52
+ this.W = opts.W;
53
+ this.H = opts.H;
54
+ this.numWorkers = Math.max(1, opts.numWorkers);
55
+ const cells = opts.W * opts.H;
56
+ const gridBytes = cells * 4;
57
+ const fieldsBytes = cells * 4;
58
+ const skipMaskBytes = cells; // 1 byte per cell
59
+ const deferredMaskBytes = cells; // 1 byte per cell
60
+ const histogramBytes = opts.W * 4; // 1 uint32 per column
61
+ // The histogram is a Uint32Array view — its byte offset must stay
62
+ // 4-aligned even when `cells` is odd (skip/deferred are 1B per cell).
63
+ const align4 = (n) => (n + 3) & ~3;
64
+ if (opts.sab) {
65
+ this.sab = opts.sab;
66
+ this.gridOffset = opts.gridOffset ?? 0;
67
+ this.fieldsOffset = opts.fieldsOffset ?? gridBytes;
68
+ this.skipMaskOffset = opts.skipMaskOffset ?? (gridBytes + fieldsBytes);
69
+ this.deferredMaskOffset = opts.deferredMaskOffset ?? (gridBytes + fieldsBytes + skipMaskBytes);
70
+ this.histogramOffset = opts.histogramOffset ?? align4(gridBytes + fieldsBytes + skipMaskBytes + deferredMaskBytes);
71
+ }
72
+ else {
73
+ // Allocate a SAB for grid + fields + skip mask + deferred mask + histogram.
74
+ this.gridOffset = 0;
75
+ this.fieldsOffset = gridBytes;
76
+ this.skipMaskOffset = gridBytes + fieldsBytes;
77
+ this.deferredMaskOffset = gridBytes + fieldsBytes + skipMaskBytes;
78
+ this.histogramOffset = align4(gridBytes + fieldsBytes + skipMaskBytes + deferredMaskBytes);
79
+ this.sab = new SharedArrayBuffer(this.histogramOffset + histogramBytes);
80
+ }
81
+ // Compute strip boundaries — divide W into numWorkers roughly-equal strips.
82
+ this.strips = this.computeStrips(opts.W, this.numWorkers);
83
+ // Coordinator's boundary cleanup world — full grid bounds, SAB-backed.
84
+ this.boundaryWorld = new SandWorld(opts.W, opts.H, {
85
+ sab: this.sab,
86
+ gridOffset: this.gridOffset,
87
+ fieldsOffset: this.fieldsOffset,
88
+ skipMaskOffset: this.skipMaskOffset,
89
+ deferredMaskOffset: this.deferredMaskOffset,
90
+ histogramOffset: this.histogramOffset,
91
+ skipStoneFloor: true,
92
+ });
93
+ if (opts.preserveFlagsMask !== undefined)
94
+ this.boundaryWorld.preserveFlagsMask = opts.preserveFlagsMask;
95
+ if (opts.disturbedFlags !== undefined)
96
+ this.boundaryWorld.disturbedFlags = opts.disturbedFlags;
97
+ // Apply gravity overrides to the coordinator's boundary world too.
98
+ if (opts.gravityOverrides) {
99
+ this.gravityOverrides = opts.gravityOverrides;
100
+ opts.gravityOverrides.forEach((o) => {
101
+ MAT_GRAVITY_DIR[o.mat] = o.gravityDir;
102
+ if (o.gravity !== 0)
103
+ MAT_GRAVITY[o.mat] = o.gravity;
104
+ });
105
+ }
106
+ // Custom worker URL — when provided, workers are created from this URL.
107
+ // When not provided, init() uses the inline `new Worker(new URL(...))`
108
+ // pattern so Vite can bundle the nested worker for production builds.
109
+ this.workerUrl = opts.workerUrl ?? null;
110
+ }
111
+ computeStrips(W, n) {
112
+ const strips = [];
113
+ const base = Math.floor(W / n);
114
+ const rem = W % n;
115
+ let x = 0;
116
+ for (let i = 0; i < n; i++) {
117
+ const w = base + (i < rem ? 1 : 0);
118
+ strips.push({ startX: x, endX: x + w });
119
+ x += w;
120
+ }
121
+ return strips;
122
+ }
123
+ /**
124
+ * Compute balanced strip boundaries from the per-column active cell
125
+ * histogram. Uses a prefix-sum to find N boundaries that split the total
126
+ * active cell count as evenly as possible. This equalizes per-worker load
127
+ * regardless of where particles cluster in the X dimension.
128
+ *
129
+ * Each strip gets at least 1 column (guards against degenerate cases where
130
+ * most columns are empty).
131
+ */
132
+ computeBalancedStrips(histogram, n) {
133
+ const W = histogram.length;
134
+ // Prefix sum of active cells per column.
135
+ const prefix = new Float64Array(W + 1);
136
+ let total = 0;
137
+ for (let x = 0; x < W; x++) {
138
+ total += histogram[x];
139
+ prefix[x + 1] = total;
140
+ }
141
+ // If the grid is (nearly) empty, fall back to equal-width strips.
142
+ if (total < n)
143
+ return this.computeStrips(W, n);
144
+ const strips = [];
145
+ const targetPerStrip = total / n;
146
+ let x = 0;
147
+ for (let i = 0; i < n; i++) {
148
+ const target = (i + 1) * targetPerStrip;
149
+ // Find the column x where prefix[x+1] first reaches the target.
150
+ // Binary search for efficiency (W can be 640+).
151
+ let lo = x, hi = W;
152
+ while (lo < hi) {
153
+ const mid = (lo + hi) >> 1;
154
+ if (prefix[mid + 1] < target)
155
+ lo = mid + 1;
156
+ else
157
+ hi = mid;
158
+ }
159
+ let endX = lo;
160
+ // Ensure at least 1 column per strip.
161
+ if (endX <= x)
162
+ endX = x + 1;
163
+ // Ensure the last strip reaches W.
164
+ if (i === n - 1)
165
+ endX = W;
166
+ // Don't exceed W.
167
+ if (endX > W)
168
+ endX = W;
169
+ strips.push({ startX: x, endX });
170
+ x = endX;
171
+ }
172
+ return strips;
173
+ }
174
+ /** Initialize all workers. Must be called before step(). */
175
+ async init() {
176
+ if (this.initialized)
177
+ return;
178
+ // Deduplicate concurrent init() calls. If two callers race into init()
179
+ // (e.g. loadGrid's pool recreation overlapping with onTick's
180
+ // `if (!this.initialized) await this.init()`), they share the same
181
+ // initialization promise instead of each spawning numWorkers workers.
182
+ if (this.initPromise)
183
+ return this.initPromise;
184
+ this.initPromise = this.runInit();
185
+ try {
186
+ await this.initPromise;
187
+ }
188
+ finally {
189
+ this.initPromise = null;
190
+ }
191
+ }
192
+ async runInit() {
193
+ const initPromises = [];
194
+ for (let i = 0; i < this.numWorkers; i++) {
195
+ // Use inline `new Worker(new URL(...))` when no custom URL is provided
196
+ // so Vite can detect and bundle the nested worker for production builds.
197
+ // Assigning the URL to a variable first breaks Vite's worker bundling.
198
+ const worker = this.workerUrl
199
+ ? new Worker(this.workerUrl, { type: "module" })
200
+ : new Worker(new URL("./sand-step-worker.js", import.meta.url), { type: "module" });
201
+ // Nested workers are process-scoped, not parent-scoped — a sim worker
202
+ // force-terminated before pool.shutdown() would orphan these and pin
203
+ // process exit. unref keeps a leaked pool worker from holding the
204
+ // runtime open.
205
+ worker.unref?.();
206
+ this.workers.push(worker);
207
+ const strip = this.strips[i];
208
+ initPromises.push(new Promise((resolve, reject) => {
209
+ const onWorkerError = (e) => {
210
+ reject(new Error(`sand-step-worker ${i} error: ${e.message ?? "undefined"} file=${e.filename ?? "none"}`));
211
+ };
212
+ worker.addEventListener("error", onWorkerError);
213
+ const handler = (e) => {
214
+ if (e.data.type === "ready") {
215
+ worker.removeEventListener("message", handler);
216
+ worker.removeEventListener("error", onWorkerError);
217
+ resolve();
218
+ }
219
+ };
220
+ worker.addEventListener("message", handler);
221
+ worker.postMessage({
222
+ type: "init",
223
+ sab: this.sab,
224
+ gridOffset: this.gridOffset,
225
+ fieldsOffset: this.fieldsOffset,
226
+ skipMaskOffset: this.skipMaskOffset,
227
+ deferredMaskOffset: this.deferredMaskOffset,
228
+ histogramOffset: this.histogramOffset,
229
+ W: this.W,
230
+ H: this.H,
231
+ stripStartX: strip.startX,
232
+ stripEndX: strip.endX,
233
+ preserveFlagsMask: this.boundaryWorld.preserveFlagsMask,
234
+ disturbedFlags: this.boundaryWorld.disturbedFlags,
235
+ gravityOverrides: this.gravityOverrides,
236
+ });
237
+ }));
238
+ }
239
+ await Promise.all(initPromises);
240
+ this.initialized = true;
241
+ }
242
+ /** Get the SAB-backed skip mask (coordinator writes to it, workers read). */
243
+ getSkipMask() {
244
+ return this.boundaryWorld.skipMask;
245
+ }
246
+ /** Copy an external skip mask into the SAB-backed skip mask. */
247
+ setSkipMask(mask) {
248
+ const sabMask = this.boundaryWorld.skipMask;
249
+ if (sabMask) {
250
+ sabMask.set(mask.subarray(0, this.W * this.H));
251
+ }
252
+ }
253
+ /** Sync config to all workers. Called when interlace/impulse settings change. */
254
+ lastConfig = {
255
+ interlaceEnabled: false,
256
+ interlaceScale: 1,
257
+ horizontalImpulseChance: 0.02,
258
+ horizontalImpulseStrength: 1,
259
+ };
260
+ updateConfig(config) {
261
+ if (config.interlaceEnabled !== undefined)
262
+ this.lastConfig.interlaceEnabled = config.interlaceEnabled;
263
+ if (config.interlaceScale !== undefined)
264
+ this.lastConfig.interlaceScale = config.interlaceScale;
265
+ if (config.horizontalImpulseChance !== undefined)
266
+ this.lastConfig.horizontalImpulseChance = config.horizontalImpulseChance;
267
+ if (config.horizontalImpulseStrength !== undefined)
268
+ this.lastConfig.horizontalImpulseStrength = config.horizontalImpulseStrength;
269
+ // Also update the boundary world
270
+ this.boundaryWorld.interlaceEnabled = this.lastConfig.interlaceEnabled;
271
+ this.boundaryWorld.interlaceScale = this.lastConfig.interlaceScale;
272
+ this.boundaryWorld.horizontalImpulseChance = this.lastConfig.horizontalImpulseChance;
273
+ this.boundaryWorld.horizontalImpulseStrength = this.lastConfig.horizontalImpulseStrength;
274
+ }
275
+ /**
276
+ * Run one sand step across all workers + boundary cleanup.
277
+ * Returns a promise that resolves when all workers + cleanup are done.
278
+ */
279
+ async step(frame) {
280
+ if (!this.initialized)
281
+ await this.init();
282
+ // Dispatch step to all workers. The skip mask + histogram are in the SAB —
283
+ // workers read/write them directly, no need to post.
284
+ const stepPromises = [];
285
+ for (let i = 0; i < this.workers.length; i++) {
286
+ const worker = this.workers[i];
287
+ const strip = this.strips[i];
288
+ stepPromises.push(new Promise((resolve) => {
289
+ const handler = (e) => {
290
+ if (e.data.type === "done") {
291
+ worker.removeEventListener("message", handler);
292
+ resolve();
293
+ }
294
+ };
295
+ worker.addEventListener("message", handler);
296
+ worker.postMessage({
297
+ type: "step",
298
+ frame,
299
+ stripStartX: strip.startX,
300
+ stripEndX: strip.endX,
301
+ interlaceEnabled: this.lastConfig.interlaceEnabled,
302
+ interlaceScale: this.lastConfig.interlaceScale,
303
+ horizontalImpulseChance: this.lastConfig.horizontalImpulseChance,
304
+ horizontalImpulseStrength: this.lastConfig.horizontalImpulseStrength,
305
+ });
306
+ }));
307
+ }
308
+ await Promise.all(stepPromises);
309
+ // Boundary cleanup: re-run movement on the 1-cell-wide columns at each
310
+ // strip boundary. The workers skipped cross-strip writes; this pass lets
311
+ // particles at the boundary move into the adjacent strip.
312
+ this.runBoundaryCleanup(frame);
313
+ // Periodically rebalance strip boundaries based on the per-column active
314
+ // cell histogram (written by workers during buildActiveListAndClearFlags).
315
+ // The histogram is in the SAB — no postMessage needed. New boundaries take
316
+ // effect on the next step (passed in the step message).
317
+ this.stepCount++;
318
+ if (this.stepCount % this.REBALANCE_INTERVAL === 0 && this.numWorkers > 1) {
319
+ const histogram = this.boundaryWorld.histogram;
320
+ if (histogram) {
321
+ this.strips = this.computeBalancedStrips(histogram, this.numWorkers);
322
+ }
323
+ }
324
+ }
325
+ /**
326
+ * Boundary cleanup: re-run the movement pass on boundary columns, but ONLY
327
+ * for cells whose cross-strip move was deferred by the write guard during
328
+ * the worker pass (marked in the shared deferredMask).
329
+ *
330
+ * For each interior strip boundary (between strip i and i+1), we process:
331
+ * - The last column of strip i — can now write into strip i+1.
332
+ * - The first column of strip i+1 — can now write into strip i.
333
+ *
334
+ * Key differences from the old approach (which re-ran the FULL tryMove on
335
+ * every boundary cell with full-grid write bounds):
336
+ *
337
+ * 1. Only deferred cells are processed. Cells that didn't attempt a
338
+ * cross-strip move (friction-blocked, obstacle-blocked, or already moved)
339
+ * are skipped. This prevents the cleanup from re-rolling RNG gates
340
+ * (friction, flicker, impulse, wind) and giving boundary cells an unfair
341
+ * second movement chance — the root cause of "fast falling" artifacts at
342
+ * strip boundaries.
343
+ *
344
+ * 2. Write bounds are restricted to the adjacent strip for each column, so
345
+ * only cross-strip moves are attempted. Within-strip moves (which the
346
+ * worker already handled) are blocked by the write guard.
347
+ *
348
+ * 3. The boundaryPass flag on the boundary world skips all RNG-based
349
+ * movement gates in tryMove — those already had their chance during the
350
+ * worker pass.
351
+ *
352
+ * This is a movement-only pass — reactions, combustion, and aging already
353
+ * ran in the workers. We only handle the cross-strip movement writes that
354
+ * were skipped at the boundaries.
355
+ */
356
+ runBoundaryCleanup(frame) {
357
+ if (this.numWorkers <= 1)
358
+ return; // no boundaries with a single worker
359
+ const bw = this.boundaryWorld;
360
+ bw.frame = frame;
361
+ bw.boundaryPass = true;
362
+ const grid = bw.grid;
363
+ const deferred = bw.deferredMask;
364
+ if (deferred === null) {
365
+ // No deferred mask (non-SAB mode) — nothing to do.
366
+ bw.boundaryPass = false;
367
+ return;
368
+ }
369
+ const W = this.W;
370
+ const H = this.H;
371
+ // Process each interior boundary pair separately so we can restrict
372
+ // write bounds to the adjacent strip for each column.
373
+ for (let bi = 0; bi < this.strips.length - 1; bi++) {
374
+ const leftStrip = this.strips[bi];
375
+ const rightStrip = this.strips[bi + 1];
376
+ const leftCol = leftStrip.endX - 1; // last col of left strip
377
+ const rightCol = rightStrip.startX; // first col of right strip
378
+ // Process the left boundary column — can only write into the right strip.
379
+ bw.writeXMin = rightStrip.startX;
380
+ bw.writeXMax = rightStrip.endX;
381
+ this.processBoundaryColumn(bw, grid, deferred, leftCol, W, H);
382
+ // Process the right boundary column — can only write into the left strip.
383
+ bw.writeXMin = leftStrip.startX;
384
+ bw.writeXMax = leftStrip.endX;
385
+ this.processBoundaryColumn(bw, grid, deferred, rightCol, W, H);
386
+ }
387
+ // Reset boundary pass state.
388
+ bw.boundaryPass = false;
389
+ bw.writeXMin = 0;
390
+ bw.writeXMax = W;
391
+ // Clear the deferred mask on all boundary columns — the mask is also
392
+ // cleared at the start of the next frame by buildActiveListAndClearFlags,
393
+ // but clearing here prevents any stale markers from affecting a potential
394
+ // second cleanup call within the same frame.
395
+ for (let bi = 0; bi < this.strips.length - 1; bi++) {
396
+ const leftCol = this.strips[bi].endX - 1;
397
+ const rightCol = this.strips[bi + 1].startX;
398
+ for (let y = 0; y < H; y++) {
399
+ deferred[y * W + leftCol] = 0;
400
+ deferred[y * W + rightCol] = 0;
401
+ }
402
+ }
403
+ }
404
+ /**
405
+ * Process a single boundary column: find the Y range of cells with the
406
+ * deferred marker, then run tryMove on them bottom-to-top (matching the
407
+ * main movement pass order). Only deferred cells are processed — tryMove
408
+ * early-returns for cells without the marker when boundaryPass is true.
409
+ */
410
+ processBoundaryColumn(bw, grid, deferred, col, W, H) {
411
+ let minY = H, maxY = 0;
412
+ let hasDeferred = false;
413
+ for (let y = 0; y < H; y++) {
414
+ const idx = y * W + col;
415
+ if (grid[idx] !== 0 && deferred[idx] !== 0) {
416
+ if (y < minY)
417
+ minY = y;
418
+ if (y > maxY)
419
+ maxY = y;
420
+ hasDeferred = true;
421
+ }
422
+ }
423
+ if (!hasDeferred)
424
+ return;
425
+ // Process bottom-to-top (same as the main movement pass). tryMove
426
+ // early-returns for non-deferred cells when boundaryPass is true, so
427
+ // iterating the full [minY, maxY] range is cheap.
428
+ bw.runBoundaryMovement([col], minY, maxY, true);
429
+ }
430
+ /** Get the shared grid (for the chunk-world to read/write directly). */
431
+ getGrid() {
432
+ return this.boundaryWorld.grid;
433
+ }
434
+ /** Get the boundary world (the coordinator's SandWorld — shared SAB grid). */
435
+ getBoundaryWorld() {
436
+ return this.boundaryWorld;
437
+ }
438
+ /** Get the shared fields array. */
439
+ getFields() {
440
+ return this.boundaryWorld.fields;
441
+ }
442
+ /** Get the SAB backing the grid + fields. */
443
+ getSAB() {
444
+ return this.sab;
445
+ }
446
+ /** Shut down all workers. */
447
+ shutdown() {
448
+ this.workers.forEach((worker) => {
449
+ worker.postMessage({ type: "shutdown" });
450
+ worker.terminate();
451
+ });
452
+ this.workers = [];
453
+ this.initialized = false;
454
+ // Clear any in-flight init promise so a subsequent init() can rebuild
455
+ // workers from scratch after shutdown.
456
+ this.initPromise = null;
457
+ }
458
+ }
@@ -0,0 +1,101 @@
1
+ // ============================================================================
2
+ // Sand step worker — processes one vertical strip of the sand grid per step.
3
+ //
4
+ // Spawned by SandStepPool (which runs inside the mining worker). Each sand-step
5
+ // worker shares the grid + fields via a SharedArrayBuffer and only writes to
6
+ // its assigned strip [stripStartX, stripEndX). Cross-strip writes are skipped
7
+ // by write guards in SandWorld; the coordinator's boundary cleanup pass
8
+ // handles them after all workers finish.
9
+ //
10
+ // Communication:
11
+ // - init: { sab, gridOffset, fieldsOffset, W, H, stripStartX, stripEndX, frame }
12
+ // - step: { frame } → processes one SandWorld.step() for this strip
13
+ // - The worker responds with { done: true } when the step is complete.
14
+ // - Atomics.wait/postMessage handshake for low-latency dispatch.
15
+ // ============================================================================
16
+ import { MAT_GRAVITY, MAT_GRAVITY_DIR, SandWorld } from "./sand-world.js";
17
+ // --- Gravity overrides for static materials ---
18
+ // Games can pass `gravityOverrides` in the init message to patch the gravity
19
+ // lookup tables for materials that are static by default (gravityDir=0) but
20
+ // need to fall in the game's context (e.g. Sandjongg's Ice/Plant/Fireflies).
21
+ // This runs in the sand-step worker thread, which has its own module instance
22
+ // separate from the game worker.
23
+ let gravityOverrides = null;
24
+ function applyGravityOverrides() {
25
+ if (!gravityOverrides)
26
+ return;
27
+ gravityOverrides.forEach((o) => {
28
+ MAT_GRAVITY_DIR[o.mat] = o.gravityDir;
29
+ if (o.gravity !== 0)
30
+ MAT_GRAVITY[o.mat] = o.gravity;
31
+ });
32
+ }
33
+ let world = null;
34
+ let stripStartX = 0;
35
+ let stripEndX = 0;
36
+ self.onmessage = (e) => {
37
+ const msg = e.data;
38
+ switch (msg.type) {
39
+ case "init": {
40
+ // Apply gravity overrides before creating the SandWorld so the patched
41
+ // tables are used from the first step.
42
+ if (msg.gravityOverrides) {
43
+ gravityOverrides = msg.gravityOverrides;
44
+ applyGravityOverrides();
45
+ }
46
+ world = new SandWorld(msg.W, msg.H, {
47
+ sab: msg.sab,
48
+ gridOffset: msg.gridOffset,
49
+ fieldsOffset: msg.fieldsOffset,
50
+ skipMaskOffset: msg.skipMaskOffset,
51
+ deferredMaskOffset: msg.deferredMaskOffset,
52
+ histogramOffset: msg.histogramOffset,
53
+ skipStoneFloor: true,
54
+ });
55
+ stripStartX = msg.stripStartX;
56
+ stripEndX = msg.stripEndX;
57
+ world.setStripBounds(stripStartX, stripEndX);
58
+ // Copy preserveFlagsMask + disturbedFlags from the coordinator (game-specific).
59
+ if (msg.preserveFlagsMask !== undefined)
60
+ world.preserveFlagsMask = msg.preserveFlagsMask;
61
+ if (msg.disturbedFlags !== undefined)
62
+ world.disturbedFlags = msg.disturbedFlags;
63
+ self.postMessage({ type: "ready" });
64
+ break;
65
+ }
66
+ case "step": {
67
+ if (!world)
68
+ return;
69
+ // Sync strip bounds (in case the coordinator rebalanced strips).
70
+ if (msg.stripStartX !== undefined && msg.stripEndX !== undefined) {
71
+ stripStartX = msg.stripStartX;
72
+ stripEndX = msg.stripEndX;
73
+ world.setStripBounds(stripStartX, stripEndX);
74
+ }
75
+ // Sync per-step config from coordinator.
76
+ if (msg.interlaceEnabled !== undefined)
77
+ world.interlaceEnabled = msg.interlaceEnabled;
78
+ if (msg.interlaceScale !== undefined)
79
+ world.interlaceScale = msg.interlaceScale;
80
+ if (msg.horizontalImpulseChance !== undefined)
81
+ world.horizontalImpulseChance = msg.horizontalImpulseChance;
82
+ if (msg.horizontalImpulseStrength !== undefined)
83
+ world.horizontalImpulseStrength = msg.horizontalImpulseStrength;
84
+ // Set the frame number so interlace + fuse burn + C4 visited arrays work.
85
+ world.frame = msg.frame;
86
+ world.step();
87
+ self.postMessage({ type: "done", activeCount: world.getActiveCount() });
88
+ break;
89
+ }
90
+ case "setSkipMask": {
91
+ // The skip mask is shared via SAB — the coordinator sets it directly.
92
+ // This message is a no-op placeholder for future per-worker skip masks.
93
+ break;
94
+ }
95
+ case "shutdown": {
96
+ world = null;
97
+ self.close();
98
+ break;
99
+ }
100
+ }
101
+ };