@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,643 @@
1
+ /**
2
+ * Paths over a `NavMesh`: A* across polygons (and off-mesh links) priced by area, then the
3
+ * funnel algorithm pulls the polygon corridor into the shortest string of waypoints. `NavPath3`
4
+ * is `NavPath` with a y and the corridor. The search is a resumable `MeshSearch` so a queue can
5
+ * slice it; scratch is allocated once per search (the first query is the warm-up) and reused.
6
+ */
7
+ import { CellHeap } from '../heap.js';
8
+ import { OBSTACLE_AREA } from './areas.js';
9
+ import { area2 } from './navmesh.js';
10
+ /** A path with room for `capacity` waypoints (grows on demand). */
11
+ export function createNavPath3(capacity = 64) {
12
+ return {
13
+ points: new Float32Array(Math.max(1, capacity) * 3),
14
+ length: 0,
15
+ cursor: 0,
16
+ version: -1,
17
+ links: [],
18
+ linkCount: 0,
19
+ polys: new Int32Array(Math.max(1, capacity)),
20
+ polyCount: 0,
21
+ cost: 0,
22
+ };
23
+ }
24
+ /** Makes room for `count` corridor polygons (1.5× growth), keeping the data already there. */
25
+ export function reservePolys3(path, count) {
26
+ if (path.polys.length >= count)
27
+ return;
28
+ const next = new Int32Array(Math.max(count, Math.ceil(path.polys.length * 1.5)));
29
+ next.set(path.polys);
30
+ path.polys = next;
31
+ }
32
+ /** Makes room for `count` waypoints (1.5× growth), keeping the floats already there. */
33
+ export function reservePath3(path, count) {
34
+ const need = count * 3;
35
+ if (path.points.length >= need)
36
+ return;
37
+ const next = new Float32Array(Math.max(need, Math.ceil(path.points.length * 1.5)));
38
+ next.set(path.points);
39
+ path.points = next;
40
+ }
41
+ /** Empties the path (`length` 0, `cursor` 0, no links, no corridor); the buffers stay. */
42
+ export function clearPath3(path) {
43
+ path.length = 0;
44
+ path.cursor = 0;
45
+ path.linkCount = 0;
46
+ path.polyCount = 0;
47
+ path.cost = 0;
48
+ }
49
+ /** Writes waypoint `i` into `out`. */
50
+ export function pathPoint3(path, i, out) {
51
+ out.x = path.points[i * 3];
52
+ out.y = path.points[i * 3 + 1];
53
+ out.z = path.points[i * 3 + 2];
54
+ return out;
55
+ }
56
+ /** The sum of the segment lengths, world units. */
57
+ export function pathDistance3(path) {
58
+ const p = path.points;
59
+ let d = 0;
60
+ for (let i = 1; i < path.length; i++) {
61
+ const dx = p[i * 3] - p[i * 3 - 3];
62
+ const dy = p[i * 3 + 1] - p[i * 3 - 2];
63
+ const dz = p[i * 3 + 2] - p[i * 3 - 1];
64
+ d += Math.sqrt(dx * dx + dy * dy + dz * dz);
65
+ }
66
+ return d;
67
+ }
68
+ function pushPoint(path, x, y, z) {
69
+ // Portals fanning around one corner would repeat it; a path never holds the same point twice in a row.
70
+ if (path.length > 0) {
71
+ const l = (path.length - 1) * 3;
72
+ // `points` is f32 and the portals pass through f32 too: compare at that precision.
73
+ if (path.points[l] === Math.fround(x) &&
74
+ path.points[l + 1] === Math.fround(y) &&
75
+ path.points[l + 2] === Math.fround(z))
76
+ return;
77
+ }
78
+ reservePath3(path, path.length + 1);
79
+ const i = path.length++ * 3;
80
+ path.points[i] = x;
81
+ path.points[i + 1] = y;
82
+ path.points[i + 2] = z;
83
+ }
84
+ function pushLink(path, index, id) {
85
+ const i = path.linkCount++;
86
+ const rec = path.links[i];
87
+ if (rec) {
88
+ rec.index = index;
89
+ rec.id = id;
90
+ }
91
+ else {
92
+ path.links[i] = { index, id };
93
+ }
94
+ }
95
+ /** Whether a polygon of area `a` may be entered under the options. */
96
+ export function areaAllowed(a, cost, mask) {
97
+ if (a === OBSTACLE_AREA)
98
+ return false;
99
+ if (mask !== undefined && mask[a] === 0)
100
+ return false;
101
+ return cost === undefined || cost[a] !== Infinity;
102
+ }
103
+ /**
104
+ * A resumable polygon A*: `begin` snaps the ends and seeds the open heap, `step(maxPops)`
105
+ * expands at most that many polygons and `finish` backtracks the corridor and string-pulls it
106
+ * into a path. `findMeshPath` runs one to the end; a path queue slices one across frames. Every
107
+ * array is allocated once per search (sized to the mesh) and reused.
108
+ */
109
+ export class MeshSearch {
110
+ mesh;
111
+ state = 'idle';
112
+ /** The mesh version `begin` saw; a differing `mesh.version` means the search is stale. */
113
+ version = -1;
114
+ g;
115
+ f;
116
+ parent;
117
+ /** How the polygon was entered: the parent's edge index, or `-(link * 2 + end) - 1` for a link. */
118
+ via;
119
+ /** Where the search stands inside each polygon (portal midpoints, link landings). */
120
+ px;
121
+ py;
122
+ pz;
123
+ seen;
124
+ closed;
125
+ heap;
126
+ stamp = 0;
127
+ /** The corridor, start to end, after backtracking. */
128
+ corridor;
129
+ corridorVia;
130
+ /** Funnel portals, `lx, ly, lz, rx, ry, rz` per step. */
131
+ portals;
132
+ start = { x: 0, y: 0, z: 0 };
133
+ end = { x: 0, y: 0, z: 0 };
134
+ /** The polygons the ends snapped to (-1 before `begin`). */
135
+ startPoly = -1;
136
+ endPoly = -1;
137
+ expanded = 0;
138
+ maxExpand = Number.POSITIVE_INFINITY;
139
+ pull = true;
140
+ hw = 1;
141
+ areaCost;
142
+ areaMask;
143
+ constructor(mesh) {
144
+ this.mesh = mesh;
145
+ const n = Math.max(1, mesh.polyCount);
146
+ this.g = new Float64Array(n);
147
+ this.f = new Float64Array(n);
148
+ this.parent = new Int32Array(n);
149
+ this.via = new Int32Array(n);
150
+ this.px = new Float64Array(n);
151
+ this.py = new Float64Array(n);
152
+ this.pz = new Float64Array(n);
153
+ this.seen = new Uint32Array(n);
154
+ this.closed = new Uint32Array(n);
155
+ this.heap = new CellHeap(n, this.f);
156
+ this.corridor = new Int32Array(n);
157
+ this.corridorVia = new Int32Array(n);
158
+ this.portals = new Float64Array((n + 2) * 6);
159
+ }
160
+ /**
161
+ * Snaps `from` and `to` onto the mesh and seeds the search. False (state `'failed'`) when
162
+ * either end is off the mesh (beyond `snapRadius`) or the goal polygon's area is excluded.
163
+ */
164
+ begin(from, to, opts) {
165
+ const mesh = this.mesh;
166
+ this.version = mesh.version;
167
+ this.state = 'failed';
168
+ this.expanded = 0;
169
+ if (mesh.polyCount === 0)
170
+ return false;
171
+ const snap = opts?.snapRadius ?? Number.POSITIVE_INFINITY;
172
+ const startPoly = mesh.findNearestPoly(from.x, from.y, from.z, this.start, snap);
173
+ if (startPoly < 0)
174
+ return false;
175
+ const endPoly = mesh.findNearestPoly(to.x, to.y, to.z, this.end, snap);
176
+ if (endPoly < 0)
177
+ return false;
178
+ this.areaCost = opts?.areaCost;
179
+ this.areaMask = opts?.areaMask;
180
+ if (!areaAllowed(mesh.area[endPoly], this.areaCost, this.areaMask))
181
+ return false;
182
+ this.maxExpand = opts?.maxExpand ?? Number.POSITIVE_INFINITY;
183
+ this.pull = opts?.stringPull ?? true;
184
+ this.hw = opts?.heuristicWeight ?? 1;
185
+ this.startPoly = startPoly;
186
+ this.endPoly = endPoly;
187
+ this.stamp = (this.stamp + 1) >>> 0;
188
+ if (this.stamp === 0) {
189
+ this.seen.fill(0);
190
+ this.closed.fill(0);
191
+ this.stamp = 1;
192
+ }
193
+ this.heap.clear();
194
+ const s = this.start;
195
+ const e = this.end;
196
+ this.g[startPoly] = 0;
197
+ this.f[startPoly] = this.hw * dist3(s.x, s.y, s.z, e.x, e.y, e.z);
198
+ this.parent[startPoly] = -1;
199
+ this.via[startPoly] = 0;
200
+ this.px[startPoly] = s.x;
201
+ this.py[startPoly] = s.y;
202
+ this.pz[startPoly] = s.z;
203
+ this.seen[startPoly] = this.stamp;
204
+ this.heap.pushOrDecrease(startPoly);
205
+ this.state = startPoly === endPoly ? 'found' : 'running';
206
+ return true;
207
+ }
208
+ /** The funnel portal buffer (room for every polygon plus two), for `pullString`. */
209
+ portalsScratch() {
210
+ return this.portals;
211
+ }
212
+ /** Pops up to `maxPops` polygons off the open heap; returns how many it popped. */
213
+ step(maxPops) {
214
+ if (this.state !== 'running')
215
+ return 0;
216
+ const mesh = this.mesh;
217
+ const { g, f, parent, via, px, py, pz, seen, closed, heap, stamp, endPoly } = this;
218
+ const nvp = mesh.maxVertsPerPoly;
219
+ const verts = mesh.verts;
220
+ const polys = mesh.polys;
221
+ const adjacency = mesh.adjacency;
222
+ const area = mesh.area;
223
+ const areaCost = this.areaCost;
224
+ const areaMask = this.areaMask;
225
+ const ex = this.end.x;
226
+ const ey = this.end.y;
227
+ const ez = this.end.z;
228
+ const hw = this.hw;
229
+ let pops = 0;
230
+ while (pops < maxPops) {
231
+ if (heap.size === 0) {
232
+ this.state = 'failed';
233
+ break;
234
+ }
235
+ const cur = heap.pop();
236
+ pops++;
237
+ if (cur === endPoly) {
238
+ this.state = 'found';
239
+ break;
240
+ }
241
+ closed[cur] = stamp;
242
+ if (++this.expanded > this.maxExpand) {
243
+ this.state = 'failed';
244
+ break;
245
+ }
246
+ const cx = px[cur];
247
+ const cy = py[cur];
248
+ const cz = pz[cur];
249
+ const gc = g[cur];
250
+ // A leg runs from where the search stands in `cur` to the portal out of it, so `cur`'s
251
+ // area prices it; the destination's area only says whether the step is allowed.
252
+ const curMul = areaCost === undefined ? 1 : areaCost[area[cur]];
253
+ const n = mesh.polyVertexCount(cur);
254
+ for (let e = 0; e < n; e++) {
255
+ const next = adjacency[cur * nvp + e];
256
+ if (next < 0 || closed[next] === stamp)
257
+ continue;
258
+ const na = area[next];
259
+ if (!areaAllowed(na, areaCost, areaMask))
260
+ continue;
261
+ const a = polys[cur * nvp + e] * 3;
262
+ const b = polys[cur * nvp + (e + 1 === n ? 0 : e + 1)] * 3;
263
+ // Stand at the portal's midpoint, except in the goal polygon where the goal itself is the node.
264
+ let nx;
265
+ let ny;
266
+ let nz;
267
+ if (next === endPoly) {
268
+ nx = ex;
269
+ ny = ey;
270
+ nz = ez;
271
+ }
272
+ else {
273
+ nx = (verts[a] + verts[b]) * 0.5;
274
+ ny = (verts[a + 1] + verts[b + 1]) * 0.5;
275
+ nz = (verts[a + 2] + verts[b + 2]) * 0.5;
276
+ }
277
+ const ng = gc + dist3(cx, cy, cz, nx, ny, nz) * curMul;
278
+ if (seen[next] === stamp && ng >= g[next])
279
+ continue;
280
+ seen[next] = stamp;
281
+ g[next] = ng;
282
+ f[next] = ng + hw * dist3(nx, ny, nz, ex, ey, ez);
283
+ parent[next] = cur;
284
+ via[next] = e;
285
+ px[next] = nx;
286
+ py[next] = ny;
287
+ pz[next] = nz;
288
+ heap.pushOrDecrease(next);
289
+ }
290
+ // Off-mesh links leaving this polygon.
291
+ const lend = mesh.linkStart[cur + 1];
292
+ for (let li = mesh.linkStart[cur]; li < lend; li++) {
293
+ const rec = mesh.linkItems[li];
294
+ const link = mesh.links[rec >> 1];
295
+ if (!link)
296
+ continue;
297
+ const end = rec & 1;
298
+ const src = end === 0 ? link.from : link.to;
299
+ const dst = end === 0 ? link.to : link.from;
300
+ const next = end === 0 ? link.toPoly : link.fromPoly;
301
+ if (next < 0 || closed[next] === stamp)
302
+ continue;
303
+ if (!areaAllowed(area[next], areaCost, areaMask))
304
+ continue;
305
+ const linkCost = link.cost ?? dist3(src.x, src.y, src.z, dst.x, dst.y, dst.z);
306
+ const ng = gc + dist3(cx, cy, cz, src.x, src.y, src.z) * curMul + linkCost;
307
+ if (seen[next] === stamp && ng >= g[next])
308
+ continue;
309
+ seen[next] = stamp;
310
+ g[next] = ng;
311
+ f[next] = ng + hw * dist3(dst.x, dst.y, dst.z, ex, ey, ez);
312
+ parent[next] = cur;
313
+ via[next] = -rec - 1;
314
+ px[next] = dst.x;
315
+ py[next] = dst.y;
316
+ pz[next] = dst.z;
317
+ heap.pushOrDecrease(next);
318
+ }
319
+ }
320
+ return pops;
321
+ }
322
+ /**
323
+ * After `'found'`: backtracks the corridor into `out.polys` and string-pulls it (each stretch
324
+ * between links through its portals) into `out.points`. False, with `out` empty, unless the
325
+ * search found the goal.
326
+ */
327
+ finish(out) {
328
+ clearPath3(out);
329
+ out.version = this.version;
330
+ if (this.state !== 'found')
331
+ return false;
332
+ const mesh = this.mesh;
333
+ const { parent, via, corridor, corridorVia, portals, endPoly } = this;
334
+ const nvp = mesh.maxVertsPerPoly;
335
+ const verts = mesh.verts;
336
+ const polys = mesh.polys;
337
+ // Backtrack into the corridor, start first.
338
+ let len = 0;
339
+ for (let p = endPoly; p >= 0; p = parent[p]) {
340
+ corridor[len] = p;
341
+ corridorVia[len] = via[p];
342
+ len++;
343
+ }
344
+ for (let i = 0, j = len - 1; i < j; i++, j--) {
345
+ let t = corridor[i];
346
+ corridor[i] = corridor[j];
347
+ corridor[j] = t;
348
+ t = corridorVia[i];
349
+ corridorVia[i] = corridorVia[j];
350
+ corridorVia[j] = t;
351
+ }
352
+ reservePolys3(out, len);
353
+ out.polys.set(corridor.subarray(0, len));
354
+ out.polyCount = len;
355
+ out.cost = endPoly === this.startPoly ? 0 : this.g[endPoly];
356
+ // String-pull each stretch between links through the portals.
357
+ let apexX = this.start.x;
358
+ let apexY = this.start.y;
359
+ let apexZ = this.start.z;
360
+ pushPoint(out, apexX, apexY, apexZ);
361
+ let i = 1;
362
+ while (i <= len) {
363
+ // Collect portals of the stretch starting at the apex until a link or the end.
364
+ let np = 0;
365
+ let linkRec = -1;
366
+ while (i < len) {
367
+ const v = corridorVia[i];
368
+ if (v < 0) {
369
+ linkRec = -v - 1;
370
+ break;
371
+ }
372
+ const prevPoly = corridor[i - 1];
373
+ const n = mesh.polyVertexCount(prevPoly);
374
+ const a = polys[prevPoly * nvp + v] * 3;
375
+ const b = polys[prevPoly * nvp + (v + 1 === n ? 0 : v + 1)] * 3;
376
+ // Edge `v` runs a → b; exiting across it, b is on the left and a on the right.
377
+ portals[np * 6] = verts[b];
378
+ portals[np * 6 + 1] = verts[b + 1];
379
+ portals[np * 6 + 2] = verts[b + 2];
380
+ portals[np * 6 + 3] = verts[a];
381
+ portals[np * 6 + 4] = verts[a + 1];
382
+ portals[np * 6 + 5] = verts[a + 2];
383
+ np++;
384
+ i++;
385
+ }
386
+ // The stretch ends at the link's start point or at the goal.
387
+ let tx;
388
+ let ty;
389
+ let tz;
390
+ if (linkRec >= 0) {
391
+ const link = mesh.links[linkRec >> 1];
392
+ const src = (linkRec & 1) === 0 ? link.from : link.to;
393
+ tx = src.x;
394
+ ty = src.y;
395
+ tz = src.z;
396
+ }
397
+ else {
398
+ tx = this.end.x;
399
+ ty = this.end.y;
400
+ tz = this.end.z;
401
+ }
402
+ portals[np * 6] = tx;
403
+ portals[np * 6 + 1] = ty;
404
+ portals[np * 6 + 2] = tz;
405
+ portals[np * 6 + 3] = tx;
406
+ portals[np * 6 + 4] = ty;
407
+ portals[np * 6 + 5] = tz;
408
+ np++;
409
+ if (this.pull) {
410
+ funnel(out, portals, np, apexX, apexY, apexZ);
411
+ }
412
+ else {
413
+ for (let k = 0; k + 1 < np; k++) {
414
+ pushPoint(out, (portals[k * 6] + portals[k * 6 + 3]) * 0.5, (portals[k * 6 + 1] + portals[k * 6 + 4]) * 0.5, (portals[k * 6 + 2] + portals[k * 6 + 5]) * 0.5);
415
+ }
416
+ }
417
+ pushPoint(out, tx, ty, tz);
418
+ if (linkRec >= 0) {
419
+ const link = mesh.links[linkRec >> 1];
420
+ const dst = (linkRec & 1) === 0 ? link.to : link.from;
421
+ pushLink(out, out.length - 1, link.id);
422
+ pushPoint(out, dst.x, dst.y, dst.z);
423
+ apexX = dst.x;
424
+ apexY = dst.y;
425
+ apexZ = dst.z;
426
+ i++;
427
+ }
428
+ else {
429
+ break;
430
+ }
431
+ }
432
+ this.state = 'idle';
433
+ return true;
434
+ }
435
+ }
436
+ const searchFor = new WeakMap();
437
+ /** The mesh's shared synchronous search (allocated on the first query). */
438
+ function searchOf(mesh) {
439
+ let s = searchFor.get(mesh);
440
+ if (!s) {
441
+ s = new MeshSearch(mesh);
442
+ searchFor.set(mesh, s);
443
+ }
444
+ return s;
445
+ }
446
+ function dist3(ax, ay, az, bx, by, bz) {
447
+ const dx = bx - ax;
448
+ const dy = by - ay;
449
+ const dz = bz - az;
450
+ return Math.sqrt(dx * dx + dy * dy + dz * dz);
451
+ }
452
+ /**
453
+ * Finds the shortest route over the mesh from `from` to `to` (both snapped to the nearest
454
+ * polygon) and writes its waypoints into `out`, the first being the snapped start and the last
455
+ * the snapped goal, and its polygon corridor into `out.polys`. Off-mesh links are taken when
456
+ * they are cheaper and listed in `out.links`. Steps are priced by `areaCost` and filtered by
457
+ * `areaMask`; area 255 (an obstacle) is never entered. Returns false, with `out` empty, when
458
+ * either end is off the mesh (beyond `snapRadius`), the goal is unreachable or excluded, or
459
+ * `maxExpand` ran out.
460
+ */
461
+ export function findMeshPath(mesh, from, to, out, opts) {
462
+ const s = searchOf(mesh);
463
+ if (!s.begin(from, to, opts)) {
464
+ clearPath3(out);
465
+ out.version = mesh.version;
466
+ return false;
467
+ }
468
+ s.step(Number.POSITIVE_INFINITY);
469
+ return s.finish(out);
470
+ }
471
+ /**
472
+ * String-pulls a corridor of `count` polygons (`polys[offset ..]`, each adjacent to the next)
473
+ * from `from` (inside the first) to `to` (inside the last) into `out`: the start, every
474
+ * corner, the target. A pair without a shared edge (an off-mesh link) is bridged through the
475
+ * next polygon's centre. Allocation-free after the mesh's first query; used by corridors.
476
+ */
477
+ export function pullString(mesh, polys, offset, count, from, to, out) {
478
+ clearPath3(out);
479
+ out.version = mesh.version;
480
+ const s = searchOf(mesh);
481
+ const portals = s.portalsScratch();
482
+ const nvp = mesh.maxVertsPerPoly;
483
+ const verts = mesh.verts;
484
+ const mp = mesh.polys;
485
+ const adjacency = mesh.adjacency;
486
+ let np = 0;
487
+ for (let i = 1; i < count; i++) {
488
+ const prev = polys[offset + i - 1];
489
+ const next = polys[offset + i];
490
+ const n = mesh.polyVertexCount(prev);
491
+ let e = 0;
492
+ while (e < n && adjacency[prev * nvp + e] !== next)
493
+ e++;
494
+ if (e === n) {
495
+ mesh.polyCenter(next, centreScratch);
496
+ portals[np * 6] = centreScratch.x;
497
+ portals[np * 6 + 1] = centreScratch.y;
498
+ portals[np * 6 + 2] = centreScratch.z;
499
+ portals[np * 6 + 3] = centreScratch.x;
500
+ portals[np * 6 + 4] = centreScratch.y;
501
+ portals[np * 6 + 5] = centreScratch.z;
502
+ }
503
+ else {
504
+ const a = mp[prev * nvp + e] * 3;
505
+ const b = mp[prev * nvp + (e + 1 === n ? 0 : e + 1)] * 3;
506
+ portals[np * 6] = verts[b];
507
+ portals[np * 6 + 1] = verts[b + 1];
508
+ portals[np * 6 + 2] = verts[b + 2];
509
+ portals[np * 6 + 3] = verts[a];
510
+ portals[np * 6 + 4] = verts[a + 1];
511
+ portals[np * 6 + 5] = verts[a + 2];
512
+ }
513
+ np++;
514
+ }
515
+ portals[np * 6] = to.x;
516
+ portals[np * 6 + 1] = to.y;
517
+ portals[np * 6 + 2] = to.z;
518
+ portals[np * 6 + 3] = to.x;
519
+ portals[np * 6 + 4] = to.y;
520
+ portals[np * 6 + 5] = to.z;
521
+ np++;
522
+ pushPoint(out, from.x, from.y, from.z);
523
+ funnel(out, portals, np, from.x, from.y, from.z);
524
+ pushPoint(out, to.x, to.y, to.z);
525
+ }
526
+ const centreScratch = { x: 0, y: 0, z: 0 };
527
+ /**
528
+ * Simple Stupid Funnel Algorithm over `np` portals (the last one degenerate at the target),
529
+ * appending the corners it turns at to `out`. The apex itself and the target are not appended.
530
+ */
531
+ function funnel(out, portals, np, apexX0, apexY0, apexZ0) {
532
+ let apexX = apexX0;
533
+ let apexY = apexY0;
534
+ let apexZ = apexZ0;
535
+ let leftX = apexX;
536
+ let leftY = apexY;
537
+ let leftZ = apexZ;
538
+ let rightX = apexX;
539
+ let rightY = apexY;
540
+ let rightZ = apexZ;
541
+ let apexIndex = -1;
542
+ let leftIndex = -1;
543
+ let rightIndex = -1;
544
+ for (let i = 0; i < np; i++) {
545
+ const lx = portals[i * 6];
546
+ const ly = portals[i * 6 + 1];
547
+ const lz = portals[i * 6 + 2];
548
+ const rx = portals[i * 6 + 3];
549
+ const ry = portals[i * 6 + 4];
550
+ const rz = portals[i * 6 + 5];
551
+ // Right side: tighten when the new right is inside the funnel.
552
+ if (area2(apexX, apexZ, rightX, rightZ, rx, rz) >= 0) {
553
+ if ((apexX === rightX && apexZ === rightZ) || area2(apexX, apexZ, leftX, leftZ, rx, rz) < 0) {
554
+ rightX = rx;
555
+ rightY = ry;
556
+ rightZ = rz;
557
+ rightIndex = i;
558
+ }
559
+ else {
560
+ // The right crossed the left: the left vertex is a corner of the path.
561
+ pushPoint(out, leftX, leftY, leftZ);
562
+ apexX = leftX;
563
+ apexY = leftY;
564
+ apexZ = leftZ;
565
+ apexIndex = leftIndex;
566
+ leftX = apexX;
567
+ leftY = apexY;
568
+ leftZ = apexZ;
569
+ rightX = apexX;
570
+ rightY = apexY;
571
+ rightZ = apexZ;
572
+ leftIndex = apexIndex;
573
+ rightIndex = apexIndex;
574
+ i = apexIndex;
575
+ continue;
576
+ }
577
+ }
578
+ // Left side.
579
+ if (area2(apexX, apexZ, leftX, leftZ, lx, lz) <= 0) {
580
+ if ((apexX === leftX && apexZ === leftZ) || area2(apexX, apexZ, rightX, rightZ, lx, lz) > 0) {
581
+ leftX = lx;
582
+ leftY = ly;
583
+ leftZ = lz;
584
+ leftIndex = i;
585
+ }
586
+ else {
587
+ pushPoint(out, rightX, rightY, rightZ);
588
+ apexX = rightX;
589
+ apexY = rightY;
590
+ apexZ = rightZ;
591
+ apexIndex = rightIndex;
592
+ leftX = apexX;
593
+ leftY = apexY;
594
+ leftZ = apexZ;
595
+ rightX = apexX;
596
+ rightY = apexY;
597
+ rightZ = apexZ;
598
+ leftIndex = apexIndex;
599
+ rightIndex = apexIndex;
600
+ i = apexIndex;
601
+ }
602
+ }
603
+ }
604
+ }
605
+ /**
606
+ * Heads for `path.points[path.cursor]` at `speed`: the cursor advances when `position` is within
607
+ * `arriveRadius` (measured in XZ) of its waypoint, and the last waypoint reached is `'arrived'`
608
+ * with a zero velocity. `outVelocity` is the desired velocity in 3D (world units per second);
609
+ * a walker usually keeps its own y and snaps it to `mesh.height(x, z)`.
610
+ */
611
+ export function followPath3(path, position, speed, arriveRadius, outVelocity) {
612
+ const n = path.length;
613
+ if (n === 0) {
614
+ outVelocity.x = 0;
615
+ outVelocity.y = 0;
616
+ outVelocity.z = 0;
617
+ return 'arrived';
618
+ }
619
+ if (path.cursor >= n)
620
+ path.cursor = n - 1;
621
+ const r2 = arriveRadius * arriveRadius;
622
+ const p = path.points;
623
+ let dx = p[path.cursor * 3] - position.x;
624
+ let dy = p[path.cursor * 3 + 1] - position.y;
625
+ let dz = p[path.cursor * 3 + 2] - position.z;
626
+ while (dx * dx + dz * dz <= r2) {
627
+ if (path.cursor >= n - 1) {
628
+ outVelocity.x = 0;
629
+ outVelocity.y = 0;
630
+ outVelocity.z = 0;
631
+ return 'arrived';
632
+ }
633
+ path.cursor++;
634
+ dx = p[path.cursor * 3] - position.x;
635
+ dy = p[path.cursor * 3 + 1] - position.y;
636
+ dz = p[path.cursor * 3 + 2] - position.z;
637
+ }
638
+ const d = Math.sqrt(dx * dx + dy * dy + dz * dz);
639
+ outVelocity.x = (dx / d) * speed;
640
+ outVelocity.y = (dy / d) * speed;
641
+ outVelocity.z = (dz / d) * speed;
642
+ return 'moving';
643
+ }