@downdraft/engine 0.1.1 → 0.2.0

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 (1034) hide show
  1. package/app/README.md +11 -0
  2. package/app/src/renderer/bootstrap.ts +295 -19
  3. package/app/src/renderer/feature-log.ts +1 -1
  4. package/app/src/renderer/game-module.ts +60 -12
  5. package/app/src/renderer/hooks.ts +9 -1
  6. package/app/src/renderer/hot-reload.ts +9 -9
  7. package/app/src/renderer/mcp-harness.ts +2 -2
  8. package/app/src/renderer/standard-automation-tools.ts +104 -3
  9. package/app/src/shared/feature-log.ts +2 -1
  10. package/app/src/shared/mcp-discovery.ts +8 -3
  11. package/app/src/shared/mcp-proxy.ts +2 -2
  12. package/asset-bake/README.md +22 -0
  13. package/core/README.md +25 -0
  14. package/core/src/animation/skeleton-animator.ts +23 -5
  15. package/core/src/assets/manager.ts +4 -4
  16. package/core/src/ecs/events.ts +1 -1
  17. package/core/src/ecs/schedule.ts +1 -1
  18. package/core/src/ecs/world.ts +1 -1
  19. package/core/src/index.ts +3 -4
  20. package/core/src/input/local-player-manager.ts +2 -2
  21. package/core/src/library/host.ts +27 -13
  22. package/core/src/library/library.ts +13 -5
  23. package/core/src/module/cross-thread.ts +6 -0
  24. package/core/src/module/diagnostics.ts +10 -6
  25. package/core/src/module/host.ts +65 -18
  26. package/core/src/module/index.ts +1 -0
  27. package/core/src/module/module.ts +11 -5
  28. package/core/src/module/renderer-module.ts +15 -0
  29. package/core/src/physics/safety.ts +1 -1
  30. package/core/src/platform/bun-preload.ts +7 -2
  31. package/core/src/platform/glob-polyfill.ts +17 -8
  32. package/core/src/platform/pkg-root.ts +27 -0
  33. package/core/src/platform/runtime.ts +29 -0
  34. package/core/src/plugin/discovery.ts +1 -1
  35. package/core/src/plugin/extension-loaders.ts +6 -4
  36. package/core/src/plugin/host.ts +13 -13
  37. package/core/src/plugin/loader-asset.ts +5 -5
  38. package/core/src/plugin/loader-quickjs.ts +1 -1
  39. package/core/src/plugin/loader-wasm.ts +3 -3
  40. package/core/src/plugin/loader-worker.ts +1 -1
  41. package/core/src/plugin/manifest.ts +8 -3
  42. package/core/src/plugin/workshop.ts +3 -3
  43. package/core/src/profiling/index.ts +1 -1
  44. package/core/src/profiling/profiling-sab.ts +19 -0
  45. package/core/src/profiling/warnings.ts +1 -1
  46. package/core/src/profiling/worker-prelude.ts +1 -1
  47. package/core/src/render/bindless/frame-bindings.ts +1 -1
  48. package/core/src/render/bindless/material-manager.ts +2 -2
  49. package/core/src/render/bindless/texture-registry.ts +2 -2
  50. package/core/src/render/device.ts +5 -5
  51. package/core/src/render/frame-graph.ts +2 -2
  52. package/core/src/render/game-renderer.ts +42 -18
  53. package/core/src/render/hot-reload.ts +3 -3
  54. package/core/src/render/renderer-module-host.ts +32 -12
  55. package/core/src/render/shader-validator.ts +7 -7
  56. package/core/src/render/surface.ts +1 -1
  57. package/core/src/sab/errors.ts +1 -1
  58. package/core/src/sab/sab-polyfill.ts +1 -1
  59. package/core/src/save/migration-registry.ts +4 -4
  60. package/core/src/save/schema.ts +1 -1
  61. package/core/src/scene/prefab.ts +1 -1
  62. package/core/src/scene/scene-manager.ts +2 -2
  63. package/core/src/scene/scene.ts +4 -4
  64. package/core/src/scene/streaming.ts +2 -2
  65. package/core/src/scripting/hot-reload.ts +2 -2
  66. package/core/src/sim/hot-reload-pipeline.ts +30 -6
  67. package/core/src/sim/sim-state-helper.ts +1 -1
  68. package/core/src/sim/transient-state-registry.ts +1 -1
  69. package/core/src/sim/worker-loop.ts +2 -2
  70. package/core/src/telemetry/gpu-profiler.ts +3 -3
  71. package/core/src/util/index.ts +1 -1
  72. package/core/src/util/logger.ts +38 -7
  73. package/core/src/version.ts +13 -0
  74. package/core/src/worker/base-worker-host.ts +87 -25
  75. package/core/src/worker/buffer-sync.ts +1 -1
  76. package/core/src/worker/crash-recovery.ts +2 -2
  77. package/core/src/worker/instrumented-worker-host.ts +3 -3
  78. package/core/src/worker/rpc.ts +62 -11
  79. package/core/src/worker/sim-worker-base.ts +4 -9
  80. package/core/src/worker/task-pool.ts +2 -2
  81. package/dist/.dd-manifest.json +4119 -0
  82. package/dist/app/src/index.js +9 -0
  83. package/dist/app/src/renderer/bootstrap.js +446 -0
  84. package/dist/app/src/renderer/downdraft-base.css +93 -0
  85. package/dist/app/src/renderer/feature-log.js +180 -0
  86. package/dist/app/src/renderer/game-module.js +562 -0
  87. package/dist/app/src/renderer/hooks.js +82 -0
  88. package/dist/app/src/renderer/hot-reload.js +158 -0
  89. package/dist/app/src/renderer/import-cache.js +77 -0
  90. package/dist/app/src/renderer/index.js +149 -0
  91. package/dist/app/src/renderer/mcp-harness.js +112 -0
  92. package/dist/app/src/renderer/save-store-factory.js +180 -0
  93. package/dist/app/src/renderer/sim-bridge.js +138 -0
  94. package/dist/app/src/renderer/standard-automation-tools.js +720 -0
  95. package/dist/app/src/shared/feature-log.js +54 -0
  96. package/dist/app/src/shared/gpu-info.js +74 -0
  97. package/dist/app/src/shared/import-cache-store.js +123 -0
  98. package/dist/app/src/shared/index.js +4 -0
  99. package/dist/app/src/shared/mcp-discovery.js +55 -0
  100. package/dist/app/src/shared/mcp-proxy.js +71 -0
  101. package/dist/app/src/shared/types.js +13 -0
  102. package/dist/asset-bake/src/bake-audio.js +103 -0
  103. package/dist/asset-bake/src/bake-gltf.js +141 -0
  104. package/dist/asset-bake/src/bake.js +63 -0
  105. package/dist/asset-bake/src/cache.js +147 -0
  106. package/dist/asset-bake/src/config.js +93 -0
  107. package/dist/asset-bake/src/index.js +25 -0
  108. package/dist/core/src/animation/animation-event.js +24 -0
  109. package/dist/core/src/animation/bone-mask.js +103 -0
  110. package/dist/core/src/animation/clip.js +210 -0
  111. package/dist/core/src/animation/index.js +13 -0
  112. package/dist/core/src/animation/mixamo.js +78 -0
  113. package/dist/core/src/animation/morph-target.js +37 -0
  114. package/dist/core/src/animation/player.js +621 -0
  115. package/dist/core/src/animation/retarget.js +101 -0
  116. package/dist/core/src/animation/skeleton-animator.js +1361 -0
  117. package/dist/core/src/animation/skeleton.js +166 -0
  118. package/dist/core/src/animation/state-machine.js +252 -0
  119. package/dist/core/src/assets/blob-store.js +14 -0
  120. package/dist/core/src/assets/cache.js +168 -0
  121. package/dist/core/src/assets/cubemap-converter.js +129 -0
  122. package/dist/core/src/assets/environment-manager.js +84 -0
  123. package/dist/core/src/assets/import-cache.js +36 -0
  124. package/dist/core/src/assets/import-settings.js +34 -0
  125. package/dist/core/src/assets/importer.js +78 -0
  126. package/dist/core/src/assets/index.js +29 -0
  127. package/dist/core/src/assets/irradiance-generator.js +179 -0
  128. package/dist/core/src/assets/loader-audio.js +70 -0
  129. package/dist/core/src/assets/loader-cubemap.js +141 -0
  130. package/dist/core/src/assets/loader-dds.js +185 -0
  131. package/dist/core/src/assets/loader-hdr.js +430 -0
  132. package/dist/core/src/assets/loader-mesh.js +47 -0
  133. package/dist/core/src/assets/loader-shader.js +61 -0
  134. package/dist/core/src/assets/loader-texture.js +264 -0
  135. package/dist/core/src/assets/lod.js +150 -0
  136. package/dist/core/src/assets/manager.js +401 -0
  137. package/dist/core/src/assets/manifest.js +57 -0
  138. package/dist/core/src/assets/material-bridge.js +160 -0
  139. package/dist/core/src/assets/model-importer.js +32 -0
  140. package/dist/core/src/assets/model-normalizer.js +213 -0
  141. package/dist/core/src/assets/model-to-gpu.js +44 -0
  142. package/dist/core/src/assets/model-to-mesh.js +171 -0
  143. package/dist/core/src/assets/prefilter-generator.js +220 -0
  144. package/dist/core/src/audio/engine.js +153 -0
  145. package/dist/core/src/audio/interface.js +8 -0
  146. package/dist/core/src/audio/listener.js +19 -0
  147. package/dist/core/src/audio/mixer.js +124 -0
  148. package/dist/core/src/audio/registry.js +43 -0
  149. package/dist/core/src/audio/sab.js +74 -0
  150. package/dist/core/src/audio/source.js +60 -0
  151. package/dist/core/src/change-detection/atomics.js +1 -0
  152. package/dist/core/src/change-detection/tracker.js +26 -0
  153. package/dist/core/src/debug-draw/lines.js +27 -0
  154. package/dist/core/src/debug-draw/points.js +9 -0
  155. package/dist/core/src/debug-draw/queue.js +77 -0
  156. package/dist/core/src/debug-draw/text.js +12 -0
  157. package/dist/core/src/ecs/archetype.js +271 -0
  158. package/dist/core/src/ecs/component.js +109 -0
  159. package/dist/core/src/ecs/entity.js +11 -0
  160. package/dist/core/src/ecs/events.js +73 -0
  161. package/dist/core/src/ecs/hierarchy.js +104 -0
  162. package/dist/core/src/ecs/hmr-swap-registry.js +15 -0
  163. package/dist/core/src/ecs/index.js +14 -0
  164. package/dist/core/src/ecs/query.js +110 -0
  165. package/dist/core/src/ecs/resource.js +3 -0
  166. package/dist/core/src/ecs/schedule.js +157 -0
  167. package/dist/core/src/ecs/system-params.js +45 -0
  168. package/dist/core/src/ecs/system.js +18 -0
  169. package/dist/core/src/ecs/world.js +292 -0
  170. package/dist/core/src/index.js +191 -0
  171. package/dist/core/src/input/context.js +69 -0
  172. package/dist/core/src/input/dom-handler.js +288 -0
  173. package/dist/core/src/input/local-player-manager.js +145 -0
  174. package/dist/core/src/input/mapping.js +36 -0
  175. package/dist/core/src/input/multi-sab-bridge.js +224 -0
  176. package/dist/core/src/input/multi-state.js +48 -0
  177. package/dist/core/src/input/sab-bridge.js +66 -0
  178. package/dist/core/src/input/state.js +108 -0
  179. package/dist/core/src/input/ui-router.js +76 -0
  180. package/dist/core/src/library/host.js +291 -0
  181. package/dist/core/src/library/index.js +1 -0
  182. package/dist/core/src/library/library.js +20 -0
  183. package/dist/core/src/material/compiler.js +73 -0
  184. package/dist/core/src/material/graph-bridge.js +119 -0
  185. package/dist/core/src/material/index.js +6 -0
  186. package/dist/core/src/material/library.js +414 -0
  187. package/dist/core/src/material/material.js +120 -0
  188. package/dist/core/src/material/variants.js +37 -0
  189. package/dist/core/src/math/mat4.js +198 -0
  190. package/dist/core/src/math/perlin-noise-2d.js +66 -0
  191. package/dist/core/src/math/perlin-noise-3d.js +76 -0
  192. package/dist/core/src/math/quat.js +29 -0
  193. package/dist/core/src/math/rng.js +25 -0
  194. package/dist/core/src/math/trig.js +42 -0
  195. package/dist/core/src/math/value-noise.js +49 -0
  196. package/dist/core/src/mesh/builder.js +137 -0
  197. package/dist/core/src/mesh/csg.js +250 -0
  198. package/dist/core/src/mesh/greased-line.js +102 -0
  199. package/dist/core/src/mesh/mesh.js +6 -0
  200. package/dist/core/src/mesh/parametric.js +392 -0
  201. package/dist/core/src/mesh/skinning.js +30 -0
  202. package/dist/core/src/mesh/vertex-layout.js +65 -0
  203. package/dist/core/src/module/cross-thread.js +126 -0
  204. package/dist/core/src/module/diagnostics.js +99 -0
  205. package/dist/core/src/module/host.js +449 -0
  206. package/dist/core/src/module/index.js +6 -0
  207. package/dist/core/src/module/module.js +1 -0
  208. package/dist/core/src/module/registry.js +83 -0
  209. package/dist/core/src/module/renderer-module.js +13 -0
  210. package/dist/core/src/module/ts-loader.js +20 -0
  211. package/dist/core/src/particles/compute-pass.js +329 -0
  212. package/dist/core/src/particles/emitter.js +113 -0
  213. package/dist/core/src/particles/index.js +7 -0
  214. package/dist/core/src/particles/particle-data.js +33 -0
  215. package/dist/core/src/particles/render-pass.js +338 -0
  216. package/dist/core/src/particles/simulator.js +224 -0
  217. package/dist/core/src/particles/system.js +157 -0
  218. package/dist/core/src/physics/body.js +25 -0
  219. package/dist/core/src/physics/ccd-heuristic.js +46 -0
  220. package/dist/core/src/physics/character.js +184 -0
  221. package/dist/core/src/physics/collider.js +36 -0
  222. package/dist/core/src/physics/collision-system.js +62 -0
  223. package/dist/core/src/physics/events.js +74 -0
  224. package/dist/core/src/physics/index.js +24 -0
  225. package/dist/core/src/physics/interface.js +14 -0
  226. package/dist/core/src/physics/interpolation-buffer.js +182 -0
  227. package/dist/core/src/physics/lifecycle.js +66 -0
  228. package/dist/core/src/physics/load-shedder.js +155 -0
  229. package/dist/core/src/physics/physics-accumulator.js +94 -0
  230. package/dist/core/src/physics/physics-system.js +142 -0
  231. package/dist/core/src/physics/ragdoll-presets.js +248 -0
  232. package/dist/core/src/physics/ragdoll-system.js +193 -0
  233. package/dist/core/src/physics/ragdoll.js +117 -0
  234. package/dist/core/src/physics/raycast.js +97 -0
  235. package/dist/core/src/physics/realm-manager.js +431 -0
  236. package/dist/core/src/physics/realm-worker-pool.js +181 -0
  237. package/dist/core/src/physics/realm-worker.js +91 -0
  238. package/dist/core/src/physics/realm.js +137 -0
  239. package/dist/core/src/physics/registry.js +43 -0
  240. package/dist/core/src/physics/safety.js +211 -0
  241. package/dist/core/src/physics/snapshot-manager.js +118 -0
  242. package/dist/core/src/physics/worker-protocol.js +1 -0
  243. package/dist/core/src/platform/bun-preload.js +175 -0
  244. package/dist/core/src/platform/css-stub.js +4 -0
  245. package/dist/core/src/platform/glob-polyfill.js +137 -0
  246. package/dist/core/src/platform/hidpi.js +52 -0
  247. package/dist/core/src/platform/pkg-root.js +27 -0
  248. package/dist/core/src/platform/render-surface.js +15 -0
  249. package/dist/core/src/platform/rpc.js +82 -0
  250. package/dist/core/src/platform/runtime.js +93 -0
  251. package/dist/core/src/plugin/context.js +144 -0
  252. package/dist/core/src/plugin/diagnostics.js +20 -0
  253. package/dist/core/src/plugin/discovery.js +124 -0
  254. package/dist/core/src/plugin/extension-loaders.js +111 -0
  255. package/dist/core/src/plugin/host.js +542 -0
  256. package/dist/core/src/plugin/index.js +19 -0
  257. package/dist/core/src/plugin/loader-asset.js +105 -0
  258. package/dist/core/src/plugin/loader-quickjs.js +67 -0
  259. package/dist/core/src/plugin/loader-wasm.js +385 -0
  260. package/dist/core/src/plugin/loader-worker.js +228 -0
  261. package/dist/core/src/plugin/manifest.js +424 -0
  262. package/dist/core/src/plugin/material-registry.js +44 -0
  263. package/dist/core/src/plugin/mcp-tools.js +147 -0
  264. package/dist/core/src/plugin/permissions.js +152 -0
  265. package/dist/core/src/plugin/quickjs-bridge.js +219 -0
  266. package/dist/core/src/plugin/registry.js +92 -0
  267. package/dist/core/src/plugin/sandbox-shim.js +79 -0
  268. package/dist/core/src/plugin/sandbox-worker.js +194 -0
  269. package/dist/core/src/plugin/wasm-abi.js +62 -0
  270. package/dist/core/src/plugin/wasm-worker.js +234 -0
  271. package/dist/core/src/plugin/workshop.js +131 -0
  272. package/dist/core/src/profiling/event-loop.js +164 -0
  273. package/dist/core/src/profiling/index.js +23 -0
  274. package/dist/core/src/profiling/iops/idb-patch.js +211 -0
  275. package/dist/core/src/profiling/iops/opfs-patch.js +206 -0
  276. package/dist/core/src/profiling/profiling-sab.js +632 -0
  277. package/dist/core/src/profiling/task-latency.js +118 -0
  278. package/dist/core/src/profiling/thread-metrics.js +103 -0
  279. package/dist/core/src/profiling/trace-event-writer.js +165 -0
  280. package/dist/core/src/profiling/warnings.js +304 -0
  281. package/dist/core/src/profiling/worker-prelude.js +281 -0
  282. package/dist/core/src/render/bind-group.js +33 -0
  283. package/dist/core/src/render/bindless/bindless-struct.js +39 -0
  284. package/dist/core/src/render/bindless/bindless.wgsl.js +163 -0
  285. package/dist/core/src/render/bindless/frame-bindings.js +142 -0
  286. package/dist/core/src/render/bindless/index.js +6 -0
  287. package/dist/core/src/render/bindless/material-manager.js +182 -0
  288. package/dist/core/src/render/bindless/texture-registry.js +498 -0
  289. package/dist/core/src/render/buffer.js +74 -0
  290. package/dist/core/src/render/camera-2d.js +151 -0
  291. package/dist/core/src/render/camera-controller.js +370 -0
  292. package/dist/core/src/render/camera.js +332 -0
  293. package/dist/core/src/render/canvas-resize-watcher.js +36 -0
  294. package/dist/core/src/render/compute-kernel.js +130 -0
  295. package/dist/core/src/render/constants.js +2 -0
  296. package/dist/core/src/render/device.js +91 -0
  297. package/dist/core/src/render/frame-graph.js +594 -0
  298. package/dist/core/src/render/frustum.js +152 -0
  299. package/dist/core/src/render/fullscreen-vs.js +24 -0
  300. package/dist/core/src/render/g-buffer.js +156 -0
  301. package/dist/core/src/render/game-renderer.js +1165 -0
  302. package/dist/core/src/render/gpu-driven/cull-pass.js +352 -0
  303. package/dist/core/src/render/gpu-driven/hzb.js +183 -0
  304. package/dist/core/src/render/gpu-driven/index.js +6 -0
  305. package/dist/core/src/render/gpu-driven/indirect-draw-pass.js +300 -0
  306. package/dist/core/src/render/gpu-driven/instance-buffer.js +150 -0
  307. package/dist/core/src/render/gpu-driven/mesh-table.js +130 -0
  308. package/dist/core/src/render/gpu-driven/passes/hzb-build-pass.js +39 -0
  309. package/dist/core/src/render/gpu-utils.js +72 -0
  310. package/dist/core/src/render/hdr.js +69 -0
  311. package/dist/core/src/render/hot-reload.js +236 -0
  312. package/dist/core/src/render/ibl-bind-group.js +232 -0
  313. package/dist/core/src/render/ibl.js +148 -0
  314. package/dist/core/src/render/index.js +86 -0
  315. package/dist/core/src/render/input-manager.js +224 -0
  316. package/dist/core/src/render/lighting/area-light.js +142 -0
  317. package/dist/core/src/render/lighting/cluster-grid.js +255 -0
  318. package/dist/core/src/render/lighting/cluster-types.js +87 -0
  319. package/dist/core/src/render/lighting/ies-parser.js +111 -0
  320. package/dist/core/src/render/lighting.js +300 -0
  321. package/dist/core/src/render/material-types/depth.wgsl +44 -0
  322. package/dist/core/src/render/material-types/line.wgsl +50 -0
  323. package/dist/core/src/render/material-types/matcap.wgsl +51 -0
  324. package/dist/core/src/render/material-types/normal.wgsl +41 -0
  325. package/dist/core/src/render/material-types/physical.wgsl +152 -0
  326. package/dist/core/src/render/material-types/sprite.wgsl +46 -0
  327. package/dist/core/src/render/material-types/sss.wgsl +79 -0
  328. package/dist/core/src/render/material-types/toon.wgsl +79 -0
  329. package/dist/core/src/render/passes/README.md +121 -0
  330. package/dist/core/src/render/passes/atmosphere.js +107 -0
  331. package/dist/core/src/render/passes/cluster-lighting-pass.js +441 -0
  332. package/dist/core/src/render/passes/csm.js +338 -0
  333. package/dist/core/src/render/passes/cubemap-capture.js +93 -0
  334. package/dist/core/src/render/passes/debug-viz.js +248 -0
  335. package/dist/core/src/render/passes/debug.js +500 -0
  336. package/dist/core/src/render/passes/decal-mesh.js +86 -0
  337. package/dist/core/src/render/passes/decal-pass.js +344 -0
  338. package/dist/core/src/render/passes/deferred-lighting.js +406 -0
  339. package/dist/core/src/render/passes/depth-prepass.js +148 -0
  340. package/dist/core/src/render/passes/dome-360.js +68 -0
  341. package/dist/core/src/render/passes/fluid-render.js +116 -0
  342. package/dist/core/src/render/passes/gi-types.js +78 -0
  343. package/dist/core/src/render/passes/graph-compute.js +251 -0
  344. package/dist/core/src/render/passes/greased-line-pass.js +218 -0
  345. package/dist/core/src/render/passes/morph-target.js +35 -0
  346. package/dist/core/src/render/passes/opaque.js +966 -0
  347. package/dist/core/src/render/passes/point-light-shadow.js +221 -0
  348. package/dist/core/src/render/passes/procedural-texture.js +142 -0
  349. package/dist/core/src/render/passes/reflection-probe.js +100 -0
  350. package/dist/core/src/render/passes/rsm-pass.js +228 -0
  351. package/dist/core/src/render/passes/sdf-text.js +114 -0
  352. package/dist/core/src/render/passes/shadow-map.js +121 -0
  353. package/dist/core/src/render/passes/shadow.js +191 -0
  354. package/dist/core/src/render/passes/skinning-vs.js +102 -0
  355. package/dist/core/src/render/passes/skinning.js +282 -0
  356. package/dist/core/src/render/passes/sky-dome.js +380 -0
  357. package/dist/core/src/render/passes/skybox.js +146 -0
  358. package/dist/core/src/render/passes/spot-light-shadow.js +223 -0
  359. package/dist/core/src/render/passes/terrain.js +303 -0
  360. package/dist/core/src/render/passes/transparent.js +323 -0
  361. package/dist/core/src/render/passes/underwater-fog.js +173 -0
  362. package/dist/core/src/render/passes/video-texture.js +58 -0
  363. package/dist/core/src/render/passes/volumetric-pass.js +278 -0
  364. package/dist/core/src/render/passes/volumetric-types.js +96 -0
  365. package/dist/core/src/render/passes/water.js +697 -0
  366. package/dist/core/src/render/pbr.js +257 -0
  367. package/dist/core/src/render/pipeline.js +49 -0
  368. package/dist/core/src/render/render-pass.js +13 -0
  369. package/dist/core/src/render/renderer-input-bus.js +176 -0
  370. package/dist/core/src/render/renderer-module-host.js +539 -0
  371. package/dist/core/src/render/resource-tracker.js +59 -0
  372. package/dist/core/src/render/sab-canvas-overlay.js +83 -0
  373. package/dist/core/src/render/shader-validator.js +172 -0
  374. package/dist/core/src/render/shaders/debug/debug-line.wgsl +27 -0
  375. package/dist/core/src/render/shaders/debug/debug-point.wgsl +30 -0
  376. package/dist/core/src/render/shaders/debug/debug-text.wgsl +42 -0
  377. package/dist/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
  378. package/dist/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
  379. package/dist/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
  380. package/dist/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
  381. package/dist/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
  382. package/dist/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
  383. package/dist/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
  384. package/dist/core/src/render/shaders/shadow-chunks.js +133 -0
  385. package/dist/core/src/render/skybox.js +123 -0
  386. package/dist/core/src/render/splitscreen.js +60 -0
  387. package/dist/core/src/render/surface.js +63 -0
  388. package/dist/core/src/render/tonemap.js +171 -0
  389. package/dist/core/src/render/tracked-render-pass.js +115 -0
  390. package/dist/core/src/render/viewport.js +81 -0
  391. package/dist/core/src/render/wgsl-hmr.js +66 -0
  392. package/dist/core/src/sab/core-input-channel.js +22 -0
  393. package/dist/core/src/sab/define.js +127 -0
  394. package/dist/core/src/sab/errors.js +60 -0
  395. package/dist/core/src/sab/game-input.js +299 -0
  396. package/dist/core/src/sab/gamepad-devices.js +205 -0
  397. package/dist/core/src/sab/grid-buffer.js +91 -0
  398. package/dist/core/src/sab/input.js +38 -0
  399. package/dist/core/src/sab/layout.js +160 -0
  400. package/dist/core/src/sab/multi-input-channel.js +39 -0
  401. package/dist/core/src/sab/record-buffer.js +130 -0
  402. package/dist/core/src/sab/sab-polyfill.js +47 -0
  403. package/dist/core/src/sab/sim-channel.js +397 -0
  404. package/dist/core/src/sab/slot-buffer.js +140 -0
  405. package/dist/core/src/sab/types.js +1 -0
  406. package/dist/core/src/safety/bounds.js +71 -0
  407. package/dist/core/src/safety/json.js +70 -0
  408. package/dist/core/src/safety/path.js +151 -0
  409. package/dist/core/src/save/binary-format.js +95 -0
  410. package/dist/core/src/save/game-save-system.js +101 -0
  411. package/dist/core/src/save/grid-save-system.js +102 -0
  412. package/dist/core/src/save/migrate.js +35 -0
  413. package/dist/core/src/save/migration-registry.js +66 -0
  414. package/dist/core/src/save/persist-types.js +4 -0
  415. package/dist/core/src/save/schema.js +36 -0
  416. package/dist/core/src/save/serializer.js +139 -0
  417. package/dist/core/src/scene/builder.js +31 -0
  418. package/dist/core/src/scene/camera.js +118 -0
  419. package/dist/core/src/scene/checkpoint.js +84 -0
  420. package/dist/core/src/scene/game-loop.js +155 -0
  421. package/dist/core/src/scene/index.js +14 -0
  422. package/dist/core/src/scene/layer.js +7 -0
  423. package/dist/core/src/scene/prefab.js +97 -0
  424. package/dist/core/src/scene/scene-manager.js +141 -0
  425. package/dist/core/src/scene/scene.js +147 -0
  426. package/dist/core/src/scene/sky.js +179 -0
  427. package/dist/core/src/scene/spatial-grid.js +140 -0
  428. package/dist/core/src/scene/streaming.js +247 -0
  429. package/dist/core/src/scene/vegetation.js +107 -0
  430. package/dist/core/src/scene/world.js +66 -0
  431. package/dist/core/src/scripting/binding.js +85 -0
  432. package/dist/core/src/scripting/hot-reload.js +123 -0
  433. package/dist/core/src/scripting/script.js +68 -0
  434. package/dist/core/src/sim/hot-reload-pipeline.js +65 -0
  435. package/dist/core/src/sim/sim-state-helper.js +40 -0
  436. package/dist/core/src/sim/transient-state-registry.js +63 -0
  437. package/dist/core/src/sim/types.js +4 -0
  438. package/dist/core/src/sim/worker-loop.js +168 -0
  439. package/dist/core/src/stores/game-store.js +81 -0
  440. package/dist/core/src/stores/hot-reload-store.js +19 -0
  441. package/dist/core/src/telemetry/collector.js +303 -0
  442. package/dist/core/src/telemetry/gc-controller.js +365 -0
  443. package/dist/core/src/telemetry/gc-profiler.js +82 -0
  444. package/dist/core/src/telemetry/gc-tracker.js +63 -0
  445. package/dist/core/src/telemetry/gpu-profiler.js +554 -0
  446. package/dist/core/src/telemetry/gpu-resource-tracker.js +234 -0
  447. package/dist/core/src/telemetry/gpu-timer-pool.js +223 -0
  448. package/dist/core/src/telemetry/gpu-timer.js +117 -0
  449. package/dist/core/src/telemetry/gpu-timestamp-gate.js +22 -0
  450. package/dist/core/src/telemetry/reporter.js +56 -0
  451. package/dist/core/src/types/engine-types.js +21 -0
  452. package/dist/core/src/ui-font-scale.js +111 -0
  453. package/dist/core/src/util/broad-phase-grid.js +77 -0
  454. package/dist/core/src/util/feature-log.js +176 -0
  455. package/dist/core/src/util/index.js +4 -0
  456. package/dist/core/src/util/logger.js +596 -0
  457. package/dist/core/src/version.js +11 -0
  458. package/dist/core/src/webgpu-destroy-augmentation.d.ts +25 -0
  459. package/dist/core/src/worker/base-worker-host.js +212 -0
  460. package/dist/core/src/worker/buffer-sync.js +454 -0
  461. package/dist/core/src/worker/crash-recovery.js +153 -0
  462. package/dist/core/src/worker/entity-sim-worker-host.js +128 -0
  463. package/dist/core/src/worker/instrumented-worker-host.js +139 -0
  464. package/dist/core/src/worker/rpc.js +244 -0
  465. package/dist/core/src/worker/sim-worker-base.js +558 -0
  466. package/dist/core/src/worker/sim-worker-host.js +271 -0
  467. package/dist/core/src/worker/task-pool.js +205 -0
  468. package/dist/core/src/worker/task-worker.js +77 -0
  469. package/dist/libraries/asset-browser/src/index.js +10 -0
  470. package/dist/libraries/asset-browser/src/software-thumbnails.js +940 -0
  471. package/dist/libraries/audio-kira/src/backend.js +405 -0
  472. package/dist/libraries/audio-kira/src/index.js +4 -0
  473. package/dist/libraries/audio-kira/src/library.js +54 -0
  474. package/dist/libraries/blitz-ui/src/index.js +13 -0
  475. package/dist/libraries/blitz-ui/src/native-module.js +162 -0
  476. package/dist/libraries/blitz-ui/src/native-osr-ffi.js +409 -0
  477. package/dist/libraries/blitz-ui/src/router.js +82 -0
  478. package/dist/libraries/blitz-ui/src/shaders/ui-blit.wgsl.js +32 -0
  479. package/dist/libraries/blitz-ui/src/ui-blit-pass.js +108 -0
  480. package/dist/libraries/character/src/character-animator.js +323 -0
  481. package/dist/libraries/character/src/customization.js +464 -0
  482. package/dist/libraries/character/src/index.js +19 -0
  483. package/dist/libraries/character/src/inspectable.js +77 -0
  484. package/dist/libraries/character/src/loader.js +336 -0
  485. package/dist/libraries/character/src/locomotion.js +84 -0
  486. package/dist/libraries/character/src/preview.js +280 -0
  487. package/dist/libraries/devtools/src/backend.js +449 -0
  488. package/dist/libraries/devtools/src/cdp-bridge.js +293 -0
  489. package/dist/libraries/devtools/src/collectors.js +318 -0
  490. package/dist/libraries/devtools/src/index.js +31 -0
  491. package/dist/libraries/devtools/src/native-providers.js +749 -0
  492. package/dist/libraries/devtools/src/snapshot.js +35 -0
  493. package/dist/libraries/devtools/src/verify.js +139 -0
  494. package/dist/libraries/devtools/src/web/browser.js +94 -0
  495. package/dist/libraries/devtools/src/web/host.js +183 -0
  496. package/dist/libraries/devtools/src/web/mirror.js +26 -0
  497. package/dist/libraries/devtools/src/web/server.js +187 -0
  498. package/dist/libraries/entities/src/index.js +3 -0
  499. package/dist/libraries/entities/src/library.js +46 -0
  500. package/dist/libraries/entities/src/model-renderer.js +1307 -0
  501. package/dist/libraries/entities/src/shaders/model.wgsl +375 -0
  502. package/dist/libraries/gamepad/src/feed-input.js +54 -0
  503. package/dist/libraries/gamepad/src/filters.js +44 -0
  504. package/dist/libraries/gamepad/src/glyphs.js +83 -0
  505. package/dist/libraries/gamepad/src/hub.js +164 -0
  506. package/dist/libraries/gamepad/src/index.js +10 -0
  507. package/dist/libraries/gamepad/src/library.js +56 -0
  508. package/dist/libraries/gamepad/src/source-sab.js +62 -0
  509. package/dist/libraries/gamepad/src/sysfs-enrich.js +125 -0
  510. package/dist/libraries/gaussian-splats/src/gpu-sort.js +506 -0
  511. package/dist/libraries/gaussian-splats/src/index.js +8 -0
  512. package/dist/libraries/gaussian-splats/src/library.js +44 -0
  513. package/dist/libraries/gaussian-splats/src/parser.js +297 -0
  514. package/dist/libraries/gaussian-splats/src/renderer.js +368 -0
  515. package/dist/libraries/gaussian-splats/src/sh-eval.js +196 -0
  516. package/dist/libraries/gaussian-splats/src/sorter.js +76 -0
  517. package/dist/libraries/gaussian-splats/src/tile-raster.js +424 -0
  518. package/dist/libraries/gpu-kernels/src/index.js +8 -0
  519. package/dist/libraries/gpu-kernels/src/kernel.js +591 -0
  520. package/dist/libraries/gpu-kernels/src/transpile.js +896 -0
  521. package/dist/libraries/html-ui-kit/src/behaviors.js +231 -0
  522. package/dist/libraries/html-ui-kit/src/components.js +219 -0
  523. package/dist/libraries/html-ui-kit/src/index.js +17 -0
  524. package/dist/libraries/html-ui-kit/src/nav/nav-controller.js +215 -0
  525. package/dist/libraries/html-ui-kit/src/nav/nav-input.js +138 -0
  526. package/dist/libraries/html-ui-kit/src/nav/osk.js +135 -0
  527. package/dist/libraries/html-ui-kit/src/nav/router.js +152 -0
  528. package/dist/libraries/html-ui-kit/src/nav/vcursor.js +177 -0
  529. package/dist/libraries/html-ui-kit/src/ten-foot.js +138 -0
  530. package/dist/libraries/html-ui-kit/src/theme.js +235 -0
  531. package/dist/libraries/inspectable/src/index.js +6 -0
  532. package/dist/libraries/inspectable/src/inspectable.js +205 -0
  533. package/dist/libraries/lighting/src/index.js +4 -0
  534. package/dist/libraries/lighting/src/library.js +48 -0
  535. package/dist/libraries/lighting/src/light-system.js +395 -0
  536. package/dist/libraries/lighting/src/lighting-system.js +57 -0
  537. package/dist/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
  538. package/dist/libraries/marching-cubes/src/chunked-field.js +130 -0
  539. package/dist/libraries/marching-cubes/src/deformation.js +41 -0
  540. package/dist/libraries/marching-cubes/src/generator.js +356 -0
  541. package/dist/libraries/marching-cubes/src/index.js +13 -0
  542. package/dist/libraries/marching-cubes/src/library.js +54 -0
  543. package/dist/libraries/marching-cubes/src/lod.js +95 -0
  544. package/dist/libraries/marching-cubes/src/marching-tetrahedra.js +261 -0
  545. package/dist/libraries/marching-cubes/src/sab.js +40 -0
  546. package/dist/libraries/marching-cubes/src/streaming-config.js +28 -0
  547. package/dist/libraries/marching-cubes/src/streaming-manager.js +490 -0
  548. package/dist/libraries/marching-cubes/src/tables.js +314 -0
  549. package/dist/libraries/marching-cubes/src/types.js +1 -0
  550. package/dist/libraries/models/src/bake-node-transforms.js +146 -0
  551. package/dist/libraries/models/src/bind-unskinned-meshes.js +145 -0
  552. package/dist/libraries/models/src/codecs/basisu-codec.js +134 -0
  553. package/dist/libraries/models/src/codecs/draco-codec.js +236 -0
  554. package/dist/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
  555. package/dist/libraries/models/src/codecs/index.js +5 -0
  556. package/dist/libraries/models/src/codecs/meshopt-codec.js +59 -0
  557. package/dist/libraries/models/src/codecs/registry.js +111 -0
  558. package/dist/libraries/models/src/dae.js +665 -0
  559. package/dist/libraries/models/src/default-part-selection.js +58 -0
  560. package/dist/libraries/models/src/dxf.js +235 -0
  561. package/dist/libraries/models/src/fbx/index.js +438 -0
  562. package/dist/libraries/models/src/fbx/interpreter/animation.js +369 -0
  563. package/dist/libraries/models/src/fbx/interpreter/blend-shapes.js +283 -0
  564. package/dist/libraries/models/src/fbx/interpreter/connections.js +158 -0
  565. package/dist/libraries/models/src/fbx/interpreter/diagnostics.js +48 -0
  566. package/dist/libraries/models/src/fbx/interpreter/geometry.js +430 -0
  567. package/dist/libraries/models/src/fbx/interpreter/global-settings.js +77 -0
  568. package/dist/libraries/models/src/fbx/interpreter/materials.js +231 -0
  569. package/dist/libraries/models/src/fbx/interpreter/nodes.js +168 -0
  570. package/dist/libraries/models/src/fbx/interpreter/skeleton.js +454 -0
  571. package/dist/libraries/models/src/fbx/parsers/binary-parser.js +217 -0
  572. package/dist/libraries/models/src/fbx/types.js +88 -0
  573. package/dist/libraries/models/src/gltf-extensions.js +121 -0
  574. package/dist/libraries/models/src/gltf.js +724 -0
  575. package/dist/libraries/models/src/index.js +46 -0
  576. package/dist/libraries/models/src/library.js +44 -0
  577. package/dist/libraries/models/src/loader.js +218 -0
  578. package/dist/libraries/models/src/material-adapter.js +82 -0
  579. package/dist/libraries/models/src/mini-xml.js +145 -0
  580. package/dist/libraries/models/src/normalize.js +168 -0
  581. package/dist/libraries/models/src/obj.js +247 -0
  582. package/dist/libraries/models/src/off.js +94 -0
  583. package/dist/libraries/models/src/ply.js +329 -0
  584. package/dist/libraries/models/src/pose-sampler.js +183 -0
  585. package/dist/libraries/models/src/sidecar/blender-extras.js +32 -0
  586. package/dist/libraries/models/src/sidecar/ddmeta.js +98 -0
  587. package/dist/libraries/models/src/sidecar/godot-import.js +76 -0
  588. package/dist/libraries/models/src/sidecar/resolver.js +112 -0
  589. package/dist/libraries/models/src/sidecar/types.js +8 -0
  590. package/dist/libraries/models/src/sidecar/unity-meta.js +46 -0
  591. package/dist/libraries/models/src/skeleton-synthesis.js +122 -0
  592. package/dist/libraries/models/src/stl.js +129 -0
  593. package/dist/libraries/models/src/threeds.js +312 -0
  594. package/dist/libraries/models/src/threemf.js +203 -0
  595. package/dist/libraries/models/src/types.js +33 -0
  596. package/dist/libraries/models/src/vtk.js +242 -0
  597. package/dist/libraries/navmesh/src/crowd-system.js +207 -0
  598. package/dist/libraries/navmesh/src/debug-viz.js +52 -0
  599. package/dist/libraries/navmesh/src/index.js +7 -0
  600. package/dist/libraries/navmesh/src/library.js +47 -0
  601. package/dist/libraries/navmesh/src/navmesh-generator.js +364 -0
  602. package/dist/libraries/navmesh/src/navmesh.js +141 -0
  603. package/dist/libraries/navmesh/src/pathfinder.js +221 -0
  604. package/dist/libraries/navmesh/src/types.js +1 -0
  605. package/dist/libraries/networking/src/authority.js +107 -0
  606. package/dist/libraries/networking/src/connection.js +107 -0
  607. package/dist/libraries/networking/src/discovery.js +314 -0
  608. package/dist/libraries/networking/src/enhanced-replication.js +282 -0
  609. package/dist/libraries/networking/src/epic-adapter.js +101 -0
  610. package/dist/libraries/networking/src/index.js +16 -0
  611. package/dist/libraries/networking/src/library.js +45 -0
  612. package/dist/libraries/networking/src/lobby.js +84 -0
  613. package/dist/libraries/networking/src/platform-adapter.js +92 -0
  614. package/dist/libraries/networking/src/rcs-adapter.js +100 -0
  615. package/dist/libraries/networking/src/remote-input.js +162 -0
  616. package/dist/libraries/networking/src/replication.js +273 -0
  617. package/dist/libraries/networking/src/rpc.js +172 -0
  618. package/dist/libraries/networking/src/session.js +129 -0
  619. package/dist/libraries/networking/src/transport.js +156 -0
  620. package/dist/libraries/networking/src/webrtc.js +266 -0
  621. package/dist/libraries/pathfinding-2d/src/astar-grid.js +255 -0
  622. package/dist/libraries/pathfinding-2d/src/index.js +9 -0
  623. package/dist/libraries/persistence/src/autosave-manager.js +94 -0
  624. package/dist/libraries/persistence/src/binary-record-store.js +205 -0
  625. package/dist/libraries/persistence/src/browser.js +16 -0
  626. package/dist/libraries/persistence/src/file-save-store.js +507 -0
  627. package/dist/libraries/persistence/src/hash-utils.js +54 -0
  628. package/dist/libraries/persistence/src/index.js +17 -0
  629. package/dist/libraries/persistence/src/library.js +51 -0
  630. package/dist/libraries/persistence/src/mock-opfs.js +114 -0
  631. package/dist/libraries/persistence/src/node-fs-directory-handle.js +168 -0
  632. package/dist/libraries/persistence/src/opfs-save-store.js +584 -0
  633. package/dist/libraries/persistence/src/save-worker-proxy.js +96 -0
  634. package/dist/libraries/persistence/src/save-worker.js +76 -0
  635. package/dist/libraries/persistence/src/xxh3-ts.d.ts +10 -0
  636. package/dist/libraries/physics-native/src/backend.js +960 -0
  637. package/dist/libraries/physics-native/src/broadphase.js +79 -0
  638. package/dist/libraries/physics-native/src/index.js +6 -0
  639. package/dist/libraries/physics-native/src/library.js +57 -0
  640. package/dist/libraries/physics-native/src/narrowphase-shapes.js +348 -0
  641. package/dist/libraries/physics-native/src/narrowphase.js +60 -0
  642. package/dist/libraries/physics-native/src/solver.js +105 -0
  643. package/dist/libraries/physics-native/src/types.js +4 -0
  644. package/dist/libraries/physics-rapier/src/api.js +352 -0
  645. package/dist/libraries/physics-rapier/src/auto-backend.js +54 -0
  646. package/dist/libraries/physics-rapier/src/backend.js +1066 -0
  647. package/dist/libraries/physics-rapier/src/bulk-ops.js +46 -0
  648. package/dist/libraries/physics-rapier/src/ffi-backend.js +17 -0
  649. package/dist/libraries/physics-rapier/src/ffi-lib.js +605 -0
  650. package/dist/libraries/physics-rapier/src/index.js +9 -0
  651. package/dist/libraries/physics-rapier/src/library.js +71 -0
  652. package/dist/libraries/physics-rapier/src/rapier-backend.js +1102 -0
  653. package/dist/libraries/physics-rapier/src/realm-worker-script.js +233 -0
  654. package/dist/libraries/postfx/src/index.js +14 -0
  655. package/dist/libraries/postfx/src/library.js +207 -0
  656. package/dist/libraries/postfx/src/post-process-stack.js +1641 -0
  657. package/dist/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
  658. package/dist/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
  659. package/dist/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
  660. package/dist/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
  661. package/dist/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
  662. package/dist/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
  663. package/dist/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
  664. package/dist/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
  665. package/dist/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
  666. package/dist/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
  667. package/dist/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
  668. package/dist/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
  669. package/dist/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
  670. package/dist/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
  671. package/dist/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
  672. package/dist/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
  673. package/dist/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
  674. package/dist/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
  675. package/dist/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
  676. package/dist/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
  677. package/dist/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
  678. package/dist/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
  679. package/dist/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
  680. package/dist/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
  681. package/dist/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
  682. package/dist/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
  683. package/dist/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
  684. package/dist/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
  685. package/dist/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
  686. package/dist/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
  687. package/dist/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
  688. package/dist/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
  689. package/dist/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
  690. package/dist/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
  691. package/dist/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
  692. package/dist/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
  693. package/dist/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
  694. package/dist/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
  695. package/dist/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
  696. package/dist/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
  697. package/dist/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
  698. package/dist/libraries/recast/src/backend.js +124 -0
  699. package/dist/libraries/recast/src/crowd-system.js +310 -0
  700. package/dist/libraries/recast/src/index.js +4 -0
  701. package/dist/libraries/recast/src/library.js +59 -0
  702. package/dist/libraries/recast/src/types.js +4 -0
  703. package/dist/libraries/sand/src/cell.js +32 -0
  704. package/dist/libraries/sand/src/fields.js +27 -0
  705. package/dist/libraries/sand/src/fluid-grid.js +267 -0
  706. package/dist/libraries/sand/src/grid-dims.js +47 -0
  707. package/dist/libraries/sand/src/grid-sim-buffer.js +184 -0
  708. package/dist/libraries/sand/src/index.js +20 -0
  709. package/dist/libraries/sand/src/library.js +67 -0
  710. package/dist/libraries/sand/src/materials.js +437 -0
  711. package/dist/libraries/sand/src/palette.js +87 -0
  712. package/dist/libraries/sand/src/particles.js +163 -0
  713. package/dist/libraries/sand/src/render/sand-grid-pass.js +377 -0
  714. package/dist/libraries/sand/src/rng.js +44 -0
  715. package/dist/libraries/sand/src/rules/builtin-rules.js +125 -0
  716. package/dist/libraries/sand/src/rules/rule-compiler.js +164 -0
  717. package/dist/libraries/sand/src/rules/rule-engine.js +210 -0
  718. package/dist/libraries/sand/src/rules/rule-types.js +27 -0
  719. package/dist/libraries/sand/src/sand-step-pool.js +458 -0
  720. package/dist/libraries/sand/src/sand-step-worker.js +101 -0
  721. package/dist/libraries/sand/src/sand-world.js +3382 -0
  722. package/dist/libraries/stickman/src/index.js +7 -0
  723. package/dist/libraries/stickman/src/library.js +44 -0
  724. package/dist/libraries/stickman/src/proportions.js +40 -0
  725. package/dist/libraries/stickman/src/shader.js +113 -0
  726. package/dist/libraries/stickman/src/skeleton.js +163 -0
  727. package/dist/libraries/stickman/src/stickman-pass.js +210 -0
  728. package/dist/libraries/stickman/src/thick-line.js +120 -0
  729. package/dist/libraries/surface-nets/src/chunked-field.js +5 -0
  730. package/dist/libraries/surface-nets/src/deformation.js +29 -0
  731. package/dist/libraries/surface-nets/src/index.js +15 -0
  732. package/dist/libraries/surface-nets/src/library.js +41 -0
  733. package/dist/libraries/surface-nets/src/lod.js +6 -0
  734. package/dist/libraries/surface-nets/src/sab.js +4 -0
  735. package/dist/libraries/surface-nets/src/streaming-config.js +4 -0
  736. package/dist/libraries/surface-nets/src/streaming-manager.js +9 -0
  737. package/dist/libraries/surface-nets/src/surface-nets.js +361 -0
  738. package/dist/libraries/surface-nets/src/types.js +1 -0
  739. package/dist/libraries/water/src/buoyancy.js +80 -0
  740. package/dist/libraries/water/src/index.js +12 -0
  741. package/dist/libraries/water/src/library.js +65 -0
  742. package/dist/libraries/water/src/shore-damping.js +70 -0
  743. package/dist/libraries/water/src/water-buffer.js +78 -0
  744. package/dist/libraries/water/src/water-chunks.js +5 -0
  745. package/dist/libraries/water/src/water-physics.js +315 -0
  746. package/dist/libraries/water/src/water-renderer.js +736 -0
  747. package/dist/libraries/water/src/water-sab.js +138 -0
  748. package/dist/libraries/water/src/wave-sources.js +45 -0
  749. package/dist/libraries/weather/src/index.js +5 -0
  750. package/dist/libraries/weather/src/library.js +48 -0
  751. package/dist/libraries/weather/src/types.js +29 -0
  752. package/dist/libraries/weather/src/weather-blend.js +108 -0
  753. package/dist/libraries/weather/src/weather-system.js +275 -0
  754. package/dist/libraries/weatherfx/src/cloud-provider.js +5 -0
  755. package/dist/libraries/weatherfx/src/cloud-system.js +294 -0
  756. package/dist/libraries/weatherfx/src/index.js +4 -0
  757. package/dist/libraries/weatherfx/src/library.js +41 -0
  758. package/dist/libraries/weatherfx/src/particle-system.js +350 -0
  759. package/dist/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
  760. package/dist/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
  761. package/dist/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
  762. package/dist/mcp/src/client.js +669 -0
  763. package/dist/mcp/src/engine-context.js +99 -0
  764. package/dist/mcp/src/http-transport.js +423 -0
  765. package/dist/mcp/src/index.js +5 -0
  766. package/dist/mcp/src/prompts/add-entity.js +39 -0
  767. package/dist/mcp/src/prompts/create-scene.js +41 -0
  768. package/dist/mcp/src/prompts/debug-frame.js +36 -0
  769. package/dist/mcp/src/prompts/index.js +10 -0
  770. package/dist/mcp/src/resources/asset-list.js +28 -0
  771. package/dist/mcp/src/resources/checkpoint-list.js +29 -0
  772. package/dist/mcp/src/resources/entity-state.js +45 -0
  773. package/dist/mcp/src/resources/gpu-info.js +90 -0
  774. package/dist/mcp/src/resources/index.js +51 -0
  775. package/dist/mcp/src/resources/performance.js +33 -0
  776. package/dist/mcp/src/resources/scene-tree.js +37 -0
  777. package/dist/mcp/src/server.js +307 -0
  778. package/dist/mcp/src/tools/animation.js +102 -0
  779. package/dist/mcp/src/tools/asset.js +146 -0
  780. package/dist/mcp/src/tools/audio.js +80 -0
  781. package/dist/mcp/src/tools/build.js +128 -0
  782. package/dist/mcp/src/tools/camera.js +157 -0
  783. package/dist/mcp/src/tools/checkpoint.js +90 -0
  784. package/dist/mcp/src/tools/component.js +176 -0
  785. package/dist/mcp/src/tools/debug.js +273 -0
  786. package/dist/mcp/src/tools/entity.js +309 -0
  787. package/dist/mcp/src/tools/inspect.js +192 -0
  788. package/dist/mcp/src/tools/lighting.js +239 -0
  789. package/dist/mcp/src/tools/material.js +225 -0
  790. package/dist/mcp/src/tools/mesh.js +210 -0
  791. package/dist/mcp/src/tools/physics.js +251 -0
  792. package/dist/mcp/src/tools/scene.js +139 -0
  793. package/dist/mcp/src/tools/script.js +114 -0
  794. package/dist/mcp/src/types.js +9 -0
  795. package/dist/mcp/src/undo-redo.js +64 -0
  796. package/dist/modules/camera-controls/src/index.js +116 -0
  797. package/dist/modules/controller-ui/src/index.js +149 -0
  798. package/dist/modules/devtools/src/api.js +317 -0
  799. package/dist/modules/devtools/src/asset-utils.js +102 -0
  800. package/dist/modules/devtools/src/bind-debug-store.js +34 -0
  801. package/dist/modules/devtools/src/blitz/host.js +391 -0
  802. package/dist/modules/devtools/src/blitz/module.js +65 -0
  803. package/dist/modules/devtools/src/blitz/panels/console.js +217 -0
  804. package/dist/modules/devtools/src/blitz/panels/elements.js +79 -0
  805. package/dist/modules/devtools/src/blitz/panels/gpu.js +61 -0
  806. package/dist/modules/devtools/src/blitz/panels/performance.js +113 -0
  807. package/dist/modules/devtools/src/blitz/panels/snapshot.js +141 -0
  808. package/dist/modules/devtools/src/blitz/panels/types.js +55 -0
  809. package/dist/modules/devtools/src/blitz/theme.js +167 -0
  810. package/dist/modules/devtools/src/data-bridge.js +247 -0
  811. package/dist/modules/devtools/src/debug-overlay.js +181 -0
  812. package/dist/modules/devtools/src/debug-raycast.js +296 -0
  813. package/dist/modules/devtools/src/debug-store.js +28 -0
  814. package/dist/modules/devtools/src/debug-view-descriptors.js +24 -0
  815. package/dist/modules/devtools/src/doctor-panel.js +163 -0
  816. package/dist/modules/devtools/src/gizmo-module.js +95 -0
  817. package/dist/modules/devtools/src/graph-model.js +387 -0
  818. package/dist/modules/devtools/src/grid-renderer.js +145 -0
  819. package/dist/modules/devtools/src/height-ruler-renderer.js +189 -0
  820. package/dist/modules/devtools/src/index.js +46 -0
  821. package/dist/modules/devtools/src/init.js +204 -0
  822. package/dist/modules/devtools/src/label-overlay.js +129 -0
  823. package/dist/modules/devtools/src/material-stats-panel.js +171 -0
  824. package/dist/modules/devtools/src/profiling-bridge.js +288 -0
  825. package/dist/modules/devtools/src/profiling-hooks.js +63 -0
  826. package/dist/modules/devtools/src/renderer-adapter.js +61 -0
  827. package/dist/modules/devtools/src/scene-inspector.js +571 -0
  828. package/dist/modules/devtools/src/scene-store.js +212 -0
  829. package/dist/modules/devtools/src/scene-sync.js +92 -0
  830. package/dist/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
  831. package/dist/modules/devtools/src/sim-stats-panel.js +250 -0
  832. package/dist/modules/devtools/src/sim-stats-provider.js +73 -0
  833. package/dist/modules/devtools/src/skeleton-renderer.js +326 -0
  834. package/dist/modules/devtools/src/transform-gizmo.js +677 -0
  835. package/dist/modules/devtools/src/types.js +5 -0
  836. package/dist/modules/devtools/src/worker-expose.js +59 -0
  837. package/dist/modules/devtools/src/worker-sync.js +115 -0
  838. package/dist/modules/editor/src/commands/component.js +151 -0
  839. package/dist/modules/editor/src/commands/entity.js +253 -0
  840. package/dist/modules/editor/src/commands/hierarchy.js +79 -0
  841. package/dist/modules/editor/src/commands/index.js +57 -0
  842. package/dist/modules/editor/src/commands/prefab.js +149 -0
  843. package/dist/modules/editor/src/commands/registry.js +246 -0
  844. package/dist/modules/editor/src/commands/scene-io.js +206 -0
  845. package/dist/modules/editor/src/commands/selection.js +71 -0
  846. package/dist/modules/editor/src/commands/transform.js +88 -0
  847. package/dist/modules/editor/src/ddscene.js +189 -0
  848. package/dist/modules/editor/src/document.js +96 -0
  849. package/dist/modules/editor/src/editor-context.js +115 -0
  850. package/dist/modules/editor/src/index.js +11 -0
  851. package/dist/modules/editor/src/mcp.js +91 -0
  852. package/dist/modules/editor/src/module.js +115 -0
  853. package/dist/modules/editor/src/selection.js +60 -0
  854. package/dist/modules/editor/src/shell.js +397 -0
  855. package/dist/modules/editor/src/viewport.js +186 -0
  856. package/dist/modules/html-ui/src/composite.js +116 -0
  857. package/dist/modules/html-ui/src/create-html-ui.js +137 -0
  858. package/dist/modules/html-ui/src/doc-backend.js +518 -0
  859. package/dist/modules/html-ui/src/host.js +819 -0
  860. package/dist/modules/html-ui/src/index.js +5 -0
  861. package/dist/modules/html-ui/src/jsx-dev-runtime.js +9 -0
  862. package/dist/modules/html-ui/src/jsx-runtime.js +121 -0
  863. package/dist/modules/html-ui/src/protocol.js +6 -0
  864. package/dist/modules/html-ui/src/ui-worker.js +10 -0
  865. package/dist/modules/mcp/src/index.js +62 -0
  866. package/dist/modules/movement-2d/src/grid-character.js +345 -0
  867. package/dist/modules/movement-2d/src/index.js +27 -0
  868. package/dist/modules/movement-3d/src/character-motor.js +166 -0
  869. package/dist/modules/movement-3d/src/index.js +27 -0
  870. package/dist/modules/native-osr/src/index.js +12 -0
  871. package/dist/modules/native-osr/src/input-router.js +335 -0
  872. package/dist/modules/native-osr/src/native-osr-manager.js +210 -0
  873. package/dist/modules/native-osr/src/native-texture-source.js +66 -0
  874. package/dist/modules/native-osr/src/types.js +8 -0
  875. package/dist/modules/native-osr/src/world-space-ui-pass.js +313 -0
  876. package/dist/modules/sailing/src/index.js +39 -0
  877. package/dist/modules/terrain/src/index.js +44 -0
  878. package/dist/modules/vitals/src/index.js +25 -0
  879. package/dist/modules/vitals/src/vitals.js +195 -0
  880. package/dist/modules/xr/src/camera-rig.js +119 -0
  881. package/dist/modules/xr/src/debug.js +45 -0
  882. package/dist/modules/xr/src/frame-loop.js +139 -0
  883. package/dist/modules/xr/src/index.js +10 -0
  884. package/dist/modules/xr/src/input.js +164 -0
  885. package/dist/modules/xr/src/layer.js +100 -0
  886. package/dist/modules/xr/src/session.js +133 -0
  887. package/dist/modules/xr/src/sim-module.js +21 -0
  888. package/dist/modules/xr/src/types.js +4 -0
  889. package/dist/modules/xr/src/webxr.d.ts +182 -0
  890. package/dist/modules/xr/src/xr-module.js +134 -0
  891. package/dist/shader-graph/src/chunks.js +340 -0
  892. package/dist/shader-graph/src/compiler.js +639 -0
  893. package/dist/shader-graph/src/compute-compiler.js +384 -0
  894. package/dist/shader-graph/src/compute-graph.js +55 -0
  895. package/dist/shader-graph/src/compute-profiles.js +39 -0
  896. package/dist/shader-graph/src/graph.js +38 -0
  897. package/dist/shader-graph/src/index.js +15 -0
  898. package/dist/shader-graph/src/profiles.js +305 -0
  899. package/dist/shader-graph/src/validator.js +42 -0
  900. package/dist/shader-graph/src/wgsl-binding-validator.js +110 -0
  901. package/dist/shader-graph/src/wgsl-struct-validator.js +222 -0
  902. package/dist/shader-graph/src/wgsl-struct.js +251 -0
  903. package/dist/test/src/index.js +1 -0
  904. package/dist/test/src/vision-test.js +228 -0
  905. package/libraries/asset-browser/src/software-thumbnails.ts +2 -2
  906. package/libraries/audio-kira/src/backend.ts +2 -1
  907. package/libraries/blitz-ui/native/src/shell.rs +35 -1
  908. package/libraries/blitz-ui/native-osr/Cargo.toml +8 -0
  909. package/libraries/blitz-ui/native-osr/src/lib.rs +213 -22
  910. package/libraries/blitz-ui/native-osr/src/mutate.rs +109 -14
  911. package/libraries/blitz-ui/src/native-osr-ffi.ts +71 -8
  912. package/libraries/blitz-ui/src/router.ts +3 -1
  913. package/libraries/blitz-ui/src/ui-blit-pass.ts +1 -1
  914. package/libraries/character/src/character-animator.ts +1 -1
  915. package/libraries/character/src/customization.ts +513 -0
  916. package/libraries/character/src/index.ts +6 -0
  917. package/libraries/character/src/inspectable.ts +111 -0
  918. package/libraries/character/src/loader.ts +38 -13
  919. package/libraries/character/src/locomotion.ts +13 -1
  920. package/libraries/character/src/preview.ts +94 -24
  921. package/libraries/devtools/README.md +16 -18
  922. package/libraries/devtools/src/backend.ts +505 -0
  923. package/libraries/devtools/src/cdp-bridge.ts +8 -8
  924. package/libraries/devtools/src/collectors.ts +41 -37
  925. package/libraries/devtools/src/index.ts +32 -14
  926. package/libraries/devtools/src/native-providers.ts +20 -12
  927. package/libraries/devtools/src/snapshot.ts +77 -0
  928. package/libraries/devtools/src/web/host.ts +11 -12
  929. package/libraries/devtools/src/web/mirror.ts +14 -405
  930. package/libraries/devtools/src/web/server.ts +4 -3
  931. package/libraries/entities/src/model-renderer.ts +96 -23
  932. package/libraries/gamepad/src/feed-input.ts +1 -1
  933. package/libraries/gamepad/src/hub.ts +2 -2
  934. package/libraries/gamepad/src/library.ts +2 -1
  935. package/libraries/gamepad/src/source-sab.ts +2 -2
  936. package/libraries/gamepad/src/sysfs-enrich.ts +2 -2
  937. package/libraries/gpu-kernels/src/kernel.ts +2 -2
  938. package/libraries/gpu-kernels/src/transpile.ts +1 -1
  939. package/libraries/html-ui-kit/src/nav/nav-controller.ts +1 -1
  940. package/libraries/html-ui-kit/src/nav/nav-input.ts +2 -2
  941. package/libraries/inspectable/src/index.ts +11 -0
  942. package/libraries/inspectable/src/inspectable.ts +277 -0
  943. package/libraries/marching-cubes/src/streaming-manager.ts +4 -4
  944. package/libraries/models/src/bind-unskinned-meshes.ts +131 -0
  945. package/libraries/models/src/index.ts +1 -0
  946. package/libraries/models/src/types.ts +22 -0
  947. package/libraries/networking/src/discovery.ts +8 -8
  948. package/libraries/persistence/src/autosave-manager.ts +1 -1
  949. package/libraries/persistence/src/binary-record-store.ts +1 -1
  950. package/libraries/persistence/src/file-save-store.ts +9 -9
  951. package/libraries/persistence/src/library.ts +1 -1
  952. package/libraries/persistence/src/opfs-save-store.ts +7 -7
  953. package/libraries/persistence/src/save-worker.ts +13 -14
  954. package/libraries/physics-rapier/src/ffi-lib.ts +2 -1
  955. package/libraries/physics-rapier/src/realm-worker-script.ts +1 -1
  956. package/libraries/postfx/src/post-process-stack.ts +1 -1
  957. package/libraries/sand/src/sand-step-pool.ts +5 -0
  958. package/libraries/water/src/water-renderer.ts +1 -1
  959. package/libraries/weatherfx/src/cloud-system.ts +3 -3
  960. package/mcp/README.md +20 -0
  961. package/mcp/src/client.ts +75 -22
  962. package/mcp/src/undo-redo.ts +2 -2
  963. package/modules/controller-ui/src/index.ts +1 -1
  964. package/modules/devtools/src/blitz/host.ts +430 -0
  965. package/modules/devtools/src/blitz/module.ts +101 -0
  966. package/modules/devtools/src/blitz/panels/console.ts +223 -0
  967. package/modules/devtools/src/blitz/panels/elements.ts +92 -0
  968. package/modules/devtools/src/blitz/panels/gpu.ts +70 -0
  969. package/modules/devtools/src/blitz/panels/performance.ts +120 -0
  970. package/modules/devtools/src/blitz/panels/snapshot.ts +152 -0
  971. package/modules/devtools/src/blitz/panels/types.ts +120 -0
  972. package/modules/devtools/src/blitz/theme.ts +168 -0
  973. package/modules/devtools/src/data-bridge.ts +1 -1
  974. package/modules/devtools/src/index.ts +6 -0
  975. package/modules/devtools/src/profiling-bridge.ts +17 -13
  976. package/modules/devtools/src/profiling-hooks.ts +22 -13
  977. package/modules/devtools/src/scene-inspector.ts +1 -1
  978. package/modules/devtools/src/worker-sync.ts +9 -1
  979. package/modules/editor/src/commands/registry.ts +2 -2
  980. package/modules/editor/src/module.ts +1 -1
  981. package/modules/html-ui/src/composite.ts +1 -1
  982. package/modules/html-ui/src/create-html-ui.ts +21 -9
  983. package/modules/html-ui/src/doc-backend.ts +189 -10
  984. package/modules/html-ui/src/host.ts +354 -40
  985. package/modules/html-ui/src/index.ts +1 -1
  986. package/modules/html-ui/src/jsx-runtime.ts +2 -2
  987. package/modules/html-ui/src/protocol.ts +53 -6
  988. package/modules/mcp/README.md +6 -0
  989. package/modules/mcp/src/index.ts +70 -3
  990. package/modules/movement-3d/src/character-motor.ts +83 -10
  991. package/package.json +838 -165
  992. package/shader-graph/README.md +25 -0
  993. package/test/README.md +16 -0
  994. package/libraries/blitz-ui/native-osr-spike.ts +0 -70
  995. package/libraries/devtools/native/Cargo.toml +0 -12
  996. package/libraries/devtools/native/src/lib.rs +0 -1646
  997. package/libraries/devtools/native/src/panels/console.rs +0 -338
  998. package/libraries/devtools/native/src/panels/dom_tree.rs +0 -47
  999. package/libraries/devtools/native/src/panels/generic.rs +0 -317
  1000. package/libraries/devtools/native/src/panels/gpu.rs +0 -107
  1001. package/libraries/devtools/native/src/panels/input.rs +0 -88
  1002. package/libraries/devtools/native/src/panels/mod.rs +0 -154
  1003. package/libraries/devtools/native/src/panels/perf_metrics.rs +0 -91
  1004. package/libraries/devtools/native/src/panels/perf_recorder.rs +0 -158
  1005. package/libraries/devtools/native/src/panels/scene.rs +0 -72
  1006. package/libraries/devtools/native/src/state.rs +0 -394
  1007. package/libraries/devtools/src/egui-ffi.ts +0 -804
  1008. package/libraries/devtools/src/egui-renderer.ts +0 -407
  1009. package/libraries/devtools/src/host.ts +0 -363
  1010. package/libraries/devtools/src/mirror.ts +0 -794
  1011. package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +0 -24
  1012. package/libraries/models/test-fixtures/fbx/README.md +0 -46
  1013. package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
  1014. package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
  1015. package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
  1016. package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
  1017. package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
  1018. package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
  1019. package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
  1020. package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
  1021. package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
  1022. package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
  1023. package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
  1024. package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
  1025. package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
  1026. package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
  1027. package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
  1028. package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
  1029. package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
  1030. package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
  1031. package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
  1032. package/libraries/physics-native/src/ffi-spike-worker.ts +0 -71
  1033. package/libraries/physics-rapier/bench/ffi-bench.ts +0 -79
  1034. package/libraries/physics-rapier/bench/wasm-baseline.ts +0 -90
@@ -267,7 +267,7 @@ export class InlineWasmPluginLoader implements PluginLoader {
267
267
  (subscriptions as any).__tickUnsub = unsub;
268
268
  }
269
269
 
270
- log.info("InlineWasmPluginLoader", `Loaded WASM plugin "${manifest.id}"`);
270
+ log.info("inline-wasm-plugin-loader", `Loaded WASM plugin "${manifest.id}"`);
271
271
 
272
272
  return () => {
273
273
  const unsubTick = (subscriptions as any).__tickUnsub;
@@ -319,7 +319,7 @@ export class WasmPluginLoader implements PluginLoader {
319
319
  });
320
320
 
321
321
  worker.onerror = (e) => {
322
- log.error("WasmPluginLoader", `worker error for "${manifest.id}": ${e.message}`);
322
+ log.error("wasm-plugin-loader", `worker error for "${manifest.id}": ${e.message}`);
323
323
  };
324
324
 
325
325
  // Send init message with the WASM URL.
@@ -395,7 +395,7 @@ export class WasmPluginLoader implements PluginLoader {
395
395
  });
396
396
 
397
397
  await ready;
398
- log.info("WasmPluginLoader", `Loaded WASM plugin "${manifest.id}" in dedicated worker`);
398
+ log.info("wasm-plugin-loader", `Loaded WASM plugin "${manifest.id}" in dedicated worker`);
399
399
 
400
400
  return () => {
401
401
  worker.postMessage({ __wasmDispose: true });
@@ -73,7 +73,7 @@ export class WorkerPluginLoader implements PluginLoader {
73
73
  // sim-thread worker-js plugins are loaded by the sim worker's own host
74
74
  // via direct dynamic import (not this loader). Renderer-side host skips.
75
75
  log.info(
76
- "WorkerPluginLoader",
76
+ "worker-plugin-loader",
77
77
  `plugin "${manifest.id}" thread=${manifest.thread} — skipping on this host (sim-side host loads it)`,
78
78
  );
79
79
  return;
@@ -71,8 +71,10 @@ export interface ModAssetExtension {
71
71
  kind: "mesh" | "texture" | "pbr-material" | "texture-pipeline";
72
72
  /** Logical asset id (namespaced, e.g. "my-mod:crate"). */
73
73
  id: string;
74
- /** Path to the file relative to the mod dir. */
75
- path: string;
74
+ /** Path to the file relative to the mod dir. Required for all kinds except
75
+ * "mesh" — a pathless mesh registers a procedural primitive prop whose
76
+ * shape/physics come entirely from the extension's meta fields. */
77
+ path?: string;
76
78
  /** pbr-material: descriptor fields (baseColor, metallic, roughness, texture refs). */
77
79
  /** texture-pipeline: pipeline descriptor. Extra fields are pass-through. */
78
80
  [key: string]: unknown;
@@ -561,7 +563,10 @@ function validateAssetExtension(a: unknown, i: number, errors: string[]): void {
561
563
  if (typeof ext.id !== "string" || !ext.id) {
562
564
  errors.push(`extensions.assets[${i}].id: required string`);
563
565
  }
564
- if (typeof ext.path !== "string" || !ext.path) {
566
+ // `path` is optional for mesh assets: a pathless mesh means "procedural
567
+ // primitive prop" (shape/physics meta only, no file). All other kinds
568
+ // still require a file path.
569
+ if (ext.kind !== "mesh" && (typeof ext.path !== "string" || !ext.path)) {
565
570
  errors.push(`extensions.assets[${i}].path: required string`);
566
571
  }
567
572
  }
@@ -78,18 +78,18 @@ export class WorkshopFetcher {
78
78
  try {
79
79
  rawManifest = await source.store.get(source.manifestKey);
80
80
  } catch (e) {
81
- log.error("WorkshopFetcher", `Failed to fetch workshop manifest: ${(e as Error).message}`);
81
+ log.error("workshop-fetcher", `Failed to fetch workshop manifest: ${(e as Error).message}`);
82
82
  continue;
83
83
  }
84
84
  let parsed: unknown;
85
85
  try {
86
86
  parsed = JSON.parse(new TextDecoder().decode(rawManifest));
87
87
  } catch (e) {
88
- log.error("WorkshopFetcher", `Workshop manifest is not valid JSON: ${(e as Error).message}`);
88
+ log.error("workshop-fetcher", `Workshop manifest is not valid JSON: ${(e as Error).message}`);
89
89
  continue;
90
90
  }
91
91
  if (!validateManifest(parsed)) {
92
- log.error("WorkshopFetcher", `Workshop manifest failed schema validation`);
92
+ log.error("workshop-fetcher", `Workshop manifest failed schema validation`);
93
93
  continue;
94
94
  }
95
95
  const assetManifest = parsed as AssetManifest;
@@ -8,7 +8,7 @@
8
8
  // SAB layout + reader/writer
9
9
  export {
10
10
  allocateProfilingSAB,
11
- claimSlot, computeProfilingSABLayout, fnv1a32, METRIC_CPU_PERCENT, METRIC_CUSTOM, METRIC_GC_PAUSE, METRIC_GPU_TIME, METRIC_HEAP_PERCENT, METRIC_HEAP_USAGE, METRIC_IOPS_LATENCY, METRIC_LONGTASK, METRIC_RAF_JITTER, METRIC_TASK_LATENCY, METRIC_TICK_LATENCY, PROFILING_IOPS_RING_CAP, PROFILING_MAGIC, PROFILING_MAX_SLOTS, PROFILING_STRING_MAX_LEN, PROFILING_STRING_TABLE_CAP, PROFILING_VERSION, PROFILING_WARNING_RING_CAP, ProfilingSABReader, ProfilingSABWriter, releaseSlot, RUNTIME_JS,
11
+ claimSlot, computeProfilingSABLayout, fnv1a32, METRIC_CPU_PERCENT, METRIC_CUSTOM, METRIC_GC_PAUSE, METRIC_GPU_TIME, METRIC_HEAP_PERCENT, METRIC_HEAP_USAGE, METRIC_IOPS_LATENCY, METRIC_LONGTASK, METRIC_RAF_JITTER, METRIC_TASK_LATENCY, METRIC_TICK_LATENCY, PROFILING_IOPS_RING_CAP, PROFILING_MAGIC, PROFILING_MAX_SLOTS, PROFILING_STRING_MAX_LEN, PROFILING_STRING_TABLE_CAP, PROFILING_VERSION, PROFILING_WARNING_RING_CAP, profilingLayoutFromSab, ProfilingSABReader, ProfilingSABWriter, releaseSlot, RUNTIME_JS,
12
12
  RUNTIME_QUICKJS,
13
13
  RUNTIME_WASM, SEVERITY_CRITICAL, SEVERITY_ERROR, SEVERITY_INFO,
14
14
  SEVERITY_WARN, STORE_IDB, STORE_OPFS
@@ -322,6 +322,25 @@ export function allocateProfilingSAB(
322
322
  return { sab, layout };
323
323
  }
324
324
 
325
+ /**
326
+ * Derive the SAB layout from a live buffer's header — readers should prefer
327
+ * this over computeProfilingSABLayout() defaults so they work regardless of
328
+ * the allocator's maxSlots. Returns null when the buffer isn't a valid
329
+ * ProfilingSAB. Ring/table caps aren't stored in the header — they must
330
+ * match the engine defaults (allocateProfilingSAB / ProfilingBridge use them).
331
+ */
332
+ export function profilingLayoutFromSab(sab: SharedArrayBuffer): ProfilingSABLayout | null {
333
+ if (sab.byteLength < HEADER_SIZE) return null;
334
+ const u32 = new Uint32Array(sab);
335
+ if (u32[HDR.MAGIC] !== PROFILING_MAGIC) return null;
336
+ const maxSlots = u32[HDR.MAX_SLOTS];
337
+ if (maxSlots <= 0 || maxSlots > 4096) return null;
338
+ const layout = computeProfilingSABLayout(maxSlots);
339
+ // Strict match: a custom ring/table cap shifts every slot offset — reading
340
+ // with the wrong layout produces garbage rather than a clean miss.
341
+ return layout.byteLength === sab.byteLength ? layout : null;
342
+ }
343
+
325
344
  // ─── ProfilingSABWriter (worker side) ───────────────────────────────────────
326
345
 
327
346
  /**
@@ -284,7 +284,7 @@ export class WarningEngine {
284
284
  cb(record, ctx);
285
285
  } catch (err) {
286
286
  // Don't let a callback error stop other callbacks
287
- log.error("WarningEngine", `callback error for rule "${rule.id}": ${err}`);
287
+ log.error("warning-engine", `callback error for rule "${rule.id}": ${err}`);
288
288
  }
289
289
  });
290
290
  }
@@ -2,7 +2,7 @@
2
2
  // Worker prelude — imported at the top of every instrumented worker.
3
3
  //
4
4
  // On load (worker realm only):
5
- // 1. Detects worker tag (from __ddThreadTag if set, else assigns auto-<n>).
5
+ // 1. Takes the worker tag passed by the host's attachProfilingSAB RPC.
6
6
  // 2. If a ProfilingSAB has been attached (via attachProfilingSAB called from
7
7
  // the host's init RPC), claims a slot, initializes ThreadMetricsWriter +
8
8
  // IopsRingWriter + worker-side WarningEngine + EventLoopMonitor.
@@ -143,7 +143,7 @@ export class BindlessFrameBindings {
143
143
  this.bindGroup = this.device.createBindGroup({ layout, entries });
144
144
  this.cachedLayoutVersion = layoutVersion;
145
145
  this.cachedBufferVersion = bufferVersion;
146
- log.debug("Bindless", `material bind group rebuilt (layout v${layoutVersion}, buffer v${bufferVersion})`);
146
+ log.debug("bindless", `material bind group rebuilt (layout v${layoutVersion}, buffer v${bufferVersion})`);
147
147
  return this.bindGroup;
148
148
  }
149
149
 
@@ -146,7 +146,7 @@ export class BindlessMaterialManager {
146
146
  /** Update an existing material's params in place (no reallocation). */
147
147
  updateMaterial(index: number, params: MaterialParams): void {
148
148
  if (index < 0 || index >= this.nextSlot) {
149
- log.warn("Bindless", `updateMaterial: index ${index} out of range (nextSlot=${this.nextSlot})`);
149
+ log.warn("bindless", `updateMaterial: index ${index} out of range (nextSlot=${this.nextSlot})`);
150
150
  return;
151
151
  }
152
152
  this.writeMaterial(index, params);
@@ -243,7 +243,7 @@ export class BindlessMaterialManager {
243
243
  this.backingU32 = new Uint32Array(newBacking.buffer);
244
244
  this.capacity = newCapacity;
245
245
  this.bufferVersion++;
246
- log.debug("Bindless", `material SSBO grew to capacity ${newCapacity}`);
246
+ log.debug("bindless", `material SSBO grew to capacity ${newCapacity}`);
247
247
  }
248
248
  }
249
249
 
@@ -190,7 +190,7 @@ export class BindlessTextureRegistry {
190
190
  const reg = b.sources.get(sourceId);
191
191
  if (!reg) continue;
192
192
  if (b.key.width !== bitmap.width || b.key.height !== bitmap.height) {
193
- log.warn("Bindless", `updateFromImageBitmap dimension mismatch for ${String(sourceId)}: bucket ${b.key.width}x${b.key.height} vs bitmap ${bitmap.width}x${bitmap.height}`);
193
+ log.warn("bindless", `updateFromImageBitmap dimension mismatch for ${String(sourceId)}: bucket ${b.key.width}x${b.key.height} vs bitmap ${bitmap.width}x${bitmap.height}`);
194
194
  return false;
195
195
  }
196
196
  this.copyImageBitmapIntoLayer(bitmap, b, reg.pageIndex, reg.layerIndex, b.key);
@@ -510,7 +510,7 @@ fn fs(@builtin(position) pos: vec4f) -> @location(0) vec4f {
510
510
 
511
511
  private appendPage(b: Bucket): void {
512
512
  if (b.pages.length >= this.maxPagesPerBucket) {
513
- log.error("Bindless", `bucket ${b.keyStr} exhausted maxPages=${this.maxPagesPerBucket}; texture registration failed`);
513
+ log.error("bindless", `bucket ${b.keyStr} exhausted maxPages=${this.maxPagesPerBucket}; texture registration failed`);
514
514
  throw new Error(`BindlessTextureRegistry: bucket ${b.keyStr} full (maxPages=${this.maxPagesPerBucket})`);
515
515
  }
516
516
  const tex = this.device.createTexture({
@@ -42,7 +42,7 @@ export class GPUDeviceManager {
42
42
 
43
43
  async requestDevice(): Promise<GPUDevice | null> {
44
44
  if (!navigator.gpu) {
45
- log.error("DownDraft", "WebGPU not available");
45
+ log.error("gpu", "WebGPU not available");
46
46
  return null;
47
47
  }
48
48
 
@@ -51,7 +51,7 @@ export class GPUDeviceManager {
51
51
  });
52
52
 
53
53
  if (!this.adapter) {
54
- log.error("DownDraft", "No suitable GPU adapter found");
54
+ log.error("gpu", "No suitable GPU adapter found");
55
55
  return null;
56
56
  }
57
57
 
@@ -67,12 +67,12 @@ export class GPUDeviceManager {
67
67
 
68
68
  this.device.lost.then((info: GPUDeviceLostInfo) => {
69
69
  this.deviceLost = true;
70
- log.error("DownDraft", `GPU device lost: ${info?.message ?? "unknown reason"}. Application should attempt recovery or notify the user.`);
70
+ log.error("gpu", `GPU device lost: ${info?.message ?? "unknown reason"}. Application should attempt recovery or notify the user.`);
71
71
  for (let i = 0; i < this.lostHandlers.length; i++) {
72
72
  try {
73
73
  this.lostHandlers[i](info);
74
74
  } catch (err) {
75
- log.error("DownDraft", `Device lost handler threw: ${err}`);
75
+ log.error("gpu", `Device lost handler threw: ${err}`);
76
76
  }
77
77
  }
78
78
  });
@@ -98,7 +98,7 @@ export class GPUDeviceManager {
98
98
  }
99
99
 
100
100
  async reinit(): Promise<GPUDevice | null> {
101
- log.warn("DownDraft", "Device lost — reinitializing GPU device. Pass-specific resources (pipelines, bind groups, textures) are NOT recreated and must be rebuilt by the application.");
101
+ log.warn("gpu", "Device lost — reinitializing GPU device. Pass-specific resources (pipelines, bind groups, textures) are NOT recreated and must be rebuilt by the application.");
102
102
  this.deviceLost = false;
103
103
  this.device = null;
104
104
  this.adapter = null;
@@ -722,7 +722,7 @@ export class FrameGraph {
722
722
  }
723
723
 
724
724
  if (result.length !== n) {
725
- log.error("FrameGraph", "Cycle detected in render graph, falling back to registration order");
725
+ log.error("frame-graph", "Cycle detected in render graph, falling back to registration order");
726
726
  return this.passes;
727
727
  }
728
728
 
@@ -745,7 +745,7 @@ export class FrameGraph {
745
745
  });
746
746
 
747
747
  if (errors.length > 0) {
748
- log.warn("FrameGraph", `Validation errors:\n${errors.join("\n")}`);
748
+ log.warn("frame-graph", `Validation errors:\n${errors.join("\n")}`);
749
749
  }
750
750
  }
751
751
 
@@ -52,11 +52,19 @@ export interface GameRendererLike {
52
52
  /** Render one frame on demand while the loop is stopped (or running). */
53
53
  renderOnce?(): void;
54
54
  getSurface?(): RenderSurface;
55
+ /** @deprecated Use getSurface — the surface is not necessarily a DOM canvas. */
55
56
  getCanvas?(): RenderSurface;
56
57
  getDevice?(): GPUDevice | null;
57
58
  getFormat?(): GPUTextureFormat;
58
59
  getFPS?(): number;
59
60
  useRendererModule?(module: RendererModule): void;
61
+ /**
62
+ * The renderer's module host, when the renderer supports renderer modules.
63
+ * `startGame()` uses it to wire EngineLibrary DI provides — renderers
64
+ * that omit it silently drop library-provided resources (a warning is
65
+ * logged when libraries are declared but no host exists).
66
+ */
67
+ getRendererModuleHost?(): RendererModuleHost | null;
60
68
  getWorkerHost?(): unknown;
61
69
  }
62
70
 
@@ -342,7 +350,7 @@ export class GameRenderer implements CanvasResizeHandler {
342
350
  // below).
343
351
  const adapter = borrowedAdapter ?? await this.requestAdapterWithFallback();
344
352
  if (!adapter && !borrowedDevice) {
345
- log.error("GameRenderer", "No GPU adapter found — check GPU drivers and /dev/dri permissions");
353
+ log.error("game-renderer", "No GPU adapter found — check GPU drivers and /dev/dri permissions");
346
354
  return false;
347
355
  }
348
356
  this.device = borrowedDevice ?? await this.requestDeviceFromAdapter(adapter!);
@@ -367,7 +375,7 @@ export class GameRenderer implements CanvasResizeHandler {
367
375
  this.format = navigator.gpu.getPreferredCanvasFormat();
368
376
  this.gpuProfiler = new GPUProfiler();
369
377
  this.gpuProfiler.init(this.device, adapterInfo, this.format, 32);
370
- log.info("GameRenderer", `GPU timer pool supported: ${this.gpuProfiler.isGpuTimerSupported()} features: ${Array.from(this.device.features).join(", ")}`);
378
+ log.debug("game-renderer", `GPU timer pool supported: ${this.gpuProfiler.isGpuTimerSupported()} features: ${Array.from(this.device.features).join(", ")}`);
371
379
 
372
380
  // Device lost handler
373
381
  this.device.lost.then((info: GPUDeviceLostInfo) => {
@@ -426,10 +434,10 @@ export class GameRenderer implements CanvasResizeHandler {
426
434
  // Initial viewport layout
427
435
  this.updateViewports(1);
428
436
 
429
- log.info("GameRenderer", "initialized");
437
+ log.info("game-renderer", "initialized");
430
438
  return true;
431
439
  } catch (err) {
432
- log.error("GameRenderer", `Init failed: ${err}`);
440
+ log.error("game-renderer", `Init failed: ${err}`);
433
441
  return false;
434
442
  }
435
443
  }
@@ -442,13 +450,13 @@ export class GameRenderer implements CanvasResizeHandler {
442
450
  powerPreference: "high-performance",
443
451
  });
444
452
  if (!adapter) {
445
- log.warn("GameRenderer", "No high-performance GPU adapter, trying low-power...");
453
+ log.warn("game-renderer", "No high-performance GPU adapter, trying low-power...");
446
454
  adapter = await navigator.gpu.requestAdapter({
447
455
  powerPreference: "low-power",
448
456
  });
449
457
  }
450
458
  if (!adapter) {
451
- log.warn("GameRenderer", "No low-power adapter, trying any...");
459
+ log.warn("game-renderer", "No low-power adapter, trying any...");
452
460
  adapter = await navigator.gpu.requestAdapter({});
453
461
  }
454
462
  return adapter;
@@ -471,9 +479,9 @@ export class GameRenderer implements CanvasResizeHandler {
471
479
  private handleDeviceLost(info: GPUDeviceLostInfo): void {
472
480
  if (this.deviceLost || this.recoveringDevice) return; // already handled
473
481
  this.deviceLost = true;
474
- log.error("GameRenderer", `WebGPU device lost: ${info?.reason ?? "unknown"} — ${info?.message ?? ""}`);
482
+ log.error("game-renderer", `WebGPU device lost: ${info?.reason ?? "unknown"} — ${info?.message ?? ""}`);
475
483
  try { this.callbacks.onDeviceLost?.(info); } catch (err) {
476
- log.error("GameRenderer", `onDeviceLost callback threw: ${err}`);
484
+ log.error("game-renderer", `onDeviceLost callback threw: ${err}`);
477
485
  }
478
486
 
479
487
  if (
@@ -516,7 +524,7 @@ export class GameRenderer implements CanvasResizeHandler {
516
524
  try { nativeWin.requestQuit?.(); } catch { /* best-effort */ }
517
525
  return;
518
526
  }
519
- log.warn("GameRenderer", "Attempting page reload for GPU recovery...");
527
+ log.warn("game-renderer", "Attempting page reload for GPU recovery...");
520
528
  window.location.reload();
521
529
  }, 2000);
522
530
  }
@@ -567,9 +575,9 @@ export class GameRenderer implements CanvasResizeHandler {
567
575
  await this.callbacks.onDeviceRecovered?.(device);
568
576
 
569
577
  this.deviceLost = false;
570
- log.warn("GameRenderer", "GPU device recovered — rendering resumed without reload");
578
+ log.warn("game-renderer", "GPU device recovered — rendering resumed without reload");
571
579
  } catch (err) {
572
- log.error("GameRenderer", `Device recovery failed: ${err}`);
580
+ log.error("game-renderer", `Device recovery failed: ${err}`);
573
581
  this.reloadForDeviceLoss();
574
582
  } finally {
575
583
  this.recoveringDevice = false;
@@ -606,7 +614,7 @@ export class GameRenderer implements CanvasResizeHandler {
606
614
  // an offscreen-render + upscale path to work here; for now it is a
607
615
  // no-op rather than a brick.
608
616
  if (this.resolutionScale < 1) {
609
- log.warn("GameRenderer", "resolutionScale is not supported on the native surface (swapchain must match the window size) — ignoring");
617
+ log.warn("game-renderer", "resolutionScale is not supported on the native surface (swapchain must match the window size) — ignoring");
610
618
  }
611
619
  }
612
620
  if (this.lastCssW > 0) this.onResize(this.lastCssW, this.lastCssH, this.lastRawDpr);
@@ -789,7 +797,7 @@ export class GameRenderer implements CanvasResizeHandler {
789
797
  try {
790
798
  this.renderFrame();
791
799
  } catch (err) {
792
- log.error("GameRenderer", `Render loop error: ${(err as Error).message}\n${(err as Error).stack}`);
800
+ log.error("game-renderer", `Render loop error: ${(err as Error).message}\n${(err as Error).stack}`);
793
801
  if (this.device?.lost) {
794
802
  this.device.lost.then((info: GPUDeviceLostInfo) => {
795
803
  this.handleDeviceLost(info);
@@ -904,6 +912,16 @@ export class GameRenderer implements CanvasResizeHandler {
904
912
  this.callbacks.afterViewports?.(dt, this.elapsedTime);
905
913
  this.rendererModuleHost?.dispatchFrame("afterViewports", dt, this.elapsedTime);
906
914
 
915
+ // Worker-produced passes (postPass → "preSubmit" slot on the native
916
+ // host's GpuPassMailbox) join this frame's submit batch — refs that
917
+ // arrived since the last drain execute after the owner's buffers.
918
+ // Stale-tolerant by design: a worker that misses the drain lands next
919
+ // frame instead of rendezvousing the render thread.
920
+ const passMailbox = getNativeHost()?.passMailbox;
921
+ if (passMailbox) {
922
+ frameCommandBuffers.push(...passMailbox.drain("preSubmit"));
923
+ }
924
+
907
925
  // Submit all command buffers for this frame in a single queue.submit() call
908
926
  if (frameCommandBuffers.length > 0) {
909
927
  this.device!.queue.submit(frameCommandBuffers);
@@ -972,7 +990,9 @@ export class GameRenderer implements CanvasResizeHandler {
972
990
  // the afterFrame callback, so drawing UI earlier would put it underneath
973
991
  // their clear pass.
974
992
  if (!gpuError && this.device && this.context) {
975
- const compositors = [...this.uiCompositors].filter((c) => c.hasContent());
993
+ const compositors = [...this.uiCompositors]
994
+ .filter((c) => c.hasContent())
995
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
976
996
  const uiCanvasView = compositors.length > 0
977
997
  ? this.getSurfaceTexture()?.createView()
978
998
  : undefined;
@@ -988,7 +1008,9 @@ export class GameRenderer implements CanvasResizeHandler {
988
1008
  });
989
1009
  compositors.forEach((c) => { c.render(uiPass, this.canvas.width, this.canvas.height); });
990
1010
  uiPass.end();
991
- this.device.queue.submit([uiEncoder.finish()]);
1011
+ // "preUi" slot — worker passes ordered ahead of the UI-composite
1012
+ // submit so their output is visible to the compositor this frame.
1013
+ this.device.queue.submit([...(passMailbox?.drain("preUi") ?? []), uiEncoder.finish()]);
992
1014
  }
993
1015
  }
994
1016
 
@@ -1000,7 +1022,7 @@ export class GameRenderer implements CanvasResizeHandler {
1000
1022
  }
1001
1023
 
1002
1024
  const __rfTotal = performance.now() - now;
1003
- if (this.config.debugTimingWarnings && __rfTotal > 20) log.warn("GameRenderer", `renderFrame took ${__rfTotal.toFixed(1)}ms`);
1025
+ if (this.config.debugTimingWarnings && __rfTotal > 20) log.warn("game-renderer", `renderFrame took ${__rfTotal.toFixed(1)}ms`);
1004
1026
  // NOTE: renderFrame() intentionally does NOT schedule the next frame —
1005
1027
  // render() owns the rAF chain so one-shot callers (renderOnce, MCP
1006
1028
  // screenshot capture) can't leak parallel loops.
@@ -1087,7 +1109,7 @@ export class GameRenderer implements CanvasResizeHandler {
1087
1109
  // window, transient failure) — skip this viewport's GPU work; game
1088
1110
  // callbacks already ran above and the loop stays alive for next frame.
1089
1111
  if (!colorView) return null;
1090
- if (this.config.debugTimingWarnings && __ctMs > 20) log.warn("GameRenderer", `getCurrentTexture took ${__ctMs.toFixed(1)}ms`);
1112
+ if (this.config.debugTimingWarnings && __ctMs > 20) log.warn("game-renderer", `getCurrentTexture took ${__ctMs.toFixed(1)}ms`);
1091
1113
 
1092
1114
  const depthView = xrProvider
1093
1115
  ? xrProvider.getDepthView(viewportIdx, origViewport.w, origViewport.h)
@@ -1292,7 +1314,9 @@ export class GameRenderer implements CanvasResizeHandler {
1292
1314
  * this helper only runs the compositors.
1293
1315
  */
1294
1316
  protected renderScreenUiCompositors(): void {
1295
- const compositors = [...this.uiCompositors].filter((c) => c.hasContent());
1317
+ const compositors = [...this.uiCompositors]
1318
+ .filter((c) => c.hasContent())
1319
+ .sort((a, b) => (a.order ?? 0) - (b.order ?? 0));
1296
1320
  if (compositors.length === 0 || !this.device || !this.context) return;
1297
1321
  const canvasView = this.getSurfaceTexture()?.createView();
1298
1322
  if (!canvasView) return;
@@ -200,7 +200,7 @@ export class MaterialHotReloader {
200
200
  this.pipelineCache.invalidate(material.pipelineKey);
201
201
  }
202
202
  } catch (e) {
203
- log.warn("HotReloader", `Failed to reload shader: ${path} ${e}`);
203
+ log.warn("hot-reloader", `Failed to reload shader: ${path} ${e}`);
204
204
  }
205
205
  }
206
206
 
@@ -214,7 +214,7 @@ export class MaterialHotReloader {
214
214
  onReload(result.meshes[0]);
215
215
  }
216
216
  } catch (e) {
217
- log.warn("HotReloader", `Failed to reload mesh: ${path} ${e}`);
217
+ log.warn("hot-reloader", `Failed to reload mesh: ${path} ${e}`);
218
218
  }
219
219
  }
220
220
 
@@ -243,7 +243,7 @@ export class MaterialHotReloader {
243
243
  );
244
244
  watched.onReload(gpuTexture);
245
245
  } catch (e) {
246
- log.warn("HotReloader", `Failed to reload texture: ${path} ${e}`);
246
+ log.warn("hot-reloader", `Failed to reload texture: ${path} ${e}`);
247
247
  }
248
248
  }
249
249
 
@@ -28,6 +28,7 @@ import type {
28
28
  ResizeHook,
29
29
  } from "../module/renderer-module";
30
30
  import type { RenderSurface } from "../platform/render-surface";
31
+ import { getNativeHost } from "../platform/runtime";
31
32
  import { createLogger } from "../util/logger";
32
33
  import type { CameraState } from "./camera";
33
34
  import type { FrameGraph, SlotRegistry } from "./frame-graph";
@@ -101,7 +102,11 @@ export class RendererModuleHost {
101
102
  private renderPassHooks: OwnedRenderPassHook[] = [];
102
103
 
103
104
  private cameraController: CameraControllerLike | null = null;
105
+ /** Name of the module that installed the current camera controller (for unload cleanup). */
106
+ private cameraControllerOwner: string | null = null;
104
107
  private viewportCameraProvider: ((viewportIdx: number, dt: number, elapsedTime: number) => CameraViewportInfo | null) | null = null;
108
+ /** Name of the module that installed the current viewport camera provider (for unload cleanup). */
109
+ private viewportCameraProviderOwner: string | null = null;
105
110
  private _devtools: ModuleDevToolsAPI | null = null;
106
111
 
107
112
  constructor(canvas: RenderSurface, callbacks: RendererModuleHostCallbacks) {
@@ -328,7 +333,7 @@ export class RendererModuleHost {
328
333
  try {
329
334
  active.disposeFns[i]();
330
335
  } catch (err) {
331
- log.error("RendererModuleHost", `Dispose error in plugin "${name}": ${err}`);
336
+ log.error("renderer-module-host", `Dispose error in plugin "${name}": ${err}`);
332
337
  }
333
338
  }
334
339
  // Remove this plugin's hooks.
@@ -338,11 +343,17 @@ export class RendererModuleHost {
338
343
  this.frameHooks.afterFrame = this.frameHooks.afterFrame.filter((h) => h.owner !== name);
339
344
  this.resizeHooks = this.resizeHooks.filter((h) => h.owner !== name);
340
345
  this.renderPassHooks = this.renderPassHooks.filter((h) => h.owner !== name);
341
- // If this plugin owned the camera controller, clear it.
342
- // (We can't tell who set it; clear conservatively if the plugin name
343
- // matches a convention. For now, leave the controller in place — a
344
- // well-behaved plugin should null it in its dispose fn. We also call
345
- // onDispose before clearing hooks, so the plugin's dispose fn can do it.)
346
+ // If this plugin owned the camera controller / viewport camera provider,
347
+ // clear it so a disposed object isn't invoked on the next frame. (If
348
+ // another plugin overwrote the slot later, its ownership is preserved.)
349
+ if (this.cameraControllerOwner === name) {
350
+ this.cameraController = null;
351
+ this.cameraControllerOwner = null;
352
+ }
353
+ if (this.viewportCameraProviderOwner === name) {
354
+ this.viewportCameraProvider = null;
355
+ this.viewportCameraProviderOwner = null;
356
+ }
346
357
  this.active.delete(name);
347
358
  this.plugins.delete(name);
348
359
  this.pending.delete(name);
@@ -356,6 +367,9 @@ export class RendererModuleHost {
356
367
  names.forEach((name) => { this.unloadModule(name);; });
357
368
  this.inputBus.destroy();
358
369
  this.cameraController = null;
370
+ this.cameraControllerOwner = null;
371
+ this.viewportCameraProvider = null;
372
+ this.viewportCameraProviderOwner = null;
359
373
  }
360
374
 
361
375
  // ── Getters ──
@@ -419,7 +433,7 @@ export class RendererModuleHost {
419
433
  try {
420
434
  hooks[i].fn(dt, elapsedTime);
421
435
  } catch (err) {
422
- log.error("RendererModuleHost", `Frame hook error (${phase}) in "${hooks[i].owner}": ${err}`);
436
+ log.error("renderer-module-host", `Frame hook error (${phase}) in "${hooks[i].owner}": ${err}`);
423
437
  }
424
438
  }
425
439
  }
@@ -429,7 +443,7 @@ export class RendererModuleHost {
429
443
  try {
430
444
  this.resizeHooks[i].fn(cssWidth, cssHeight, dpr);
431
445
  } catch (err) {
432
- log.error("RendererModuleHost", `Resize hook error in "${this.resizeHooks[i].owner}": ${err}`);
446
+ log.error("renderer-module-host", `Resize hook error in "${this.resizeHooks[i].owner}": ${err}`);
433
447
  }
434
448
  }
435
449
  this.cameraController?.setAspect(
@@ -447,7 +461,7 @@ export class RendererModuleHost {
447
461
  try {
448
462
  this.renderPassHooks[i].fn(passEncoder, camera, viewportIdx);
449
463
  } catch (err) {
450
- log.error("RendererModuleHost", `Render-pass hook error in "${this.renderPassHooks[i].owner}": ${err}`);
464
+ log.error("renderer-module-host", `Render-pass hook error in "${this.renderPassHooks[i].owner}": ${err}`);
451
465
  }
452
466
  }
453
467
  }
@@ -462,7 +476,7 @@ export class RendererModuleHost {
462
476
  try {
463
477
  return this.cameraController.getCameraState(viewportIdx);
464
478
  } catch (err) {
465
- log.error("RendererModuleHost", `Camera controller error: ${err}`);
479
+ log.error("renderer-module-host", `Camera controller error: ${err}`);
466
480
  return null;
467
481
  }
468
482
  }
@@ -478,7 +492,7 @@ export class RendererModuleHost {
478
492
  try {
479
493
  return this.viewportCameraProvider(viewportIdx, dt, elapsedTime);
480
494
  } catch (err) {
481
- log.error("RendererModuleHost", `Viewport camera provider error: ${err}`);
495
+ log.error("renderer-module-host", `Viewport camera provider error: ${err}`);
482
496
  return null;
483
497
  }
484
498
  }
@@ -538,6 +552,7 @@ export class RendererModuleHost {
538
552
  // ── Per-plugin context facade ──
539
553
 
540
554
  private makeContext(name: string, active: ActiveRendererModule): RendererModuleContext {
555
+ const devtoolsApi = () => this._devtools ?? NoopRendererDevToolsAPI;
541
556
  return {
542
557
  name,
543
558
 
@@ -554,6 +569,8 @@ export class RendererModuleHost {
554
569
  registerUiCompositor: this.callbacks.registerUiCompositor
555
570
  ? (c) => this.callbacks.registerUiCompositor!(c)
556
571
  : undefined,
572
+ // The mailbox lives on the native host — null on browser/standalone.
573
+ getGpuPassMailbox: () => getNativeHost()?.passMailbox ?? null,
557
574
 
558
575
  onFrame: (phase, fn) => {
559
576
  const entry: OwnedFrameHook = { owner: name, fn };
@@ -587,11 +604,13 @@ export class RendererModuleHost {
587
604
  // Only one active controller at a time. Last writer wins; a plugin
588
605
  // should null this in its dispose fn if it wants to release the slot.
589
606
  this.cameraController = controller;
607
+ this.cameraControllerOwner = controller ? name : null;
590
608
  },
591
609
  getCameraController: () => this.cameraController,
592
610
 
593
611
  setViewportCameraProvider: (provider) => {
594
612
  this.viewportCameraProvider = provider;
613
+ this.viewportCameraProviderOwner = provider ? name : null;
595
614
  },
596
615
 
597
616
  setViewportCount: (count) => this.callbacks.setViewportCount(count),
@@ -600,7 +619,8 @@ export class RendererModuleHost {
600
619
  setRenderTargetProvider: (provider) => this.callbacks.setRenderTargetProvider(provider),
601
620
  setRAFSource: (src, cancel) => this.callbacks.setRAFSource(src, cancel),
602
621
 
603
- devtools: this._devtools ?? NoopRendererDevToolsAPI,
622
+ // Lazy — the DevTools API may be injected after register() runs.
623
+ get devtools() { return devtoolsApi(); },
604
624
 
605
625
  provide: <T>(token: ResourceToken<T>, value: T) => this.provideResource(name, token, value, active),
606
626
  inject: <T>(token: ResourceToken<T>): T => this.injectResource(token),
@@ -76,17 +76,17 @@ function processCompilationInfo(
76
76
  const fullMsg = `[${label}] ${msg.message}${location}`;
77
77
 
78
78
  if (msg.type === "error") {
79
- log.fatal("Shader", fullMsg);
79
+ log.fatal("shader", fullMsg);
80
80
  errors.push(fullMsg);
81
81
  } else if (msg.type === "warning") {
82
- log.warn("Shader", fullMsg);
82
+ log.warn("shader", fullMsg);
83
83
  } else {
84
- log.debug("Shader", fullMsg);
84
+ log.debug("shader", fullMsg);
85
85
  }
86
86
  }
87
87
 
88
88
  if (suppressedCount > 0 && suppressedCount % SUPPRESS_THRESHOLD === 0) {
89
- log.warn("Shader", `[${label}] ${suppressedCount} duplicate shader messages suppressed`);
89
+ log.warn("shader", `[${label}] ${suppressedCount} duplicate shader messages suppressed`);
90
90
  }
91
91
  })
92
92
  .catch(() => {
@@ -145,12 +145,12 @@ export async function createValidatedShaderModuleAsync(
145
145
  const fullMsg = `[${label}] ${msg.message}${location}`;
146
146
 
147
147
  if (msg.type === "error") {
148
- log.fatal("Shader", fullMsg);
148
+ log.fatal("shader", fullMsg);
149
149
  errors.push(fullMsg);
150
150
  } else if (msg.type === "warning") {
151
- log.warn("Shader", fullMsg);
151
+ log.warn("shader", fullMsg);
152
152
  } else {
153
- log.debug("Shader", fullMsg);
153
+ log.debug("shader", fullMsg);
154
154
  }
155
155
  }
156
156