@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,44 @@
1
+ /**
2
+ * Area types on a `NavMesh`: every polygon carries one byte (`mesh.area`, 0 by default) that a
3
+ * query multiplies its step cost by (`areaCost`) or filters on (`areaMask`). `markArea` stamps a
4
+ * box or a convex polygon onto the polygons whose centre it holds; a bake takes the same shapes
5
+ * as `areas`. Area 255 is reserved for dynamic obstacles and is never walked.
6
+ */
7
+ import type { NavMesh } from './navmesh.js';
8
+ /** The area byte dynamic obstacles stamp; every query treats it as blocked. */
9
+ export declare const OBSTACLE_AREA = 255;
10
+ /** An axis-aligned box on the XZ plane, with an optional height band. */
11
+ export interface AreaBox {
12
+ minX: number;
13
+ minZ: number;
14
+ maxX: number;
15
+ maxZ: number;
16
+ /** Polygons whose centre lies outside `[minY, maxY]` are left alone. Default: any height. */
17
+ minY?: number;
18
+ maxY?: number;
19
+ }
20
+ /** A convex polygon on the XZ plane: `x, z` pairs in either winding, with an optional height band. */
21
+ export interface AreaPolygon {
22
+ points: ArrayLike<number>;
23
+ minY?: number;
24
+ maxY?: number;
25
+ }
26
+ export type AreaShape = AreaBox | AreaPolygon;
27
+ /** One stamp of a bake's `areas` list. */
28
+ export interface AreaStamp {
29
+ shape: AreaShape;
30
+ /** The area byte, 0..254 (255 is reserved for obstacles). */
31
+ area: number;
32
+ }
33
+ /** Per-area cost multipliers (256 entries; `Infinity` excludes an area) with every area at 1. */
34
+ export declare function createAreaCosts(fill?: number): Float32Array;
35
+ /** Per-area walkability (256 entries; 0 excludes an area) with every area allowed. */
36
+ export declare function createAreaMask(allow?: number): Uint8Array;
37
+ /** Whether `(x, z)` lies inside the shape (edges included) and `y` within its height band. */
38
+ export declare function areaShapeContains(shape: AreaShape, x: number, y: number, z: number): boolean;
39
+ /**
40
+ * Sets `mesh.area[p] = area` for every polygon whose centre lies inside `shape`; polygons
41
+ * carrying the obstacle area (255) are left alone. Bumps `mesh.version` when any changed.
42
+ * Returns the number of polygons stamped. Edit-time; allocation-free.
43
+ */
44
+ export declare function markArea(mesh: NavMesh, shape: AreaShape, area: number): number;
@@ -0,0 +1,98 @@
1
+ /** The area byte dynamic obstacles stamp; every query treats it as blocked. */
2
+ export const OBSTACLE_AREA = 255;
3
+ /** Per-area cost multipliers (256 entries; `Infinity` excludes an area) with every area at 1. */
4
+ export function createAreaCosts(fill = 1) {
5
+ return new Float32Array(256).fill(fill);
6
+ }
7
+ /** Per-area walkability (256 entries; 0 excludes an area) with every area allowed. */
8
+ export function createAreaMask(allow = 1) {
9
+ return new Uint8Array(256).fill(allow);
10
+ }
11
+ /** Whether `(x, z)` lies inside the shape (edges included) and `y` within its height band. */
12
+ export function areaShapeContains(shape, x, y, z) {
13
+ if (shape.minY !== undefined && y < shape.minY)
14
+ return false;
15
+ if (shape.maxY !== undefined && y > shape.maxY)
16
+ return false;
17
+ if ('points' in shape) {
18
+ const pts = shape.points;
19
+ const n = pts.length >> 1;
20
+ if (n < 3)
21
+ return false;
22
+ // Inside a convex polygon when the point is on the same side of every edge.
23
+ let sign = 0;
24
+ for (let i = 0; i < n; i++) {
25
+ const j = i + 1 === n ? 0 : i + 1;
26
+ const ax = pts[i * 2];
27
+ const az = pts[i * 2 + 1];
28
+ const bx = pts[j * 2];
29
+ const bz = pts[j * 2 + 1];
30
+ const cross = (bx - ax) * (z - az) - (bz - az) * (x - ax);
31
+ if (cross === 0)
32
+ continue;
33
+ const s = cross > 0 ? 1 : -1;
34
+ if (sign === 0)
35
+ sign = s;
36
+ else if (s !== sign)
37
+ return false;
38
+ }
39
+ return true;
40
+ }
41
+ return x >= shape.minX && x <= shape.maxX && z >= shape.minZ && z <= shape.maxZ;
42
+ }
43
+ const centre = { x: 0, y: 0, z: 0 };
44
+ /**
45
+ * Sets `mesh.area[p] = area` for every polygon whose centre lies inside `shape`; polygons
46
+ * carrying the obstacle area (255) are left alone. Bumps `mesh.version` when any changed.
47
+ * Returns the number of polygons stamped. Edit-time; allocation-free.
48
+ */
49
+ export function markArea(mesh, shape, area) {
50
+ const a = Math.max(0, Math.min(254, Math.floor(area)));
51
+ let minX;
52
+ let minZ;
53
+ let maxX;
54
+ let maxZ;
55
+ if ('points' in shape) {
56
+ minX = minZ = Number.POSITIVE_INFINITY;
57
+ maxX = maxZ = Number.NEGATIVE_INFINITY;
58
+ const pts = shape.points;
59
+ for (let i = 0; i + 1 < pts.length; i += 2) {
60
+ const x = pts[i];
61
+ const z = pts[i + 1];
62
+ if (x < minX)
63
+ minX = x;
64
+ if (x > maxX)
65
+ maxX = x;
66
+ if (z < minZ)
67
+ minZ = z;
68
+ if (z > maxZ)
69
+ maxZ = z;
70
+ }
71
+ }
72
+ else {
73
+ minX = shape.minX;
74
+ minZ = shape.minZ;
75
+ maxX = shape.maxX;
76
+ maxZ = shape.maxZ;
77
+ }
78
+ let stamped = 0;
79
+ let changed = false;
80
+ const count = mesh.polysInBox(minX, minZ, maxX, maxZ);
81
+ const found = mesh.polysFound;
82
+ for (let i = 0; i < count; i++) {
83
+ const p = found[i];
84
+ mesh.polyCenter(p, centre);
85
+ if (!areaShapeContains(shape, centre.x, centre.y, centre.z))
86
+ continue;
87
+ if (mesh.area[p] === OBSTACLE_AREA)
88
+ continue;
89
+ stamped++;
90
+ if (mesh.area[p] !== a) {
91
+ mesh.area[p] = a;
92
+ changed = true;
93
+ }
94
+ }
95
+ if (changed)
96
+ mesh.version++;
97
+ return stamped;
98
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `NavBakeOptions` defaults and validation (ws/nav-6). Every numeric option but `cellSize` has a
3
+ * default derived from it, and a value that would bake NaN cells (non-finite, negative, out of
4
+ * range) throws a `NavBakeError` naming the option instead of yielding an empty mesh. Bake-time
5
+ * code; `scripts/bake-nav.mjs` resolves its options through the same function.
6
+ */
7
+ import type { NavBakeOptions } from './voxelize.js';
8
+ /** Thrown by `bakeNavMesh` (and `resolveNavBakeOptions`) for an option it cannot bake with. */
9
+ export declare class NavBakeError extends Error {
10
+ /** The option's name, as in `NavBakeOptions`. */
11
+ readonly option: string;
12
+ /** The value given. */
13
+ readonly value: unknown;
14
+ constructor(option: string, value: unknown, rule: string);
15
+ }
16
+ /** `NavBakeOptions` with every default filled in. */
17
+ export type ResolvedNavBakeOptions = Required<NavBakeOptions>;
18
+ /** The fixed defaults; the rest derive from `cellSize` (see `resolveNavBakeOptions`). */
19
+ export declare const NAV_BAKE_DEFAULTS: Readonly<{
20
+ agentHeight: 2;
21
+ agentMaxSlope: 45;
22
+ minRegionArea: 8;
23
+ mergeRegionArea: 20;
24
+ maxVertsPerPoly: 6;
25
+ }>;
26
+ /**
27
+ * Fills the defaults and validates: `cellHeight = cellSize / 2`, `agentHeight = 2`,
28
+ * `agentRadius = cellSize * 2`, `agentMaxClimb = cellHeight * 2`, `agentMaxSlope = 45`,
29
+ * `minRegionArea = 8`, `mergeRegionArea = 20`, `maxEdgeLength = 12 * cellSize`,
30
+ * `maxSimplification = 1.3 * cellSize`, `maxVertsPerPoly = 6`. Throws a `NavBakeError` for a
31
+ * missing `cellSize` or any value that is not a finite number in range.
32
+ */
33
+ export declare function resolveNavBakeOptions(opts: NavBakeOptions): ResolvedNavBakeOptions;
@@ -0,0 +1,76 @@
1
+ /** Thrown by `bakeNavMesh` (and `resolveNavBakeOptions`) for an option it cannot bake with. */
2
+ export class NavBakeError extends Error {
3
+ /** The option's name, as in `NavBakeOptions`. */
4
+ option;
5
+ /** The value given. */
6
+ value;
7
+ constructor(option, value, rule) {
8
+ super(`bakeNavMesh: ${option} must be ${rule}, got ${showValue(value)}`);
9
+ this.name = 'NavBakeError';
10
+ this.option = option;
11
+ this.value = value;
12
+ }
13
+ }
14
+ /** The fixed defaults; the rest derive from `cellSize` (see `resolveNavBakeOptions`). */
15
+ export const NAV_BAKE_DEFAULTS = Object.freeze({
16
+ agentHeight: 2,
17
+ agentMaxSlope: 45,
18
+ minRegionArea: 8,
19
+ mergeRegionArea: 20,
20
+ maxVertsPerPoly: 6,
21
+ });
22
+ function showValue(v) {
23
+ if (typeof v === 'string')
24
+ return JSON.stringify(v);
25
+ if (typeof v === 'number' || typeof v === 'boolean' || v == null)
26
+ return String(v);
27
+ return typeof v;
28
+ }
29
+ function num(opts, key, fallback, min, minOpen, max = Number.POSITIVE_INFINITY) {
30
+ const v = opts[key];
31
+ if (v === undefined)
32
+ return fallback;
33
+ const rule = max === Number.POSITIVE_INFINITY
34
+ ? `a finite number ${minOpen ? '>' : '>='} ${min}`
35
+ : `a number in ${min}..${max}`;
36
+ if (typeof v !== 'number' || !Number.isFinite(v))
37
+ throw new NavBakeError(key, v, rule);
38
+ if (minOpen ? v <= min : v < min)
39
+ throw new NavBakeError(key, v, rule);
40
+ if (v > max)
41
+ throw new NavBakeError(key, v, rule);
42
+ return v;
43
+ }
44
+ /**
45
+ * Fills the defaults and validates: `cellHeight = cellSize / 2`, `agentHeight = 2`,
46
+ * `agentRadius = cellSize * 2`, `agentMaxClimb = cellHeight * 2`, `agentMaxSlope = 45`,
47
+ * `minRegionArea = 8`, `mergeRegionArea = 20`, `maxEdgeLength = 12 * cellSize`,
48
+ * `maxSimplification = 1.3 * cellSize`, `maxVertsPerPoly = 6`. Throws a `NavBakeError` for a
49
+ * missing `cellSize` or any value that is not a finite number in range.
50
+ */
51
+ export function resolveNavBakeOptions(opts) {
52
+ if (opts === null || typeof opts !== 'object') {
53
+ throw new NavBakeError('options', opts, 'an object with a cellSize');
54
+ }
55
+ const cs = opts.cellSize;
56
+ if (typeof cs !== 'number' || !Number.isFinite(cs) || cs <= 0) {
57
+ throw new NavBakeError('cellSize', cs, 'a finite number > 0 (it has no default)');
58
+ }
59
+ const cellHeight = num(opts, 'cellHeight', cs / 2, 0, true);
60
+ const nvp = num(opts, 'maxVertsPerPoly', NAV_BAKE_DEFAULTS.maxVertsPerPoly, 3, false, 6);
61
+ if (!Number.isInteger(nvp))
62
+ throw new NavBakeError('maxVertsPerPoly', nvp, 'an integer in 3..6');
63
+ return {
64
+ cellSize: cs,
65
+ cellHeight,
66
+ agentHeight: num(opts, 'agentHeight', NAV_BAKE_DEFAULTS.agentHeight, 0, true),
67
+ agentRadius: num(opts, 'agentRadius', cs * 2, 0, false),
68
+ agentMaxClimb: num(opts, 'agentMaxClimb', cellHeight * 2, 0, false),
69
+ agentMaxSlope: num(opts, 'agentMaxSlope', NAV_BAKE_DEFAULTS.agentMaxSlope, 0, false, 90),
70
+ minRegionArea: num(opts, 'minRegionArea', NAV_BAKE_DEFAULTS.minRegionArea, 0, false),
71
+ mergeRegionArea: num(opts, 'mergeRegionArea', NAV_BAKE_DEFAULTS.mergeRegionArea, 0, false),
72
+ maxEdgeLength: num(opts, 'maxEdgeLength', 12 * cs, 0, false),
73
+ maxSimplification: num(opts, 'maxSimplification', 1.3 * cs, 0, false),
74
+ maxVertsPerPoly: nvp,
75
+ };
76
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Navmesh bake, stage three: contours. Each region's boundary is walked cell by cell, then
3
+ * simplified (points where the neighbouring region changes are kept, the rest within
4
+ * `maxError`), and long outer edges are split. Recast `rcBuildContours`, in cells; vertices are
5
+ * `x, y, z, flags` with the neighbour region in the low 16 bits of `flags`.
6
+ */
7
+ import { type CompactHeightfield } from './voxelize.js';
8
+ export declare const CONTOUR_REG_MASK = 65535;
9
+ export declare const AREA_BORDER = 131072;
10
+ export interface Contour {
11
+ /** Simplified vertices, `x, y, z, flags` per vertex (cells). */
12
+ verts: number[];
13
+ reg: number;
14
+ area: number;
15
+ }
16
+ /** Twice the signed area of a contour in the XZ plane. */
17
+ export declare function contourArea2(verts: number[]): number;
18
+ /**
19
+ * Builds one simplified contour per region. `maxError` and `maxEdgeLen` are in cells. A contour
20
+ * that comes out as a hole (reversed winding) cannot happen with hole-free regions and is dropped.
21
+ */
22
+ export declare function buildContours(chf: CompactHeightfield, maxError: number, maxEdgeLen: number): Contour[];
@@ -0,0 +1,323 @@
1
+ /**
2
+ * Navmesh bake, stage three: contours. Each region's boundary is walked cell by cell, then
3
+ * simplified (points where the neighbouring region changes are kept, the rest within
4
+ * `maxError`), and long outer edges are split. Recast `rcBuildContours`, in cells; vertices are
5
+ * `x, y, z, flags` with the neighbour region in the low 16 bits of `flags`.
6
+ */
7
+ import { DIR_X, DIR_Z, NOT_CONNECTED, NULL_AREA } from './voxelize.js';
8
+ export const CONTOUR_REG_MASK = 0xffff;
9
+ export const AREA_BORDER = 0x20000;
10
+ function cornerHeight(i, dir, chf) {
11
+ let ch = chf.y[i];
12
+ const dirp = (dir + 1) & 3;
13
+ const ai = chf.con[i * 4 + dir];
14
+ if (ai !== NOT_CONNECTED) {
15
+ ch = Math.max(ch, chf.y[ai]);
16
+ const ai2 = chf.con[ai * 4 + dirp];
17
+ if (ai2 !== NOT_CONNECTED)
18
+ ch = Math.max(ch, chf.y[ai2]);
19
+ }
20
+ const bi = chf.con[i * 4 + dirp];
21
+ if (bi !== NOT_CONNECTED) {
22
+ ch = Math.max(ch, chf.y[bi]);
23
+ const bi2 = chf.con[bi * 4 + dir];
24
+ if (bi2 !== NOT_CONNECTED)
25
+ ch = Math.max(ch, chf.y[bi2]);
26
+ }
27
+ return ch;
28
+ }
29
+ function walkContour(x0, z0, i0, chf, flags, points) {
30
+ let x = x0;
31
+ let z = z0;
32
+ let i = i0;
33
+ let dir = 0;
34
+ while ((flags[i] & (1 << dir)) === 0)
35
+ dir++;
36
+ const startDir = dir;
37
+ const area = chf.areas[i];
38
+ let iter = 0;
39
+ while (++iter < 40000) {
40
+ if (flags[i] & (1 << dir)) {
41
+ let px = x;
42
+ const py = cornerHeight(i, dir, chf);
43
+ let pz = z;
44
+ switch (dir) {
45
+ case 0:
46
+ pz++;
47
+ break;
48
+ case 1:
49
+ px++;
50
+ pz++;
51
+ break;
52
+ case 2:
53
+ px++;
54
+ break;
55
+ default:
56
+ break;
57
+ }
58
+ let r = 0;
59
+ const ai = chf.con[i * 4 + dir];
60
+ if (ai !== NOT_CONNECTED) {
61
+ r = chf.regs[ai];
62
+ if (area !== chf.areas[ai])
63
+ r |= AREA_BORDER;
64
+ }
65
+ points.push(px, py, pz, r);
66
+ flags[i] = flags[i] & ~(1 << dir);
67
+ dir = (dir + 1) & 3;
68
+ }
69
+ else {
70
+ const ni = chf.con[i * 4 + dir];
71
+ if (ni === NOT_CONNECTED)
72
+ return;
73
+ x += DIR_X[dir];
74
+ z += DIR_Z[dir];
75
+ i = ni;
76
+ dir = (dir + 3) & 3;
77
+ }
78
+ if (i0 === i && startDir === dir)
79
+ break;
80
+ }
81
+ }
82
+ /** Squared distance from a point to a segment, in the XZ plane. */
83
+ function distancePtSeg(x, z, px, pz, qx, qz) {
84
+ const pqx = qx - px;
85
+ const pqz = qz - pz;
86
+ let dx = x - px;
87
+ let dz = z - pz;
88
+ const d = pqx * pqx + pqz * pqz;
89
+ let t = pqx * dx + pqz * dz;
90
+ if (d > 0)
91
+ t /= d;
92
+ if (t < 0)
93
+ t = 0;
94
+ else if (t > 1)
95
+ t = 1;
96
+ dx = px + t * pqx - x;
97
+ dz = pz + t * pqz - z;
98
+ return dx * dx + dz * dz;
99
+ }
100
+ function simplifyContour(points, simplified, maxError, maxEdgeLen) {
101
+ const pn = points.length / 4;
102
+ let hasConnections = false;
103
+ for (let i = 0; i < pn; i++) {
104
+ if ((points[i * 4 + 3] & CONTOUR_REG_MASK) !== 0) {
105
+ hasConnections = true;
106
+ break;
107
+ }
108
+ }
109
+ if (hasConnections) {
110
+ for (let i = 0; i < pn; i++) {
111
+ const ii = (i + 1) % pn;
112
+ const differentRegs = (points[i * 4 + 3] & CONTOUR_REG_MASK) !== (points[ii * 4 + 3] & CONTOUR_REG_MASK);
113
+ const areaBorders = (points[i * 4 + 3] & AREA_BORDER) !== (points[ii * 4 + 3] & AREA_BORDER);
114
+ if (differentRegs || areaBorders) {
115
+ simplified.push(points[i * 4], points[i * 4 + 1], points[i * 4 + 2], i);
116
+ }
117
+ }
118
+ }
119
+ if (simplified.length === 0) {
120
+ let llx = points[0];
121
+ let lly = points[1];
122
+ let llz = points[2];
123
+ let lli = 0;
124
+ let urx = points[0];
125
+ let ury = points[1];
126
+ let urz = points[2];
127
+ let uri = 0;
128
+ for (let i = 0; i < pn; i++) {
129
+ const x = points[i * 4];
130
+ const y = points[i * 4 + 1];
131
+ const z = points[i * 4 + 2];
132
+ if (x < llx || (x === llx && z < llz)) {
133
+ llx = x;
134
+ lly = y;
135
+ llz = z;
136
+ lli = i;
137
+ }
138
+ if (x > urx || (x === urx && z > urz)) {
139
+ urx = x;
140
+ ury = y;
141
+ urz = z;
142
+ uri = i;
143
+ }
144
+ }
145
+ simplified.push(llx, lly, llz, lli, urx, ury, urz, uri);
146
+ }
147
+ // Add points until every raw point is within the error of the simplified shape.
148
+ for (let i = 0; i < simplified.length / 4;) {
149
+ const n = simplified.length / 4;
150
+ const ii = (i + 1) % n;
151
+ let ax = simplified[i * 4];
152
+ let az = simplified[i * 4 + 2];
153
+ const ai = simplified[i * 4 + 3];
154
+ let bx = simplified[ii * 4];
155
+ let bz = simplified[ii * 4 + 2];
156
+ const bi = simplified[ii * 4 + 3];
157
+ let maxd = 0;
158
+ let maxi = -1;
159
+ let ci;
160
+ let cinc;
161
+ let endi;
162
+ // Traverse in lexicographic order so opposite traversals of a shared edge agree.
163
+ if (bx > ax || (bx === ax && bz > az)) {
164
+ cinc = 1;
165
+ ci = (ai + cinc) % pn;
166
+ endi = bi;
167
+ }
168
+ else {
169
+ cinc = pn - 1;
170
+ ci = (bi + cinc) % pn;
171
+ endi = ai;
172
+ const tx = ax;
173
+ ax = bx;
174
+ bx = tx;
175
+ const tz = az;
176
+ az = bz;
177
+ bz = tz;
178
+ }
179
+ // Tessellate only outer edges or edges between areas.
180
+ if ((points[ci * 4 + 3] & CONTOUR_REG_MASK) === 0 || points[ci * 4 + 3] & AREA_BORDER) {
181
+ while (ci !== endi) {
182
+ const d = distancePtSeg(points[ci * 4], points[ci * 4 + 2], ax, az, bx, bz);
183
+ if (d > maxd) {
184
+ maxd = d;
185
+ maxi = ci;
186
+ }
187
+ ci = (ci + cinc) % pn;
188
+ }
189
+ }
190
+ if (maxi !== -1 && maxd > maxError * maxError) {
191
+ simplified.splice((i + 1) * 4, 0, points[maxi * 4], points[maxi * 4 + 1], points[maxi * 4 + 2], maxi);
192
+ }
193
+ else {
194
+ i++;
195
+ }
196
+ }
197
+ // Split too long outer edges.
198
+ if (maxEdgeLen > 0) {
199
+ for (let i = 0; i < simplified.length / 4;) {
200
+ const n = simplified.length / 4;
201
+ const ii = (i + 1) % n;
202
+ const ax = simplified[i * 4];
203
+ const az = simplified[i * 4 + 2];
204
+ const ai = simplified[i * 4 + 3];
205
+ const bx = simplified[ii * 4];
206
+ const bz = simplified[ii * 4 + 2];
207
+ const bi = simplified[ii * 4 + 3];
208
+ let maxi = -1;
209
+ const ci = (ai + 1) % pn;
210
+ if ((points[ci * 4 + 3] & CONTOUR_REG_MASK) === 0) {
211
+ const dx = bx - ax;
212
+ const dz = bz - az;
213
+ if (dx * dx + dz * dz > maxEdgeLen * maxEdgeLen) {
214
+ const cnt = bi < ai ? bi + pn - ai : bi - ai;
215
+ if (cnt > 1) {
216
+ if (bx > ax || (bx === ax && bz > az))
217
+ maxi = (ai + (cnt >> 1)) % pn;
218
+ else
219
+ maxi = (ai + ((cnt + 1) >> 1)) % pn;
220
+ }
221
+ }
222
+ }
223
+ if (maxi !== -1) {
224
+ simplified.splice((i + 1) * 4, 0, points[maxi * 4], points[maxi * 4 + 1], points[maxi * 4 + 2], maxi);
225
+ }
226
+ else {
227
+ i++;
228
+ }
229
+ }
230
+ }
231
+ for (let i = 0; i < simplified.length / 4; i++) {
232
+ // The neighbour region of an edge comes from the raw point after the vertex.
233
+ const ai = (simplified[i * 4 + 3] + 1) % pn;
234
+ simplified[i * 4 + 3] = points[ai * 4 + 3] & (CONTOUR_REG_MASK | AREA_BORDER);
235
+ }
236
+ }
237
+ function removeDegenerateSegments(simplified) {
238
+ let npts = simplified.length / 4;
239
+ for (let i = 0; i < npts; i++) {
240
+ const ni = (i + 1) % npts;
241
+ if (simplified[i * 4] === simplified[ni * 4] &&
242
+ simplified[i * 4 + 2] === simplified[ni * 4 + 2]) {
243
+ simplified.splice(i * 4, 4);
244
+ npts--;
245
+ i--;
246
+ }
247
+ }
248
+ }
249
+ /** Twice the signed area of a contour in the XZ plane. */
250
+ export function contourArea2(verts) {
251
+ const n = verts.length / 4;
252
+ let area = 0;
253
+ for (let i = 0, j = n - 1; i < n; j = i++) {
254
+ area += verts[i * 4] * verts[j * 4 + 2] - verts[j * 4] * verts[i * 4 + 2];
255
+ }
256
+ return area;
257
+ }
258
+ /**
259
+ * Builds one simplified contour per region. `maxError` and `maxEdgeLen` are in cells. A contour
260
+ * that comes out as a hole (reversed winding) cannot happen with hole-free regions and is dropped.
261
+ */
262
+ export function buildContours(chf, maxError, maxEdgeLen) {
263
+ const w = chf.width;
264
+ const h = chf.height;
265
+ const flags = new Uint8Array(chf.spanCount);
266
+ for (let z = 0; z < h; z++) {
267
+ for (let x = 0; x < w; x++) {
268
+ const c = x + z * w;
269
+ const end = chf.cellIndex[c] + chf.cellCount[c];
270
+ for (let i = chf.cellIndex[c]; i < end; i++) {
271
+ let res = 0;
272
+ if (chf.regs[i] === 0 || chf.areas[i] === NULL_AREA) {
273
+ flags[i] = 0;
274
+ continue;
275
+ }
276
+ for (let dir = 0; dir < 4; dir++) {
277
+ const ai = chf.con[i * 4 + dir];
278
+ const r = ai !== NOT_CONNECTED ? chf.regs[ai] : 0;
279
+ if (r === chf.regs[i])
280
+ res |= 1 << dir;
281
+ }
282
+ flags[i] = res ^ 0xf;
283
+ }
284
+ }
285
+ }
286
+ const contours = [];
287
+ const verts = [];
288
+ const simplified = [];
289
+ // The sign of a region's outer boundary, from the first contour built (all share the walk order).
290
+ let outerSign = 0;
291
+ for (let z = 0; z < h; z++) {
292
+ for (let x = 0; x < w; x++) {
293
+ const c = x + z * w;
294
+ const end = chf.cellIndex[c] + chf.cellCount[c];
295
+ for (let i = chf.cellIndex[c]; i < end; i++) {
296
+ if (flags[i] === 0 || flags[i] === 0xf) {
297
+ flags[i] = 0;
298
+ continue;
299
+ }
300
+ const reg = chf.regs[i];
301
+ if (reg === 0)
302
+ continue;
303
+ const area = chf.areas[i];
304
+ verts.length = 0;
305
+ simplified.length = 0;
306
+ walkContour(x, z, i, chf, flags, verts);
307
+ simplifyContour(verts, simplified, maxError, maxEdgeLen);
308
+ removeDegenerateSegments(simplified);
309
+ if (simplified.length / 4 >= 3) {
310
+ const a = contourArea2(simplified);
311
+ if (a === 0)
312
+ continue;
313
+ if (outerSign === 0)
314
+ outerSign = a > 0 ? 1 : -1;
315
+ if ((a > 0 ? 1 : -1) !== outerSign)
316
+ continue;
317
+ contours.push({ verts: simplified.slice(), reg, area });
318
+ }
319
+ }
320
+ }
321
+ }
322
+ return contours;
323
+ }
@@ -0,0 +1,35 @@
1
+ import { type AreaQueryOptions } from './mesh-path.js';
2
+ import type { NavMesh, NavPoint3 } from './navmesh.js';
3
+ export interface FlowField3Options extends AreaQueryOptions {
4
+ /** Snap each goal to the nearest polygon within this radius. Default: unbounded. */
5
+ snapRadius?: number;
6
+ }
7
+ export interface FlowField3 {
8
+ readonly mesh: NavMesh;
9
+ /** Per polygon: cost-weighted distance to the nearest goal (`Infinity` unreachable). */
10
+ readonly distances: Float64Array;
11
+ /** Per polygon: the polygon it flows to (-1 at a goal or unreachable). */
12
+ readonly next: Int32Array;
13
+ /** Per polygon: the portal edge index into `next` (-1 at a goal or unreachable). */
14
+ readonly portal: Int32Array;
15
+ /** The mesh version the field was built from. */
16
+ readonly version: number;
17
+ /** True when the mesh changed since the build. */
18
+ readonly stale: boolean;
19
+ /** Rebuilds the field when stale (or always, with `force`); returns whether it rebuilt. */
20
+ update(force?: boolean): boolean;
21
+ /** The polygon count reached from a goal in the last build. */
22
+ readonly reached: number;
23
+ /**
24
+ * The unit direction to walk from `(x, y, z)` into `out` (zero at a goal, off the mesh or
25
+ * where no goal is reachable). Returns the polygon under the point, or -1.
26
+ */
27
+ direction3(x: number, y: number, z: number, out: NavPoint3): number;
28
+ /**
29
+ * The cost-weighted distance to the nearest goal from `(x, y, z)` along the field (through
30
+ * the polygon's exit portal); `Infinity` off the mesh or where no goal is reachable.
31
+ */
32
+ distanceAt(x: number, y: number, z: number): number;
33
+ }
34
+ /** Builds a flow field toward `goals` (points on the mesh) and keeps it current. */
35
+ export declare function createFlowField3(mesh: NavMesh, goals: readonly Readonly<NavPoint3>[], opts?: FlowField3Options): FlowField3;