@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,193 @@
1
+ import { edgeCostOf, NEIGHBOUR_X, NEIGHBOUR_Y, stepLength } from './grid.js';
2
+ import { CellHeap } from './heap.js';
3
+ const NX = NEIGHBOUR_X;
4
+ const NY = NEIGHBOUR_Y;
5
+ class Field {
6
+ grid;
7
+ distances;
8
+ directions;
9
+ stepCosts;
10
+ goals;
11
+ goalCount = 0;
12
+ version = -1;
13
+ key;
14
+ heap;
15
+ constructor(grid) {
16
+ this.grid = grid;
17
+ const n = grid.size;
18
+ this.distances = new Float32Array(n).fill(Infinity);
19
+ this.directions = new Float32Array(n * 2);
20
+ this.stepCosts = new Float32Array(n).fill(Infinity);
21
+ this.goals = new Int32Array(n);
22
+ this.key = new Float64Array(n);
23
+ this.heap = new CellHeap(n, this.key);
24
+ }
25
+ get stale() {
26
+ return this.version !== this.grid.version;
27
+ }
28
+ build(goals) {
29
+ const grid = this.grid;
30
+ let count = 0;
31
+ for (let i = 0; i < goals.length && count < this.goals.length; i++) {
32
+ const c = goals[i];
33
+ if (!grid.inBounds(c.x, c.y))
34
+ continue;
35
+ this.goals[count++] = c.y * grid.width + c.x;
36
+ }
37
+ this.goalCount = count;
38
+ this.update();
39
+ }
40
+ setGoals(goals) {
41
+ const size = this.grid.size;
42
+ let count = 0;
43
+ for (let i = 0; i < goals.length && count < this.goals.length; i++) {
44
+ const gi = goals[i];
45
+ if (!(gi >= 0 && gi < size))
46
+ continue;
47
+ this.goals[count++] = gi;
48
+ }
49
+ this.goalCount = count;
50
+ this.update();
51
+ }
52
+ update() {
53
+ const grid = this.grid;
54
+ const width = grid.width;
55
+ const height = grid.height;
56
+ const costs = grid.costs;
57
+ const dirs8 = grid.neighbours;
58
+ const dist = this.key;
59
+ const heap = this.heap;
60
+ const hooked = grid.edgeCost !== undefined;
61
+ dist.fill(Infinity);
62
+ heap.clear();
63
+ for (let i = 0; i < this.goalCount; i++) {
64
+ const gi = this.goals[i];
65
+ if (costs[gi] <= 0)
66
+ continue;
67
+ dist[gi] = 0;
68
+ heap.pushOrDecrease(gi);
69
+ }
70
+ while (heap.size > 0) {
71
+ const cur = heap.pop();
72
+ const cx = cur % width;
73
+ const cy = (cur - cx) / width;
74
+ const dc = dist[cur];
75
+ // The search runs from the goals outward, so the edge is walked the other way: from the
76
+ // neighbour into `cur`. The hook sees it in that order, so a one-way ledge works.
77
+ for (let d = 0; d < dirs8; d++) {
78
+ const len = stepLength(grid, cx, cy, d);
79
+ if (len === Infinity)
80
+ continue;
81
+ const ni = (cy + NY[d]) * width + cx + NX[d];
82
+ const nd = dc + len * costs[ni] + (hooked ? edgeCostOf(grid, ni, cur) : 0);
83
+ if (nd >= dist[ni])
84
+ continue;
85
+ dist[ni] = nd;
86
+ heap.pushOrDecrease(ni);
87
+ }
88
+ }
89
+ // Directions: towards the lowest neighbour (a diagonal only when its corners are open).
90
+ // With an edge-cost hook the step itself counts, so a one-way ledge is never pointed at:
91
+ // the neighbour minimising step + distance, which equals the cell's own distance.
92
+ const dirs = this.directions;
93
+ const steps = this.stepCosts;
94
+ const out = this.distances;
95
+ for (let cy = 0; cy < height; cy++) {
96
+ for (let cx = 0; cx < width; cx++) {
97
+ const i = cy * width + cx;
98
+ const own = dist[i];
99
+ out[i] = own;
100
+ let best = own;
101
+ let bd = -1;
102
+ if (own > 0 && own < Infinity) {
103
+ const own0 = costs[i];
104
+ for (let d = 0; d < dirs8; d++) {
105
+ const nx = cx + NX[d];
106
+ const ny = cy + NY[d];
107
+ if (nx < 0 || ny < 0 || nx >= width || ny >= height)
108
+ continue;
109
+ const ni = ny * width + nx;
110
+ if (costs[ni] <= 0)
111
+ continue;
112
+ if (d >= 4 && (costs[cy * width + nx] <= 0 || costs[ny * width + cx] <= 0))
113
+ continue;
114
+ if (hooked) {
115
+ const e = edgeCostOf(grid, i, ni);
116
+ if (e === Infinity)
117
+ continue;
118
+ const nd = dist[ni] + (d < 4 ? own0 : own0 * Math.SQRT2) + e;
119
+ // The minimum equals `own` exactly (same sum Dijkstra made); first tie wins.
120
+ if (nd < best || (bd < 0 && nd <= own)) {
121
+ best = nd;
122
+ bd = d;
123
+ }
124
+ }
125
+ else {
126
+ const nd = dist[ni];
127
+ if (nd < best) {
128
+ best = nd;
129
+ bd = d;
130
+ }
131
+ }
132
+ }
133
+ }
134
+ if (bd < 0) {
135
+ dirs[i * 2] = 0;
136
+ dirs[i * 2 + 1] = 0;
137
+ steps[i] = own === 0 ? 0 : Infinity;
138
+ }
139
+ else {
140
+ const ni = (cy + NY[bd]) * width + cx + NX[bd];
141
+ // What A* charges for this step: its length × the destination's cost, plus the hook.
142
+ steps[i] =
143
+ (bd < 4 ? 1 : Math.SQRT2) * costs[ni] + (hooked ? edgeCostOf(grid, i, ni) : 0);
144
+ if (bd < 4) {
145
+ dirs[i * 2] = NX[bd];
146
+ dirs[i * 2 + 1] = NY[bd];
147
+ }
148
+ else {
149
+ dirs[i * 2] = NX[bd] * Math.SQRT1_2;
150
+ dirs[i * 2 + 1] = NY[bd] * Math.SQRT1_2;
151
+ }
152
+ }
153
+ }
154
+ }
155
+ this.version = grid.version;
156
+ }
157
+ direction(cx, cy, out) {
158
+ if (!this.grid.inBounds(cx, cy)) {
159
+ out.x = 0;
160
+ out.z = 0;
161
+ if ('cost' in out)
162
+ out.cost = Infinity;
163
+ return out;
164
+ }
165
+ const i = cy * this.grid.width + cx;
166
+ out.x = this.directions[i * 2];
167
+ out.z = this.directions[i * 2 + 1];
168
+ if ('cost' in out)
169
+ out.cost = this.stepCosts[i];
170
+ return out;
171
+ }
172
+ directionAt(worldX, worldZ, out) {
173
+ const g = this.grid;
174
+ const cx = Math.floor((worldX - g.origin.x) / g.cellSize);
175
+ const cy = Math.floor((worldZ - g.origin.z) / g.cellSize);
176
+ return this.direction(cx, cy, out);
177
+ }
178
+ distance(cx, cy) {
179
+ if (!this.grid.inBounds(cx, cy))
180
+ return Infinity;
181
+ return this.distances[cy * this.grid.width + cx];
182
+ }
183
+ }
184
+ /**
185
+ * A flow field over `grid`: unbuilt (every distance `Infinity`, `version` -1) until
186
+ * `build(goals)` or `setGoals(goals)`, or built at once from `opts.goals`.
187
+ */
188
+ export function createFlowField(grid, opts = {}) {
189
+ const f = new Field(grid);
190
+ if (opts.goals)
191
+ f.setGoals(opts.goals);
192
+ return f;
193
+ }
@@ -0,0 +1,108 @@
1
+ /**
2
+ * The navigation grid: a field of cells over the XZ plane, each walkable or not and with a cost
3
+ * multiplier. The grid is the one thing every query reads; `version` increments on every edit so
4
+ * a cached path or flow field can tell it is stale. No game nouns: cells, costs, world points.
5
+ */
6
+ /** A cell coordinate (`x` across, `y` down the grid; integers inside the grid). Mutable, reused. */
7
+ export interface NavCell {
8
+ x: number;
9
+ y: number;
10
+ }
11
+ /** A point on the world XZ plane. `y` (height) is the game's or `geom`'s job. Mutable, reused. */
12
+ export interface NavPoint {
13
+ x: number;
14
+ z: number;
15
+ }
16
+ export interface NavGridOptions {
17
+ /** Cells across. */
18
+ width: number;
19
+ /** Cells down. */
20
+ height: number;
21
+ /** World units per cell side. */
22
+ cellSize: number;
23
+ /** World XZ of the grid's corner (cell 0,0's min corner). Default the origin. */
24
+ origin?: Readonly<NavPoint>;
25
+ /** Initial walkability per cell. Default: every cell walkable. */
26
+ walkable?: (x: number, y: number) => boolean;
27
+ /** Initial cost multiplier per cell (≥ 0; 1 is plain ground). Default 1. */
28
+ cost?: (x: number, y: number) => number;
29
+ /**
30
+ * An extra cost for the step between two cells (row-major indices), added to the step's
31
+ * length × destination cost: a climb penalty, a one-way ledge. `Infinity` blocks the edge in
32
+ * that direction only; negative values are clamped to 0. Honoured by `findPath`,
33
+ * `createFlowField` and `reachable`; absent, a step costs its length × destination cost.
34
+ * Called per expanded edge, so keep it a lookup. Call `grid.touch()` when its inputs change.
35
+ */
36
+ edgeCost?: EdgeCost;
37
+ /** Moves per cell: 8 (king moves, √2 diagonals; default) or 4 (orthogonal only). */
38
+ neighbours?: 4 | 8;
39
+ }
40
+ /** The step-cost hook: `(fromIndex, toIndex, grid) => cost ≥ 0`, `Infinity` to block. */
41
+ export type EdgeCost = (fromIndex: number, toIndex: number, grid: NavGrid) => number;
42
+ export interface NavGrid {
43
+ readonly width: number;
44
+ readonly height: number;
45
+ readonly cellSize: number;
46
+ readonly origin: Readonly<NavPoint>;
47
+ /** Increments on every `setWalkable`, `setCost` or `touch` that changes the grid. */
48
+ readonly version: number;
49
+ /** The step-cost hook given at creation, or undefined. */
50
+ readonly edgeCost: EdgeCost | undefined;
51
+ /** Moves per cell, 4 or 8; every query defaults to it. */
52
+ readonly neighbours: 4 | 8;
53
+ /** Cell count (`width * height`). */
54
+ readonly size: number;
55
+ /**
56
+ * Cost multiplier per cell, row-major (`y * width + x`); 0 marks an unwalkable cell. Read it
57
+ * directly in hot loops; write through `setWalkable` and `setCost` so `version` moves.
58
+ */
59
+ readonly costs: Float32Array;
60
+ /** Sets walkability by cell or by row-major index; a cell made walkable gets cost 1. */
61
+ setWalkable(x: number, y: number, walkable: boolean): void;
62
+ setWalkable(index: number, walkable: boolean): void;
63
+ /** Sets the cost multiplier (clamped to ≥ 0) by cell or by index; 0 makes it unwalkable. */
64
+ setCost(x: number, y: number, cost: number): void;
65
+ setCost(index: number, cost: number): void;
66
+ /**
67
+ * Bumps `version` without changing a cell: for when what `edgeCost` reads has changed, so
68
+ * cached paths, fields and reaches read as stale.
69
+ */
70
+ touch(): void;
71
+ /** False outside the grid. */
72
+ isWalkable(x: number, y: number): boolean;
73
+ /** The cost multiplier, or 0 outside the grid. */
74
+ costAt(x: number, y: number): number;
75
+ inBounds(x: number, y: number): boolean;
76
+ /** Row-major index of a cell (no bounds check). */
77
+ index(x: number, y: number): number;
78
+ /** The cell under a world point (clamped into the grid). Returns `out`. */
79
+ toCell(worldX: number, worldZ: number, out: NavCell): NavCell;
80
+ /** The world centre of a cell. Returns `out`. */
81
+ toWorld(cx: number, cy: number, out: NavPoint): NavPoint;
82
+ }
83
+ /** Neighbour offsets shared by every query: the four orthogonal first, then the four diagonal. */
84
+ export declare const NEIGHBOUR_X: readonly [1, -1, 0, 0, 1, 1, -1, -1];
85
+ export declare const NEIGHBOUR_Y: readonly [0, 0, 1, -1, 1, -1, 1, -1];
86
+ /**
87
+ * The cost of stepping from cell `from` to its neighbour `to` in direction `d` (an index into
88
+ * `NEIGHBOUR_X`): the step's length (1 or √2) × the destination's cost multiplier, plus the
89
+ * grid's `edgeCost` if any. `Infinity` when the step is blocked: an unwalkable destination, a
90
+ * diagonal whose two orthogonal neighbours are not both walkable (no corner cutting), or an
91
+ * edge the hook blocks. `from` and `to` are row-major indices; `fx`, `fy` are `from`'s cell.
92
+ */
93
+ export declare function stepCost(grid: NavGrid, from: number, fx: number, fy: number, d: number): number;
94
+ /**
95
+ * The length of the step from cell `fx, fy` in direction `d`: 1, √2, or `Infinity` when the
96
+ * destination is outside the grid or unwalkable, or the diagonal would cut a corner.
97
+ */
98
+ export declare function stepLength(grid: NavGrid, fx: number, fy: number, d: number): number;
99
+ /** The hook's term for the edge `from → to`: 0 without a hook or below zero, `Infinity` to block. */
100
+ export declare function edgeCostOf(grid: NavGrid, from: number, to: number): number;
101
+ /** Builds a grid; every cell walkable at cost 1 unless the callbacks say otherwise. */
102
+ export declare function createNavGrid(opts: NavGridOptions): NavGrid;
103
+ /**
104
+ * True when a straight segment between the centres of two cells crosses walkable cells only
105
+ * (a supercover walk: a segment through a corner needs both cells beside the corner walkable,
106
+ * so it never slips between two diagonal walls). Both endpoints must be walkable.
107
+ */
108
+ export declare function hasLineOfWalkable(grid: NavGrid, x0: number, y0: number, x1: number, y1: number): boolean;
@@ -0,0 +1,210 @@
1
+ /**
2
+ * The navigation grid: a field of cells over the XZ plane, each walkable or not and with a cost
3
+ * multiplier. The grid is the one thing every query reads; `version` increments on every edit so
4
+ * a cached path or flow field can tell it is stale. No game nouns: cells, costs, world points.
5
+ */
6
+ class Grid {
7
+ width;
8
+ height;
9
+ cellSize;
10
+ origin;
11
+ size;
12
+ costs;
13
+ edgeCost;
14
+ neighbours;
15
+ version = 0;
16
+ constructor(opts) {
17
+ if (opts.neighbours !== undefined && opts.neighbours !== 4 && opts.neighbours !== 8) {
18
+ throw new Error('nav: neighbours must be 4 or 8');
19
+ }
20
+ this.edgeCost = opts.edgeCost;
21
+ this.neighbours = opts.neighbours ?? 8;
22
+ const width = Math.floor(opts.width);
23
+ const height = Math.floor(opts.height);
24
+ if (!(width > 0) || !(height > 0))
25
+ throw new Error('nav: grid width and height must be ≥ 1');
26
+ if (!(opts.cellSize > 0) || !Number.isFinite(opts.cellSize)) {
27
+ throw new Error('nav: cellSize must be a positive number');
28
+ }
29
+ this.width = width;
30
+ this.height = height;
31
+ this.cellSize = opts.cellSize;
32
+ this.origin = { x: opts.origin?.x ?? 0, z: opts.origin?.z ?? 0 };
33
+ this.size = width * height;
34
+ this.costs = new Float32Array(this.size);
35
+ const walkable = opts.walkable;
36
+ const cost = opts.cost;
37
+ for (let y = 0; y < height; y++) {
38
+ for (let x = 0; x < width; x++) {
39
+ const w = walkable ? walkable(x, y) : true;
40
+ const c = cost ? clampCost(cost(x, y)) : 1;
41
+ this.costs[y * width + x] = w ? c : 0;
42
+ }
43
+ }
44
+ }
45
+ inBounds(x, y) {
46
+ return x >= 0 && y >= 0 && x < this.width && y < this.height;
47
+ }
48
+ index(x, y) {
49
+ return y * this.width + x;
50
+ }
51
+ isWalkable(x, y) {
52
+ return this.inBounds(x, y) && this.costs[y * this.width + x] > 0;
53
+ }
54
+ costAt(x, y) {
55
+ return this.inBounds(x, y) ? this.costs[y * this.width + x] : 0;
56
+ }
57
+ setWalkable(a, b, c) {
58
+ let i;
59
+ let walkable;
60
+ if (c === undefined) {
61
+ i = a;
62
+ walkable = b;
63
+ if (!(i >= 0 && i < this.size))
64
+ return;
65
+ }
66
+ else {
67
+ if (!this.inBounds(a, b))
68
+ return;
69
+ i = b * this.width + a;
70
+ walkable = c;
71
+ }
72
+ const was = this.costs[i] > 0;
73
+ if (was === walkable)
74
+ return;
75
+ this.costs[i] = walkable ? 1 : 0;
76
+ this.version++;
77
+ }
78
+ setCost(a, b, c) {
79
+ let i;
80
+ let cost;
81
+ if (c === undefined) {
82
+ i = a;
83
+ cost = b;
84
+ if (!(i >= 0 && i < this.size))
85
+ return;
86
+ }
87
+ else {
88
+ if (!this.inBounds(a, b))
89
+ return;
90
+ i = b * this.width + a;
91
+ cost = c;
92
+ }
93
+ const v = clampCost(cost);
94
+ if (this.costs[i] === v)
95
+ return;
96
+ this.costs[i] = v;
97
+ this.version++;
98
+ }
99
+ touch() {
100
+ this.version++;
101
+ }
102
+ toCell(worldX, worldZ, out) {
103
+ const cx = Math.floor((worldX - this.origin.x) / this.cellSize);
104
+ const cy = Math.floor((worldZ - this.origin.z) / this.cellSize);
105
+ out.x = cx < 0 ? 0 : cx >= this.width ? this.width - 1 : cx;
106
+ out.y = cy < 0 ? 0 : cy >= this.height ? this.height - 1 : cy;
107
+ return out;
108
+ }
109
+ toWorld(cx, cy, out) {
110
+ out.x = this.origin.x + (cx + 0.5) * this.cellSize;
111
+ out.z = this.origin.z + (cy + 0.5) * this.cellSize;
112
+ return out;
113
+ }
114
+ }
115
+ function clampCost(c) {
116
+ return Number.isFinite(c) && c > 0 ? c : 0;
117
+ }
118
+ /** Neighbour offsets shared by every query: the four orthogonal first, then the four diagonal. */
119
+ export const NEIGHBOUR_X = [1, -1, 0, 0, 1, 1, -1, -1];
120
+ export const NEIGHBOUR_Y = [0, 0, 1, -1, 1, -1, 1, -1];
121
+ /**
122
+ * The cost of stepping from cell `from` to its neighbour `to` in direction `d` (an index into
123
+ * `NEIGHBOUR_X`): the step's length (1 or √2) × the destination's cost multiplier, plus the
124
+ * grid's `edgeCost` if any. `Infinity` when the step is blocked: an unwalkable destination, a
125
+ * diagonal whose two orthogonal neighbours are not both walkable (no corner cutting), or an
126
+ * edge the hook blocks. `from` and `to` are row-major indices; `fx`, `fy` are `from`'s cell.
127
+ */
128
+ export function stepCost(grid, from, fx, fy, d) {
129
+ const len = stepLength(grid, fx, fy, d);
130
+ if (len === Infinity)
131
+ return Infinity;
132
+ const to = (fy + NEIGHBOUR_Y[d]) * grid.width + fx + NEIGHBOUR_X[d];
133
+ return len * grid.costs[to] + edgeCostOf(grid, from, to);
134
+ }
135
+ /**
136
+ * The length of the step from cell `fx, fy` in direction `d`: 1, √2, or `Infinity` when the
137
+ * destination is outside the grid or unwalkable, or the diagonal would cut a corner.
138
+ */
139
+ export function stepLength(grid, fx, fy, d) {
140
+ const width = grid.width;
141
+ const nx = fx + NEIGHBOUR_X[d];
142
+ const ny = fy + NEIGHBOUR_Y[d];
143
+ if (nx < 0 || ny < 0 || nx >= width || ny >= grid.height)
144
+ return Infinity;
145
+ const costs = grid.costs;
146
+ if (costs[ny * width + nx] <= 0)
147
+ return Infinity;
148
+ if (d < 4)
149
+ return 1;
150
+ if (costs[fy * width + nx] <= 0 || costs[ny * width + fx] <= 0)
151
+ return Infinity;
152
+ return Math.SQRT2;
153
+ }
154
+ /** The hook's term for the edge `from → to`: 0 without a hook or below zero, `Infinity` to block. */
155
+ export function edgeCostOf(grid, from, to) {
156
+ const hook = grid.edgeCost;
157
+ if (!hook)
158
+ return 0;
159
+ const e = hook(from, to, grid);
160
+ if (e === Infinity || Number.isNaN(e))
161
+ return Infinity;
162
+ return Math.max(e, 0);
163
+ }
164
+ /** Builds a grid; every cell walkable at cost 1 unless the callbacks say otherwise. */
165
+ export function createNavGrid(opts) {
166
+ return new Grid(opts);
167
+ }
168
+ /**
169
+ * True when a straight segment between the centres of two cells crosses walkable cells only
170
+ * (a supercover walk: a segment through a corner needs both cells beside the corner walkable,
171
+ * so it never slips between two diagonal walls). Both endpoints must be walkable.
172
+ */
173
+ export function hasLineOfWalkable(grid, x0, y0, x1, y1) {
174
+ if (!grid.isWalkable(x0, y0) || !grid.isWalkable(x1, y1))
175
+ return false;
176
+ let x = x0;
177
+ let y = y0;
178
+ const dx = Math.abs(x1 - x0);
179
+ const dy = Math.abs(y1 - y0);
180
+ const sx = x1 > x0 ? 1 : -1;
181
+ const sy = y1 > y0 ? 1 : -1;
182
+ // Integer DDA: the next vertical boundary is crossed at t = (ix + 0.5) / dx, the next
183
+ // horizontal one at (iy + 0.5) / dy; both scaled by 2·dx·dy so the comparison is exact.
184
+ let ix = 0;
185
+ let iy = 0;
186
+ while (ix < dx || iy < dy) {
187
+ const tx = (2 * ix + 1) * dy;
188
+ const ty = (2 * iy + 1) * dx;
189
+ if (ix < dx && (iy >= dy || tx < ty)) {
190
+ x += sx;
191
+ ix++;
192
+ }
193
+ else if (iy < dy && (ix >= dx || ty < tx)) {
194
+ y += sy;
195
+ iy++;
196
+ }
197
+ else {
198
+ // Exactly through a corner: both cells beside it must be open, then step diagonally.
199
+ if (!grid.isWalkable(x + sx, y) || !grid.isWalkable(x, y + sy))
200
+ return false;
201
+ x += sx;
202
+ y += sy;
203
+ ix++;
204
+ iy++;
205
+ }
206
+ if (!grid.isWalkable(x, y))
207
+ return false;
208
+ }
209
+ return true;
210
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * A binary min-heap of cell indices keyed by a caller-owned float array, with decrease-key
3
+ * through a position table. Sized to the grid once; nothing allocates afterwards. Internal to
4
+ * A*, the flow field and `reachable`.
5
+ */
6
+ export declare class CellHeap {
7
+ private readonly items;
8
+ /** Heap slot of each cell, or -1 when not in the heap. */
9
+ private readonly where;
10
+ private readonly key;
11
+ private count;
12
+ constructor(cells: number, key: Float64Array | Float32Array);
13
+ get size(): number;
14
+ clear(): void;
15
+ has(cell: number): boolean;
16
+ /** Inserts `cell`, or moves it up after its key decreased. */
17
+ pushOrDecrease(cell: number): void;
18
+ /** Removes and returns the cell with the smallest key (-1 when empty). */
19
+ pop(): number;
20
+ private up;
21
+ private down;
22
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * A binary min-heap of cell indices keyed by a caller-owned float array, with decrease-key
3
+ * through a position table. Sized to the grid once; nothing allocates afterwards. Internal to
4
+ * A*, the flow field and `reachable`.
5
+ */
6
+ export class CellHeap {
7
+ items;
8
+ /** Heap slot of each cell, or -1 when not in the heap. */
9
+ where;
10
+ key;
11
+ count = 0;
12
+ constructor(cells, key) {
13
+ this.items = new Int32Array(cells);
14
+ this.where = new Int32Array(cells).fill(-1);
15
+ this.key = key;
16
+ }
17
+ get size() {
18
+ return this.count;
19
+ }
20
+ clear() {
21
+ for (let i = 0; i < this.count; i++)
22
+ this.where[this.items[i]] = -1;
23
+ this.count = 0;
24
+ }
25
+ has(cell) {
26
+ return this.where[cell] >= 0;
27
+ }
28
+ /** Inserts `cell`, or moves it up after its key decreased. */
29
+ pushOrDecrease(cell) {
30
+ let i = this.where[cell];
31
+ if (i < 0) {
32
+ i = this.count++;
33
+ this.items[i] = cell;
34
+ this.where[cell] = i;
35
+ }
36
+ this.up(i);
37
+ }
38
+ /** Removes and returns the cell with the smallest key (-1 when empty). */
39
+ pop() {
40
+ if (this.count === 0)
41
+ return -1;
42
+ const top = this.items[0];
43
+ this.where[top] = -1;
44
+ const last = this.items[--this.count];
45
+ if (this.count > 0) {
46
+ this.items[0] = last;
47
+ this.where[last] = 0;
48
+ this.down(0);
49
+ }
50
+ return top;
51
+ }
52
+ up(i) {
53
+ const items = this.items;
54
+ const key = this.key;
55
+ const cell = items[i];
56
+ const k = key[cell];
57
+ while (i > 0) {
58
+ const parent = (i - 1) >> 1;
59
+ const pc = items[parent];
60
+ if (key[pc] <= k)
61
+ break;
62
+ items[i] = pc;
63
+ this.where[pc] = i;
64
+ i = parent;
65
+ }
66
+ items[i] = cell;
67
+ this.where[cell] = i;
68
+ }
69
+ down(i) {
70
+ const items = this.items;
71
+ const key = this.key;
72
+ const n = this.count;
73
+ const cell = items[i];
74
+ const k = key[cell];
75
+ for (;;) {
76
+ let child = i * 2 + 1;
77
+ if (child >= n)
78
+ break;
79
+ const right = child + 1;
80
+ if (right < n && key[items[right]] < key[items[child]])
81
+ child = right;
82
+ const cc = items[child];
83
+ if (key[cc] >= k)
84
+ break;
85
+ items[i] = cc;
86
+ this.where[cc] = i;
87
+ i = child;
88
+ }
89
+ items[i] = cell;
90
+ this.where[cell] = i;
91
+ }
92
+ }
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `@thunderclap-engine/engine/nav`: grid navigation on the XZ plane. A `NavGrid` of walkable cells with
3
+ * costs (and an edge-cost hook, 4 or 8 neighbours), A* (`findPath`) and string pulling
4
+ * (`smoothPath`) into a reusable `NavPath`, a flow field one build serves every agent with,
5
+ * budget-bounded reachability with parents (`reachable`, on a grid or a `NavMesh`, with
6
+ * `reachableOutline` for a mesh range's boundary), a path follower and local steering.
7
+ * Pure CPU, no imports from other engine modules, no allocation per query after warm-up.
8
+ */
9
+ export type { FindPathOptions } from './astar.js';
10
+ export { findPath } from './astar.js';
11
+ export { type Corridor, createCorridor } from './corridor.js';
12
+ export type { Crowd, CrowdAgent, CrowdAgentOptions, CrowdAttachOptions, CrowdOptions, } from './crowd.js';
13
+ export { createCrowd } from './crowd.js';
14
+ export type { FlowDirection, FlowField, FlowFieldOptions } from './flow.js';
15
+ export { createFlowField } from './flow.js';
16
+ export type { EdgeCost, NavCell, NavGrid, NavGridOptions, NavPoint } from './grid.js';
17
+ export { createNavGrid } from './grid.js';
18
+ export { type AreaBox, type AreaPolygon, type AreaShape, type AreaStamp, areaShapeContains, createAreaCosts, createAreaMask, markArea, OBSTACLE_AREA, } from './mesh/areas.js';
19
+ export { NAV_BAKE_DEFAULTS, NavBakeError, type ResolvedNavBakeOptions, resolveNavBakeOptions, } from './mesh/bake-options.js';
20
+ export { createFlowField3, type FlowField3, type FlowField3Options } from './mesh/flow3.js';
21
+ export type { OffMeshLink, OffMeshLinkOptions } from './mesh/links.js';
22
+ export { addOffMeshLink, getOffMeshLink, removeOffMeshLink } from './mesh/links.js';
23
+ export type { FindMeshPathOptions, NavPath3, NavPathLink } from './mesh/mesh-path.js';
24
+ export { type AreaQueryOptions, areaAllowed, clearPath3, createNavPath3, findMeshPath, followPath3, MeshSearch, type MeshSearchState, pathDistance3, pathPoint3, pullString, reservePath3, reservePolys3, } from './mesh/mesh-path.js';
25
+ export { createMeshReach, createReachOutline, type MeshReach, type MeshReachOptions, type ReachOutline, reachableOutline, } from './mesh/mesh-reach.js';
26
+ export type { NavBakeAreaOptions, NavBounds, NavPoint3 } from './mesh/navmesh.js';
27
+ export { bakeNavMesh, NavMesh } from './mesh/navmesh.js';
28
+ export { exportNavMesh, importNavMesh, loadNavMesh } from './mesh/serialize.js';
29
+ export type { NavBakeOptions, NavBakeSource } from './mesh/voxelize.js';
30
+ export { createObstacleSet, type Obstacle, type ObstacleBox, type ObstacleDisc, type ObstacleSet, type ObstacleSetOptions, type ObstacleShape, } from './obstacles.js';
31
+ export type { FollowResult, LineOfWalkableOptions, NavPath } from './path.js';
32
+ export { clearPath, createNavPath, followPath, hasLineOfWalkable, pathDistance, pathPoint, reservePath, smoothPath, } from './path.js';
33
+ export { createPathQueue, type PathQueue, type PathQueueOptions, type PathRequestOptions, type PathStatus, } from './query-queue.js';
34
+ export type { Reach } from './reach.js';
35
+ export { createReach, reachable } from './reach.js';
36
+ export type { Disc } from './steer.js';
37
+ export { arrive, avoidDisc, separate, steer } from './steer.js';
@@ -0,0 +1,19 @@
1
+ export { findPath } from './astar.js';
2
+ export { createCorridor } from './corridor.js';
3
+ export { createCrowd } from './crowd.js';
4
+ export { createFlowField } from './flow.js';
5
+ export { createNavGrid } from './grid.js';
6
+ // ws/nav-4: areas, obstacles, queue, corridors, mesh flow field.
7
+ export { areaShapeContains, createAreaCosts, createAreaMask, markArea, OBSTACLE_AREA, } from './mesh/areas.js';
8
+ export { NAV_BAKE_DEFAULTS, NavBakeError, resolveNavBakeOptions, } from './mesh/bake-options.js';
9
+ export { createFlowField3 } from './mesh/flow3.js';
10
+ export { addOffMeshLink, getOffMeshLink, removeOffMeshLink } from './mesh/links.js';
11
+ export { areaAllowed, clearPath3, createNavPath3, findMeshPath, followPath3, MeshSearch, pathDistance3, pathPoint3, pullString, reservePath3, reservePolys3, } from './mesh/mesh-path.js';
12
+ export { createMeshReach, createReachOutline, reachableOutline, } from './mesh/mesh-reach.js';
13
+ export { bakeNavMesh, NavMesh } from './mesh/navmesh.js';
14
+ export { exportNavMesh, importNavMesh, loadNavMesh } from './mesh/serialize.js';
15
+ export { createObstacleSet, } from './obstacles.js';
16
+ export { clearPath, createNavPath, followPath, hasLineOfWalkable, pathDistance, pathPoint, reservePath, smoothPath, } from './path.js';
17
+ export { createPathQueue, } from './query-queue.js';
18
+ export { createReach, reachable } from './reach.js';
19
+ export { arrive, avoidDisc, separate, steer } from './steer.js';