@thunderclap-engine/engine 0.0.0-stage → 1.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 (566) hide show
  1. package/CHANGELOG.md +390 -0
  2. package/LICENSE +21 -0
  3. package/README.md +333 -2
  4. package/dist/analytics/analytics.d.ts +80 -0
  5. package/dist/analytics/analytics.js +129 -0
  6. package/dist/analytics/index.d.ts +1 -0
  7. package/dist/analytics/index.js +1 -0
  8. package/dist/anim/aim.d.ts +43 -0
  9. package/dist/anim/aim.js +157 -0
  10. package/dist/anim/clip.d.ts +98 -0
  11. package/dist/anim/clip.js +282 -0
  12. package/dist/anim/compress.d.ts +65 -0
  13. package/dist/anim/compress.js +339 -0
  14. package/dist/anim/foot-ik.d.ts +74 -0
  15. package/dist/anim/foot-ik.js +241 -0
  16. package/dist/anim/graph.d.ts +153 -0
  17. package/dist/anim/graph.js +532 -0
  18. package/dist/anim/ik.d.ts +105 -0
  19. package/dist/anim/ik.js +435 -0
  20. package/dist/anim/index.d.ts +36 -0
  21. package/dist/anim/index.js +21 -0
  22. package/dist/anim/match.d.ts +66 -0
  23. package/dist/anim/match.js +153 -0
  24. package/dist/anim/mixer.d.ts +113 -0
  25. package/dist/anim/mixer.js +314 -0
  26. package/dist/anim/morph.d.ts +41 -0
  27. package/dist/anim/morph.js +94 -0
  28. package/dist/anim/pose.d.ts +74 -0
  29. package/dist/anim/pose.js +254 -0
  30. package/dist/anim/quat.d.ts +44 -0
  31. package/dist/anim/quat.js +187 -0
  32. package/dist/anim/retarget.d.ts +97 -0
  33. package/dist/anim/retarget.js +366 -0
  34. package/dist/anim/root-motion.d.ts +44 -0
  35. package/dist/anim/root-motion.js +224 -0
  36. package/dist/anim/skin-pose.d.ts +39 -0
  37. package/dist/anim/skin-pose.js +53 -0
  38. package/dist/anim/socket.d.ts +47 -0
  39. package/dist/anim/socket.js +84 -0
  40. package/dist/anim/spring-chain.d.ts +73 -0
  41. package/dist/anim/spring-chain.js +294 -0
  42. package/dist/assets/atlas.d.ts +90 -0
  43. package/dist/assets/atlas.js +212 -0
  44. package/dist/assets/baked.d.ts +33 -0
  45. package/dist/assets/baked.js +38 -0
  46. package/dist/assets/bundle.d.ts +88 -0
  47. package/dist/assets/bundle.js +464 -0
  48. package/dist/assets/cache.d.ts +56 -0
  49. package/dist/assets/cache.js +123 -0
  50. package/dist/assets/gltf-load.d.ts +252 -0
  51. package/dist/assets/gltf-load.js +661 -0
  52. package/dist/assets/gltf-skin.d.ts +36 -0
  53. package/dist/assets/gltf-skin.js +109 -0
  54. package/dist/assets/gltf.d.ts +706 -0
  55. package/dist/assets/gltf.js +1376 -0
  56. package/dist/assets/index.d.ts +20 -0
  57. package/dist/assets/index.js +10 -0
  58. package/dist/assets/ktx2.d.ts +71 -0
  59. package/dist/assets/ktx2.js +213 -0
  60. package/dist/assets/manifest.d.ts +79 -0
  61. package/dist/assets/manifest.js +7 -0
  62. package/dist/assets/meshopt.d.ts +23 -0
  63. package/dist/assets/meshopt.js +403 -0
  64. package/dist/audio/audio.d.ts +733 -0
  65. package/dist/audio/audio.js +2013 -0
  66. package/dist/audio/dsp.d.ts +61 -0
  67. package/dist/audio/dsp.js +159 -0
  68. package/dist/audio/duck.d.ts +44 -0
  69. package/dist/audio/duck.js +101 -0
  70. package/dist/audio/envelope.d.ts +53 -0
  71. package/dist/audio/envelope.js +106 -0
  72. package/dist/audio/index.d.ts +13 -0
  73. package/dist/audio/index.js +14 -0
  74. package/dist/audio/music.d.ts +113 -0
  75. package/dist/audio/music.js +548 -0
  76. package/dist/audio/occlusion.d.ts +55 -0
  77. package/dist/audio/occlusion.js +61 -0
  78. package/dist/audio/persist.d.ts +23 -0
  79. package/dist/audio/persist.js +27 -0
  80. package/dist/audio/recipes.d.ts +55 -0
  81. package/dist/audio/recipes.js +227 -0
  82. package/dist/audio/send.d.ts +41 -0
  83. package/dist/audio/send.js +118 -0
  84. package/dist/audio/sprites.d.ts +59 -0
  85. package/dist/audio/sprites.js +43 -0
  86. package/dist/audio/synth.d.ts +103 -0
  87. package/dist/audio/synth.js +197 -0
  88. package/dist/audio/variations.d.ts +25 -0
  89. package/dist/audio/variations.js +55 -0
  90. package/dist/audio/zones.d.ts +100 -0
  91. package/dist/audio/zones.js +167 -0
  92. package/dist/core/detached-surface.d.ts +44 -0
  93. package/dist/core/detached-surface.js +104 -0
  94. package/dist/core/events.d.ts +24 -0
  95. package/dist/core/events.js +43 -0
  96. package/dist/core/game.d.ts +409 -0
  97. package/dist/core/game.js +530 -0
  98. package/dist/core/hash.d.ts +24 -0
  99. package/dist/core/hash.js +49 -0
  100. package/dist/core/index.d.ts +17 -0
  101. package/dist/core/index.js +9 -0
  102. package/dist/core/loop.d.ts +113 -0
  103. package/dist/core/loop.js +185 -0
  104. package/dist/core/math.d.ts +58 -0
  105. package/dist/core/math.js +210 -0
  106. package/dist/core/noise.d.ts +40 -0
  107. package/dist/core/noise.js +247 -0
  108. package/dist/core/pool.d.ts +42 -0
  109. package/dist/core/pool.js +85 -0
  110. package/dist/core/random.d.ts +61 -0
  111. package/dist/core/random.js +199 -0
  112. package/dist/core/scene.d.ts +79 -0
  113. package/dist/core/scene.js +195 -0
  114. package/dist/core/timer.d.ts +66 -0
  115. package/dist/core/timer.js +286 -0
  116. package/dist/fx/billboard-wgsl.d.ts +29 -0
  117. package/dist/fx/billboard-wgsl.js +158 -0
  118. package/dist/fx/billboard.d.ts +249 -0
  119. package/dist/fx/billboard.js +702 -0
  120. package/dist/fx/debug-draw.d.ts +127 -0
  121. package/dist/fx/debug-draw.js +523 -0
  122. package/dist/fx/debug-wgsl.d.ts +7 -0
  123. package/dist/fx/debug-wgsl.js +32 -0
  124. package/dist/fx/decals-wgsl.d.ts +15 -0
  125. package/dist/fx/decals-wgsl.js +173 -0
  126. package/dist/fx/decals.d.ts +216 -0
  127. package/dist/fx/decals.js +607 -0
  128. package/dist/fx/effect.d.ts +129 -0
  129. package/dist/fx/effect.js +349 -0
  130. package/dist/fx/effects/hit-spark.json +48 -0
  131. package/dist/fx/effects/index.d.ts +8 -0
  132. package/dist/fx/effects/index.js +9 -0
  133. package/dist/fx/effects/magic-aura.json +47 -0
  134. package/dist/fx/effects/smoke-puff.json +34 -0
  135. package/dist/fx/emit-surface.d.ts +40 -0
  136. package/dist/fx/emit-surface.js +124 -0
  137. package/dist/fx/flicker.d.ts +30 -0
  138. package/dist/fx/flicker.js +42 -0
  139. package/dist/fx/index.d.ts +31 -0
  140. package/dist/fx/index.js +20 -0
  141. package/dist/fx/particles-wgsl.d.ts +57 -0
  142. package/dist/fx/particles-wgsl.js +828 -0
  143. package/dist/fx/particles.d.ts +566 -0
  144. package/dist/fx/particles.js +1533 -0
  145. package/dist/fx/random.d.ts +15 -0
  146. package/dist/fx/random.js +20 -0
  147. package/dist/fx/sky-wgsl.d.ts +23 -0
  148. package/dist/fx/sky-wgsl.js +127 -0
  149. package/dist/fx/sky.d.ts +96 -0
  150. package/dist/fx/sky.js +175 -0
  151. package/dist/fx/text-atlas.d.ts +143 -0
  152. package/dist/fx/text-atlas.js +327 -0
  153. package/dist/fx/trail-wgsl.d.ts +11 -0
  154. package/dist/fx/trail-wgsl.js +42 -0
  155. package/dist/fx/trail.d.ts +194 -0
  156. package/dist/fx/trail.js +555 -0
  157. package/dist/fx/water-wgsl.d.ts +34 -0
  158. package/dist/fx/water-wgsl.js +197 -0
  159. package/dist/fx/water.d.ts +176 -0
  160. package/dist/fx/water.js +371 -0
  161. package/dist/geom/collide/bvh.d.ts +151 -0
  162. package/dist/geom/collide/bvh.js +493 -0
  163. package/dist/geom/collide/debug.d.ts +14 -0
  164. package/dist/geom/collide/debug.js +74 -0
  165. package/dist/geom/collide/grid.d.ts +26 -0
  166. package/dist/geom/collide/grid.js +91 -0
  167. package/dist/geom/collide/index.d.ts +8 -0
  168. package/dist/geom/collide/index.js +8 -0
  169. package/dist/geom/collide/queries.d.ts +70 -0
  170. package/dist/geom/collide/queries.js +583 -0
  171. package/dist/geom/collide/serialize.d.ts +14 -0
  172. package/dist/geom/collide/serialize.js +145 -0
  173. package/dist/geom/collide/shapes.d.ts +161 -0
  174. package/dist/geom/collide/shapes.js +686 -0
  175. package/dist/geom/collide/slide.d.ts +66 -0
  176. package/dist/geom/collide/slide.js +375 -0
  177. package/dist/geom/collide/tile-slide.d.ts +88 -0
  178. package/dist/geom/collide/tile-slide.js +255 -0
  179. package/dist/geom/geometry.d.ts +95 -0
  180. package/dist/geom/geometry.js +322 -0
  181. package/dist/geom/heightfield.d.ts +72 -0
  182. package/dist/geom/heightfield.js +295 -0
  183. package/dist/geom/hull.d.ts +27 -0
  184. package/dist/geom/hull.js +279 -0
  185. package/dist/geom/index.d.ts +35 -0
  186. package/dist/geom/index.js +23 -0
  187. package/dist/geom/iso.d.ts +74 -0
  188. package/dist/geom/iso.js +89 -0
  189. package/dist/geom/lod.d.ts +29 -0
  190. package/dist/geom/lod.js +27 -0
  191. package/dist/geom/ops.d.ts +47 -0
  192. package/dist/geom/ops.js +285 -0
  193. package/dist/geom/primitives.d.ts +97 -0
  194. package/dist/geom/primitives.js +359 -0
  195. package/dist/geom/shapes.d.ts +43 -0
  196. package/dist/geom/shapes.js +88 -0
  197. package/dist/geom/simplify.d.ts +38 -0
  198. package/dist/geom/simplify.js +519 -0
  199. package/dist/geom/split.d.ts +37 -0
  200. package/dist/geom/split.js +413 -0
  201. package/dist/geom/sweep.d.ts +83 -0
  202. package/dist/geom/sweep.js +534 -0
  203. package/dist/geom/tangents.d.ts +16 -0
  204. package/dist/geom/tangents.js +124 -0
  205. package/dist/geom/triangulate.d.ts +19 -0
  206. package/dist/geom/triangulate.js +147 -0
  207. package/dist/host/default.d.ts +10 -0
  208. package/dist/host/default.js +10 -0
  209. package/dist/host/index.d.ts +4 -0
  210. package/dist/host/index.js +3 -0
  211. package/dist/host/types.d.ts +144 -0
  212. package/dist/host/types.js +1 -0
  213. package/dist/host/web-links.d.ts +38 -0
  214. package/dist/host/web-links.js +110 -0
  215. package/dist/host/web.d.ts +30 -0
  216. package/dist/host/web.js +216 -0
  217. package/dist/host/xr.d.ts +24 -0
  218. package/dist/host/xr.js +59 -0
  219. package/dist/i18n/i18n.d.ts +59 -0
  220. package/dist/i18n/i18n.js +241 -0
  221. package/dist/i18n/index.d.ts +3 -0
  222. package/dist/i18n/index.js +3 -0
  223. package/dist/i18n/message.d.ts +72 -0
  224. package/dist/i18n/message.js +369 -0
  225. package/dist/i18n/negotiate.d.ts +17 -0
  226. package/dist/i18n/negotiate.js +58 -0
  227. package/dist/index.d.ts +7 -0
  228. package/dist/index.js +1 -0
  229. package/dist/input/bindings.d.ts +31 -0
  230. package/dist/input/bindings.js +141 -0
  231. package/dist/input/clock.d.ts +44 -0
  232. package/dist/input/clock.js +49 -0
  233. package/dist/input/follow.d.ts +133 -0
  234. package/dist/input/follow.js +218 -0
  235. package/dist/input/gestures.d.ts +281 -0
  236. package/dist/input/gestures.js +662 -0
  237. package/dist/input/glyphs.d.ts +35 -0
  238. package/dist/input/glyphs.js +216 -0
  239. package/dist/input/gyro.d.ts +85 -0
  240. package/dist/input/gyro.js +140 -0
  241. package/dist/input/index.d.ts +19 -0
  242. package/dist/input/index.js +16 -0
  243. package/dist/input/input.d.ts +543 -0
  244. package/dist/input/input.js +1492 -0
  245. package/dist/input/look.d.ts +327 -0
  246. package/dist/input/look.js +681 -0
  247. package/dist/input/magnify.d.ts +177 -0
  248. package/dist/input/magnify.js +131 -0
  249. package/dist/input/pointer-dispatch.d.ts +138 -0
  250. package/dist/input/pointer-dispatch.js +180 -0
  251. package/dist/input/pointer-router.d.ts +204 -0
  252. package/dist/input/pointer-router.js +533 -0
  253. package/dist/input/pointer-sources.d.ts +164 -0
  254. package/dist/input/pointer-sources.js +306 -0
  255. package/dist/input/rays.d.ts +138 -0
  256. package/dist/input/rays.js +615 -0
  257. package/dist/input/record.d.ts +209 -0
  258. package/dist/input/record.js +601 -0
  259. package/dist/input/touch-zones.d.ts +147 -0
  260. package/dist/input/touch-zones.js +300 -0
  261. package/dist/input/types.d.ts +158 -0
  262. package/dist/input/types.js +1 -0
  263. package/dist/input/xr-source.d.ts +53 -0
  264. package/dist/input/xr-source.js +164 -0
  265. package/dist/nav/astar.d.ts +45 -0
  266. package/dist/nav/astar.js +182 -0
  267. package/dist/nav/corridor.d.ts +40 -0
  268. package/dist/nav/corridor.js +95 -0
  269. package/dist/nav/crowd.d.ts +94 -0
  270. package/dist/nav/crowd.js +624 -0
  271. package/dist/nav/flow.d.ts +61 -0
  272. package/dist/nav/flow.js +193 -0
  273. package/dist/nav/grid.d.ts +108 -0
  274. package/dist/nav/grid.js +210 -0
  275. package/dist/nav/heap.d.ts +22 -0
  276. package/dist/nav/heap.js +92 -0
  277. package/dist/nav/index.d.ts +37 -0
  278. package/dist/nav/index.js +19 -0
  279. package/dist/nav/mesh/areas.d.ts +44 -0
  280. package/dist/nav/mesh/areas.js +98 -0
  281. package/dist/nav/mesh/bake-options.d.ts +33 -0
  282. package/dist/nav/mesh/bake-options.js +76 -0
  283. package/dist/nav/mesh/contour.d.ts +22 -0
  284. package/dist/nav/mesh/contour.js +323 -0
  285. package/dist/nav/mesh/flow3.d.ts +35 -0
  286. package/dist/nav/mesh/flow3.js +229 -0
  287. package/dist/nav/mesh/links.d.ts +38 -0
  288. package/dist/nav/mesh/links.js +72 -0
  289. package/dist/nav/mesh/mesh-path.d.ts +152 -0
  290. package/dist/nav/mesh/mesh-path.js +643 -0
  291. package/dist/nav/mesh/mesh-reach.d.ts +78 -0
  292. package/dist/nav/mesh/mesh-reach.js +450 -0
  293. package/dist/nav/mesh/navmesh.d.ts +117 -0
  294. package/dist/nav/mesh/navmesh.js +647 -0
  295. package/dist/nav/mesh/polymesh.d.ts +24 -0
  296. package/dist/nav/mesh/polymesh.js +384 -0
  297. package/dist/nav/mesh/regions.d.ts +12 -0
  298. package/dist/nav/mesh/regions.js +367 -0
  299. package/dist/nav/mesh/serialize.d.ts +13 -0
  300. package/dist/nav/mesh/serialize.js +197 -0
  301. package/dist/nav/mesh/voxelize.d.ts +111 -0
  302. package/dist/nav/mesh/voxelize.js +552 -0
  303. package/dist/nav/obstacles.d.ts +75 -0
  304. package/dist/nav/obstacles.js +294 -0
  305. package/dist/nav/path.d.ts +59 -0
  306. package/dist/nav/path.js +177 -0
  307. package/dist/nav/query-queue.d.ts +46 -0
  308. package/dist/nav/query-queue.js +308 -0
  309. package/dist/nav/reach.d.ts +53 -0
  310. package/dist/nav/reach.js +148 -0
  311. package/dist/nav/steer.d.ts +36 -0
  312. package/dist/nav/steer.js +78 -0
  313. package/dist/platform/boot.d.ts +28 -0
  314. package/dist/platform/boot.js +43 -0
  315. package/dist/platform/device-mode.d.ts +40 -0
  316. package/dist/platform/device-mode.js +104 -0
  317. package/dist/platform/device.d.ts +31 -0
  318. package/dist/platform/device.js +91 -0
  319. package/dist/platform/environment.d.ts +42 -0
  320. package/dist/platform/environment.js +82 -0
  321. package/dist/platform/gpu.d.ts +40 -0
  322. package/dist/platform/gpu.js +57 -0
  323. package/dist/platform/index.d.ts +18 -0
  324. package/dist/platform/index.js +10 -0
  325. package/dist/platform/letterbox.d.ts +43 -0
  326. package/dist/platform/letterbox.js +57 -0
  327. package/dist/platform/links.d.ts +20 -0
  328. package/dist/platform/links.js +43 -0
  329. package/dist/platform/screens.d.ts +36 -0
  330. package/dist/platform/screens.js +138 -0
  331. package/dist/platform/surface.d.ts +72 -0
  332. package/dist/platform/surface.js +157 -0
  333. package/dist/platform/xr-fake.d.ts +168 -0
  334. package/dist/platform/xr-fake.js +434 -0
  335. package/dist/platform/xr-surface.d.ts +120 -0
  336. package/dist/platform/xr-surface.js +214 -0
  337. package/dist/platform/xr-types.d.ts +262 -0
  338. package/dist/post/ao.d.ts +12 -0
  339. package/dist/post/ao.js +136 -0
  340. package/dist/post/blend.d.ts +27 -0
  341. package/dist/post/blend.js +129 -0
  342. package/dist/post/depth-pass.d.ts +43 -0
  343. package/dist/post/depth-pass.js +118 -0
  344. package/dist/post/dof.d.ts +1 -0
  345. package/dist/post/dof.js +66 -0
  346. package/dist/post/exposure.d.ts +80 -0
  347. package/dist/post/exposure.js +322 -0
  348. package/dist/post/index.d.ts +12 -0
  349. package/dist/post/index.js +11 -0
  350. package/dist/post/lens-dirt.d.ts +13 -0
  351. package/dist/post/lens-dirt.js +91 -0
  352. package/dist/post/lut.d.ts +19 -0
  353. package/dist/post/lut.js +50 -0
  354. package/dist/post/motion-blur.d.ts +9 -0
  355. package/dist/post/motion-blur.js +78 -0
  356. package/dist/post/post-stack.d.ts +302 -0
  357. package/dist/post/post-stack.js +1137 -0
  358. package/dist/post/settings.d.ts +485 -0
  359. package/dist/post/settings.js +416 -0
  360. package/dist/post/shaders.d.ts +25 -0
  361. package/dist/post/shaders.js +410 -0
  362. package/dist/post/ssr.d.ts +16 -0
  363. package/dist/post/ssr.js +155 -0
  364. package/dist/post/taa.d.ts +74 -0
  365. package/dist/post/taa.js +235 -0
  366. package/dist/post/white-balance.d.ts +25 -0
  367. package/dist/post/white-balance.js +98 -0
  368. package/dist/render/bindings.d.ts +98 -0
  369. package/dist/render/bindings.js +281 -0
  370. package/dist/render/blend.d.ts +13 -0
  371. package/dist/render/blend.js +26 -0
  372. package/dist/render/camera-2d.d.ts +72 -0
  373. package/dist/render/camera-2d.js +92 -0
  374. package/dist/render/camera.d.ts +302 -0
  375. package/dist/render/camera.js +671 -0
  376. package/dist/render/color.d.ts +16 -0
  377. package/dist/render/color.js +41 -0
  378. package/dist/render/compressed.d.ts +104 -0
  379. package/dist/render/compressed.js +248 -0
  380. package/dist/render/diagnostics.d.ts +15 -0
  381. package/dist/render/diagnostics.js +43 -0
  382. package/dist/render/dynamic-resolution.d.ts +70 -0
  383. package/dist/render/dynamic-resolution.js +126 -0
  384. package/dist/render/fake-gpu.d.ts +204 -0
  385. package/dist/render/fake-gpu.js +426 -0
  386. package/dist/render/flipbook.d.ts +56 -0
  387. package/dist/render/flipbook.js +87 -0
  388. package/dist/render/frame.d.ts +278 -0
  389. package/dist/render/frame.js +174 -0
  390. package/dist/render/fullscreen.d.ts +54 -0
  391. package/dist/render/fullscreen.js +91 -0
  392. package/dist/render/gpu-timer.d.ts +73 -0
  393. package/dist/render/gpu-timer.js +186 -0
  394. package/dist/render/index.d.ts +53 -0
  395. package/dist/render/index.js +29 -0
  396. package/dist/render/instance-list.d.ts +185 -0
  397. package/dist/render/instance-list.js +547 -0
  398. package/dist/render/lights.d.ts +181 -0
  399. package/dist/render/lights.js +233 -0
  400. package/dist/render/lod.d.ts +54 -0
  401. package/dist/render/lod.js +52 -0
  402. package/dist/render/material.d.ts +165 -0
  403. package/dist/render/material.js +292 -0
  404. package/dist/render/mesh.d.ts +284 -0
  405. package/dist/render/mesh.js +472 -0
  406. package/dist/render/mipmap.d.ts +16 -0
  407. package/dist/render/mipmap.js +121 -0
  408. package/dist/render/parallax.d.ts +50 -0
  409. package/dist/render/parallax.js +47 -0
  410. package/dist/render/pbr-wgsl.d.ts +31 -0
  411. package/dist/render/pbr-wgsl.js +119 -0
  412. package/dist/render/ping-pong.d.ts +42 -0
  413. package/dist/render/ping-pong.js +74 -0
  414. package/dist/render/renderer.d.ts +741 -0
  415. package/dist/render/renderer.js +2486 -0
  416. package/dist/render/scene-pipelines.d.ts +44 -0
  417. package/dist/render/scene-pipelines.js +92 -0
  418. package/dist/render/scene-target.d.ts +170 -0
  419. package/dist/render/scene-target.js +450 -0
  420. package/dist/render/shadow.d.ts +74 -0
  421. package/dist/render/shadow.js +208 -0
  422. package/dist/render/skin.d.ts +112 -0
  423. package/dist/render/skin.js +240 -0
  424. package/dist/render/snapshot.d.ts +36 -0
  425. package/dist/render/snapshot.js +34 -0
  426. package/dist/render/standard.d.ts +162 -0
  427. package/dist/render/standard.js +263 -0
  428. package/dist/render/texture.d.ts +142 -0
  429. package/dist/render/texture.js +228 -0
  430. package/dist/render/tile-layer.d.ts +110 -0
  431. package/dist/render/tile-layer.js +304 -0
  432. package/dist/render/transform.d.ts +115 -0
  433. package/dist/render/transform.js +318 -0
  434. package/dist/render/wgsl.d.ts +131 -0
  435. package/dist/render/wgsl.js +528 -0
  436. package/dist/save/codec.d.ts +49 -0
  437. package/dist/save/codec.js +169 -0
  438. package/dist/save/index.d.ts +8 -0
  439. package/dist/save/index.js +8 -0
  440. package/dist/save/journal.d.ts +24 -0
  441. package/dist/save/journal.js +102 -0
  442. package/dist/save/migrate.d.ts +15 -0
  443. package/dist/save/migrate.js +37 -0
  444. package/dist/save/schema.d.ts +72 -0
  445. package/dist/save/schema.js +154 -0
  446. package/dist/save/settings.d.ts +28 -0
  447. package/dist/save/settings.js +59 -0
  448. package/dist/save/slots.d.ts +56 -0
  449. package/dist/save/slots.js +200 -0
  450. package/dist/save/storage.d.ts +35 -0
  451. package/dist/save/storage.js +62 -0
  452. package/dist/save/store.d.ts +114 -0
  453. package/dist/save/store.js +269 -0
  454. package/dist/testing/fake-host.d.ts +103 -0
  455. package/dist/testing/fake-host.js +163 -0
  456. package/dist/testing/fixed-clock.d.ts +25 -0
  457. package/dist/testing/fixed-clock.js +30 -0
  458. package/dist/testing/index.d.ts +4 -0
  459. package/dist/testing/index.js +5 -0
  460. package/dist/testing/test-game.d.ts +76 -0
  461. package/dist/testing/test-game.js +92 -0
  462. package/dist/tween/ease.d.ts +77 -0
  463. package/dist/tween/ease.js +192 -0
  464. package/dist/tween/index.d.ts +8 -0
  465. package/dist/tween/index.js +7 -0
  466. package/dist/tween/timeline.d.ts +78 -0
  467. package/dist/tween/timeline.js +269 -0
  468. package/dist/tween/tween.d.ts +168 -0
  469. package/dist/tween/tween.js +320 -0
  470. package/dist/ui/anchor.d.ts +206 -0
  471. package/dist/ui/anchor.js +307 -0
  472. package/dist/ui/caption.d.ts +122 -0
  473. package/dist/ui/caption.js +286 -0
  474. package/dist/ui/cursor.d.ts +105 -0
  475. package/dist/ui/cursor.js +261 -0
  476. package/dist/ui/dom.d.ts +30 -0
  477. package/dist/ui/dom.js +92 -0
  478. package/dist/ui/floats.d.ts +86 -0
  479. package/dist/ui/floats.js +260 -0
  480. package/dist/ui/hud.d.ts +198 -0
  481. package/dist/ui/hud.js +431 -0
  482. package/dist/ui/index.d.ts +37 -0
  483. package/dist/ui/index.js +34 -0
  484. package/dist/ui/inventory-card.d.ts +52 -0
  485. package/dist/ui/inventory-card.js +173 -0
  486. package/dist/ui/inventory-context.d.ts +29 -0
  487. package/dist/ui/inventory-context.js +125 -0
  488. package/dist/ui/inventory-drag.d.ts +63 -0
  489. package/dist/ui/inventory-drag.js +394 -0
  490. package/dist/ui/inventory-grid.d.ts +66 -0
  491. package/dist/ui/inventory-grid.js +625 -0
  492. package/dist/ui/inventory-radial.d.ts +39 -0
  493. package/dist/ui/inventory-radial.js +168 -0
  494. package/dist/ui/inventory.d.ts +128 -0
  495. package/dist/ui/inventory.js +154 -0
  496. package/dist/ui/layout.d.ts +356 -0
  497. package/dist/ui/layout.js +856 -0
  498. package/dist/ui/link.d.ts +64 -0
  499. package/dist/ui/link.js +155 -0
  500. package/dist/ui/loading.d.ts +40 -0
  501. package/dist/ui/loading.js +157 -0
  502. package/dist/ui/loupe.d.ts +74 -0
  503. package/dist/ui/loupe.js +164 -0
  504. package/dist/ui/menu-nav.d.ts +33 -0
  505. package/dist/ui/menu-nav.js +28 -0
  506. package/dist/ui/minimap-canvas.d.ts +145 -0
  507. package/dist/ui/minimap-canvas.js +460 -0
  508. package/dist/ui/notify.d.ts +40 -0
  509. package/dist/ui/notify.js +141 -0
  510. package/dist/ui/orb.d.ts +53 -0
  511. package/dist/ui/orb.js +304 -0
  512. package/dist/ui/overlay.d.ts +213 -0
  513. package/dist/ui/overlay.js +394 -0
  514. package/dist/ui/padnav.d.ts +53 -0
  515. package/dist/ui/padnav.js +146 -0
  516. package/dist/ui/perf.d.ts +130 -0
  517. package/dist/ui/perf.js +329 -0
  518. package/dist/ui/rotate-card.d.ts +54 -0
  519. package/dist/ui/rotate-card.js +97 -0
  520. package/dist/ui/stack.d.ts +128 -0
  521. package/dist/ui/stack.js +312 -0
  522. package/dist/ui/styles.d.ts +13 -0
  523. package/dist/ui/styles.js +200 -0
  524. package/dist/ui/text-scale.d.ts +67 -0
  525. package/dist/ui/text-scale.js +102 -0
  526. package/dist/ui/theme.d.ts +70 -0
  527. package/dist/ui/theme.js +98 -0
  528. package/dist/ui/toast.d.ts +23 -0
  529. package/dist/ui/toast.js +46 -0
  530. package/dist/ui/tooltip.d.ts +89 -0
  531. package/dist/ui/tooltip.js +333 -0
  532. package/dist/ui/widgets-2.d.ts +134 -0
  533. package/dist/ui/widgets-2.js +399 -0
  534. package/dist/ui/widgets-3.d.ts +91 -0
  535. package/dist/ui/widgets-3.js +212 -0
  536. package/dist/ui/widgets.d.ts +34 -0
  537. package/dist/ui/widgets.js +50 -0
  538. package/dist/ui/world-panel/index.d.ts +5 -0
  539. package/dist/ui/world-panel/index.js +5 -0
  540. package/dist/ui/world-panel/layout.d.ts +38 -0
  541. package/dist/ui/world-panel/layout.js +68 -0
  542. package/dist/ui/world-panel/paint.d.ts +96 -0
  543. package/dist/ui/world-panel/paint.js +136 -0
  544. package/dist/ui/world-panel/panel.d.ts +235 -0
  545. package/dist/ui/world-panel/panel.js +762 -0
  546. package/dist/ui/world-panel/wgsl.d.ts +10 -0
  547. package/dist/ui/world-panel/wgsl.js +52 -0
  548. package/dist/ui/world-panel/widgets.d.ts +207 -0
  549. package/dist/ui/world-panel/widgets.js +569 -0
  550. package/dist/voxel/chunks.d.ts +77 -0
  551. package/dist/voxel/chunks.js +149 -0
  552. package/dist/voxel/grid.d.ts +84 -0
  553. package/dist/voxel/grid.js +223 -0
  554. package/dist/voxel/index.d.ts +22 -0
  555. package/dist/voxel/index.js +7 -0
  556. package/dist/voxel/mesher-worker.d.ts +14 -0
  557. package/dist/voxel/mesher-worker.js +47 -0
  558. package/dist/voxel/mesher.d.ts +73 -0
  559. package/dist/voxel/mesher.js +306 -0
  560. package/dist/voxel/ray.d.ts +32 -0
  561. package/dist/voxel/ray.js +73 -0
  562. package/dist/voxel/wgsl.d.ts +16 -0
  563. package/dist/voxel/wgsl.js +28 -0
  564. package/dist/voxel/worker-client.d.ts +79 -0
  565. package/dist/voxel/worker-client.js +122 -0
  566. package/package.json +177 -3
@@ -0,0 +1,294 @@
1
+ import { OBSTACLE_AREA } from './mesh/areas.js';
2
+ import { NavMesh } from './mesh/navmesh.js';
3
+ /** Squared XZ distance from `(x, z)` to polygon `p` (0 inside). */
4
+ function polyDistance2(mesh, p, x, z) {
5
+ if (mesh.containsXZ(p, x, z))
6
+ return 0;
7
+ const n = mesh.polyVertexCount(p);
8
+ const nvp = mesh.maxVertsPerPoly;
9
+ const verts = mesh.verts;
10
+ let best = Number.POSITIVE_INFINITY;
11
+ for (let k = 0; k < n; k++) {
12
+ const a = mesh.polys[p * nvp + k] * 3;
13
+ const b = mesh.polys[p * nvp + (k + 1 === n ? 0 : k + 1)] * 3;
14
+ const ax = verts[a];
15
+ const az = verts[a + 2];
16
+ const ex = verts[b] - ax;
17
+ const ez = verts[b + 2] - az;
18
+ const len = ex * ex + ez * ez;
19
+ let t = len > 0 ? ((x - ax) * ex + (z - az) * ez) / len : 0;
20
+ if (t < 0)
21
+ t = 0;
22
+ else if (t > 1)
23
+ t = 1;
24
+ const dx = ax + ex * t - x;
25
+ const dz = az + ez * t - z;
26
+ const d = dx * dx + dz * dz;
27
+ if (d < best)
28
+ best = d;
29
+ }
30
+ return best;
31
+ }
32
+ /** Separating-axis test between polygon `p` and a yawed box (both convex, XZ). */
33
+ function polyOverlapsBox(mesh, p, bx, bz, hw, hd, yaw) {
34
+ const n = mesh.polyVertexCount(p);
35
+ const nvp = mesh.maxVertsPerPoly;
36
+ const verts = mesh.verts;
37
+ const c = Math.cos(yaw);
38
+ const s = Math.sin(yaw);
39
+ // Box axes: u = (c, s), v = (-s, c); the box's projection on an axis (nx, nz) has half width
40
+ // hw·|u·n| + hd·|v·n| around its centre.
41
+ const axes = n + 2;
42
+ for (let i = 0; i < axes; i++) {
43
+ let nx;
44
+ let nz;
45
+ if (i === n) {
46
+ nx = c;
47
+ nz = s;
48
+ }
49
+ else if (i === n + 1) {
50
+ nx = -s;
51
+ nz = c;
52
+ }
53
+ else {
54
+ const a = mesh.polys[p * nvp + i] * 3;
55
+ const b = mesh.polys[p * nvp + (i + 1 === n ? 0 : i + 1)] * 3;
56
+ nx = -(verts[b + 2] - verts[a + 2]);
57
+ nz = verts[b] - verts[a];
58
+ }
59
+ let pmin = Number.POSITIVE_INFINITY;
60
+ let pmax = Number.NEGATIVE_INFINITY;
61
+ for (let k = 0; k < n; k++) {
62
+ const v = mesh.polys[p * nvp + k] * 3;
63
+ const d = verts[v] * nx + verts[v + 2] * nz;
64
+ if (d < pmin)
65
+ pmin = d;
66
+ if (d > pmax)
67
+ pmax = d;
68
+ }
69
+ const bc = bx * nx + bz * nz;
70
+ const br = hw * Math.abs(c * nx + s * nz) + hd * Math.abs(-s * nx + c * nz);
71
+ if (bc + br < pmin || bc - br > pmax)
72
+ return false;
73
+ }
74
+ return true;
75
+ }
76
+ /** Whether a yawed box holds `(x, z)` once inflated by `pad` on every side. */
77
+ function boxHolds(x, z, bx, bz, hw, hd, yaw, pad) {
78
+ const c = Math.cos(yaw);
79
+ const s = Math.sin(yaw);
80
+ const dx = x - bx;
81
+ const dz = z - bz;
82
+ const lx = dx * c + dz * s;
83
+ const lz = -dx * s + dz * c;
84
+ return Math.abs(lx) <= hw + pad && Math.abs(lz) <= hd + pad;
85
+ }
86
+ /** A set of up to `maxObstacles` obstacles over a mesh or a grid. */
87
+ export function createObstacleSet(target, opts) {
88
+ const max = Math.max(1, opts.maxObstacles);
89
+ const mesh = target instanceof NavMesh ? target : null;
90
+ const grid = mesh ? null : target;
91
+ const slots = [];
92
+ for (let i = 0; i < max; i++) {
93
+ slots.push({
94
+ active: false,
95
+ id: 0,
96
+ kind: 'disc',
97
+ x: 0,
98
+ z: 0,
99
+ radius: 0,
100
+ w: 0,
101
+ d: 0,
102
+ yaw: 0,
103
+ dirty: false,
104
+ applied: false,
105
+ ax: 0,
106
+ az: 0,
107
+ aradius: 0,
108
+ aw: 0,
109
+ ad: 0,
110
+ ayaw: 0,
111
+ akind: 'disc',
112
+ });
113
+ }
114
+ const layer = grid && opts.layer && opts.layer.length >= grid.size
115
+ ? opts.layer
116
+ : new Float32Array(grid ? grid.size : 0);
117
+ const cover = new Uint16Array(mesh ? Math.max(1, mesh.polyCount) : grid ? grid.size : 1);
118
+ const saved = mesh ? new Uint8Array(Math.max(1, mesh.polyCount)) : null;
119
+ let nextId = 1;
120
+ let count = 0;
121
+ let version = 0;
122
+ const slotOf = (id) => {
123
+ if (id <= 0)
124
+ return undefined;
125
+ for (let i = 0; i < max; i++) {
126
+ const s = slots[i];
127
+ if (s.active && s.id === id)
128
+ return s;
129
+ }
130
+ return undefined;
131
+ };
132
+ /** Adds or removes one footprint's coverage; returns the polygons or cells whose state flipped. */
133
+ const stamp = (kind, x, z, radius, w, d, yaw, delta) => {
134
+ let flipped = 0;
135
+ const hw = w * 0.5;
136
+ const hd = d * 0.5;
137
+ if (mesh && saved) {
138
+ const n = mesh.polysInBox(x - radius, z - radius, x + radius, z + radius);
139
+ const found = mesh.polysFound;
140
+ for (let i = 0; i < n; i++) {
141
+ const p = found[i];
142
+ const hit = kind === 'disc'
143
+ ? polyDistance2(mesh, p, x, z) <= radius * radius
144
+ : polyOverlapsBox(mesh, p, x, z, hw, hd, yaw);
145
+ if (!hit)
146
+ continue;
147
+ const was = cover[p];
148
+ const now = was + delta;
149
+ cover[p] = now;
150
+ if (was === 0 && now === 1) {
151
+ saved[p] = mesh.area[p];
152
+ mesh.area[p] = OBSTACLE_AREA;
153
+ flipped++;
154
+ }
155
+ else if (was === 1 && now === 0) {
156
+ mesh.area[p] = saved[p];
157
+ flipped++;
158
+ }
159
+ }
160
+ }
161
+ else if (grid) {
162
+ const cs = grid.cellSize;
163
+ const pad = cs * 0.5;
164
+ const reach = radius + pad;
165
+ const x0 = Math.max(0, Math.floor((x - reach - grid.origin.x) / cs));
166
+ const z0 = Math.max(0, Math.floor((z - reach - grid.origin.z) / cs));
167
+ const x1 = Math.min(grid.width - 1, Math.floor((x + reach - grid.origin.x) / cs));
168
+ const z1 = Math.min(grid.height - 1, Math.floor((z + reach - grid.origin.z) / cs));
169
+ const r2 = reach * reach;
170
+ for (let cy = z0; cy <= z1; cy++) {
171
+ for (let cx = x0; cx <= x1; cx++) {
172
+ const wx = grid.origin.x + (cx + 0.5) * cs;
173
+ const wz = grid.origin.z + (cy + 0.5) * cs;
174
+ let hit;
175
+ if (kind === 'disc') {
176
+ const dx = wx - x;
177
+ const dz = wz - z;
178
+ hit = dx * dx + dz * dz <= r2;
179
+ }
180
+ else {
181
+ hit = boxHolds(wx, wz, x, z, hw, hd, yaw, pad);
182
+ }
183
+ if (!hit)
184
+ continue;
185
+ const i = cy * grid.width + cx;
186
+ const was = cover[i];
187
+ const now = was + delta;
188
+ cover[i] = now;
189
+ if (was === 0 && now === 1) {
190
+ layer[i] = Infinity;
191
+ flipped++;
192
+ }
193
+ else if (was === 1 && now === 0) {
194
+ layer[i] = 0;
195
+ flipped++;
196
+ }
197
+ }
198
+ }
199
+ }
200
+ return flipped;
201
+ };
202
+ return {
203
+ obstacles: slots,
204
+ get count() {
205
+ return count;
206
+ },
207
+ get version() {
208
+ return version;
209
+ },
210
+ layer,
211
+ add(shape) {
212
+ for (let i = 0; i < max; i++) {
213
+ const s = slots[i];
214
+ if (s.active)
215
+ continue;
216
+ s.active = true;
217
+ s.id = nextId++;
218
+ s.x = shape.x;
219
+ s.z = shape.z;
220
+ if ('radius' in shape) {
221
+ s.kind = 'disc';
222
+ s.radius = Math.max(0, shape.radius);
223
+ s.w = s.d = s.radius * 2;
224
+ s.yaw = 0;
225
+ }
226
+ else {
227
+ s.kind = 'box';
228
+ s.w = Math.max(0, shape.w);
229
+ s.d = Math.max(0, shape.d);
230
+ s.yaw = shape.yaw;
231
+ s.radius = Math.sqrt(s.w * s.w + s.d * s.d) * 0.5;
232
+ }
233
+ s.dirty = true;
234
+ count++;
235
+ return s.id;
236
+ }
237
+ return -1;
238
+ },
239
+ move(id, x, z, yaw) {
240
+ const s = slotOf(id);
241
+ if (!s)
242
+ return;
243
+ if (s.x === x && s.z === z && (yaw === undefined || yaw === s.yaw))
244
+ return;
245
+ s.x = x;
246
+ s.z = z;
247
+ if (yaw !== undefined && s.kind === 'box')
248
+ s.yaw = yaw;
249
+ s.dirty = true;
250
+ },
251
+ remove(id) {
252
+ const s = slotOf(id);
253
+ if (!s)
254
+ return false;
255
+ s.active = false;
256
+ s.dirty = true;
257
+ count--;
258
+ return true;
259
+ },
260
+ get: slotOf,
261
+ apply() {
262
+ let flipped = 0;
263
+ for (let i = 0; i < max; i++) {
264
+ const s = slots[i];
265
+ if (!s.dirty)
266
+ continue;
267
+ s.dirty = false;
268
+ if (s.applied) {
269
+ flipped += stamp(s.akind, s.ax, s.az, s.aradius, s.aw, s.ad, s.ayaw, -1);
270
+ s.applied = false;
271
+ }
272
+ if (s.active) {
273
+ flipped += stamp(s.kind, s.x, s.z, s.radius, s.w, s.d, s.yaw, 1);
274
+ s.applied = true;
275
+ s.akind = s.kind;
276
+ s.ax = s.x;
277
+ s.az = s.z;
278
+ s.aradius = s.radius;
279
+ s.aw = s.w;
280
+ s.ad = s.d;
281
+ s.ayaw = s.yaw;
282
+ }
283
+ }
284
+ if (flipped > 0) {
285
+ version++;
286
+ if (mesh)
287
+ mesh.version++;
288
+ else
289
+ grid?.touch();
290
+ }
291
+ return flipped;
292
+ },
293
+ };
294
+ }
@@ -0,0 +1,59 @@
1
+ /**
2
+ * `NavPath`: a reusable list of world XZ waypoints, `followPath`, which turns one into a
3
+ * desired velocity per tick, and string pulling (`smoothPath` over `hasLineOfWalkable`, both
4
+ * honouring the grid's edge-cost hook). Allocation-free after the path's capacity settles.
5
+ */
6
+ import type { EdgeCost, NavGrid, NavPoint } from './grid.js';
7
+ export interface NavPath {
8
+ /** Waypoints as world `x, z` pairs; `length * 2` floats are valid. Grows in place as needed. */
9
+ points: Float32Array;
10
+ /** Waypoints in the path (0 when no path). */
11
+ length: number;
12
+ /** Index of the waypoint `followPath` is heading for. */
13
+ cursor: number;
14
+ /** `grid.version` when the path was found; differs from the grid's once the grid was edited. */
15
+ version: number;
16
+ }
17
+ /** A path with room for `capacity` waypoints (grows on demand). */
18
+ export declare function createNavPath(capacity?: number): NavPath;
19
+ /** Makes room for `count` waypoints (1.5× growth), keeping the floats already there. */
20
+ export declare function reservePath(path: NavPath, count: number): void;
21
+ /** Empties the path (`length` 0, `cursor` 0); the buffer stays. */
22
+ export declare function clearPath(path: NavPath): void;
23
+ /** Writes waypoint `i` into `out`. */
24
+ export declare function pathPoint(path: NavPath, i: number, out: NavPoint): NavPoint;
25
+ /** The sum of the segment lengths, world units. */
26
+ export declare function pathDistance(path: NavPath): number;
27
+ export type FollowResult = 'moving' | 'arrived';
28
+ /**
29
+ * Heads for `path.points[path.cursor]` at `speed`: the cursor advances when `position` is within
30
+ * `arriveRadius` of its waypoint, and the last waypoint reached is `'arrived'` with a zero
31
+ * velocity. `outVelocity` is the desired velocity (world units per second), full speed until the
32
+ * end (pair with `steer.arrive` for a slow-down). An empty path is `'arrived'`.
33
+ */
34
+ export declare function followPath(path: NavPath, position: Readonly<NavPoint>, speed: number, arriveRadius: number, outVelocity: NavPoint): FollowResult;
35
+ export interface LineOfWalkableOptions {
36
+ /**
37
+ * The step-cost hook the line honours per cell pair it crosses: a pair the hook blocks
38
+ * (`Infinity`) breaks the line, so a one-way ledge is never cut across. Default: the grid's own
39
+ * `edgeCost`; `null` opts out (walkability only).
40
+ */
41
+ edgeCost?: EdgeCost | null;
42
+ }
43
+ /**
44
+ * True when a straight segment between the centres of two cells crosses walkable cells only
45
+ * (a supercover walk: a segment through a corner needs both cells beside the corner walkable,
46
+ * so it never slips between two diagonal walls) and no cell pair along it is blocked by the
47
+ * edge-cost hook (the grid's, or `opts.edgeCost`; `null` ignores hooks). Both endpoints must be
48
+ * walkable. Allocation-free.
49
+ */
50
+ export declare function hasLineOfWalkable(grid: NavGrid, x0: number, y0: number, x1: number, y1: number, opts?: LineOfWalkableOptions): boolean;
51
+ /**
52
+ * String pulling: drops every waypoint that a straight line of walkable cells can skip, in
53
+ * place, so a staircase of cell centres becomes a few straight legs. A leg never crosses a cell
54
+ * pair the edge-cost hook blocks (`hasLineOfWalkable` with `opts`), so a bend at a cliff stays.
55
+ * On a 4-neighbour grid a leg never leaves its row or column: only collinear waypoints are
56
+ * dropped, so the path keeps every corner and makes no diagonal cut. `path.cursor` is reset to
57
+ * 0. Returns the path. Allocation-free.
58
+ */
59
+ export declare function smoothPath(grid: NavGrid, path: NavPath, opts?: LineOfWalkableOptions): NavPath;
@@ -0,0 +1,177 @@
1
+ /** A path with room for `capacity` waypoints (grows on demand). */
2
+ export function createNavPath(capacity = 64) {
3
+ return { points: new Float32Array(Math.max(1, capacity) * 2), length: 0, cursor: 0, version: -1 };
4
+ }
5
+ /** Makes room for `count` waypoints (1.5× growth), keeping the floats already there. */
6
+ export function reservePath(path, count) {
7
+ const need = count * 2;
8
+ if (path.points.length >= need)
9
+ return;
10
+ const next = new Float32Array(Math.max(need, Math.ceil(path.points.length * 1.5)));
11
+ next.set(path.points);
12
+ path.points = next;
13
+ }
14
+ /** Empties the path (`length` 0, `cursor` 0); the buffer stays. */
15
+ export function clearPath(path) {
16
+ path.length = 0;
17
+ path.cursor = 0;
18
+ }
19
+ /** Writes waypoint `i` into `out`. */
20
+ export function pathPoint(path, i, out) {
21
+ out.x = path.points[i * 2];
22
+ out.z = path.points[i * 2 + 1];
23
+ return out;
24
+ }
25
+ /** The sum of the segment lengths, world units. */
26
+ export function pathDistance(path) {
27
+ const p = path.points;
28
+ let d = 0;
29
+ for (let i = 1; i < path.length; i++) {
30
+ const dx = p[i * 2] - p[i * 2 - 2];
31
+ const dz = p[i * 2 + 1] - p[i * 2 - 1];
32
+ d += Math.sqrt(dx * dx + dz * dz);
33
+ }
34
+ return d;
35
+ }
36
+ /**
37
+ * Heads for `path.points[path.cursor]` at `speed`: the cursor advances when `position` is within
38
+ * `arriveRadius` of its waypoint, and the last waypoint reached is `'arrived'` with a zero
39
+ * velocity. `outVelocity` is the desired velocity (world units per second), full speed until the
40
+ * end (pair with `steer.arrive` for a slow-down). An empty path is `'arrived'`.
41
+ */
42
+ export function followPath(path, position, speed, arriveRadius, outVelocity) {
43
+ const n = path.length;
44
+ if (n === 0) {
45
+ outVelocity.x = 0;
46
+ outVelocity.z = 0;
47
+ return 'arrived';
48
+ }
49
+ if (path.cursor >= n)
50
+ path.cursor = n - 1;
51
+ const r2 = arriveRadius * arriveRadius;
52
+ const p = path.points;
53
+ let dx = p[path.cursor * 2] - position.x;
54
+ let dz = p[path.cursor * 2 + 1] - position.z;
55
+ while (dx * dx + dz * dz <= r2) {
56
+ if (path.cursor >= n - 1) {
57
+ outVelocity.x = 0;
58
+ outVelocity.z = 0;
59
+ return 'arrived';
60
+ }
61
+ path.cursor++;
62
+ dx = p[path.cursor * 2] - position.x;
63
+ dz = p[path.cursor * 2 + 1] - position.z;
64
+ }
65
+ const d = Math.sqrt(dx * dx + dz * dz);
66
+ outVelocity.x = (dx / d) * speed;
67
+ outVelocity.z = (dz / d) * speed;
68
+ return 'moving';
69
+ }
70
+ /**
71
+ * True when a straight segment between the centres of two cells crosses walkable cells only
72
+ * (a supercover walk: a segment through a corner needs both cells beside the corner walkable,
73
+ * so it never slips between two diagonal walls) and no cell pair along it is blocked by the
74
+ * edge-cost hook (the grid's, or `opts.edgeCost`; `null` ignores hooks). Both endpoints must be
75
+ * walkable. Allocation-free.
76
+ */
77
+ export function hasLineOfWalkable(grid, x0, y0, x1, y1, opts) {
78
+ if (!grid.isWalkable(x0, y0) || !grid.isWalkable(x1, y1))
79
+ return false;
80
+ const hook = opts === undefined || opts.edgeCost === undefined ? grid.edgeCost : opts.edgeCost;
81
+ const width = grid.width;
82
+ let x = x0;
83
+ let y = y0;
84
+ const dx = Math.abs(x1 - x0);
85
+ const dy = Math.abs(y1 - y0);
86
+ const sx = x1 > x0 ? 1 : -1;
87
+ const sy = y1 > y0 ? 1 : -1;
88
+ // Integer DDA: the next vertical boundary is crossed at t = (ix + 0.5) / dx, the next
89
+ // horizontal one at (iy + 0.5) / dy; both scaled by 2·dx·dy so the comparison is exact.
90
+ let ix = 0;
91
+ let iy = 0;
92
+ while (ix < dx || iy < dy) {
93
+ const from = y * width + x;
94
+ const tx = (2 * ix + 1) * dy;
95
+ const ty = (2 * iy + 1) * dx;
96
+ if (ix < dx && (iy >= dy || tx < ty)) {
97
+ x += sx;
98
+ ix++;
99
+ }
100
+ else if (iy < dy && (ix >= dx || ty < tx)) {
101
+ y += sy;
102
+ iy++;
103
+ }
104
+ else {
105
+ // Exactly through a corner: both cells beside it must be open, then step diagonally.
106
+ if (!grid.isWalkable(x + sx, y) || !grid.isWalkable(x, y + sy))
107
+ return false;
108
+ x += sx;
109
+ y += sy;
110
+ ix++;
111
+ iy++;
112
+ }
113
+ if (!grid.isWalkable(x, y))
114
+ return false;
115
+ if (hook) {
116
+ const e = hook(from, y * width + x, grid);
117
+ if (e === Infinity || Number.isNaN(e))
118
+ return false;
119
+ }
120
+ }
121
+ return true;
122
+ }
123
+ const sa = { x: 0, y: 0 };
124
+ const sb = { x: 0, y: 0 };
125
+ /**
126
+ * String pulling: drops every waypoint that a straight line of walkable cells can skip, in
127
+ * place, so a staircase of cell centres becomes a few straight legs. A leg never crosses a cell
128
+ * pair the edge-cost hook blocks (`hasLineOfWalkable` with `opts`), so a bend at a cliff stays.
129
+ * On a 4-neighbour grid a leg never leaves its row or column: only collinear waypoints are
130
+ * dropped, so the path keeps every corner and makes no diagonal cut. `path.cursor` is reset to
131
+ * 0. Returns the path. Allocation-free.
132
+ */
133
+ export function smoothPath(grid, path, opts) {
134
+ const n = path.length;
135
+ path.cursor = 0;
136
+ if (n < 3)
137
+ return path;
138
+ const p = path.points;
139
+ let write = 1;
140
+ if (grid.neighbours === 4) {
141
+ for (let i = 1; i < n - 1; i++) {
142
+ const ax = p[i * 2] - p[write * 2 - 2];
143
+ const az = p[i * 2 + 1] - p[write * 2 - 1];
144
+ const bx = p[i * 2 + 2] - p[i * 2];
145
+ const bz = p[i * 2 + 3] - p[i * 2 + 1];
146
+ // Keep the waypoint when the run bends (the cross product of the two legs is not zero).
147
+ if (ax * bz - az * bx !== 0) {
148
+ p[write * 2] = p[i * 2];
149
+ p[write * 2 + 1] = p[i * 2 + 1];
150
+ write++;
151
+ }
152
+ }
153
+ p[write * 2] = p[n * 2 - 2];
154
+ p[write * 2 + 1] = p[n * 2 - 1];
155
+ path.length = write + 1;
156
+ return path;
157
+ }
158
+ let anchor = 0;
159
+ while (anchor < n - 1) {
160
+ grid.toCell(p[anchor * 2], p[anchor * 2 + 1], sa);
161
+ // The furthest waypoint visible from the anchor; the next one is always reachable.
162
+ let far = anchor + 1;
163
+ for (let j = n - 1; j > anchor + 1; j--) {
164
+ grid.toCell(p[j * 2], p[j * 2 + 1], sb);
165
+ if (hasLineOfWalkable(grid, sa.x, sa.y, sb.x, sb.y, opts)) {
166
+ far = j;
167
+ break;
168
+ }
169
+ }
170
+ p[write * 2] = p[far * 2];
171
+ p[write * 2 + 1] = p[far * 2 + 1];
172
+ write++;
173
+ anchor = far;
174
+ }
175
+ path.length = write;
176
+ return path;
177
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * A path queue: requests are tickets, `update()` spends a fixed budget of A* pops per call on
3
+ * them in order (one search in flight at a time, the budget left over flowing to the next
4
+ * ticket), so a hundred agents asking for routes at once cost the same per frame as one. Works
5
+ * over a `NavMesh` (a `MeshSearch`) or a `NavGrid` (a sliced copy of `findPath`'s A*, same
6
+ * expansions, same paths). Grid paths are string-pulled when asked. A search whose target
7
+ * changed version under it restarts. Every array is allocated at creation.
8
+ */
9
+ import type { FindPathOptions } from './astar.js';
10
+ import { type NavCell, type NavGrid } from './grid.js';
11
+ import { type FindMeshPathOptions, type NavPath3 } from './mesh/mesh-path.js';
12
+ import { NavMesh, type NavPoint3 } from './mesh/navmesh.js';
13
+ import { type NavPath } from './path.js';
14
+ export type PathStatus = 'pending' | 'done' | 'failed' | 'none';
15
+ export interface PathQueueOptions {
16
+ /** How many tickets may wait or be in flight at once. */
17
+ maxQueries: number;
18
+ /** A* pops spent per `update()`, shared by the tickets it works on. Default 256. */
19
+ iterationsPerUpdate?: number;
20
+ }
21
+ export interface PathRequestOptions extends FindMeshPathOptions, FindPathOptions {
22
+ /** Grid only: string-pull the path (`smoothPath`) when it is done. Default false. */
23
+ smooth?: boolean;
24
+ }
25
+ export interface PathQueue {
26
+ /** Tickets waiting or in flight. */
27
+ readonly pending: number;
28
+ /** Tickets finished since creation (done or failed). */
29
+ readonly finished: number;
30
+ /**
31
+ * Queues a search from `from` to `to` into `out` (a `NavPath3` on a mesh, a `NavPath` on a
32
+ * grid). Grid ends are cells. Returns the ticket (> 0), or -1 when the queue is full. `out`
33
+ * is written only when the ticket completes (`'done'`), and never after a cancel.
34
+ */
35
+ request(from: Readonly<NavPoint3> | Readonly<NavCell>, to: Readonly<NavPoint3> | Readonly<NavCell>, out: NavPath3 | NavPath, opts?: PathRequestOptions): number;
36
+ /** Spends the budget; returns the pops used. */
37
+ update(): number;
38
+ /** `'pending'` while queued or in flight, `'done'`/`'failed'` once finished, `'none'` for an unknown or cancelled ticket. */
39
+ status(ticket: number): PathStatus;
40
+ /** Drops a ticket; its `out` is left untouched. False when the ticket is unknown. */
41
+ cancel(ticket: number): boolean;
42
+ /** Called once per finished ticket (within `update`) with its outcome. */
43
+ onDone: ((ticket: number, ok: boolean, out: NavPath3 | NavPath) => void) | null;
44
+ }
45
+ /** A queue of path searches over a mesh or a grid, sliced across `update()` calls. */
46
+ export declare function createPathQueue(target: NavMesh | NavGrid, opts: PathQueueOptions): PathQueue;