@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,78 @@
1
+ import { type NavPath3 } from './mesh-path.js';
2
+ import type { NavMesh, NavPoint3 } from './navmesh.js';
3
+ export interface MeshReachOptions {
4
+ /** Path cost a polygon may cost to reach, inclusive (world units × area cost). */
5
+ budget: number;
6
+ /** A cost multiplier per area byte (256 entries, `createAreaCosts`); `Infinity` excludes an area. */
7
+ areaCost?: Float32Array;
8
+ /** Per area byte (256 entries, `createAreaMask`): 0 excludes the area. */
9
+ areaMask?: Uint8Array;
10
+ /** Stop once this many polygons are in (the start counts). Default: no cap. */
11
+ maxPolys?: number;
12
+ /** How far `from` may be from the mesh to snap onto it. Default: any distance. */
13
+ snapRadius?: number;
14
+ }
15
+ export interface MeshReach {
16
+ readonly mesh: NavMesh;
17
+ /** Polygons reached (the start included); 0 when `from` is off the mesh. */
18
+ readonly count: number;
19
+ /** The reached polygons in the order they came within budget, the start first; `count` valid. */
20
+ readonly polys: Int32Array;
21
+ /**
22
+ * Cost to reach each polygon's centre (`polyCenter`), the value `findMeshPath(mesh, from,
23
+ * centre).cost` gives; 0 at the start polygon, `Infinity` off the reach. One per polygon.
24
+ */
25
+ readonly costs: Float32Array;
26
+ /** The polygon each reached polygon is entered from on its cheapest route; -1 at the start or off the reach. */
27
+ readonly parents: Int32Array;
28
+ /** The polygon `from` snapped to, or -1. */
29
+ readonly startPoly: number;
30
+ /** Where `from` snapped to on the mesh. */
31
+ readonly start: Readonly<NavPoint3>;
32
+ /** The budget of the last query. */
33
+ readonly budget: number;
34
+ /** `mesh.version` at the last query, or -1 before the first. */
35
+ readonly version: number;
36
+ /** True when the mesh changed (a link, an area, an obstacle) since the last query. */
37
+ readonly stale: boolean;
38
+ /** True when polygon `p` was reached within the budget. */
39
+ has(p: number): boolean;
40
+ /**
41
+ * The route from the start to polygon `p`'s centre into `out`: the corridor in `out.polys`,
42
+ * the pulled string in `out.points`, `out.cost` the reach's cost. False, with `out` empty,
43
+ * when `p` is not reached.
44
+ */
45
+ pathTo(p: number, out: NavPath3): boolean;
46
+ /** Calls `fn` for every reached polygon, in `polys` order. */
47
+ forEach(fn: (poly: number, cost: number) => void): void;
48
+ }
49
+ /** A reusable mesh reachability result sized to `mesh`; pass it to `reachable` as `out`. */
50
+ export declare function createMeshReach(mesh: NavMesh): MeshReach;
51
+ /**
52
+ * The polygons whose centre is within path cost `opts.budget` of `from`, with their cost to
53
+ * reach. Legs are priced as `findMeshPath` prices them; the search expands only polygons it can
54
+ * enter within the budget and stops there (or at `maxPolys`). Writes into `out`, or a `MeshReach`
55
+ * kept per mesh; nothing allocates after the first query on a mesh.
56
+ */
57
+ export declare function reachableMesh(mesh: NavMesh, from: Readonly<NavPoint3>, opts: MeshReachOptions, out?: MeshReach): MeshReach;
58
+ export interface ReachOutline {
59
+ /** Loop vertices as world `x, y, z` triples; `pointCount` are valid. Grows in place. */
60
+ points: Float32Array;
61
+ pointCount: number;
62
+ /**
63
+ * Loop `k` is points `loopStart[k]` to `loopStart[k + 1] - 1` (closed: the last joins the
64
+ * first); `loopCount + 1` entries are valid. Outer loops run counter-clockwise seen from above,
65
+ * holes clockwise.
66
+ */
67
+ loopStart: Int32Array;
68
+ loopCount: number;
69
+ }
70
+ /** An empty outline (buffers grow on demand); pass it to `reachableOutline` as `out`. */
71
+ export declare function createReachOutline(capacity?: number): ReachOutline;
72
+ /**
73
+ * The boundary of a reach as closed loops of mesh vertices: every edge of a reached polygon whose
74
+ * other side is off the mesh or not reached, chained end to end. Writes into `out`, or one
75
+ * outline kept per reach; nothing allocates once the buffers have grown to the largest outline.
76
+ * The boundary follows polygon edges, so its resolution is the mesh's.
77
+ */
78
+ export declare function reachableOutline(reach: MeshReach, out?: ReachOutline): ReachOutline;
@@ -0,0 +1,450 @@
1
+ /**
2
+ * Budget-bounded reachability on a `NavMesh` (ws/nav-5): "where can this unit get to with N
3
+ * metres of movement", cheap enough to ask every frame. A Dijkstra over the polygon graph that
4
+ * prices legs exactly as `findMeshPath` does (portal midpoints as nodes, each leg × the area cost
5
+ * of the polygon it crosses, off-mesh links at their cost) and stops at the budget, then
6
+ * `reachableOutline` traces the reached set's boundary into loops for drawing a movement range.
7
+ * Scratch is sized to the mesh once (per mesh, in a `WeakMap`) and reused: no allocation per
8
+ * query after the first.
9
+ */
10
+ import { CellHeap } from '../heap.js';
11
+ import { OBSTACLE_AREA } from './areas.js';
12
+ import { areaAllowed, pullString, reservePolys3 } from './mesh-path.js';
13
+ /** Per-mesh Dijkstra scratch, shared by every `MeshReach` of the mesh. */
14
+ class ReachScratch {
15
+ g;
16
+ px;
17
+ py;
18
+ pz;
19
+ /** Polygon centres, `x, y, z` per polygon (computed once). */
20
+ centres;
21
+ /** Edge midpoints, `x, y, z` per polygon edge slot (`p * nvp + e`; computed once). */
22
+ mids;
23
+ /** The node parent (entry) chain, for `pathTo`. */
24
+ nodeParent;
25
+ seen;
26
+ closed;
27
+ heap;
28
+ corridor;
29
+ stamp = 0;
30
+ constructor(mesh) {
31
+ const n = Math.max(1, mesh.polyCount);
32
+ this.g = new Float64Array(n);
33
+ this.px = new Float64Array(n);
34
+ this.py = new Float64Array(n);
35
+ this.pz = new Float64Array(n);
36
+ this.centres = new Float64Array(n * 3);
37
+ const c = { x: 0, y: 0, z: 0 };
38
+ for (let p = 0; p < mesh.polyCount; p++) {
39
+ mesh.polyCenter(p, c);
40
+ this.centres[p * 3] = c.x;
41
+ this.centres[p * 3 + 1] = c.y;
42
+ this.centres[p * 3 + 2] = c.z;
43
+ }
44
+ const nvp = mesh.maxVertsPerPoly;
45
+ this.mids = new Float64Array(n * nvp * 3);
46
+ for (let p = 0; p < mesh.polyCount; p++) {
47
+ const k = mesh.polyVertexCount(p);
48
+ for (let e = 0; e < k; e++) {
49
+ const a = mesh.polys[p * nvp + e] * 3;
50
+ const b = mesh.polys[p * nvp + (e + 1 === k ? 0 : e + 1)] * 3;
51
+ const m = (p * nvp + e) * 3;
52
+ this.mids[m] = (mesh.verts[a] + mesh.verts[b]) * 0.5;
53
+ this.mids[m + 1] = (mesh.verts[a + 1] + mesh.verts[b + 1]) * 0.5;
54
+ this.mids[m + 2] = (mesh.verts[a + 2] + mesh.verts[b + 2]) * 0.5;
55
+ }
56
+ }
57
+ this.nodeParent = new Int32Array(n).fill(-1);
58
+ this.seen = new Uint32Array(n);
59
+ this.closed = new Uint32Array(n);
60
+ this.heap = new CellHeap(n, this.g);
61
+ this.corridor = new Int32Array(n + 1);
62
+ }
63
+ next() {
64
+ this.stamp = (this.stamp + 1) >>> 0;
65
+ if (this.stamp === 0) {
66
+ this.seen.fill(0);
67
+ this.closed.fill(0);
68
+ this.stamp = 1;
69
+ }
70
+ this.heap.clear();
71
+ return this.stamp;
72
+ }
73
+ }
74
+ const scratchFor = new WeakMap();
75
+ function scratchOf(mesh) {
76
+ let s = scratchFor.get(mesh);
77
+ if (!s) {
78
+ s = new ReachScratch(mesh);
79
+ scratchFor.set(mesh, s);
80
+ }
81
+ return s;
82
+ }
83
+ const pathCentre = { x: 0, y: 0, z: 0 };
84
+ class MeshReachImpl {
85
+ mesh;
86
+ polys;
87
+ costs;
88
+ parents;
89
+ start = { x: 0, y: 0, z: 0 };
90
+ count = 0;
91
+ startPoly = -1;
92
+ budget = 0;
93
+ version = -1;
94
+ constructor(mesh) {
95
+ this.mesh = mesh;
96
+ const n = Math.max(1, mesh.polyCount);
97
+ this.polys = new Int32Array(n);
98
+ this.costs = new Float32Array(n).fill(Infinity);
99
+ this.parents = new Int32Array(n).fill(-1);
100
+ }
101
+ get stale() {
102
+ return this.version !== this.mesh.version;
103
+ }
104
+ has(p) {
105
+ return p >= 0 && p < this.mesh.polyCount && this.costs[p] < Infinity;
106
+ }
107
+ pathTo(p, out) {
108
+ const mesh = this.mesh;
109
+ if (!this.has(p)) {
110
+ out.length = 0;
111
+ out.cursor = 0;
112
+ out.linkCount = 0;
113
+ out.polyCount = 0;
114
+ out.cost = 0;
115
+ out.version = this.version;
116
+ return false;
117
+ }
118
+ const s = scratchOf(mesh);
119
+ const corridor = s.corridor;
120
+ // The centre's parent, then the node chain back to the start.
121
+ let len = 0;
122
+ corridor[len++] = p;
123
+ for (let q = this.parents[p]; q >= 0; q = s.nodeParent[q])
124
+ corridor[len++] = q;
125
+ for (let i = 0, j = len - 1; i < j; i++, j--) {
126
+ const t = corridor[i];
127
+ corridor[i] = corridor[j];
128
+ corridor[j] = t;
129
+ }
130
+ pathCentre.x = s.centres[p * 3];
131
+ pathCentre.y = s.centres[p * 3 + 1];
132
+ pathCentre.z = s.centres[p * 3 + 2];
133
+ pullString(mesh, corridor, 0, len, this.start, pathCentre, out);
134
+ reservePolys3(out, len);
135
+ out.polys.set(corridor.subarray(0, len));
136
+ out.polyCount = len;
137
+ out.cost = this.costs[p];
138
+ out.version = this.version;
139
+ return true;
140
+ }
141
+ forEach(fn) {
142
+ for (let i = 0; i < this.count; i++) {
143
+ const p = this.polys[i];
144
+ fn(p, this.costs[p]);
145
+ }
146
+ }
147
+ reset() {
148
+ for (let i = 0; i < this.count; i++) {
149
+ const p = this.polys[i];
150
+ this.costs[p] = Infinity;
151
+ this.parents[p] = -1;
152
+ }
153
+ this.count = 0;
154
+ this.startPoly = -1;
155
+ }
156
+ add(p, cost, parent) {
157
+ if (this.costs[p] === Infinity)
158
+ this.polys[this.count++] = p;
159
+ this.costs[p] = cost;
160
+ this.parents[p] = parent;
161
+ }
162
+ }
163
+ /** A reusable mesh reachability result sized to `mesh`; pass it to `reachable` as `out`. */
164
+ export function createMeshReach(mesh) {
165
+ return new MeshReachImpl(mesh);
166
+ }
167
+ const reachFor = new WeakMap();
168
+ /**
169
+ * `findNearestPoly`, but an unbounded snap first looks near the point: the nearest polygon within
170
+ * a radius is the nearest overall, and the whole-mesh scan costs more than the search itself on a
171
+ * large mesh.
172
+ */
173
+ function snap(mesh, from, out, radius) {
174
+ if (radius === Number.POSITIVE_INFINITY) {
175
+ const near = mesh.findNearestPoly(from.x, from.y, from.z, out, mesh.cellSize * 8);
176
+ if (near >= 0)
177
+ return near;
178
+ }
179
+ return mesh.findNearestPoly(from.x, from.y, from.z, out, radius);
180
+ }
181
+ function dist3(ax, ay, az, bx, by, bz) {
182
+ const dx = bx - ax;
183
+ const dy = by - ay;
184
+ const dz = bz - az;
185
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
186
+ }
187
+ /**
188
+ * The polygons whose centre is within path cost `opts.budget` of `from`, with their cost to
189
+ * reach. Legs are priced as `findMeshPath` prices them; the search expands only polygons it can
190
+ * enter within the budget and stops there (or at `maxPolys`). Writes into `out`, or a `MeshReach`
191
+ * kept per mesh; nothing allocates after the first query on a mesh.
192
+ */
193
+ export function reachableMesh(mesh, from, opts, out) {
194
+ let r;
195
+ if (out) {
196
+ if (out.mesh !== mesh)
197
+ throw new Error('nav: reach belongs to another mesh');
198
+ r = out;
199
+ }
200
+ else {
201
+ const cached = reachFor.get(mesh);
202
+ if (cached) {
203
+ r = cached;
204
+ }
205
+ else {
206
+ r = new MeshReachImpl(mesh);
207
+ reachFor.set(mesh, r);
208
+ }
209
+ }
210
+ r.reset();
211
+ const budget = opts.budget;
212
+ r.budget = budget;
213
+ r.version = mesh.version;
214
+ if (mesh.polyCount === 0 || !(budget >= 0))
215
+ return r;
216
+ const startPoly = snap(mesh, from, r.start, opts.snapRadius ?? Number.POSITIVE_INFINITY);
217
+ if (startPoly < 0)
218
+ return r;
219
+ const areaCost = opts.areaCost;
220
+ const areaMask = opts.areaMask;
221
+ const maxPolys = opts.maxPolys ?? Number.POSITIVE_INFINITY;
222
+ const s = scratchOf(mesh);
223
+ const stamp = s.next();
224
+ const { g, px, py, pz, centres, nodeParent, seen, closed, heap } = s;
225
+ const costs = r.costs;
226
+ const nvp = mesh.maxVertsPerPoly;
227
+ const adjacency = mesh.adjacency;
228
+ const area = mesh.area;
229
+ const mids = s.mids;
230
+ const plain = areaCost === undefined && areaMask === undefined;
231
+ r.startPoly = startPoly;
232
+ r.add(startPoly, 0, -1);
233
+ g[startPoly] = 0;
234
+ px[startPoly] = r.start.x;
235
+ py[startPoly] = r.start.y;
236
+ pz[startPoly] = r.start.z;
237
+ nodeParent[startPoly] = -1;
238
+ seen[startPoly] = stamp;
239
+ heap.pushOrDecrease(startPoly);
240
+ while (heap.size > 0 && r.count < maxPolys) {
241
+ const cur = heap.pop();
242
+ closed[cur] = stamp;
243
+ const cx = px[cur];
244
+ const cy = py[cur];
245
+ const cz = pz[cur];
246
+ const gc = g[cur];
247
+ // As in `findMeshPath`: the polygon a leg crosses prices it.
248
+ const mul = areaCost === undefined ? 1 : areaCost[area[cur]];
249
+ const n = mesh.polyVertexCount(cur);
250
+ for (let e = 0; e < n; e++) {
251
+ const next = adjacency[cur * nvp + e];
252
+ if (next < 0)
253
+ continue;
254
+ if (plain ? area[next] === OBSTACLE_AREA : !areaAllowed(area[next], areaCost, areaMask))
255
+ continue;
256
+ // The centre: what a search with the centre as its goal would charge. A closed polygon
257
+ // still takes a cheaper centre (a goal polygon is never expanded through).
258
+ const nc = gc +
259
+ dist3(cx, cy, cz, centres[next * 3], centres[next * 3 + 1], centres[next * 3 + 2]) * mul;
260
+ if (nc <= budget && nc < costs[next] && r.count < maxPolys)
261
+ r.add(next, nc, cur);
262
+ if (closed[next] === stamp)
263
+ continue;
264
+ const m = (cur * nvp + e) * 3;
265
+ const nx = mids[m];
266
+ const ny = mids[m + 1];
267
+ const nz = mids[m + 2];
268
+ const ng = gc + dist3(cx, cy, cz, nx, ny, nz) * mul;
269
+ if (ng > budget)
270
+ continue;
271
+ if (seen[next] === stamp && ng >= g[next])
272
+ continue;
273
+ seen[next] = stamp;
274
+ g[next] = ng;
275
+ px[next] = nx;
276
+ py[next] = ny;
277
+ pz[next] = nz;
278
+ nodeParent[next] = cur;
279
+ heap.pushOrDecrease(next);
280
+ }
281
+ const lend = mesh.linkStart[cur + 1];
282
+ for (let li = mesh.linkStart[cur]; li < lend; li++) {
283
+ const rec = mesh.linkItems[li];
284
+ const link = mesh.links[rec >> 1];
285
+ if (!link)
286
+ continue;
287
+ const end = rec & 1;
288
+ const src = end === 0 ? link.from : link.to;
289
+ const dst = end === 0 ? link.to : link.from;
290
+ const next = end === 0 ? link.toPoly : link.fromPoly;
291
+ if (next < 0)
292
+ continue;
293
+ const na = area[next];
294
+ if (!areaAllowed(na, areaCost, areaMask))
295
+ continue;
296
+ const linkCost = link.cost ?? dist3(src.x, src.y, src.z, dst.x, dst.y, dst.z);
297
+ const ng = gc + dist3(cx, cy, cz, src.x, src.y, src.z) * mul + linkCost;
298
+ if (ng > budget)
299
+ continue;
300
+ // From the landing to the centre, priced by the polygon landed in.
301
+ const nmul = areaCost === undefined ? 1 : areaCost[na];
302
+ const nc = ng +
303
+ dist3(dst.x, dst.y, dst.z, centres[next * 3], centres[next * 3 + 1], centres[next * 3 + 2]) *
304
+ nmul;
305
+ if (nc <= budget && nc < costs[next] && r.count < maxPolys)
306
+ r.add(next, nc, cur);
307
+ if (closed[next] === stamp)
308
+ continue;
309
+ if (seen[next] === stamp && ng >= g[next])
310
+ continue;
311
+ seen[next] = stamp;
312
+ g[next] = ng;
313
+ px[next] = dst.x;
314
+ py[next] = dst.y;
315
+ pz[next] = dst.z;
316
+ nodeParent[next] = cur;
317
+ heap.pushOrDecrease(next);
318
+ }
319
+ }
320
+ return r;
321
+ }
322
+ /** An empty outline (buffers grow on demand); pass it to `reachableOutline` as `out`. */
323
+ export function createReachOutline(capacity = 64) {
324
+ return {
325
+ points: new Float32Array(Math.max(1, capacity) * 3),
326
+ pointCount: 0,
327
+ loopStart: new Int32Array(8),
328
+ loopCount: 0,
329
+ };
330
+ }
331
+ /** Per-mesh outline scratch: boundary edges and a per-vertex list of the edges leaving it. */
332
+ class OutlineScratch {
333
+ edgeA;
334
+ edgeB;
335
+ edgeNext;
336
+ used;
337
+ head;
338
+ headStamp;
339
+ stamp = 0;
340
+ constructor(mesh) {
341
+ const edges = Math.max(1, mesh.polyCount * mesh.maxVertsPerPoly);
342
+ this.edgeA = new Int32Array(edges);
343
+ this.edgeB = new Int32Array(edges);
344
+ this.edgeNext = new Int32Array(edges);
345
+ this.used = new Uint8Array(edges);
346
+ this.head = new Int32Array(Math.max(1, mesh.vertCount));
347
+ this.headStamp = new Uint32Array(Math.max(1, mesh.vertCount));
348
+ }
349
+ }
350
+ const outlineScratchFor = new WeakMap();
351
+ const outlineFor = new WeakMap();
352
+ function pushOutlinePoint(out, verts, v) {
353
+ const need = (out.pointCount + 1) * 3;
354
+ if (out.points.length < need) {
355
+ const next = new Float32Array(Math.max(need, Math.ceil(out.points.length * 1.5)));
356
+ next.set(out.points);
357
+ out.points = next;
358
+ }
359
+ const i = out.pointCount++ * 3;
360
+ out.points[i] = verts[v * 3];
361
+ out.points[i + 1] = verts[v * 3 + 1];
362
+ out.points[i + 2] = verts[v * 3 + 2];
363
+ }
364
+ function pushLoopStart(out, at) {
365
+ if (out.loopStart.length < out.loopCount + 2) {
366
+ const next = new Int32Array(Math.max(out.loopCount + 2, out.loopStart.length * 2));
367
+ next.set(out.loopStart);
368
+ out.loopStart = next;
369
+ }
370
+ out.loopStart[out.loopCount] = at;
371
+ }
372
+ /**
373
+ * The boundary of a reach as closed loops of mesh vertices: every edge of a reached polygon whose
374
+ * other side is off the mesh or not reached, chained end to end. Writes into `out`, or one
375
+ * outline kept per reach; nothing allocates once the buffers have grown to the largest outline.
376
+ * The boundary follows polygon edges, so its resolution is the mesh's.
377
+ */
378
+ export function reachableOutline(reach, out) {
379
+ let o = out;
380
+ if (!o) {
381
+ o = outlineFor.get(reach);
382
+ if (!o) {
383
+ o = createReachOutline();
384
+ outlineFor.set(reach, o);
385
+ }
386
+ }
387
+ o.pointCount = 0;
388
+ o.loopCount = 0;
389
+ o.loopStart[0] = 0;
390
+ const mesh = reach.mesh;
391
+ if (reach.count === 0)
392
+ return o;
393
+ let s = outlineScratchFor.get(mesh);
394
+ if (!s) {
395
+ s = new OutlineScratch(mesh);
396
+ outlineScratchFor.set(mesh, s);
397
+ }
398
+ s.stamp = (s.stamp + 1) >>> 0;
399
+ if (s.stamp === 0) {
400
+ s.headStamp.fill(0);
401
+ s.stamp = 1;
402
+ }
403
+ const stamp = s.stamp;
404
+ const { edgeA, edgeB, edgeNext, used, head, headStamp } = s;
405
+ const nvp = mesh.maxVertsPerPoly;
406
+ const polys = mesh.polys;
407
+ const adjacency = mesh.adjacency;
408
+ const costs = reach.costs;
409
+ let edges = 0;
410
+ for (let i = 0; i < reach.count; i++) {
411
+ const p = reach.polys[i];
412
+ const n = mesh.polyVertexCount(p);
413
+ for (let e = 0; e < n; e++) {
414
+ const other = adjacency[p * nvp + e];
415
+ if (other >= 0 && costs[other] < Infinity)
416
+ continue;
417
+ const a = polys[p * nvp + e];
418
+ edgeA[edges] = a;
419
+ edgeB[edges] = polys[p * nvp + (e + 1 === n ? 0 : e + 1)];
420
+ used[edges] = 0;
421
+ edgeNext[edges] = headStamp[a] === stamp ? head[a] : -1;
422
+ head[a] = edges;
423
+ headStamp[a] = stamp;
424
+ edges++;
425
+ }
426
+ }
427
+ const verts = mesh.verts;
428
+ for (let first = 0; first < edges; first++) {
429
+ if (used[first])
430
+ continue;
431
+ used[first] = 1;
432
+ pushLoopStart(o, o.pointCount);
433
+ const origin = edgeA[first];
434
+ pushOutlinePoint(o, verts, origin);
435
+ let v = edgeB[first];
436
+ while (v !== origin) {
437
+ let e = headStamp[v] === stamp ? head[v] : -1;
438
+ while (e >= 0 && used[e])
439
+ e = edgeNext[e];
440
+ if (e < 0)
441
+ break; // an open chain (a mesh with unmatched shared edges); keep what we have
442
+ used[e] = 1;
443
+ pushOutlinePoint(o, verts, v);
444
+ v = edgeB[e];
445
+ }
446
+ o.loopCount++;
447
+ }
448
+ pushLoopStart(o, o.pointCount);
449
+ return o;
450
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * `NavMesh`: convex walkable polygons with shared edges, baked from triangle soup by
3
+ * `bakeNavMesh`. Queries (nearest polygon, random point, raycast, height) allocate nothing after
4
+ * construction and write into an `out`. Polygons are wound counter-clockwise seen from above
5
+ * (`area2 > 0`), so for edge `e` the right portal vertex is `v[e]` and the left is `v[e + 1]`.
6
+ */
7
+ import { type AreaStamp } from './areas.js';
8
+ import type { OffMeshLink } from './links.js';
9
+ import { type NavBakeOptions, type NavBakeSource } from './voxelize.js';
10
+ export interface NavPoint3 {
11
+ x: number;
12
+ y: number;
13
+ z: number;
14
+ }
15
+ export interface NavBounds {
16
+ min: NavPoint3;
17
+ max: NavPoint3;
18
+ }
19
+ /** Twice the signed XZ area of `a, b, c`; positive is counter-clockwise seen from above. */
20
+ export declare function area2(ax: number, az: number, bx: number, bz: number, cx: number, cz: number): number;
21
+ export declare class NavMesh {
22
+ /** World `x, y, z` per vertex. */
23
+ readonly verts: Float32Array;
24
+ readonly vertCount: number;
25
+ /** `maxVertsPerPoly` vertex indices per polygon, -1 padded. */
26
+ readonly polys: Int32Array;
27
+ /** Per polygon edge `e` (from vertex `e` to `e + 1`): the polygon across it, or -1. */
28
+ readonly adjacency: Int32Array;
29
+ readonly polyCount: number;
30
+ readonly maxVertsPerPoly: number;
31
+ readonly bounds: NavBounds;
32
+ /** The bake's cell size and height, kept for serialisation and for defaults in queries. */
33
+ readonly cellSize: number;
34
+ readonly cellHeight: number;
35
+ /** The area byte per polygon (0 default; `markArea` stamps, 255 is reserved for obstacles). */
36
+ readonly area: Uint8Array;
37
+ /** Bumps whenever the mesh changes (links added or removed, areas stamped, obstacles applied). */
38
+ version: number;
39
+ /** The polygons the last `polysInBox` found (its return value says how many). */
40
+ readonly polysFound: Int32Array;
41
+ private readonly foundStamp;
42
+ private findStamp;
43
+ /** Off-mesh links by index (holes stay `null` after removal); edit with `addOffMeshLink`. */
44
+ readonly links: (OffMeshLink | null)[];
45
+ /** CSR of link ends per polygon: `linkItems[linkStart[p] .. linkStart[p + 1])` are `link * 2 + end`. */
46
+ linkStart: Int32Array;
47
+ linkItems: Int32Array;
48
+ nextLinkId: number;
49
+ /** Vertices per polygon (3..`maxVertsPerPoly`). */
50
+ private readonly nverts;
51
+ /** Per polygon XZ AABB, `minX, minZ, maxX, maxZ`. */
52
+ private readonly polyBox;
53
+ /** Cumulative polygon areas for `findRandomPoint`. */
54
+ private readonly cumArea;
55
+ private readonly gridW;
56
+ private readonly gridH;
57
+ private readonly gridCell;
58
+ private readonly gridStart;
59
+ private readonly gridItems;
60
+ private readonly triArea;
61
+ constructor(verts: Float32Array, vertCount: number, polys: Int32Array, polyCount: number, maxVertsPerPoly: number, cellSize: number, cellHeight: number, adjacency?: Int32Array, area?: Uint8Array);
62
+ private gx;
63
+ private gz;
64
+ /**
65
+ * Collects every polygon whose XZ bounding box overlaps the box into `polysFound` (each
66
+ * once) and returns how many. Allocation-free; the next call overwrites the list.
67
+ */
68
+ polysInBox(minX: number, minZ: number, maxX: number, maxZ: number): number;
69
+ /** Reverses any clockwise polygon so every polygon is counter-clockwise seen from above. */
70
+ private normaliseWinding;
71
+ /** Vertices in polygon `p`. */
72
+ polyVertexCount(p: number): number;
73
+ /** World position of vertex `k` of polygon `p`, into `out`. */
74
+ polyVertex(p: number, k: number, out: NavPoint3): NavPoint3;
75
+ /** The polygon's vertex centroid, into `out`. */
76
+ polyCenter(p: number, out: NavPoint3): NavPoint3;
77
+ /** The polygon's XZ area. */
78
+ polyArea(p: number): number;
79
+ /** Whether `(x, z)` projects inside polygon `p` (edges included). */
80
+ containsXZ(p: number, x: number, z: number): boolean;
81
+ /** The surface height of polygon `p` at `(x, z)`, by its triangle fan (extrapolated outside). */
82
+ polyHeight(p: number, x: number, z: number): number;
83
+ /**
84
+ * The polygon under or nearest to `(x, y, z)` within `radius`, or -1; the nearest point on it is
85
+ * written to `out` (left untouched when none).
86
+ */
87
+ findNearestPoly(x: number, y: number, z: number, out: NavPoint3, radius?: number): number;
88
+ /** The point of polygon `p` nearest `(x, y, z)` into `out`; returns the squared distance. */
89
+ closestPointOnPoly(p: number, x: number, y: number, z: number, out: NavPoint3): number;
90
+ /** The polygon whose XZ footprint holds `(x, z)`, nearest in height to `y`; -1 when none. */
91
+ findPolyAt(x: number, y: number, z: number): number;
92
+ /** The surface height at `(x, z)`: of `poly` when given, else of the polygon under it; NaN off the mesh. */
93
+ height(x: number, z: number, poly?: number): number;
94
+ /** A uniformly random point on the mesh into `out`; returns its polygon (-1 on an empty mesh). */
95
+ findRandomPoint(out: NavPoint3, rng?: () => number): number;
96
+ /**
97
+ * Walks the segment `from → to` across polygon edges. Returns `true` when a boundary edge
98
+ * stops it, with the hit point in `out`; otherwise `false` with `to` in `out`. A start off the
99
+ * mesh hits at once. `startPoly` skips the lookup of the polygon under `from`.
100
+ */
101
+ raycast(from: NavPoint3, to: NavPoint3, out: NavPoint3, startPoly?: number): boolean;
102
+ }
103
+ /** Pairs polygons across shared edges (both directions) into a fresh adjacency array. */
104
+ export declare function buildAdjacency(polys: Int32Array, polyCount: number, nvp: number, nverts: Uint8Array, vertCount: number): Int32Array;
105
+ export interface NavBakeAreaOptions {
106
+ /** Area stamps applied to the baked polygons (`markArea` for each, in order). Optional. */
107
+ areas?: AreaStamp[];
108
+ }
109
+ /**
110
+ * Bakes a navmesh from triangle soup: voxelise, filter by height, climb and slope, erode by the
111
+ * agent radius, partition into regions, trace and simplify contours, triangulate and merge into
112
+ * convex polygons, then stamp `opts.areas` (if any). Bake-time only; allocates freely. Options
113
+ * left out take the `resolveNavBakeOptions` defaults; a bad one throws a `NavBakeError`. An input
114
+ * with no triangles gives an empty mesh; one whose triangles yield no polygon gives an empty mesh
115
+ * and one `console.warn`.
116
+ */
117
+ export declare function bakeNavMesh(input: NavBakeSource | NavBakeSource[], options: NavBakeOptions & NavBakeAreaOptions): NavMesh;