@downdraft/engine 0.0.0 → 0.1.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 (907) hide show
  1. package/app/src/index.ts +10 -0
  2. package/app/src/renderer/bootstrap.ts +271 -0
  3. package/app/src/renderer/downdraft-base.css +93 -0
  4. package/app/src/renderer/feature-log.ts +200 -0
  5. package/app/src/renderer/game-module.ts +923 -0
  6. package/app/src/renderer/hooks.ts +88 -0
  7. package/app/src/renderer/hot-reload.ts +178 -0
  8. package/app/src/renderer/import-cache.ts +88 -0
  9. package/app/src/renderer/index.ts +206 -0
  10. package/app/src/renderer/mcp-harness.ts +144 -0
  11. package/app/src/renderer/save-store-factory.ts +239 -0
  12. package/app/src/renderer/sim-bridge.ts +183 -0
  13. package/app/src/renderer/standard-automation-tools.ts +771 -0
  14. package/app/src/shared/feature-log.ts +71 -0
  15. package/app/src/shared/gpu-info.ts +82 -0
  16. package/app/src/shared/import-cache-store.ts +142 -0
  17. package/app/src/shared/index.ts +6 -0
  18. package/app/src/shared/mcp-discovery.ts +47 -0
  19. package/app/src/shared/mcp-proxy.ts +82 -0
  20. package/app/src/shared/types.ts +324 -0
  21. package/asset-bake/src/bake-audio.ts +119 -0
  22. package/asset-bake/src/bake-gltf.ts +172 -0
  23. package/asset-bake/src/bake.ts +78 -0
  24. package/asset-bake/src/cache.ts +188 -0
  25. package/asset-bake/src/config.ts +186 -0
  26. package/asset-bake/src/index.ts +36 -0
  27. package/core/src/animation/animation-event.ts +41 -0
  28. package/core/src/animation/bone-mask.ts +122 -0
  29. package/core/src/animation/clip.ts +252 -0
  30. package/core/src/animation/index.ts +22 -0
  31. package/core/src/animation/mixamo.ts +113 -0
  32. package/core/src/animation/morph-target.ts +69 -0
  33. package/core/src/animation/player.ts +697 -0
  34. package/core/src/animation/retarget.ts +158 -0
  35. package/core/src/animation/skeleton-animator.ts +1399 -0
  36. package/core/src/animation/skeleton.ts +214 -0
  37. package/core/src/animation/state-machine.ts +280 -0
  38. package/core/src/assets/blob-store.ts +66 -0
  39. package/core/src/assets/cache.ts +186 -0
  40. package/core/src/assets/cubemap-converter.ts +155 -0
  41. package/core/src/assets/environment-manager.ts +121 -0
  42. package/core/src/assets/import-cache.ts +65 -0
  43. package/core/src/assets/import-settings.ts +72 -0
  44. package/core/src/assets/importer.ts +108 -0
  45. package/core/src/assets/index.ts +74 -0
  46. package/core/src/assets/irradiance-generator.ts +198 -0
  47. package/core/src/assets/loader-audio.ts +86 -0
  48. package/core/src/assets/loader-cubemap.ts +211 -0
  49. package/core/src/assets/loader-dds.ts +236 -0
  50. package/core/src/assets/loader-hdr.ts +474 -0
  51. package/core/src/assets/loader-mesh.ts +143 -0
  52. package/core/src/assets/loader-shader.ts +73 -0
  53. package/core/src/assets/loader-texture.ts +349 -0
  54. package/core/src/assets/lod.ts +198 -0
  55. package/core/src/assets/manager.ts +480 -0
  56. package/core/src/assets/manifest.ts +81 -0
  57. package/core/src/assets/material-bridge.ts +186 -0
  58. package/core/src/assets/model-importer.ts +72 -0
  59. package/core/src/assets/model-normalizer.ts +248 -0
  60. package/core/src/assets/model-to-gpu.ts +70 -0
  61. package/core/src/assets/model-to-mesh.ts +237 -0
  62. package/core/src/assets/prefilter-generator.ts +250 -0
  63. package/core/src/audio/engine.ts +177 -0
  64. package/core/src/audio/interface.ts +130 -0
  65. package/core/src/audio/listener.ts +32 -0
  66. package/core/src/audio/mixer.ts +141 -0
  67. package/core/src/audio/registry.ts +52 -0
  68. package/core/src/audio/sab.ts +87 -0
  69. package/core/src/audio/source.ts +89 -0
  70. package/core/src/change-detection/atomics.ts +1 -0
  71. package/core/src/change-detection/tracker.ts +47 -0
  72. package/core/src/debug-draw/lines.ts +64 -0
  73. package/core/src/debug-draw/points.ts +17 -0
  74. package/core/src/debug-draw/queue.ts +124 -0
  75. package/core/src/debug-draw/text.ts +25 -0
  76. package/core/src/ecs/archetype.ts +323 -0
  77. package/core/src/ecs/component.ts +188 -0
  78. package/core/src/ecs/entity.ts +25 -0
  79. package/core/src/ecs/events.ts +93 -0
  80. package/core/src/ecs/hierarchy.ts +124 -0
  81. package/core/src/ecs/hmr-swap-registry.ts +22 -0
  82. package/core/src/ecs/index.ts +25 -0
  83. package/core/src/ecs/query.ts +141 -0
  84. package/core/src/ecs/resource.ts +8 -0
  85. package/core/src/ecs/schedule.ts +181 -0
  86. package/core/src/ecs/system-params.ts +99 -0
  87. package/core/src/ecs/system.ts +42 -0
  88. package/core/src/ecs/world.ts +348 -0
  89. package/core/src/index.ts +352 -0
  90. package/core/src/input/context.ts +73 -0
  91. package/core/src/input/dom-handler.ts +380 -0
  92. package/core/src/input/local-player-manager.ts +218 -0
  93. package/core/src/input/mapping.ts +40 -0
  94. package/core/src/input/multi-sab-bridge.ts +276 -0
  95. package/core/src/input/multi-state.ts +54 -0
  96. package/core/src/input/sab-bridge.ts +71 -0
  97. package/core/src/input/state.ts +132 -0
  98. package/core/src/input/ui-router.ts +87 -0
  99. package/core/src/library/host.ts +317 -0
  100. package/core/src/library/index.ts +16 -0
  101. package/core/src/library/library.ts +292 -0
  102. package/core/src/material/compiler.ts +80 -0
  103. package/core/src/material/graph-bridge.ts +172 -0
  104. package/core/src/material/index.ts +9 -0
  105. package/core/src/material/library.ts +442 -0
  106. package/core/src/material/material.ts +156 -0
  107. package/core/src/material/variants.ts +61 -0
  108. package/core/src/math/mat4.ts +202 -0
  109. package/core/src/math/perlin-noise-2d.ts +77 -0
  110. package/core/src/math/perlin-noise-3d.ts +110 -0
  111. package/core/src/math/quat.ts +33 -0
  112. package/core/src/math/rng.ts +29 -0
  113. package/core/src/math/trig.ts +47 -0
  114. package/core/src/math/value-noise.ts +67 -0
  115. package/core/src/mesh/builder.ts +177 -0
  116. package/core/src/mesh/csg.ts +312 -0
  117. package/core/src/mesh/greased-line.ts +145 -0
  118. package/core/src/mesh/mesh.ts +17 -0
  119. package/core/src/mesh/parametric.ts +501 -0
  120. package/core/src/mesh/skinning.ts +67 -0
  121. package/core/src/mesh/vertex-layout.ts +91 -0
  122. package/core/src/module/cross-thread.ts +163 -0
  123. package/core/src/module/diagnostics.ts +123 -0
  124. package/core/src/module/host.ts +451 -0
  125. package/core/src/module/index.ts +22 -0
  126. package/core/src/module/module.ts +109 -0
  127. package/core/src/module/registry.ts +94 -0
  128. package/core/src/module/renderer-module.ts +247 -0
  129. package/core/src/module/ts-loader.ts +26 -0
  130. package/core/src/particles/compute-pass.ts +378 -0
  131. package/core/src/particles/emitter.ts +156 -0
  132. package/core/src/particles/index.ts +11 -0
  133. package/core/src/particles/particle-data.ts +47 -0
  134. package/core/src/particles/render-pass.ts +365 -0
  135. package/core/src/particles/simulator.ts +264 -0
  136. package/core/src/particles/system.ts +193 -0
  137. package/core/src/physics/body.ts +59 -0
  138. package/core/src/physics/ccd-heuristic.ts +55 -0
  139. package/core/src/physics/character.ts +282 -0
  140. package/core/src/physics/collider.ts +55 -0
  141. package/core/src/physics/collision-system.ts +91 -0
  142. package/core/src/physics/events.ts +133 -0
  143. package/core/src/physics/index.ts +34 -0
  144. package/core/src/physics/interface.ts +473 -0
  145. package/core/src/physics/interpolation-buffer.ts +192 -0
  146. package/core/src/physics/lifecycle.ts +87 -0
  147. package/core/src/physics/load-shedder.ts +164 -0
  148. package/core/src/physics/physics-accumulator.ts +101 -0
  149. package/core/src/physics/physics-system.ts +240 -0
  150. package/core/src/physics/ragdoll-presets.ts +272 -0
  151. package/core/src/physics/ragdoll-system.ts +220 -0
  152. package/core/src/physics/ragdoll.ts +182 -0
  153. package/core/src/physics/raycast.ts +143 -0
  154. package/core/src/physics/realm-manager.ts +499 -0
  155. package/core/src/physics/realm-worker-pool.ts +191 -0
  156. package/core/src/physics/realm-worker.ts +102 -0
  157. package/core/src/physics/realm.ts +189 -0
  158. package/core/src/physics/registry.ts +52 -0
  159. package/core/src/physics/safety.ts +247 -0
  160. package/core/src/physics/snapshot-manager.ts +141 -0
  161. package/core/src/physics/worker-protocol.ts +30 -0
  162. package/core/src/platform/bun-preload.ts +169 -0
  163. package/core/src/platform/css-stub.ts +4 -0
  164. package/core/src/platform/glob-polyfill.ts +124 -0
  165. package/core/src/platform/hidpi.ts +57 -0
  166. package/core/src/platform/render-surface.ts +77 -0
  167. package/core/src/platform/rpc.ts +98 -0
  168. package/core/src/platform/runtime.ts +123 -0
  169. package/core/src/plugin/context.ts +364 -0
  170. package/core/src/plugin/diagnostics.ts +61 -0
  171. package/core/src/plugin/discovery.ts +186 -0
  172. package/core/src/plugin/extension-loaders.ts +172 -0
  173. package/core/src/plugin/host.ts +659 -0
  174. package/core/src/plugin/index.ts +106 -0
  175. package/core/src/plugin/loader-asset.ts +124 -0
  176. package/core/src/plugin/loader-quickjs.ts +84 -0
  177. package/core/src/plugin/loader-wasm.ts +411 -0
  178. package/core/src/plugin/loader-worker.ts +261 -0
  179. package/core/src/plugin/manifest.ts +653 -0
  180. package/core/src/plugin/material-registry.ts +65 -0
  181. package/core/src/plugin/mcp-tools.ts +165 -0
  182. package/core/src/plugin/permissions.ts +175 -0
  183. package/core/src/plugin/quickjs-bridge.ts +294 -0
  184. package/core/src/plugin/registry.ts +107 -0
  185. package/core/src/plugin/sandbox-shim.ts +86 -0
  186. package/core/src/plugin/sandbox-worker.ts +215 -0
  187. package/core/src/plugin/wasm-abi.ts +152 -0
  188. package/core/src/plugin/wasm-worker.ts +229 -0
  189. package/core/src/plugin/workshop.ts +169 -0
  190. package/core/src/profiling/event-loop.ts +180 -0
  191. package/core/src/profiling/index.ts +69 -0
  192. package/core/src/profiling/iops/idb-patch.ts +242 -0
  193. package/core/src/profiling/iops/opfs-patch.ts +276 -0
  194. package/core/src/profiling/profiling-sab.ts +839 -0
  195. package/core/src/profiling/task-latency.ts +134 -0
  196. package/core/src/profiling/thread-metrics.ts +126 -0
  197. package/core/src/profiling/trace-event-writer.ts +205 -0
  198. package/core/src/profiling/warnings.ts +423 -0
  199. package/core/src/profiling/worker-prelude.ts +376 -0
  200. package/core/src/render/bind-group.ts +38 -0
  201. package/core/src/render/bindless/bindless-struct.ts +42 -0
  202. package/core/src/render/bindless/bindless.wgsl.ts +167 -0
  203. package/core/src/render/bindless/frame-bindings.ts +176 -0
  204. package/core/src/render/bindless/index.ts +10 -0
  205. package/core/src/render/bindless/material-manager.ts +257 -0
  206. package/core/src/render/bindless/texture-registry.ts +609 -0
  207. package/core/src/render/buffer.ts +82 -0
  208. package/core/src/render/camera-2d.ts +217 -0
  209. package/core/src/render/camera-controller.ts +440 -0
  210. package/core/src/render/camera.ts +409 -0
  211. package/core/src/render/canvas-resize-watcher.ts +46 -0
  212. package/core/src/render/compute-kernel.ts +172 -0
  213. package/core/src/render/constants.ts +2 -0
  214. package/core/src/render/device.ts +111 -0
  215. package/core/src/render/frame-graph.ts +768 -0
  216. package/core/src/render/frustum.ts +185 -0
  217. package/core/src/render/fullscreen-vs.ts +25 -0
  218. package/core/src/render/g-buffer.ts +186 -0
  219. package/core/src/render/game-renderer.ts +1452 -0
  220. package/core/src/render/gpu-driven/cull-pass.ts +394 -0
  221. package/core/src/render/gpu-driven/hzb.ts +215 -0
  222. package/core/src/render/gpu-driven/index.ts +7 -0
  223. package/core/src/render/gpu-driven/indirect-draw-pass.ts +324 -0
  224. package/core/src/render/gpu-driven/instance-buffer.ts +178 -0
  225. package/core/src/render/gpu-driven/mesh-table.ts +175 -0
  226. package/core/src/render/gpu-driven/passes/hzb-build-pass.ts +47 -0
  227. package/core/src/render/gpu-utils.ts +96 -0
  228. package/core/src/render/hdr.ts +88 -0
  229. package/core/src/render/hot-reload.ts +295 -0
  230. package/core/src/render/ibl-bind-group.ts +266 -0
  231. package/core/src/render/ibl.ts +180 -0
  232. package/core/src/render/index.ts +163 -0
  233. package/core/src/render/input-manager.ts +259 -0
  234. package/core/src/render/lighting/area-light.ts +196 -0
  235. package/core/src/render/lighting/cluster-grid.ts +288 -0
  236. package/core/src/render/lighting/cluster-types.ts +193 -0
  237. package/core/src/render/lighting/ies-parser.ts +162 -0
  238. package/core/src/render/lighting.ts +454 -0
  239. package/core/src/render/material-types/depth.wgsl +44 -0
  240. package/core/src/render/material-types/line.wgsl +50 -0
  241. package/core/src/render/material-types/matcap.wgsl +51 -0
  242. package/core/src/render/material-types/normal.wgsl +41 -0
  243. package/core/src/render/material-types/physical.wgsl +152 -0
  244. package/core/src/render/material-types/sprite.wgsl +46 -0
  245. package/core/src/render/material-types/sss.wgsl +79 -0
  246. package/core/src/render/material-types/toon.wgsl +79 -0
  247. package/core/src/render/passes/README.md +121 -0
  248. package/core/src/render/passes/atmosphere.ts +152 -0
  249. package/core/src/render/passes/cluster-lighting-pass.ts +476 -0
  250. package/core/src/render/passes/csm.ts +408 -0
  251. package/core/src/render/passes/cubemap-capture.ts +114 -0
  252. package/core/src/render/passes/debug-viz.ts +278 -0
  253. package/core/src/render/passes/debug.ts +538 -0
  254. package/core/src/render/passes/decal-mesh.ts +111 -0
  255. package/core/src/render/passes/decal-pass.ts +377 -0
  256. package/core/src/render/passes/deferred-lighting.ts +434 -0
  257. package/core/src/render/passes/depth-prepass.ts +163 -0
  258. package/core/src/render/passes/dome-360.ts +83 -0
  259. package/core/src/render/passes/fluid-render.ts +137 -0
  260. package/core/src/render/passes/gi-types.ts +118 -0
  261. package/core/src/render/passes/graph-compute.ts +300 -0
  262. package/core/src/render/passes/greased-line-pass.ts +232 -0
  263. package/core/src/render/passes/morph-target.ts +40 -0
  264. package/core/src/render/passes/opaque.ts +1028 -0
  265. package/core/src/render/passes/point-light-shadow.ts +266 -0
  266. package/core/src/render/passes/procedural-texture.ts +185 -0
  267. package/core/src/render/passes/reflection-probe.ts +140 -0
  268. package/core/src/render/passes/rsm-pass.ts +248 -0
  269. package/core/src/render/passes/sdf-text.ts +155 -0
  270. package/core/src/render/passes/shadow-map.ts +163 -0
  271. package/core/src/render/passes/shadow.ts +220 -0
  272. package/core/src/render/passes/skinning-vs.ts +121 -0
  273. package/core/src/render/passes/skinning.ts +326 -0
  274. package/core/src/render/passes/sky-dome.ts +404 -0
  275. package/core/src/render/passes/skybox.ts +162 -0
  276. package/core/src/render/passes/spot-light-shadow.ts +273 -0
  277. package/core/src/render/passes/terrain.ts +326 -0
  278. package/core/src/render/passes/transparent.ts +353 -0
  279. package/core/src/render/passes/underwater-fog.ts +185 -0
  280. package/core/src/render/passes/video-texture.ts +79 -0
  281. package/core/src/render/passes/volumetric-pass.ts +312 -0
  282. package/core/src/render/passes/volumetric-types.ts +171 -0
  283. package/core/src/render/passes/water.ts +753 -0
  284. package/core/src/render/pbr.ts +296 -0
  285. package/core/src/render/pipeline.ts +52 -0
  286. package/core/src/render/render-pass.ts +30 -0
  287. package/core/src/render/renderer-input-bus.ts +220 -0
  288. package/core/src/render/renderer-module-host.ts +623 -0
  289. package/core/src/render/resource-tracker.ts +67 -0
  290. package/core/src/render/sab-canvas-overlay.ts +122 -0
  291. package/core/src/render/shader-validator.ts +200 -0
  292. package/core/src/render/shaders/debug/debug-line.wgsl +27 -0
  293. package/core/src/render/shaders/debug/debug-point.wgsl +30 -0
  294. package/core/src/render/shaders/debug/debug-text.wgsl +42 -0
  295. package/core/src/render/shaders/debug-viz/aabb.wgsl +20 -0
  296. package/core/src/render/shaders/debug-viz/depth.wgsl +29 -0
  297. package/core/src/render/shaders/debug-viz/lod.wgsl +38 -0
  298. package/core/src/render/shaders/debug-viz/normals.wgsl +30 -0
  299. package/core/src/render/shaders/debug-viz/overdraw.wgsl +21 -0
  300. package/core/src/render/shaders/debug-viz/tangents.wgsl +29 -0
  301. package/core/src/render/shaders/debug-viz/wireframe.wgsl +33 -0
  302. package/core/src/render/shaders/shadow-chunks.ts +135 -0
  303. package/core/src/render/skybox.ts +146 -0
  304. package/core/src/render/splitscreen.ts +85 -0
  305. package/core/src/render/surface.ts +78 -0
  306. package/core/src/render/tonemap.ts +180 -0
  307. package/core/src/render/tracked-render-pass.ts +158 -0
  308. package/core/src/render/viewport.ts +109 -0
  309. package/core/src/render/wgsl-hmr.ts +70 -0
  310. package/core/src/sab/core-input-channel.ts +23 -0
  311. package/core/src/sab/define.ts +239 -0
  312. package/core/src/sab/errors.ts +76 -0
  313. package/core/src/sab/game-input.ts +343 -0
  314. package/core/src/sab/gamepad-devices.ts +259 -0
  315. package/core/src/sab/grid-buffer.ts +117 -0
  316. package/core/src/sab/input.ts +55 -0
  317. package/core/src/sab/layout.ts +219 -0
  318. package/core/src/sab/multi-input-channel.ts +50 -0
  319. package/core/src/sab/record-buffer.ts +155 -0
  320. package/core/src/sab/sab-polyfill.ts +56 -0
  321. package/core/src/sab/sim-channel.ts +453 -0
  322. package/core/src/sab/slot-buffer.ts +190 -0
  323. package/core/src/sab/types.ts +158 -0
  324. package/core/src/safety/bounds.ts +76 -0
  325. package/core/src/safety/json.ts +80 -0
  326. package/core/src/safety/path.ts +167 -0
  327. package/core/src/save/binary-format.ts +117 -0
  328. package/core/src/save/game-save-system.ts +161 -0
  329. package/core/src/save/grid-save-system.ts +158 -0
  330. package/core/src/save/migrate.ts +44 -0
  331. package/core/src/save/migration-registry.ts +94 -0
  332. package/core/src/save/persist-types.ts +208 -0
  333. package/core/src/save/schema.ts +46 -0
  334. package/core/src/save/serializer.ts +180 -0
  335. package/core/src/scene/builder.ts +65 -0
  336. package/core/src/scene/camera.ts +142 -0
  337. package/core/src/scene/checkpoint.ts +109 -0
  338. package/core/src/scene/game-loop.ts +198 -0
  339. package/core/src/scene/index.ts +24 -0
  340. package/core/src/scene/layer.ts +6 -0
  341. package/core/src/scene/prefab.ts +145 -0
  342. package/core/src/scene/scene-manager.ts +157 -0
  343. package/core/src/scene/scene.ts +192 -0
  344. package/core/src/scene/sky.ts +256 -0
  345. package/core/src/scene/spatial-grid.ts +176 -0
  346. package/core/src/scene/streaming.ts +304 -0
  347. package/core/src/scene/vegetation.ts +163 -0
  348. package/core/src/scene/world.ts +89 -0
  349. package/core/src/scripting/binding.ts +129 -0
  350. package/core/src/scripting/hot-reload.ts +144 -0
  351. package/core/src/scripting/script.ts +99 -0
  352. package/core/src/sim/hot-reload-pipeline.ts +49 -0
  353. package/core/src/sim/sim-state-helper.ts +47 -0
  354. package/core/src/sim/transient-state-registry.ts +77 -0
  355. package/core/src/sim/types.ts +113 -0
  356. package/core/src/sim/worker-loop.ts +222 -0
  357. package/core/src/stores/game-store.ts +158 -0
  358. package/core/src/stores/hot-reload-store.ts +44 -0
  359. package/core/src/telemetry/collector.ts +410 -0
  360. package/core/src/telemetry/gc-controller.ts +453 -0
  361. package/core/src/telemetry/gc-profiler.ts +126 -0
  362. package/core/src/telemetry/gc-tracker.ts +69 -0
  363. package/core/src/telemetry/gpu-profiler.ts +703 -0
  364. package/core/src/telemetry/gpu-resource-tracker.ts +285 -0
  365. package/core/src/telemetry/gpu-timer-pool.ts +234 -0
  366. package/core/src/telemetry/gpu-timer.ts +123 -0
  367. package/core/src/telemetry/gpu-timestamp-gate.ts +21 -0
  368. package/core/src/telemetry/reporter.ts +62 -0
  369. package/core/src/types/engine-types.ts +129 -0
  370. package/core/src/ui-font-scale.ts +112 -0
  371. package/core/src/util/broad-phase-grid.ts +82 -0
  372. package/core/src/util/feature-log.ts +220 -0
  373. package/core/src/util/index.ts +17 -0
  374. package/core/src/util/logger.ts +604 -0
  375. package/core/src/webgpu-destroy-augmentation.d.ts +25 -0
  376. package/core/src/worker/base-worker-host.ts +183 -0
  377. package/core/src/worker/buffer-sync.ts +550 -0
  378. package/core/src/worker/crash-recovery.ts +201 -0
  379. package/core/src/worker/entity-sim-worker-host.ts +190 -0
  380. package/core/src/worker/instrumented-worker-host.ts +171 -0
  381. package/core/src/worker/rpc.ts +253 -0
  382. package/core/src/worker/sim-worker-base.ts +913 -0
  383. package/core/src/worker/sim-worker-host.ts +358 -0
  384. package/core/src/worker/task-pool.ts +256 -0
  385. package/core/src/worker/task-worker.ts +83 -0
  386. package/libraries/asset-browser/src/index.ts +11 -0
  387. package/libraries/asset-browser/src/software-thumbnails.ts +949 -0
  388. package/libraries/audio-kira/README.md +17 -0
  389. package/libraries/audio-kira/native/Cargo.toml +14 -0
  390. package/libraries/audio-kira/native/src/engine.rs +27 -0
  391. package/libraries/audio-kira/native/src/lib.rs +185 -0
  392. package/libraries/audio-kira/native/src/mixer.rs +11 -0
  393. package/libraries/audio-kira/native/src/source.rs +80 -0
  394. package/libraries/audio-kira/src/backend.ts +469 -0
  395. package/libraries/audio-kira/src/index.ts +8 -0
  396. package/libraries/audio-kira/src/library.ts +82 -0
  397. package/libraries/blitz-ui/native/Cargo.toml +33 -0
  398. package/libraries/blitz-ui/native/assets/DejaVuSans.woff2 +0 -0
  399. package/libraries/blitz-ui/native/src/bridge.rs +100 -0
  400. package/libraries/blitz-ui/native/src/fonts.rs +20 -0
  401. package/libraries/blitz-ui/native/src/input.rs +80 -0
  402. package/libraries/blitz-ui/native/src/lib.rs +96 -0
  403. package/libraries/blitz-ui/native/src/shell.rs +301 -0
  404. package/libraries/blitz-ui/native-osr/Cargo.toml +24 -0
  405. package/libraries/blitz-ui/native-osr/src/events.rs +237 -0
  406. package/libraries/blitz-ui/native-osr/src/lib.rs +846 -0
  407. package/libraries/blitz-ui/native-osr/src/mutate.rs +385 -0
  408. package/libraries/blitz-ui/native-osr/src/resources.rs +45 -0
  409. package/libraries/blitz-ui/native-osr-spike.ts +70 -0
  410. package/libraries/blitz-ui/src/index.ts +15 -0
  411. package/libraries/blitz-ui/src/native-module.ts +221 -0
  412. package/libraries/blitz-ui/src/native-osr-ffi.ts +423 -0
  413. package/libraries/blitz-ui/src/router.ts +101 -0
  414. package/libraries/blitz-ui/src/shaders/ui-blit.wgsl.ts +35 -0
  415. package/libraries/blitz-ui/src/ui-blit-pass.ts +116 -0
  416. package/libraries/character/README.md +25 -0
  417. package/libraries/character/src/character-animator.ts +374 -0
  418. package/libraries/character/src/index.ts +24 -0
  419. package/libraries/character/src/loader.ts +375 -0
  420. package/libraries/character/src/locomotion.ts +124 -0
  421. package/libraries/character/src/preview.ts +287 -0
  422. package/libraries/devtools/README.md +51 -0
  423. package/libraries/devtools/native/Cargo.toml +12 -0
  424. package/libraries/devtools/native/src/lib.rs +1646 -0
  425. package/libraries/devtools/native/src/panels/console.rs +338 -0
  426. package/libraries/devtools/native/src/panels/dom_tree.rs +47 -0
  427. package/libraries/devtools/native/src/panels/generic.rs +317 -0
  428. package/libraries/devtools/native/src/panels/gpu.rs +107 -0
  429. package/libraries/devtools/native/src/panels/input.rs +88 -0
  430. package/libraries/devtools/native/src/panels/mod.rs +154 -0
  431. package/libraries/devtools/native/src/panels/perf_metrics.rs +91 -0
  432. package/libraries/devtools/native/src/panels/perf_recorder.rs +158 -0
  433. package/libraries/devtools/native/src/panels/scene.rs +72 -0
  434. package/libraries/devtools/native/src/state.rs +394 -0
  435. package/libraries/devtools/src/cdp-bridge.ts +349 -0
  436. package/libraries/devtools/src/collectors.ts +346 -0
  437. package/libraries/devtools/src/egui-ffi.ts +804 -0
  438. package/libraries/devtools/src/egui-renderer.ts +407 -0
  439. package/libraries/devtools/src/host.ts +363 -0
  440. package/libraries/devtools/src/index.ts +40 -0
  441. package/libraries/devtools/src/mirror.ts +794 -0
  442. package/libraries/devtools/src/native-providers.ts +744 -0
  443. package/libraries/devtools/src/verify.ts +167 -0
  444. package/libraries/devtools/src/web/browser.ts +102 -0
  445. package/libraries/devtools/src/web/host.ts +212 -0
  446. package/libraries/devtools/src/web/mirror.ts +430 -0
  447. package/libraries/devtools/src/web/server.ts +198 -0
  448. package/libraries/entities/README.md +17 -0
  449. package/libraries/entities/src/index.ts +4 -0
  450. package/libraries/entities/src/library.ts +64 -0
  451. package/libraries/entities/src/model-renderer.ts +1345 -0
  452. package/libraries/entities/src/shaders/model.wgsl +375 -0
  453. package/libraries/gamepad/src/feed-input.ts +83 -0
  454. package/libraries/gamepad/src/filters.ts +49 -0
  455. package/libraries/gamepad/src/glyphs.ts +93 -0
  456. package/libraries/gamepad/src/hub.ts +206 -0
  457. package/libraries/gamepad/src/index.ts +22 -0
  458. package/libraries/gamepad/src/library.ts +68 -0
  459. package/libraries/gamepad/src/source-sab.ts +70 -0
  460. package/libraries/gamepad/src/sysfs-enrich.ts +138 -0
  461. package/libraries/gaussian-splats/README.md +25 -0
  462. package/libraries/gaussian-splats/src/gpu-sort.ts +595 -0
  463. package/libraries/gaussian-splats/src/index.ts +31 -0
  464. package/libraries/gaussian-splats/src/library.ts +60 -0
  465. package/libraries/gaussian-splats/src/parser.ts +382 -0
  466. package/libraries/gaussian-splats/src/renderer.ts +427 -0
  467. package/libraries/gaussian-splats/src/sh-eval.ts +211 -0
  468. package/libraries/gaussian-splats/src/sorter.ts +110 -0
  469. package/libraries/gaussian-splats/src/tile-raster.ts +473 -0
  470. package/libraries/gpu-kernels/README.md +154 -0
  471. package/libraries/gpu-kernels/src/index.ts +11 -0
  472. package/libraries/gpu-kernels/src/kernel.ts +696 -0
  473. package/libraries/gpu-kernels/src/transpile.ts +958 -0
  474. package/libraries/html-ui-kit/src/behaviors.ts +250 -0
  475. package/libraries/html-ui-kit/src/components.ts +309 -0
  476. package/libraries/html-ui-kit/src/index.ts +30 -0
  477. package/libraries/html-ui-kit/src/nav/nav-controller.ts +238 -0
  478. package/libraries/html-ui-kit/src/nav/nav-input.ts +145 -0
  479. package/libraries/html-ui-kit/src/nav/osk.ts +153 -0
  480. package/libraries/html-ui-kit/src/nav/router.ts +167 -0
  481. package/libraries/html-ui-kit/src/nav/vcursor.ts +203 -0
  482. package/libraries/html-ui-kit/src/ten-foot.ts +182 -0
  483. package/libraries/html-ui-kit/src/theme.ts +238 -0
  484. package/libraries/lighting/README.md +20 -0
  485. package/libraries/lighting/src/index.ts +5 -0
  486. package/libraries/lighting/src/library.ts +66 -0
  487. package/libraries/lighting/src/light-system.ts +452 -0
  488. package/libraries/lighting/src/lighting-system.ts +68 -0
  489. package/libraries/lighting/src/shaders/light-debug.wgsl +30 -0
  490. package/libraries/marching-cubes/README.md +25 -0
  491. package/libraries/marching-cubes/src/chunked-field.ts +177 -0
  492. package/libraries/marching-cubes/src/deformation.ts +63 -0
  493. package/libraries/marching-cubes/src/generator.ts +407 -0
  494. package/libraries/marching-cubes/src/index.ts +32 -0
  495. package/libraries/marching-cubes/src/library.ts +80 -0
  496. package/libraries/marching-cubes/src/lod.ts +122 -0
  497. package/libraries/marching-cubes/src/marching-tetrahedra.ts +252 -0
  498. package/libraries/marching-cubes/src/sab.ts +45 -0
  499. package/libraries/marching-cubes/src/streaming-config.ts +48 -0
  500. package/libraries/marching-cubes/src/streaming-manager.ts +686 -0
  501. package/libraries/marching-cubes/src/tables.ts +323 -0
  502. package/libraries/marching-cubes/src/types.ts +18 -0
  503. package/libraries/models/README.md +25 -0
  504. package/libraries/models/src/bake-node-transforms.ts +171 -0
  505. package/libraries/models/src/codecs/basisu-codec.ts +180 -0
  506. package/libraries/models/src/codecs/draco-codec.ts +372 -0
  507. package/libraries/models/src/codecs/draco3dgltf.d.ts +40 -0
  508. package/libraries/models/src/codecs/index.ts +22 -0
  509. package/libraries/models/src/codecs/meshopt-codec.ts +91 -0
  510. package/libraries/models/src/codecs/registry.ts +221 -0
  511. package/libraries/models/src/dae.ts +753 -0
  512. package/libraries/models/src/default-part-selection.ts +56 -0
  513. package/libraries/models/src/dxf.ts +200 -0
  514. package/libraries/models/src/fbx/index.ts +457 -0
  515. package/libraries/models/src/fbx/interpreter/animation.ts +431 -0
  516. package/libraries/models/src/fbx/interpreter/blend-shapes.ts +323 -0
  517. package/libraries/models/src/fbx/interpreter/connections.ts +166 -0
  518. package/libraries/models/src/fbx/interpreter/diagnostics.ts +65 -0
  519. package/libraries/models/src/fbx/interpreter/geometry.ts +535 -0
  520. package/libraries/models/src/fbx/interpreter/global-settings.ts +92 -0
  521. package/libraries/models/src/fbx/interpreter/materials.ts +265 -0
  522. package/libraries/models/src/fbx/interpreter/nodes.ts +197 -0
  523. package/libraries/models/src/fbx/interpreter/skeleton.ts +476 -0
  524. package/libraries/models/src/fbx/parsers/binary-parser.ts +244 -0
  525. package/libraries/models/src/fbx/types.ts +119 -0
  526. package/libraries/models/src/gltf-extensions.ts +196 -0
  527. package/libraries/models/src/gltf.ts +935 -0
  528. package/libraries/models/src/index.ts +87 -0
  529. package/libraries/models/src/library.ts +75 -0
  530. package/libraries/models/src/loader.ts +265 -0
  531. package/libraries/models/src/material-adapter.ts +108 -0
  532. package/libraries/models/src/mini-xml.ts +174 -0
  533. package/libraries/models/src/normalize.ts +216 -0
  534. package/libraries/models/src/obj.ts +264 -0
  535. package/libraries/models/src/off.ts +95 -0
  536. package/libraries/models/src/ply.ts +348 -0
  537. package/libraries/models/src/pose-sampler.ts +219 -0
  538. package/libraries/models/src/sidecar/blender-extras.ts +37 -0
  539. package/libraries/models/src/sidecar/ddmeta.ts +114 -0
  540. package/libraries/models/src/sidecar/godot-import.ts +86 -0
  541. package/libraries/models/src/sidecar/resolver.ts +145 -0
  542. package/libraries/models/src/sidecar/types.ts +11 -0
  543. package/libraries/models/src/sidecar/unity-meta.ts +61 -0
  544. package/libraries/models/src/skeleton-synthesis.ts +132 -0
  545. package/libraries/models/src/stl.ts +149 -0
  546. package/libraries/models/src/threeds.ts +363 -0
  547. package/libraries/models/src/threemf.ts +201 -0
  548. package/libraries/models/src/types.ts +188 -0
  549. package/libraries/models/src/vtk.ts +218 -0
  550. package/libraries/models/test-fixtures/fbx/LICENSE-notice.txt +24 -0
  551. package/libraries/models/test-fixtures/fbx/README.md +46 -0
  552. package/libraries/models/test-fixtures/fbx/m01_cube_phong.fbx +0 -0
  553. package/libraries/models/test-fixtures/fbx/m02_geo_ngons.fbx +0 -0
  554. package/libraries/models/test-fixtures/fbx/m03_normals.fbx +0 -0
  555. package/libraries/models/test-fixtures/fbx/m04_material_properties.fbx +0 -0
  556. package/libraries/models/test-fixtures/fbx/m05_external_diffuse.png +0 -0
  557. package/libraries/models/test-fixtures/fbx/m05_textures.fbx +0 -0
  558. package/libraries/models/test-fixtures/fbx/m06_uv_transform.fbx +0 -0
  559. package/libraries/models/test-fixtures/fbx/m07_multimaterial.fbx +0 -0
  560. package/libraries/models/test-fixtures/fbx/m08_transforms.fbx +0 -0
  561. package/libraries/models/test-fixtures/fbx/m09_skinning.fbx +0 -0
  562. package/libraries/models/test-fixtures/fbx/m10_morph.fbx +0 -0
  563. package/libraries/models/test-fixtures/fbx/m11_node_anim.fbx +0 -0
  564. package/libraries/models/test-fixtures/fbx/m12_skeletal_anim.fbx +0 -0
  565. package/libraries/models/test-fixtures/fbx/m13_morph_anim.fbx +0 -0
  566. package/libraries/models/test-fixtures/fbx/m14_multiclip.fbx +0 -0
  567. package/libraries/models/test-fixtures/fbx/m15_camera_lights.fbx +0 -0
  568. package/libraries/models/test-fixtures/fbx/m16_axis_yup.fbx +0 -0
  569. package/libraries/models/test-fixtures/fbx/m16_axis_zup.fbx +0 -0
  570. package/libraries/models/test-fixtures/fbx/m16_units_254.fbx +0 -0
  571. package/libraries/navmesh/README.md +23 -0
  572. package/libraries/navmesh/src/crowd-system.ts +240 -0
  573. package/libraries/navmesh/src/debug-viz.ts +74 -0
  574. package/libraries/navmesh/src/index.ts +15 -0
  575. package/libraries/navmesh/src/library.ts +64 -0
  576. package/libraries/navmesh/src/navmesh-generator.ts +407 -0
  577. package/libraries/navmesh/src/navmesh.ts +159 -0
  578. package/libraries/navmesh/src/pathfinder.ts +252 -0
  579. package/libraries/navmesh/src/types.ts +63 -0
  580. package/libraries/networking/README.md +25 -0
  581. package/libraries/networking/src/authority.ts +121 -0
  582. package/libraries/networking/src/connection.ts +139 -0
  583. package/libraries/networking/src/discovery.ts +373 -0
  584. package/libraries/networking/src/enhanced-replication.ts +355 -0
  585. package/libraries/networking/src/epic-adapter.ts +129 -0
  586. package/libraries/networking/src/index.ts +45 -0
  587. package/libraries/networking/src/library.ts +69 -0
  588. package/libraries/networking/src/lobby.ts +108 -0
  589. package/libraries/networking/src/platform-adapter.ts +163 -0
  590. package/libraries/networking/src/rcs-adapter.ts +127 -0
  591. package/libraries/networking/src/remote-input.ts +188 -0
  592. package/libraries/networking/src/replication.ts +327 -0
  593. package/libraries/networking/src/rpc.ts +188 -0
  594. package/libraries/networking/src/session.ts +173 -0
  595. package/libraries/networking/src/transport.ts +201 -0
  596. package/libraries/networking/src/webrtc.ts +323 -0
  597. package/libraries/pathfinding-2d/README.md +15 -0
  598. package/libraries/pathfinding-2d/src/astar-grid.ts +312 -0
  599. package/libraries/pathfinding-2d/src/index.ts +11 -0
  600. package/libraries/persistence/README.md +25 -0
  601. package/libraries/persistence/src/autosave-manager.ts +112 -0
  602. package/libraries/persistence/src/binary-record-store.ts +244 -0
  603. package/libraries/persistence/src/browser.ts +51 -0
  604. package/libraries/persistence/src/file-save-store.ts +553 -0
  605. package/libraries/persistence/src/hash-utils.ts +59 -0
  606. package/libraries/persistence/src/index.ts +57 -0
  607. package/libraries/persistence/src/library.ts +74 -0
  608. package/libraries/persistence/src/mock-opfs.ts +141 -0
  609. package/libraries/persistence/src/node-fs-directory-handle.ts +161 -0
  610. package/libraries/persistence/src/opfs-save-store.ts +745 -0
  611. package/libraries/persistence/src/save-worker-proxy.ts +127 -0
  612. package/libraries/persistence/src/save-worker.ts +99 -0
  613. package/libraries/persistence/src/xxh3-ts.d.ts +10 -0
  614. package/libraries/physics-native/README.md +21 -0
  615. package/libraries/physics-native/native/Cargo.toml +11 -0
  616. package/libraries/physics-native/native/src/body.rs +403 -0
  617. package/libraries/physics-native/native/src/character.rs +226 -0
  618. package/libraries/physics-native/native/src/collider.rs +299 -0
  619. package/libraries/physics-native/native/src/joint.rs +81 -0
  620. package/libraries/physics-native/native/src/lib.rs +830 -0
  621. package/libraries/physics-native/native/src/query.rs +261 -0
  622. package/libraries/physics-native/native/src/realm.rs +33 -0
  623. package/libraries/physics-native/native/src/step.rs +54 -0
  624. package/libraries/physics-native/native/src/world.rs +148 -0
  625. package/libraries/physics-native/src/backend.ts +1046 -0
  626. package/libraries/physics-native/src/broadphase.ts +101 -0
  627. package/libraries/physics-native/src/ffi-spike-worker.ts +71 -0
  628. package/libraries/physics-native/src/index.ts +11 -0
  629. package/libraries/physics-native/src/library.ts +79 -0
  630. package/libraries/physics-native/src/narrowphase-shapes.ts +420 -0
  631. package/libraries/physics-native/src/narrowphase.ts +123 -0
  632. package/libraries/physics-native/src/solver.ts +141 -0
  633. package/libraries/physics-native/src/types.ts +76 -0
  634. package/libraries/physics-rapier/README.md +21 -0
  635. package/libraries/physics-rapier/bench/ffi-bench.ts +79 -0
  636. package/libraries/physics-rapier/bench/wasm-baseline.ts +90 -0
  637. package/libraries/physics-rapier/src/api.ts +452 -0
  638. package/libraries/physics-rapier/src/auto-backend.ts +59 -0
  639. package/libraries/physics-rapier/src/backend.ts +1207 -0
  640. package/libraries/physics-rapier/src/bulk-ops.ts +68 -0
  641. package/libraries/physics-rapier/src/ffi-backend.ts +21 -0
  642. package/libraries/physics-rapier/src/ffi-lib.ts +597 -0
  643. package/libraries/physics-rapier/src/index.ts +12 -0
  644. package/libraries/physics-rapier/src/library.ts +107 -0
  645. package/libraries/physics-rapier/src/rapier-backend.ts +1052 -0
  646. package/libraries/physics-rapier/src/realm-worker-script.ts +237 -0
  647. package/libraries/postfx/README.md +17 -0
  648. package/libraries/postfx/src/index.ts +19 -0
  649. package/libraries/postfx/src/library.ts +337 -0
  650. package/libraries/postfx/src/post-process-stack.ts +1752 -0
  651. package/libraries/postfx/src/shaders/post-process/afterimage.wgsl +14 -0
  652. package/libraries/postfx/src/shaders/post-process/ascii.wgsl +24 -0
  653. package/libraries/postfx/src/shaders/post-process/blit.wgsl +12 -0
  654. package/libraries/postfx/src/shaders/post-process/bloom-blur.wgsl +21 -0
  655. package/libraries/postfx/src/shaders/post-process/bloom-bright.wgsl +15 -0
  656. package/libraries/postfx/src/shaders/post-process/bloom-composite.wgsl +14 -0
  657. package/libraries/postfx/src/shaders/post-process/bloom-downsample.wgsl +60 -0
  658. package/libraries/postfx/src/shaders/post-process/bloom-soft.wgsl +46 -0
  659. package/libraries/postfx/src/shaders/post-process/bloom-upsample.wgsl +51 -0
  660. package/libraries/postfx/src/shaders/post-process/channel-mixer.wgsl +36 -0
  661. package/libraries/postfx/src/shaders/post-process/chromatic-aberration.wgsl +37 -0
  662. package/libraries/postfx/src/shaders/post-process/dithering.wgsl +64 -0
  663. package/libraries/postfx/src/shaders/post-process/dof.wgsl +131 -0
  664. package/libraries/postfx/src/shaders/post-process/edges.wgsl +45 -0
  665. package/libraries/postfx/src/shaders/post-process/fullscreen-vs.wgsl +15 -0
  666. package/libraries/postfx/src/shaders/post-process/fxaa.wgsl +102 -0
  667. package/libraries/postfx/src/shaders/post-process/gaussian-blur.wgsl +37 -0
  668. package/libraries/postfx/src/shaders/post-process/glow-blur.wgsl +33 -0
  669. package/libraries/postfx/src/shaders/post-process/glow-composite.wgsl +25 -0
  670. package/libraries/postfx/src/shaders/post-process/grain.wgsl +37 -0
  671. package/libraries/postfx/src/shaders/post-process/halftone.wgsl +80 -0
  672. package/libraries/postfx/src/shaders/post-process/highlight-blur.wgsl +33 -0
  673. package/libraries/postfx/src/shaders/post-process/highlight-composite.wgsl +32 -0
  674. package/libraries/postfx/src/shaders/post-process/lens-distortion.wgsl +43 -0
  675. package/libraries/postfx/src/shaders/post-process/lens-flare.wgsl +68 -0
  676. package/libraries/postfx/src/shaders/post-process/lut.wgsl +30 -0
  677. package/libraries/postfx/src/shaders/post-process/motion-blur.wgsl +55 -0
  678. package/libraries/postfx/src/shaders/post-process/occluder-chunk.wgsl +28 -0
  679. package/libraries/postfx/src/shaders/post-process/outline.wgsl +51 -0
  680. package/libraries/postfx/src/shaders/post-process/pixelation.wgsl +47 -0
  681. package/libraries/postfx/src/shaders/post-process/sharpen.wgsl +32 -0
  682. package/libraries/postfx/src/shaders/post-process/sobel.wgsl +26 -0
  683. package/libraries/postfx/src/shaders/post-process/split-tone.wgsl +36 -0
  684. package/libraries/postfx/src/shaders/post-process/ssao-blur.wgsl +38 -0
  685. package/libraries/postfx/src/shaders/post-process/ssao-composite.wgsl +25 -0
  686. package/libraries/postfx/src/shaders/post-process/ssao.wgsl +147 -0
  687. package/libraries/postfx/src/shaders/post-process/ssr.wgsl +155 -0
  688. package/libraries/postfx/src/shaders/post-process/taa.wgsl +98 -0
  689. package/libraries/postfx/src/shaders/post-process/tonemap.wgsl +40 -0
  690. package/libraries/postfx/src/shaders/post-process/watercolor.wgsl +82 -0
  691. package/libraries/postfx/src/shaders/post-process/white-balance.wgsl +41 -0
  692. package/libraries/recast/README.md +21 -0
  693. package/libraries/recast/src/backend.ts +150 -0
  694. package/libraries/recast/src/crowd-system.ts +352 -0
  695. package/libraries/recast/src/index.ts +12 -0
  696. package/libraries/recast/src/library.ts +91 -0
  697. package/libraries/recast/src/types.ts +86 -0
  698. package/libraries/sand/README.md +25 -0
  699. package/libraries/sand/src/cell.ts +43 -0
  700. package/libraries/sand/src/fields.ts +29 -0
  701. package/libraries/sand/src/fluid-grid.ts +261 -0
  702. package/libraries/sand/src/grid-dims.ts +74 -0
  703. package/libraries/sand/src/grid-sim-buffer.ts +271 -0
  704. package/libraries/sand/src/index.ts +81 -0
  705. package/libraries/sand/src/library.ts +92 -0
  706. package/libraries/sand/src/materials.ts +492 -0
  707. package/libraries/sand/src/palette.ts +93 -0
  708. package/libraries/sand/src/particles.ts +185 -0
  709. package/libraries/sand/src/render/sand-grid-pass.ts +430 -0
  710. package/libraries/sand/src/rng.ts +51 -0
  711. package/libraries/sand/src/rules/builtin-rules.ts +132 -0
  712. package/libraries/sand/src/rules/rule-compiler.ts +162 -0
  713. package/libraries/sand/src/rules/rule-engine.ts +231 -0
  714. package/libraries/sand/src/rules/rule-types.ts +87 -0
  715. package/libraries/sand/src/sand-step-pool.ts +484 -0
  716. package/libraries/sand/src/sand-step-worker.ts +97 -0
  717. package/libraries/sand/src/sand-world.ts +3227 -0
  718. package/libraries/stickman/README.md +25 -0
  719. package/libraries/stickman/src/index.ts +25 -0
  720. package/libraries/stickman/src/library.ts +61 -0
  721. package/libraries/stickman/src/proportions.ts +45 -0
  722. package/libraries/stickman/src/shader.ts +117 -0
  723. package/libraries/stickman/src/skeleton.ts +197 -0
  724. package/libraries/stickman/src/stickman-pass.ts +255 -0
  725. package/libraries/stickman/src/thick-line.ts +123 -0
  726. package/libraries/surface-nets/README.md +25 -0
  727. package/libraries/surface-nets/src/chunked-field.ts +14 -0
  728. package/libraries/surface-nets/src/deformation.ts +45 -0
  729. package/libraries/surface-nets/src/index.ts +36 -0
  730. package/libraries/surface-nets/src/library.ts +59 -0
  731. package/libraries/surface-nets/src/lod.ts +7 -0
  732. package/libraries/surface-nets/src/sab.ts +4 -0
  733. package/libraries/surface-nets/src/streaming-config.ts +5 -0
  734. package/libraries/surface-nets/src/streaming-manager.ts +15 -0
  735. package/libraries/surface-nets/src/surface-nets.ts +334 -0
  736. package/libraries/surface-nets/src/types.ts +23 -0
  737. package/libraries/water/README.md +25 -0
  738. package/libraries/water/src/buoyancy.ts +103 -0
  739. package/libraries/water/src/index.ts +43 -0
  740. package/libraries/water/src/library.ts +85 -0
  741. package/libraries/water/src/shore-damping.ts +93 -0
  742. package/libraries/water/src/water-buffer.ts +89 -0
  743. package/libraries/water/src/water-chunks.ts +13 -0
  744. package/libraries/water/src/water-physics.ts +376 -0
  745. package/libraries/water/src/water-renderer.ts +809 -0
  746. package/libraries/water/src/water-sab.ts +161 -0
  747. package/libraries/water/src/wave-sources.ts +84 -0
  748. package/libraries/weather/README.md +20 -0
  749. package/libraries/weather/src/index.ts +9 -0
  750. package/libraries/weather/src/library.ts +72 -0
  751. package/libraries/weather/src/types.ts +64 -0
  752. package/libraries/weather/src/weather-blend.ts +112 -0
  753. package/libraries/weather/src/weather-system.ts +271 -0
  754. package/libraries/weatherfx/README.md +24 -0
  755. package/libraries/weatherfx/src/cloud-provider.ts +31 -0
  756. package/libraries/weatherfx/src/cloud-system.ts +372 -0
  757. package/libraries/weatherfx/src/index.ts +9 -0
  758. package/libraries/weatherfx/src/library.ts +58 -0
  759. package/libraries/weatherfx/src/particle-system.ts +434 -0
  760. package/libraries/weatherfx/src/shaders/cloud.wgsl +111 -0
  761. package/libraries/weatherfx/src/shaders/particle-compute.wgsl +187 -0
  762. package/libraries/weatherfx/src/shaders/particle-render.wgsl +95 -0
  763. package/lint-plugin.mjs +41 -0
  764. package/mcp/src/client.ts +703 -0
  765. package/mcp/src/engine-context.ts +186 -0
  766. package/mcp/src/http-transport.ts +471 -0
  767. package/mcp/src/index.ts +13 -0
  768. package/mcp/src/prompts/add-entity.ts +42 -0
  769. package/mcp/src/prompts/create-scene.ts +44 -0
  770. package/mcp/src/prompts/debug-frame.ts +39 -0
  771. package/mcp/src/prompts/index.ts +12 -0
  772. package/mcp/src/resources/asset-list.ts +32 -0
  773. package/mcp/src/resources/checkpoint-list.ts +33 -0
  774. package/mcp/src/resources/entity-state.ts +55 -0
  775. package/mcp/src/resources/gpu-info.ts +103 -0
  776. package/mcp/src/resources/index.ts +57 -0
  777. package/mcp/src/resources/performance.ts +37 -0
  778. package/mcp/src/resources/scene-tree.ts +43 -0
  779. package/mcp/src/server.ts +375 -0
  780. package/mcp/src/tools/animation.ts +118 -0
  781. package/mcp/src/tools/asset.ts +161 -0
  782. package/mcp/src/tools/audio.ts +96 -0
  783. package/mcp/src/tools/build.ts +143 -0
  784. package/mcp/src/tools/camera.ts +167 -0
  785. package/mcp/src/tools/checkpoint.ts +100 -0
  786. package/mcp/src/tools/component.ts +199 -0
  787. package/mcp/src/tools/debug.ts +300 -0
  788. package/mcp/src/tools/entity.ts +361 -0
  789. package/mcp/src/tools/inspect.ts +210 -0
  790. package/mcp/src/tools/lighting.ts +263 -0
  791. package/mcp/src/tools/material.ts +243 -0
  792. package/mcp/src/tools/mesh.ts +239 -0
  793. package/mcp/src/tools/physics.ts +266 -0
  794. package/mcp/src/tools/scene.ts +153 -0
  795. package/mcp/src/tools/script.ts +122 -0
  796. package/mcp/src/types.ts +92 -0
  797. package/mcp/src/undo-redo.ts +77 -0
  798. package/modules/camera-controls/README.md +20 -0
  799. package/modules/camera-controls/src/index.ts +161 -0
  800. package/modules/controller-ui/src/index.ts +164 -0
  801. package/modules/devtools/README.md +25 -0
  802. package/modules/devtools/src/api.ts +461 -0
  803. package/modules/devtools/src/asset-utils.ts +105 -0
  804. package/modules/devtools/src/bind-debug-store.ts +48 -0
  805. package/modules/devtools/src/data-bridge.ts +286 -0
  806. package/modules/devtools/src/debug-overlay.ts +238 -0
  807. package/modules/devtools/src/debug-raycast.ts +328 -0
  808. package/modules/devtools/src/debug-store.ts +92 -0
  809. package/modules/devtools/src/debug-view-descriptors.ts +59 -0
  810. package/modules/devtools/src/doctor-panel.ts +182 -0
  811. package/modules/devtools/src/gizmo-module.ts +136 -0
  812. package/modules/devtools/src/graph-model.ts +509 -0
  813. package/modules/devtools/src/grid-renderer.ts +157 -0
  814. package/modules/devtools/src/height-ruler-renderer.ts +216 -0
  815. package/modules/devtools/src/index.ts +81 -0
  816. package/modules/devtools/src/init.ts +261 -0
  817. package/modules/devtools/src/label-overlay.ts +154 -0
  818. package/modules/devtools/src/material-stats-panel.ts +188 -0
  819. package/modules/devtools/src/profiling-bridge.ts +377 -0
  820. package/modules/devtools/src/profiling-hooks.ts +98 -0
  821. package/modules/devtools/src/renderer-adapter.ts +76 -0
  822. package/modules/devtools/src/scene-inspector.ts +637 -0
  823. package/modules/devtools/src/scene-store.ts +320 -0
  824. package/modules/devtools/src/scene-sync.ts +116 -0
  825. package/modules/devtools/src/shaders/transform-gizmo.wgsl +38 -0
  826. package/modules/devtools/src/sim-stats-panel.ts +272 -0
  827. package/modules/devtools/src/sim-stats-provider.ts +105 -0
  828. package/modules/devtools/src/skeleton-renderer.ts +351 -0
  829. package/modules/devtools/src/transform-gizmo.ts +928 -0
  830. package/modules/devtools/src/types.ts +290 -0
  831. package/modules/devtools/src/worker-expose.ts +67 -0
  832. package/modules/devtools/src/worker-sync.ts +137 -0
  833. package/modules/editor/src/commands/component.ts +156 -0
  834. package/modules/editor/src/commands/entity.ts +287 -0
  835. package/modules/editor/src/commands/hierarchy.ts +83 -0
  836. package/modules/editor/src/commands/index.ts +61 -0
  837. package/modules/editor/src/commands/prefab.ts +163 -0
  838. package/modules/editor/src/commands/registry.ts +331 -0
  839. package/modules/editor/src/commands/scene-io.ts +211 -0
  840. package/modules/editor/src/commands/selection.ts +73 -0
  841. package/modules/editor/src/commands/transform.ts +91 -0
  842. package/modules/editor/src/ddscene.ts +267 -0
  843. package/modules/editor/src/document.ts +123 -0
  844. package/modules/editor/src/editor-context.ts +172 -0
  845. package/modules/editor/src/index.ts +41 -0
  846. package/modules/editor/src/mcp.ts +103 -0
  847. package/modules/editor/src/module.ts +148 -0
  848. package/modules/editor/src/selection.ts +70 -0
  849. package/modules/editor/src/shell.ts +456 -0
  850. package/modules/editor/src/viewport.ts +199 -0
  851. package/modules/html-ui/src/composite.ts +135 -0
  852. package/modules/html-ui/src/create-html-ui.ts +188 -0
  853. package/modules/html-ui/src/doc-backend.ts +343 -0
  854. package/modules/html-ui/src/host.ts +646 -0
  855. package/modules/html-ui/src/index.ts +13 -0
  856. package/modules/html-ui/src/jsx-dev-runtime.ts +12 -0
  857. package/modules/html-ui/src/jsx-runtime.ts +126 -0
  858. package/modules/html-ui/src/protocol.ts +88 -0
  859. package/modules/html-ui/src/ui-worker.ts +16 -0
  860. package/modules/mcp/README.md +18 -0
  861. package/modules/mcp/src/index.ts +27 -0
  862. package/modules/movement-2d/README.md +19 -0
  863. package/modules/movement-2d/src/grid-character.ts +455 -0
  864. package/modules/movement-2d/src/index.ts +45 -0
  865. package/modules/movement-3d/README.md +21 -0
  866. package/modules/movement-3d/src/character-motor.ts +230 -0
  867. package/modules/movement-3d/src/index.ts +46 -0
  868. package/modules/native-osr/src/index.ts +22 -0
  869. package/modules/native-osr/src/input-router.ts +401 -0
  870. package/modules/native-osr/src/native-osr-manager.ts +247 -0
  871. package/modules/native-osr/src/native-texture-source.ts +86 -0
  872. package/modules/native-osr/src/types.ts +112 -0
  873. package/modules/native-osr/src/world-space-ui-pass.ts +351 -0
  874. package/modules/sailing/README.md +18 -0
  875. package/modules/sailing/src/index.ts +51 -0
  876. package/modules/terrain/README.md +18 -0
  877. package/modules/terrain/src/index.ts +78 -0
  878. package/modules/vitals/README.md +17 -0
  879. package/modules/vitals/src/index.ts +43 -0
  880. package/modules/vitals/src/vitals.ts +265 -0
  881. package/modules/xr/README.md +25 -0
  882. package/modules/xr/src/camera-rig.ts +146 -0
  883. package/modules/xr/src/debug.ts +59 -0
  884. package/modules/xr/src/frame-loop.ts +197 -0
  885. package/modules/xr/src/index.ts +16 -0
  886. package/modules/xr/src/input.ts +208 -0
  887. package/modules/xr/src/layer.ts +140 -0
  888. package/modules/xr/src/session.ts +156 -0
  889. package/modules/xr/src/sim-module.ts +23 -0
  890. package/modules/xr/src/types.ts +32 -0
  891. package/modules/xr/src/webxr.d.ts +182 -0
  892. package/modules/xr/src/xr-module.ts +179 -0
  893. package/package.json +232 -3
  894. package/shader-graph/src/chunks.ts +349 -0
  895. package/shader-graph/src/compiler.ts +732 -0
  896. package/shader-graph/src/compute-compiler.ts +453 -0
  897. package/shader-graph/src/compute-graph.ts +112 -0
  898. package/shader-graph/src/compute-profiles.ts +54 -0
  899. package/shader-graph/src/graph.ts +52 -0
  900. package/shader-graph/src/index.ts +53 -0
  901. package/shader-graph/src/profiles.ts +407 -0
  902. package/shader-graph/src/validator.ts +48 -0
  903. package/shader-graph/src/wgsl-binding-validator.ts +143 -0
  904. package/shader-graph/src/wgsl-struct-validator.ts +245 -0
  905. package/shader-graph/src/wgsl-struct.ts +397 -0
  906. package/test/src/index.ts +7 -0
  907. package/test/src/vision-test.ts +369 -0
@@ -0,0 +1,82 @@
1
+ // wgsl-validate: prelude ./fullscreen-vs.wgsl
2
+ // wgsl-validate: prelude ./occluder-chunk.wgsl
3
+ // Watercolor — stylized edge-aware smoothing + paper texture blend.
4
+ // Combines a soft bilateral-like smoothing with edge enhancement and a
5
+ // subtle paper grain overlay for a hand-painted watercolor look.
6
+ struct U {
7
+ texelSize: vec2<f32>,
8
+ edgeStrength: f32, // edge enhancement intensity (0–2)
9
+ paperScale: f32, // paper texture scale (1–10)
10
+ blend: f32, // watercolor blend amount (0–1)
11
+ _p0: f32,
12
+ _p1: f32,
13
+ _p2: f32,
14
+ _p3: f32,
15
+ };
16
+ @group(0) @binding(0) var colorTex: texture_2d<f32>;
17
+ @group(0) @binding(1) var noiseTex: texture_2d<f32>;
18
+ @group(0) @binding(2) var samp: sampler;
19
+ @group(0) @binding(3) var<uniform> u: U;
20
+
21
+ // Hash for procedural paper texture
22
+ fn hash(p: vec2<f32>) -> f32 {
23
+ let h = dot(p, vec2<f32>(127.1, 311.7));
24
+ return fract(sin(h) * 43758.5453);
25
+ }
26
+
27
+ fn noise2D(p: vec2<f32>) -> f32 {
28
+ let i = floor(p);
29
+ let f = fract(p);
30
+ let a = hash(i);
31
+ let b = hash(i + vec2<f32>(1.0, 0.0));
32
+ let c = hash(i + vec2<f32>(0.0, 1.0));
33
+ let d = hash(i + vec2<f32>(1.0, 1.0));
34
+ let u = f * f * (3.0 - 2.0 * f);
35
+ return mix(mix(a, b, u.x), mix(c, d, u.x), u.y);
36
+ }
37
+
38
+ @fragment
39
+ fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
40
+ if (isOccluded(input.uv)) { discard; }
41
+ let uv = input.uv;
42
+ let ts = u.texelSize;
43
+ let color = textureSample(colorTex, samp, uv).rgb;
44
+
45
+ // ── Edge-aware smoothing: 3x3 weighted blur (edge-preserving) ──
46
+ let tl = textureSample(colorTex, samp, uv + vec2<f32>(-1.0, -1.0) * ts).rgb;
47
+ let tr = textureSample(colorTex, samp, uv + vec2<f32>( 1.0, -1.0) * ts).rgb;
48
+ let bl = textureSample(colorTex, samp, uv + vec2<f32>(-1.0, 1.0) * ts).rgb;
49
+ let br = textureSample(colorTex, samp, uv + vec2<f32>( 1.0, 1.0) * ts).rgb;
50
+ let l = textureSample(colorTex, samp, uv + vec2<f32>(-1.0, 0.0) * ts).rgb;
51
+ let r = textureSample(colorTex, samp, uv + vec2<f32>( 1.0, 0.0) * ts).rgb;
52
+ let t = textureSample(colorTex, samp, uv + vec2<f32>( 0.0, -1.0) * ts).rgb;
53
+ let b = textureSample(colorTex, samp, uv + vec2<f32>( 0.0, 1.0) * ts).rgb;
54
+
55
+ // Edge weight: closer colors get more weight (bilateral-like)
56
+ let centerLuma = dot(color, vec3<f32>(0.299, 0.587, 0.114));
57
+ let neighbors = array<vec3<f32>, 8>(tl, tr, bl, br, l, r, t, b);
58
+ var smoothColor = vec3<f32>(0.0);
59
+ var totalWeight = 0.0;
60
+ for (var i = 0u; i < 8u; i = i + 1u) {
61
+ let nl = dot(neighbors[i], vec3<f32>(0.299, 0.587, 0.114));
62
+ let w = exp(-abs(centerLuma - nl) * 5.0);
63
+ smoothColor += neighbors[i] * w;
64
+ totalWeight += w;
65
+ }
66
+ smoothColor = (smoothColor + color * 2.0) / (totalWeight + 2.0);
67
+
68
+ // ── Edge enhancement (Sobel) ──
69
+ let gx = abs(dot(tr + 2.0 * r + br - tl - 2.0 * l - bl, vec3<f32>(0.299, 0.587, 0.114)));
70
+ let gy = abs(dot(bl + 2.0 * b + br - tl - 2.0 * t - tr, vec3<f32>(0.299, 0.587, 0.114)));
71
+ let edge = sqrt(gx * gx + gy * gy);
72
+ let edgeFactor = 1.0 - clamp(edge * u.edgeStrength, 0.0, 1.0);
73
+
74
+ // ── Paper texture ──
75
+ let paperUV = uv * u.paperScale * 50.0;
76
+ let paper = noise2D(paperUV) * 0.15 + 0.85;
77
+
78
+ // ── Combine: smoothed color darkened at edges, multiplied by paper texture ──
79
+ let watercolor = smoothColor * edgeFactor * paper;
80
+ let result = mix(color, watercolor, u.blend);
81
+ return vec4<f32>(result, 1.0);
82
+ }
@@ -0,0 +1,41 @@
1
+ // wgsl-validate: prelude ./fullscreen-vs.wgsl
2
+ // wgsl-validate: prelude ./occluder-chunk.wgsl
3
+ // White balance — temperature (K) + tint adjustment.
4
+ // Applies a white-balance correction by shifting the color temperature
5
+ // (warm/cool) and tint (green/magenta).
6
+ struct U {
7
+ temperature: f32, // -1.0 (cool) to 1.0 (warm), 0 = neutral
8
+ tint: f32, // -1.0 (green) to 1.0 (magenta), 0 = neutral
9
+ _p0: f32,
10
+ _p1: f32,
11
+ _p2: f32,
12
+ _p3: f32,
13
+ _p4: f32,
14
+ _p5: f32,
15
+ };
16
+ @group(0) @binding(0) var colorTex: texture_2d<f32>;
17
+ @group(0) @binding(1) var dummyTex: texture_2d<f32>;
18
+ @group(0) @binding(2) var samp: sampler;
19
+ @group(0) @binding(3) var<uniform> u: U;
20
+
21
+ @fragment
22
+ fn fs_main(input: VertexOutput) -> @location(0) vec4<f32> {
23
+ if (isOccluded(input.uv)) { discard; }
24
+ let uv = input.uv;
25
+ var color = textureSample(colorTex, samp, uv).rgb;
26
+
27
+ // Temperature: shift warm (R+ B-) or cool (R- B+)
28
+ let tempR = 1.0 + u.temperature * 0.1;
29
+ let tempB = 1.0 - u.temperature * 0.1;
30
+ // Tint: shift green (G+) or magenta (G-)
31
+ let tintG = 1.0 - u.tint * 0.1;
32
+
33
+ color = color * vec3<f32>(tempR, tintG, tempB);
34
+
35
+ // Normalize luminance to avoid overall brightness shift
36
+ let luma = dot(color, vec3<f32>(0.299, 0.587, 0.114));
37
+ let origLuma = dot(textureSample(colorTex, samp, uv).rgb, vec3<f32>(0.299, 0.587, 0.114));
38
+ color = color * (origLuma / max(luma, 0.0001));
39
+
40
+ return vec4<f32>(color, 1.0);
41
+ }
@@ -0,0 +1,21 @@
1
+ # `@downdraft/engine/libraries/recast`
2
+
3
+ Recast/Detour bindings — navmesh generation from level geometry via the Recast toolchain.
4
+
5
+ ## Install
6
+
7
+ ```sh
8
+ bun add @downdraft/engine/libraries/recast
9
+ ```
10
+
11
+ ## Key exports
12
+
13
+ - `RecastAgent`
14
+ - `RecastBackend`
15
+ - `RecastCrowdSystem`
16
+ - `RecastCrowdTok`
17
+ - `RecastLib`
18
+ - `RecastNavMeshTok`
19
+ - `loadRecastLib`
20
+
21
+ See the [Downdraft engine repository](https://github.com/knackstedt/downdraft) for architecture docs and examples.
@@ -0,0 +1,150 @@
1
+ // ============================================================================
2
+ // RecastBackend — WASM loader + navmesh generation/query wrapper
3
+ //
4
+ // Mirrors the loadPhysicsLib() pattern from @downdraft/engine/libraries/physics-rapier:
5
+ // - cached + coalesced async load (hot-reload/dispose cycles can retry)
6
+ // - WASM import isolated to one module so the rest of the library stays
7
+ // WASM-agnostic and testable.
8
+ //
9
+ // recast-navigation ships as ESM with the .wasm loaded via
10
+ // `new URL(..., import.meta.url)`. It must be excluded from Vite dep
11
+ // pre-bundling (see packages/engine/app/src/vite/index.ts optimizeDeps.exclude).
12
+ // ============================================================================
13
+
14
+ import { createLogger } from "@downdraft/engine";
15
+ import type { Crowd, NavMesh, NavMeshQuery } from "recast-navigation";
16
+ import type { RecastNavMeshConfig } from "./types";
17
+
18
+ const log = createLogger();
19
+
20
+ // ── WASM loader (cached + coalesced) ──
21
+
22
+ interface RecastModule {
23
+ init: () => Promise<void>;
24
+ NavMesh: typeof import("recast-navigation").NavMesh;
25
+ NavMeshQuery: typeof import("recast-navigation").NavMeshQuery;
26
+ Crowd: typeof import("recast-navigation").Crowd;
27
+ }
28
+
29
+ interface GeneratorsModule {
30
+ generateSoloNavMesh: typeof import("recast-navigation/generators").generateSoloNavMesh;
31
+ }
32
+
33
+ let cachedModule: RecastModule | null = null;
34
+ let cachedGenerators: GeneratorsModule | null = null;
35
+ let loadingPromise: Promise<RecastModule> | null = null;
36
+
37
+ /**
38
+ * Loads + initializes the recast-navigation WASM module. Idempotent after the
39
+ * first successful call (recast's `init()` also short-circuits if already
40
+ * initialized). Concurrent callers share the in-flight load; a failed load
41
+ * clears the promise so a retry is possible (important for dev hot-reload).
42
+ */
43
+ export function loadRecastLib(): Promise<RecastModule> {
44
+ if (cachedModule) return Promise.resolve(cachedModule);
45
+ if (loadingPromise) return loadingPromise;
46
+ const p = doLoadRecastLib();
47
+ loadingPromise = p;
48
+ p.then(() => { if (loadingPromise === p) loadingPromise = null; })
49
+ .catch(() => { if (loadingPromise === p) loadingPromise = null; });
50
+ return p;
51
+ }
52
+
53
+ async function doLoadRecastLib(): Promise<RecastModule> {
54
+ const mod = await import("recast-navigation");
55
+ await mod.init();
56
+ cachedModule = mod as unknown as RecastModule;
57
+ cachedGenerators = await import("recast-navigation/generators");
58
+ log.info("recast", "recast-navigation WASM initialized");
59
+ return cachedModule;
60
+ }
61
+
62
+ /** Returns the generators submodule (generateSoloNavMesh, etc.). */
63
+ export function getRecastGenerators(): GeneratorsModule {
64
+ if (!cachedGenerators) throw new Error("recast-navigation not loaded. Call loadRecastLib() first.");
65
+ return cachedGenerators;
66
+ }
67
+
68
+ // ── RecastBackend ──
69
+
70
+ /**
71
+ * Wraps a generated recast {@link NavMesh} + a {@link NavMeshQuery}. Created
72
+ * by {@link RecastLib.sim.create} and exposed via the {@link RecastNavMeshTok}
73
+ * DI token. Games call `buildNavMesh(positions, indices, config)` once
74
+ * (typically in `onReady`) to populate the mesh from terrain/level geometry.
75
+ */
76
+ export class RecastBackend {
77
+ private mod: RecastModule | null = null;
78
+ private navMesh: NavMesh | null = null;
79
+ private query: NavMeshQuery | null = null;
80
+ private destroyed = false;
81
+
82
+ /** Asynchronously loads the WasM module. Must be called before buildNavMesh. */
83
+ async init(): Promise<void> {
84
+ if (this.mod) return;
85
+ this.mod = await loadRecastLib();
86
+ }
87
+
88
+ private ensureMod(): RecastModule {
89
+ if (!this.mod || this.destroyed) {
90
+ throw new Error("RecastBackend not initialized or destroyed. Call init() first.");
91
+ }
92
+ return this.mod;
93
+ }
94
+
95
+ /**
96
+ * Builds a solo (single-tile) navmesh from triangle input.
97
+ *
98
+ * @param positions flat array of vertex positions: [x0,y0,z0, x1,y1,z1, ...]
99
+ * @param indices flat array of triangle indices: [i0,i1,i2, i3,i4,i5, ...]
100
+ * @param config optional recast generation config (cell size, agent
101
+ * radius, walkable slope, etc.)
102
+ * @returns `true` on success. On failure, logs the recast error + returns false.
103
+ */
104
+ buildNavMesh(positions: ArrayLike<number>, indices: ArrayLike<number>, config?: RecastNavMeshConfig): boolean {
105
+ this.ensureMod(); // ensures WASM is loaded
106
+ const generators = getRecastGenerators();
107
+ const result = generators.generateSoloNavMesh(positions, indices, config);
108
+ if (!result.success) {
109
+ log.error("recast", `generateSoloNavMesh failed: ${result.error}`);
110
+ return false;
111
+ }
112
+ this.navMesh = result.navMesh;
113
+ this.query = new this.mod!.NavMeshQuery(this.navMesh);
114
+ return true;
115
+ }
116
+
117
+ /** The generated navmesh. Throws if buildNavMesh hasn't succeeded. */
118
+ getNavMesh(): NavMesh {
119
+ if (!this.navMesh) throw new Error("RecastBackend: navmesh not built. Call buildNavMesh() first.");
120
+ return this.navMesh;
121
+ }
122
+
123
+ /** A NavMeshQuery over the built navmesh. Throws if not built. */
124
+ getQuery(): NavMeshQuery {
125
+ if (!this.query) throw new Error("RecastBackend: navmesh not built. Call buildNavMesh() first.");
126
+ return this.query;
127
+ }
128
+
129
+ /** Whether buildNavMesh has succeeded and the mesh is usable. */
130
+ isBuilt(): boolean {
131
+ return this.navMesh !== null;
132
+ }
133
+
134
+ /** The loaded recast-navigation module (for Crowd construction etc.). */
135
+ getModule(): RecastModule {
136
+ return this.ensureMod();
137
+ }
138
+
139
+ /** Releases the navmesh + query. The WASM module itself stays cached. */
140
+ destroy(): void {
141
+ this.destroyed = true;
142
+ // recast NavMesh/NavMeshQuery are GC'd; no explicit destroy on the JS wrappers.
143
+ this.navMesh = null;
144
+ this.query = null;
145
+ this.mod = null;
146
+ }
147
+ }
148
+
149
+ // Re-export the Crowd type for the crowd-system wrapper's type annotations.
150
+ export type { Crowd };
@@ -0,0 +1,352 @@
1
+ // ============================================================================
2
+ // RecastCrowdSystem — ECS-integrated wrapper over recast-navigation's Crowd
3
+ //
4
+ // Mirrors the structure of @downdraft/engine/libraries/navmesh's CrowdSystem but uses
5
+ // recast's WASM Crowd (real RVO avoidance + Detour pathfollowing) instead of
6
+ // the hand-rolled boids steering. Defines its own RecastAgent component so
7
+ // the two navmesh libraries can coexist without ECS schema coupling.
8
+ // ============================================================================
9
+
10
+ import type { ComponentDefinition } from "@downdraft/engine/ecs/component";
11
+ import { Component } from "@downdraft/engine/ecs/component";
12
+ import type { Entity } from "@downdraft/engine/ecs/entity";
13
+ import type { Query } from "@downdraft/engine/ecs/query";
14
+ import { Stage, system } from "@downdraft/engine/ecs/system";
15
+ import type { World } from "@downdraft/engine/ecs/world";
16
+ import { PhysicsTransform } from "@downdraft/engine/physics/body";
17
+ import type { RecastBackend } from "./backend";
18
+ import type { RecastAgentData, RecastAgentParams, Vec3 } from "./types";
19
+
20
+ // ── ECS component ──
21
+
22
+ export const RecastAgent: ComponentDefinition<RecastAgentData> = Component.register<RecastAgentData>(
23
+ "RecastAgent",
24
+ {
25
+ agentId: -1,
26
+ radius: 0.5,
27
+ height: 1.8,
28
+ maxSpeed: 3.5,
29
+ maxAcceleration: 10,
30
+ target: null,
31
+ state: "idle",
32
+ velocity: [0, 0, 0],
33
+ },
34
+ );
35
+
36
+ // ── Crowd system ──
37
+
38
+ interface RecastCrowdConfig {
39
+ maxAgents: number;
40
+ maxAgentRadius: number;
41
+ /**
42
+ * Seconds an agent may make no appreciable progress toward its target before
43
+ * its state flips to `"stuck"`. Set to `0` (or `Infinity`) to disable stuck
44
+ * detection. Default: `2`.
45
+ */
46
+ stuckTimeout?: number;
47
+ /**
48
+ * Minimum per-tick displacement (metres) that counts as "making progress"
49
+ * for stuck detection. Default: `0.05`.
50
+ */
51
+ stuckMoveEpsilon?: number;
52
+ /**
53
+ * Horizontal distance (metres) from the snapped target at which an agent is
54
+ * considered to have arrived. Default: `0.5`.
55
+ */
56
+ arrivalDistance?: number;
57
+ /**
58
+ * When `setTarget` is called, the engine runs a `computePath` from the
59
+ * agent's current position to the requested target and rejects the target
60
+ * if the resulting path is partial (its final waypoint is farther than this
61
+ * from the snapped target — i.e. the target lies on a disconnected navmesh
62
+ * island, such as the top of an obstacle the agent cannot climb). Set to
63
+ * `0` to accept any target that snaps onto the navmesh without a
64
+ * reachability check. Default: `1.5`.
65
+ */
66
+ reachabilityTolerance?: number;
67
+ }
68
+
69
+ /**
70
+ * Wraps a recast-navigation {@link Crowd}. Created by the {@link RecastLib}
71
+ * descriptor and exposed via {@link RecastCrowdTok}. Games register it with
72
+ * their ECS world via {@link register}, then add agents with {@link addAgent}
73
+ * and steer them with {@link setTarget}.
74
+ *
75
+ * Each tick the system calls `crowd.update(dt)` then writes agent
76
+ * position/velocity back into the ECS `RecastAgent` + `PhysicsTransform`
77
+ * components (mirroring the read-back pattern in library-navmesh's
78
+ * CrowdSystem).
79
+ */
80
+ export class RecastCrowdSystem {
81
+ private backend: RecastBackend;
82
+ private config: RecastCrowdConfig;
83
+ private crowd: import("recast-navigation").Crowd | null = null;
84
+ private world: World | null = null;
85
+ private query: Query | null = null;
86
+ /** entity.index → recast CrowdAgent index, for write-back during tick. */
87
+ private entityToAgent = new Map<number, number>();
88
+ /** Per-agent stuck-detection state, keyed by recast agent index. */
89
+ private stuckState = new Map<number, { lastPos: Vec3; timer: number }>();
90
+
91
+ // Resolved config (defaults applied once).
92
+ private readonly stuckTimeout: number;
93
+ private readonly stuckMoveEpsilon: number;
94
+ private readonly arrivalDistance: number;
95
+ private readonly reachabilityTolerance: number;
96
+
97
+ constructor(backend: RecastBackend, config: RecastCrowdConfig) {
98
+ this.backend = backend;
99
+ this.config = config;
100
+ this.stuckTimeout = config.stuckTimeout ?? 2;
101
+ this.stuckMoveEpsilon = config.stuckMoveEpsilon ?? 0.05;
102
+ this.arrivalDistance = config.arrivalDistance ?? 0.5;
103
+ this.reachabilityTolerance = config.reachabilityTolerance ?? 1.5;
104
+ }
105
+
106
+ /**
107
+ * Lazily creates the recast Crowd. The Crowd requires a built NavMesh, so
108
+ * this is called from {@link register} (after the game has built the mesh)
109
+ * or explicitly by the game once the mesh is ready.
110
+ */
111
+ private ensureCrowd(): import("recast-navigation").Crowd {
112
+ if (this.crowd) return this.crowd;
113
+ const mod = this.backend.getModule();
114
+ const navMesh = this.backend.getNavMesh();
115
+ this.crowd = new mod.Crowd(navMesh, {
116
+ maxAgents: this.config.maxAgents,
117
+ maxAgentRadius: this.config.maxAgentRadius,
118
+ });
119
+ return this.crowd;
120
+ }
121
+
122
+ /**
123
+ * Registers the per-tick crowd update system with the ECS world.
124
+ * @param world the ECS world
125
+ * @param query a query over `[RecastAgent, PhysicsTransform]`
126
+ */
127
+ register(world: World, query: Query): void {
128
+ this.world = world;
129
+ this.query = query;
130
+ const crowdSys = system(
131
+ "recast-crowd-agents",
132
+ Stage.Update,
133
+ (ctx) => {
134
+ if (!this.query) return;
135
+ const crowd = this.crowd;
136
+ if (!crowd) return; // mesh not built yet — no-op until ensureCrowd runs
137
+ crowd.update(ctx.dt);
138
+ this.query.iterate(ctx.tick, (entity, components) => {
139
+ const agent = components[0] as RecastAgentData;
140
+ const transform = components[1] as { position: Vec3; rotation: [number, number, number, number] };
141
+ const agentIdx = this.entityToAgent.get(entity.index);
142
+ if (agentIdx === undefined) return;
143
+ const crowdAgent = crowd.getAgent(agentIdx);
144
+ if (!crowdAgent) return;
145
+ const pos = crowdAgent.position();
146
+ transform.position[0] = pos.x;
147
+ transform.position[1] = pos.y;
148
+ transform.position[2] = pos.z;
149
+ const vel = crowdAgent.velocity();
150
+ agent.velocity[0] = vel.x;
151
+ agent.velocity[1] = vel.y;
152
+ agent.velocity[2] = vel.z;
153
+ // State heuristic: arrived when within arrivalDistance of the
154
+ // (snapped) target; otherwise seeking, with stuck detection as a
155
+ // backstop for agents that make no progress (e.g. target on an
156
+ // unreachable navmesh island, or wedged against geometry).
157
+ if (agent.target) {
158
+ const dx = agent.target[0] - pos.x;
159
+ const dz = agent.target[2] - pos.z;
160
+ const distSq = dx * dx + dz * dz;
161
+ if (distSq < this.arrivalDistance * this.arrivalDistance) {
162
+ agent.state = "arrived";
163
+ this.stuckState.delete(agentIdx);
164
+ } else {
165
+ this.updateStuckState(agentIdx, agent, [pos.x, pos.y, pos.z], ctx.dt);
166
+ }
167
+ } else {
168
+ this.stuckState.delete(agentIdx);
169
+ }
170
+ });
171
+ },
172
+ { queries: [query] },
173
+ );
174
+ world.schedule.add(crowdSys);
175
+ }
176
+
177
+ /**
178
+ * Adds an agent to the crowd. Reads the entity's current `PhysicsTransform`
179
+ * position as the spawn point. Stores the recast agent index on the
180
+ * `RecastAgent` component and in the entity→agent map.
181
+ */
182
+ addAgent(entity: Entity, params?: RecastAgentParams): number {
183
+ if (!this.world) throw new Error("RecastCrowdSystem not registered with a world.");
184
+ const crowd = this.ensureCrowd();
185
+ const transform = this.world.getComponent<{ position: Vec3 }>(entity, PhysicsTransform.id);
186
+ const pos = transform?.position ?? [0, 0, 0];
187
+ const crowdAgent = crowd.addAgent({ x: pos[0], y: pos[1], z: pos[2] }, {
188
+ radius: params?.radius ?? 0.5,
189
+ height: params?.height ?? 1.8,
190
+ maxAcceleration: params?.maxAcceleration ?? 10,
191
+ maxSpeed: params?.maxSpeed ?? 3.5,
192
+ collisionQueryRange: params?.collisionQueryRange ?? 2.5,
193
+ pathOptimizationRange: params?.pathOptimizationRange ?? 0,
194
+ separationWeight: params?.separationWeight ?? 0,
195
+ updateFlags: params?.updateFlags ?? 7,
196
+ obstacleAvoidanceType: params?.obstacleAvoidanceType ?? 0,
197
+ queryFilterType: params?.queryFilterType ?? 0,
198
+ });
199
+ const agentIdx = crowdAgent.agentIndex;
200
+ const agent = this.world.getComponent<RecastAgentData>(entity, RecastAgent.id);
201
+ if (agent) {
202
+ agent.agentId = agentIdx;
203
+ agent.radius = params?.radius ?? agent.radius;
204
+ agent.height = params?.height ?? agent.height;
205
+ agent.maxSpeed = params?.maxSpeed ?? agent.maxSpeed;
206
+ agent.maxAcceleration = params?.maxAcceleration ?? agent.maxAcceleration;
207
+ }
208
+ this.entityToAgent.set(entity.index, agentIdx);
209
+ this.stuckState.delete(agentIdx);
210
+ return agentIdx;
211
+ }
212
+
213
+ /**
214
+ * Sets a move target for the agent. The crowd will pathfind + steer to it.
215
+ *
216
+ * The requested target is validated before being issued:
217
+ * 1. It is snapped to the nearest walkable navmesh polygon.
218
+ * 2. A `computePath` is run from the agent's current position to the
219
+ * snapped target. If the path is partial (its final waypoint is
220
+ * farther than `reachabilityTolerance` from the target — i.e. the
221
+ * target lies on a disconnected navmesh island such as the top of an
222
+ * obstacle the agent cannot climb), the target is rejected and
223
+ * `false` is returned. The agent's existing target is left untouched.
224
+ *
225
+ * On success, the *snapped, reachable* endpoint is stored as the agent's
226
+ * target (not the raw input) so the arrival heuristic measures distance to
227
+ * the actual goal rather than a point inside geometry.
228
+ *
229
+ * @returns `true` if the target was accepted and issued to the crowd.
230
+ */
231
+ setTarget(entity: Entity, target: Vec3): boolean {
232
+ if (!this.world) return false;
233
+ const agent = this.world.getComponent<RecastAgentData>(entity, RecastAgent.id);
234
+ if (!agent || agent.agentId < 0) return false;
235
+ const crowd = this.crowd;
236
+ if (!crowd) return false;
237
+ const crowdAgent = crowd.getAgent(agent.agentId);
238
+ if (!crowdAgent) return false;
239
+
240
+ // Snap the requested target to the nearest walkable polygon, then verify
241
+ // the agent can actually reach it. Without this, a target inside an
242
+ // obstacle snaps to the nearest navmesh polygon — which may be the
243
+ // obstacle's walkable *top*, a disconnected island the agent cannot climb
244
+ // to — and the crowd spends forever steering into the obstacle base.
245
+ if (this.reachabilityTolerance > 0 && this.backend.isBuilt()) {
246
+ const query = this.backend.getQuery();
247
+ const startPos = crowdAgent.position();
248
+ const path = query.computePath(
249
+ { x: startPos.x, y: startPos.y, z: startPos.z },
250
+ { x: target[0], y: target[1], z: target[2] },
251
+ );
252
+ if (!path.success || path.path.length === 0) return false;
253
+ const last = path.path[path.path.length - 1];
254
+ const dx = last.x - target[0];
255
+ const dz = last.z - target[2];
256
+ // Partial path → target is on a disconnected island. Reject it.
257
+ if (Math.hypot(dx, dz) > this.reachabilityTolerance) return false;
258
+ // Issue the move target at the reachable endpoint and store the snapped
259
+ // target so arrival detection is accurate.
260
+ const ok = crowdAgent.requestMoveTarget({ x: last.x, y: last.y, z: last.z });
261
+ if (!ok) return false;
262
+ agent.target = [last.x, last.y, last.z];
263
+ } else {
264
+ // Reachability check disabled: fall back to recast's built-in snapping.
265
+ const ok = crowdAgent.requestMoveTarget({ x: target[0], y: target[1], z: target[2] });
266
+ if (!ok) return false;
267
+ agent.target = [target[0], target[1], target[2]];
268
+ }
269
+
270
+ agent.state = "seeking";
271
+ this.stuckState.delete(agent.agentId);
272
+ return true;
273
+ }
274
+
275
+ /**
276
+ * Per-tick stuck detection. Uses a sliding window: every `stuckTimeout`
277
+ * seconds it checks whether the agent has made appreciable *net* progress
278
+ * from its position at the start of the window. Measuring net displacement
279
+ * (rather than per-tick movement) correctly classifies an agent that
280
+ * oscillates against an obstacle as stuck — it jittered but ended up back
281
+ * where it started. This is a backstop for cases the `setTarget`
282
+ * reachability check cannot catch (dynamic obstacles, crowd local minima,
283
+ * agents wedged against geometry).
284
+ */
285
+ private updateStuckState(agentIdx: number, agent: RecastAgentData, pos: Vec3, dt: number): void {
286
+ if (this.stuckTimeout <= 0 || !Number.isFinite(this.stuckTimeout)) {
287
+ agent.state = "seeking";
288
+ return;
289
+ }
290
+ let s = this.stuckState.get(agentIdx);
291
+ if (!s) {
292
+ s = { lastPos: [pos[0], pos[1], pos[2]], timer: 0 };
293
+ this.stuckState.set(agentIdx, s);
294
+ }
295
+ s.timer += dt;
296
+ if (s.timer >= this.stuckTimeout) {
297
+ // Window elapsed — evaluate net displacement from the window start.
298
+ const moved = Math.hypot(
299
+ pos[0] - s.lastPos[0], pos[1] - s.lastPos[1], pos[2] - s.lastPos[2],
300
+ );
301
+ if (moved < this.stuckMoveEpsilon) {
302
+ agent.state = "stuck";
303
+ } else {
304
+ // Made progress — start a fresh window from the current position.
305
+ s.lastPos[0] = pos[0];
306
+ s.lastPos[1] = pos[1];
307
+ s.lastPos[2] = pos[2];
308
+ s.timer = 0;
309
+ agent.state = "seeking";
310
+ }
311
+ } else {
312
+ agent.state = "seeking";
313
+ }
314
+ }
315
+
316
+ /** Clears the agent's move target (it will decelerate to a stop). */
317
+ clearTarget(entity: Entity): void {
318
+ if (!this.world) return;
319
+ const agent = this.world.getComponent<RecastAgentData>(entity, RecastAgent.id);
320
+ if (!agent || agent.agentId < 0) return;
321
+ const crowd = this.crowd;
322
+ if (!crowd) return;
323
+ const crowdAgent = crowd.getAgent(agent.agentId);
324
+ if (!crowdAgent) return;
325
+ crowdAgent.resetMoveTarget();
326
+ agent.target = null;
327
+ agent.state = "idle";
328
+ this.stuckState.delete(agent.agentId);
329
+ }
330
+
331
+ /** Removes an agent from the crowd. */
332
+ removeAgent(entity: Entity): void {
333
+ if (!this.world) return;
334
+ const agent = this.world.getComponent<RecastAgentData>(entity, RecastAgent.id);
335
+ if (!agent || agent.agentId < 0) return;
336
+ const crowd = this.crowd;
337
+ if (crowd) crowd.removeAgent(agent.agentId);
338
+ agent.agentId = -1;
339
+ agent.state = "idle";
340
+ this.entityToAgent.delete(entity.index);
341
+ this.stuckState.delete(agent.agentId);
342
+ }
343
+
344
+ /** Releases the recast Crowd. The backend + navmesh are owned by RecastBackend. */
345
+ destroy(): void {
346
+ this.crowd = null;
347
+ this.world = null;
348
+ this.query = null;
349
+ this.entityToAgent.clear();
350
+ this.stuckState.clear();
351
+ }
352
+ }
@@ -0,0 +1,12 @@
1
+ export { RecastBackend, loadRecastLib } from "./backend";
2
+ export { RecastAgent, RecastCrowdSystem } from "./crowd-system";
3
+ export type {
4
+ RecastAgentData,
5
+ RecastAgentParams,
6
+ RecastNavMeshConfig,
7
+ Vec3,
8
+ } from "./types";
9
+
10
+ // Declarative library descriptor
11
+ export { RecastLib, RecastNavMeshTok, RecastCrowdTok } from "./library";
12
+ export type { RecastLibConfig } from "./library";