@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,367 @@
1
+ /**
2
+ * Navmesh bake, stage two: regions. A monotone sweep gives every walkable span a region such
3
+ * that no region has a hole; small regions then merge into a neighbour when the merge stays
4
+ * hole-free, and islands below `minRegionArea` are dropped. Recast's `rcBuildRegionsMonotone`
5
+ * and `mergeAndFilterRegions`, in cells.
6
+ */
7
+ import { NOT_CONNECTED, NULL_AREA } from './voxelize.js';
8
+ const NULL_NEI = 0xffff;
9
+ function newRegion(id) {
10
+ return {
11
+ spanCount: 0,
12
+ id,
13
+ areaType: 0,
14
+ remap: false,
15
+ visited: false,
16
+ overlap: false,
17
+ connections: [],
18
+ floors: [],
19
+ };
20
+ }
21
+ function isSolidEdge(chf, srcReg, i, dir) {
22
+ const ai = chf.con[i * 4 + dir];
23
+ const r = ai !== NOT_CONNECTED ? srcReg[ai] : 0;
24
+ return r !== srcReg[i];
25
+ }
26
+ /** Walks a region's boundary and lists the neighbour regions met, in order (RecastRegion `walkContour`). */
27
+ function walkContour(i0, dir0, chf, srcReg, cont) {
28
+ let i = i0;
29
+ let dir = dir0;
30
+ let curReg = 0;
31
+ const ai0 = chf.con[i * 4 + dir];
32
+ if (ai0 !== NOT_CONNECTED)
33
+ curReg = srcReg[ai0];
34
+ cont.push(curReg);
35
+ let iter = 0;
36
+ while (++iter < 40000) {
37
+ if (isSolidEdge(chf, srcReg, i, dir)) {
38
+ const ai = chf.con[i * 4 + dir];
39
+ const r = ai !== NOT_CONNECTED ? srcReg[ai] : 0;
40
+ if (r !== curReg) {
41
+ curReg = r;
42
+ cont.push(curReg);
43
+ }
44
+ dir = (dir + 1) & 3;
45
+ }
46
+ else {
47
+ const ni = chf.con[i * 4 + dir];
48
+ if (ni === NOT_CONNECTED)
49
+ return;
50
+ i = ni;
51
+ dir = (dir + 3) & 3;
52
+ }
53
+ if (i0 === i && dir0 === dir)
54
+ break;
55
+ }
56
+ // Remove adjacent duplicates.
57
+ if (cont.length > 1) {
58
+ for (let j = 0; j < cont.length;) {
59
+ const nj = (j + 1) % cont.length;
60
+ if (cont[j] === cont[nj])
61
+ cont.splice(j, 1);
62
+ else
63
+ j++;
64
+ }
65
+ }
66
+ }
67
+ function removeAdjacentNeighbours(reg) {
68
+ const c = reg.connections;
69
+ for (let i = 0; i < c.length && c.length > 1;) {
70
+ const ni = (i + 1) % c.length;
71
+ if (c[i] === c[ni])
72
+ c.splice(i, 1);
73
+ else
74
+ i++;
75
+ }
76
+ }
77
+ function replaceNeighbour(reg, oldId, newId) {
78
+ let changed = false;
79
+ for (let i = 0; i < reg.connections.length; i++) {
80
+ if (reg.connections[i] === oldId) {
81
+ reg.connections[i] = newId;
82
+ changed = true;
83
+ }
84
+ }
85
+ for (let i = 0; i < reg.floors.length; i++)
86
+ if (reg.floors[i] === oldId)
87
+ reg.floors[i] = newId;
88
+ if (changed)
89
+ removeAdjacentNeighbours(reg);
90
+ }
91
+ function canMergeWithRegion(rega, regb) {
92
+ if (rega.areaType !== regb.areaType)
93
+ return false;
94
+ let n = 0;
95
+ for (const c of rega.connections)
96
+ if (c === regb.id)
97
+ n++;
98
+ if (n > 1)
99
+ return false;
100
+ for (const f of rega.floors)
101
+ if (f === regb.id)
102
+ return false;
103
+ return true;
104
+ }
105
+ function addUniqueFloorRegion(reg, n) {
106
+ if (!reg.floors.includes(n))
107
+ reg.floors.push(n);
108
+ }
109
+ function mergeRegions(rega, regb) {
110
+ const aid = rega.id;
111
+ const bid = regb.id;
112
+ const acon = rega.connections.slice();
113
+ const bcon = regb.connections;
114
+ const insa = acon.indexOf(bid);
115
+ if (insa === -1)
116
+ return false;
117
+ const insb = bcon.indexOf(aid);
118
+ if (insb === -1)
119
+ return false;
120
+ rega.connections = [];
121
+ for (let i = 0, ni = acon.length; i < ni - 1; i++)
122
+ rega.connections.push(acon[(insa + 1 + i) % ni]);
123
+ for (let i = 0, ni = bcon.length; i < ni - 1; i++)
124
+ rega.connections.push(bcon[(insb + 1 + i) % ni]);
125
+ removeAdjacentNeighbours(rega);
126
+ for (const f of regb.floors)
127
+ addUniqueFloorRegion(rega, f);
128
+ rega.spanCount += regb.spanCount;
129
+ regb.spanCount = 0;
130
+ regb.connections = [];
131
+ return true;
132
+ }
133
+ function isRegionConnectedToBorder(reg) {
134
+ return reg.connections.includes(0);
135
+ }
136
+ /** Removes islands under `minRegionArea`, merges small regions, compacts ids; returns the region count. */
137
+ function mergeAndFilterRegions(chf, minRegionArea, mergeRegionSize, maxRegionId, srcReg) {
138
+ const w = chf.width;
139
+ const h = chf.height;
140
+ const nreg = maxRegionId + 1;
141
+ const regions = [];
142
+ for (let i = 0; i < nreg; i++)
143
+ regions.push(newRegion(i));
144
+ for (let z = 0; z < h; z++) {
145
+ for (let x = 0; x < w; x++) {
146
+ const c = x + z * w;
147
+ const start = chf.cellIndex[c];
148
+ const end = start + chf.cellCount[c];
149
+ for (let i = start; i < end; i++) {
150
+ const r = srcReg[i];
151
+ if (r === 0 || r >= nreg)
152
+ continue;
153
+ const reg = regions[r];
154
+ reg.spanCount++;
155
+ for (let j = start; j < end; j++) {
156
+ if (i === j)
157
+ continue;
158
+ const floorId = srcReg[j];
159
+ if (floorId === 0 || floorId >= nreg)
160
+ continue;
161
+ if (floorId === r)
162
+ reg.overlap = true;
163
+ addUniqueFloorRegion(reg, floorId);
164
+ }
165
+ if (reg.connections.length > 0)
166
+ continue;
167
+ reg.areaType = chf.areas[i];
168
+ let ndir = -1;
169
+ for (let dir = 0; dir < 4; dir++) {
170
+ if (isSolidEdge(chf, srcReg, i, dir)) {
171
+ ndir = dir;
172
+ break;
173
+ }
174
+ }
175
+ if (ndir !== -1)
176
+ walkContour(i, ndir, chf, srcReg, reg.connections);
177
+ }
178
+ }
179
+ }
180
+ // Remove too small regions.
181
+ const stack = [];
182
+ const trace = [];
183
+ for (let i = 0; i < nreg; i++) {
184
+ const reg = regions[i];
185
+ if (reg.id === 0)
186
+ continue;
187
+ if (reg.spanCount === 0)
188
+ continue;
189
+ if (reg.visited)
190
+ continue;
191
+ let spanCount = 0;
192
+ stack.length = 0;
193
+ trace.length = 0;
194
+ reg.visited = true;
195
+ stack.push(i);
196
+ while (stack.length > 0) {
197
+ const ri = stack.pop();
198
+ const creg = regions[ri];
199
+ spanCount += creg.spanCount;
200
+ trace.push(ri);
201
+ for (const nei of creg.connections) {
202
+ // 0 is the null region (the world's edge or an obstacle), never a region to visit.
203
+ if (nei === 0)
204
+ continue;
205
+ const neireg = regions[nei];
206
+ if (neireg.visited)
207
+ continue;
208
+ if (neireg.id === 0)
209
+ continue;
210
+ stack.push(nei);
211
+ neireg.visited = true;
212
+ }
213
+ }
214
+ if (spanCount < minRegionArea) {
215
+ for (const ri of trace) {
216
+ regions[ri].spanCount = 0;
217
+ regions[ri].id = 0;
218
+ }
219
+ }
220
+ }
221
+ // Merge too small regions to neighbour regions.
222
+ let mergeCount;
223
+ do {
224
+ mergeCount = 0;
225
+ for (let i = 0; i < nreg; i++) {
226
+ const reg = regions[i];
227
+ if (reg.id === 0)
228
+ continue;
229
+ if (reg.overlap)
230
+ continue;
231
+ if (reg.spanCount === 0)
232
+ continue;
233
+ if (reg.spanCount > mergeRegionSize && isRegionConnectedToBorder(reg))
234
+ continue;
235
+ let smallest = 0xfffffff;
236
+ let mergeId = reg.id;
237
+ for (const nei of reg.connections) {
238
+ if (nei === 0)
239
+ continue;
240
+ const mreg = regions[nei];
241
+ if (mreg.id === 0 || mreg.overlap)
242
+ continue;
243
+ if (mreg.spanCount < smallest &&
244
+ canMergeWithRegion(reg, mreg) &&
245
+ canMergeWithRegion(mreg, reg)) {
246
+ smallest = mreg.spanCount;
247
+ mergeId = mreg.id;
248
+ }
249
+ }
250
+ if (mergeId !== reg.id) {
251
+ const oldId = reg.id;
252
+ const target = regions[mergeId];
253
+ if (mergeRegions(target, reg)) {
254
+ for (let j = 0; j < nreg; j++) {
255
+ const rj = regions[j];
256
+ if (rj.id === 0)
257
+ continue;
258
+ if (rj.id === oldId)
259
+ rj.id = mergeId;
260
+ replaceNeighbour(rj, oldId, mergeId);
261
+ }
262
+ mergeCount++;
263
+ }
264
+ }
265
+ }
266
+ } while (mergeCount > 0);
267
+ // Compress region ids.
268
+ for (let i = 0; i < nreg; i++) {
269
+ regions[i].remap = false;
270
+ if (regions[i].id === 0)
271
+ continue;
272
+ regions[i].remap = true;
273
+ }
274
+ let regIdGen = 0;
275
+ for (let i = 0; i < nreg; i++) {
276
+ if (!regions[i].remap)
277
+ continue;
278
+ const oldId = regions[i].id;
279
+ const newId = ++regIdGen;
280
+ for (let j = i; j < nreg; j++) {
281
+ if (regions[j].id === oldId) {
282
+ regions[j].id = newId;
283
+ regions[j].remap = false;
284
+ }
285
+ }
286
+ }
287
+ for (let i = 0; i < chf.spanCount; i++)
288
+ srcReg[i] = regions[srcReg[i]].id;
289
+ return regIdGen;
290
+ }
291
+ /**
292
+ * Assigns a region to every walkable span (`chf.regs`; 0 is none) and sets `chf.maxRegions`.
293
+ * `minRegionArea` and `mergeRegionArea` are in cells.
294
+ */
295
+ export function buildRegions(chf, minRegionArea, mergeRegionArea) {
296
+ const w = chf.width;
297
+ const h = chf.height;
298
+ const srcReg = new Uint16Array(chf.spanCount);
299
+ const sweeps = [];
300
+ for (let i = 0; i < w + 2; i++)
301
+ sweeps.push({ rid: 0, id: 0, ns: 0, nei: 0 });
302
+ let prev = new Int32Array(256);
303
+ let regId = 1;
304
+ for (let z = 0; z < h; z++) {
305
+ if (prev.length < regId + 1)
306
+ prev = new Int32Array(Math.max(regId + 1, prev.length * 2));
307
+ prev.fill(0, 0, regId + 1);
308
+ let rid = 1;
309
+ for (let x = 0; x < w; x++) {
310
+ const c = x + z * w;
311
+ const end = chf.cellIndex[c] + chf.cellCount[c];
312
+ for (let i = chf.cellIndex[c]; i < end; i++) {
313
+ if (chf.areas[i] === NULL_AREA)
314
+ continue;
315
+ // -x
316
+ let previd = 0;
317
+ const ai0 = chf.con[i * 4 + 0];
318
+ if (ai0 !== NOT_CONNECTED && chf.areas[i] === chf.areas[ai0])
319
+ previd = srcReg[ai0];
320
+ if (previd === 0) {
321
+ previd = rid++;
322
+ const sw = sweeps[previd];
323
+ sw.rid = previd;
324
+ sw.ns = 0;
325
+ sw.nei = 0;
326
+ }
327
+ // -z
328
+ const ai3 = chf.con[i * 4 + 3];
329
+ if (ai3 !== NOT_CONNECTED && chf.areas[i] === chf.areas[ai3]) {
330
+ const nr = srcReg[ai3];
331
+ if (nr !== 0) {
332
+ const sw = sweeps[previd];
333
+ if (sw.nei === 0 || sw.nei === nr) {
334
+ sw.nei = nr;
335
+ sw.ns++;
336
+ prev[nr]++;
337
+ }
338
+ else {
339
+ sw.nei = NULL_NEI;
340
+ }
341
+ }
342
+ }
343
+ srcReg[i] = previd;
344
+ }
345
+ }
346
+ // Create unique ids.
347
+ for (let i = 1; i < rid; i++) {
348
+ const sw = sweeps[i];
349
+ if (sw.nei !== NULL_NEI && sw.nei !== 0 && prev[sw.nei] === sw.ns)
350
+ sw.id = sw.nei;
351
+ else
352
+ sw.id = regId++;
353
+ }
354
+ // Remap ids.
355
+ for (let x = 0; x < w; x++) {
356
+ const c = x + z * w;
357
+ const end = chf.cellIndex[c] + chf.cellCount[c];
358
+ for (let i = chf.cellIndex[c]; i < end; i++) {
359
+ if (srcReg[i] > 0)
360
+ srcReg[i] = sweeps[srcReg[i]].id;
361
+ }
362
+ }
363
+ }
364
+ const maxRegionId = mergeAndFilterRegions(chf, minRegionArea, mergeRegionArea, regId - 1, srcReg);
365
+ chf.maxRegions = maxRegionId;
366
+ chf.regs.set(srcReg);
367
+ }
@@ -0,0 +1,13 @@
1
+ import { NavMesh } from './navmesh.js';
2
+ /** Serialises the mesh (polygons, adjacency, areas, links) into a fresh buffer. */
3
+ export declare function exportNavMesh(mesh: NavMesh): ArrayBuffer;
4
+ /** Rebuilds a mesh from `exportNavMesh` bytes; throws on a buffer that is not one. */
5
+ export declare function importNavMesh(buffer: ArrayBuffer | ArrayBufferView): NavMesh;
6
+ /**
7
+ * Loads a navmesh shipped as bytes (a `pnpm bake:nav` or `pnpm bake` output, read with `fetch`
8
+ * or a `bytes` bundle entry): `importNavMesh`, then checks what a corrupt or truncated file would
9
+ * break later, so a bad asset fails at load with a reason instead of inside a query. Throws when
10
+ * the buffer is not a navmesh, is shorter than its header says, or holds a vertex index, an
11
+ * adjacency entry or a coordinate out of range.
12
+ */
13
+ export declare function loadNavMesh(bytes: ArrayBuffer | ArrayBufferView): NavMesh;
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Navmesh bytes: bake at build time, ship the buffer, `importNavMesh` at load. Little-endian,
3
+ * self-describing header; areas and off-mesh links travel with the mesh (their `userData` does
4
+ * not). Format 2 (ws/nav-4) adds the area bytes; format 1 buffers load with every area 0.
5
+ */
6
+ import { addOffMeshLink } from './links.js';
7
+ import { NavMesh } from './navmesh.js';
8
+ const MAGIC = 0x4e41564d; // 'NAVM'
9
+ /** Format 2 appends the area byte per polygon (padded to 4 bytes); format 1 bytes still load with every area 0. */
10
+ const FORMAT = 2;
11
+ const HEADER_U32 = 7;
12
+ const LINK_F32 = 10;
13
+ function areaBytes(polyCount) {
14
+ return (polyCount + 3) & ~3;
15
+ }
16
+ /** Serialises the mesh (polygons, adjacency, areas, links) into a fresh buffer. */
17
+ export function exportNavMesh(mesh) {
18
+ const nvp = mesh.maxVertsPerPoly;
19
+ const links = mesh.links.filter((l) => l !== null);
20
+ const bytes = HEADER_U32 * 4 +
21
+ 2 * 4 +
22
+ 6 * 4 +
23
+ mesh.vertCount * 3 * 4 +
24
+ mesh.polyCount * nvp * 4 * 2 +
25
+ areaBytes(mesh.polyCount) +
26
+ links.length * LINK_F32 * 4;
27
+ const buffer = new ArrayBuffer(bytes);
28
+ const view = new DataView(buffer);
29
+ let o = 0;
30
+ const u32 = (v) => {
31
+ view.setUint32(o, v, true);
32
+ o += 4;
33
+ };
34
+ const i32 = (v) => {
35
+ view.setInt32(o, v, true);
36
+ o += 4;
37
+ };
38
+ const f32 = (v) => {
39
+ view.setFloat32(o, v, true);
40
+ o += 4;
41
+ };
42
+ u32(MAGIC);
43
+ u32(FORMAT);
44
+ u32(nvp);
45
+ u32(mesh.vertCount);
46
+ u32(mesh.polyCount);
47
+ u32(links.length);
48
+ u32(mesh.nextLinkId);
49
+ f32(mesh.cellSize);
50
+ f32(mesh.cellHeight);
51
+ f32(mesh.bounds.min.x);
52
+ f32(mesh.bounds.min.y);
53
+ f32(mesh.bounds.min.z);
54
+ f32(mesh.bounds.max.x);
55
+ f32(mesh.bounds.max.y);
56
+ f32(mesh.bounds.max.z);
57
+ for (let i = 0; i < mesh.vertCount * 3; i++)
58
+ f32(mesh.verts[i]);
59
+ for (let i = 0; i < mesh.polyCount * nvp; i++)
60
+ i32(mesh.polys[i]);
61
+ for (let i = 0; i < mesh.polyCount * nvp; i++)
62
+ i32(mesh.adjacency[i]);
63
+ new Uint8Array(buffer, o, mesh.polyCount).set(mesh.area.subarray(0, mesh.polyCount));
64
+ o += areaBytes(mesh.polyCount);
65
+ for (const l of links) {
66
+ f32(l.from.x);
67
+ f32(l.from.y);
68
+ f32(l.from.z);
69
+ f32(l.to.x);
70
+ f32(l.to.y);
71
+ f32(l.to.z);
72
+ f32(l.radius);
73
+ f32(l.cost ?? Number.NaN);
74
+ u32(l.bidirectional ? 1 : 0);
75
+ u32(l.id);
76
+ }
77
+ return buffer;
78
+ }
79
+ /** Rebuilds a mesh from `exportNavMesh` bytes; throws on a buffer that is not one. */
80
+ export function importNavMesh(buffer) {
81
+ const view = buffer instanceof ArrayBuffer
82
+ ? new DataView(buffer)
83
+ : new DataView(buffer.buffer, buffer.byteOffset, buffer.byteLength);
84
+ let o = 0;
85
+ const u32 = () => {
86
+ const v = view.getUint32(o, true);
87
+ o += 4;
88
+ return v;
89
+ };
90
+ const f32 = () => {
91
+ const v = view.getFloat32(o, true);
92
+ o += 4;
93
+ return v;
94
+ };
95
+ if (view.byteLength < HEADER_U32 * 4 || u32() !== MAGIC)
96
+ throw new Error('importNavMesh: not a navmesh buffer');
97
+ const format = u32();
98
+ if (format !== 1 && format !== FORMAT)
99
+ throw new Error(`importNavMesh: unsupported format ${format}`);
100
+ const nvp = u32();
101
+ const vertCount = u32();
102
+ const polyCount = u32();
103
+ const linkCount = u32();
104
+ const nextLinkId = u32();
105
+ const cs = f32();
106
+ const ch = f32();
107
+ o += 6 * 4; // bounds are recomputed from the vertices
108
+ const verts = new Float32Array(Math.max(1, vertCount) * 3);
109
+ for (let i = 0; i < vertCount * 3; i++)
110
+ verts[i] = f32();
111
+ const polys = new Int32Array(Math.max(1, polyCount) * nvp).fill(-1);
112
+ for (let i = 0; i < polyCount * nvp; i++) {
113
+ polys[i] = view.getInt32(o, true);
114
+ o += 4;
115
+ }
116
+ const adjacency = new Int32Array(Math.max(1, polyCount) * nvp).fill(-1);
117
+ for (let i = 0; i < polyCount * nvp; i++) {
118
+ adjacency[i] = view.getInt32(o, true);
119
+ o += 4;
120
+ }
121
+ const area = new Uint8Array(Math.max(1, polyCount));
122
+ if (format >= 2) {
123
+ area.set(new Uint8Array(view.buffer, view.byteOffset + o, polyCount));
124
+ o += areaBytes(polyCount);
125
+ }
126
+ const mesh = new NavMesh(verts, vertCount, polys, polyCount, nvp, cs, ch, adjacency, area);
127
+ for (let i = 0; i < linkCount; i++) {
128
+ const from = { x: f32(), y: f32(), z: f32() };
129
+ const to = { x: f32(), y: f32(), z: f32() };
130
+ const radius = f32();
131
+ const cost = f32();
132
+ const bidirectional = u32() === 1;
133
+ const id = u32();
134
+ mesh.nextLinkId = id;
135
+ addOffMeshLink(mesh, {
136
+ from,
137
+ to,
138
+ radius,
139
+ bidirectional,
140
+ cost: Number.isNaN(cost) ? undefined : cost,
141
+ });
142
+ }
143
+ mesh.nextLinkId = nextLinkId;
144
+ mesh.version = 0;
145
+ return mesh;
146
+ }
147
+ /**
148
+ * Loads a navmesh shipped as bytes (a `pnpm bake:nav` or `pnpm bake` output, read with `fetch`
149
+ * or a `bytes` bundle entry): `importNavMesh`, then checks what a corrupt or truncated file would
150
+ * break later, so a bad asset fails at load with a reason instead of inside a query. Throws when
151
+ * the buffer is not a navmesh, is shorter than its header says, or holds a vertex index, an
152
+ * adjacency entry or a coordinate out of range.
153
+ */
154
+ export function loadNavMesh(bytes) {
155
+ const length = bytes.byteLength;
156
+ let mesh;
157
+ try {
158
+ mesh = importNavMesh(bytes);
159
+ }
160
+ catch (e) {
161
+ throw new Error(`loadNavMesh: ${e instanceof Error ? e.message : String(e)}`);
162
+ }
163
+ const nvp = mesh.maxVertsPerPoly;
164
+ const links = mesh.links.reduce((n, l) => (l ? n + 1 : n), 0);
165
+ const expected = HEADER_U32 * 4 +
166
+ 8 * 4 +
167
+ mesh.vertCount * 12 +
168
+ mesh.polyCount * nvp * 8 +
169
+ areaBytes(mesh.polyCount) +
170
+ links * LINK_F32 * 4;
171
+ // Format 1 has no area block.
172
+ if (length !== expected && length !== expected - areaBytes(mesh.polyCount)) {
173
+ throw new Error(`loadNavMesh: ${length} bytes, the header describes ${expected}`);
174
+ }
175
+ if (nvp < 3 || nvp > 6)
176
+ throw new Error(`loadNavMesh: ${nvp} vertices per polygon`);
177
+ for (let i = 0; i < mesh.vertCount * 3; i++) {
178
+ if (!Number.isFinite(mesh.verts[i]))
179
+ throw new Error(`loadNavMesh: vertex ${(i / 3) | 0} is not finite`);
180
+ }
181
+ for (let p = 0; p < mesh.polyCount; p++) {
182
+ const n = mesh.polyVertexCount(p);
183
+ if (n < 3)
184
+ throw new Error(`loadNavMesh: polygon ${p} has ${n} vertices`);
185
+ for (let k = 0; k < nvp; k++) {
186
+ const v = mesh.polys[p * nvp + k];
187
+ const adj = mesh.adjacency[p * nvp + k];
188
+ if (k < n && !(v >= 0 && v < mesh.vertCount)) {
189
+ throw new Error(`loadNavMesh: polygon ${p} names vertex ${v}`);
190
+ }
191
+ if (adj < -1 || adj >= mesh.polyCount || (k >= n && adj !== -1)) {
192
+ throw new Error(`loadNavMesh: polygon ${p} edge ${k} names neighbour ${adj}`);
193
+ }
194
+ }
195
+ }
196
+ return mesh;
197
+ }
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Navmesh bake, stage one: triangles to a heightfield of spans, the walkability filters, the
3
+ * compact heightfield (one record per walkable span with its four neighbours) and the erosion
4
+ * by agent radius. The method is Recast's; the units inside are cells (`cellSize` across,
5
+ * `cellHeight` up). Bake-time code: it allocates freely, queries never run here.
6
+ */
7
+ /** Triangle soup to bake: positions as x, y, z (every `stride` floats, from `offset`) and indices. */
8
+ export interface NavBakeSource {
9
+ positions: ArrayLike<number>;
10
+ indices: ArrayLike<number>;
11
+ /** Floats per vertex in `positions` (3 for a bare position array, 12 for `geom`'s layout). Default 3. */
12
+ stride?: number;
13
+ /** Float index of the first vertex's x inside its stride. Default 0. */
14
+ offset?: number;
15
+ }
16
+ /**
17
+ * How to bake. Only `cellSize` is required; every other field has a default derived from it
18
+ * (`resolveNavBakeOptions`), and a non-finite or out-of-range value throws a `NavBakeError`.
19
+ */
20
+ export interface NavBakeOptions {
21
+ /** World units per heightfield cell across (XZ), > 0. The level's smallest feature should span a few. */
22
+ cellSize: number;
23
+ /** World units per heightfield cell up (Y), > 0. Default `cellSize / 2`. */
24
+ cellHeight?: number;
25
+ /** The agent's height, > 0: a ceiling closer than this to the floor is not walkable. Default 2. */
26
+ agentHeight?: number;
27
+ /** The agent's radius, >= 0: the walkable area is eroded by it, so the centre never leaves the floor. Default `cellSize * 2`. */
28
+ agentRadius?: number;
29
+ /** The largest step the agent climbs (a kerb), >= 0; a taller drop is a ledge. Default `cellHeight * 2`. */
30
+ agentMaxClimb?: number;
31
+ /** The steepest walkable slope, in degrees from flat, 0..90. Default 45. */
32
+ agentMaxSlope?: number;
33
+ /** Regions (connected walkable islands) smaller than this many cells are dropped, >= 0. Default 8. */
34
+ minRegionArea?: number;
35
+ /** Regions smaller than this many cells merge into a neighbour where that keeps it hole-free, >= 0. Default 20. */
36
+ mergeRegionArea?: number;
37
+ /** Boundary edges longer than this (world units, >= 0) are split. Default 12 × `cellSize`; 0 never splits. */
38
+ maxEdgeLength?: number;
39
+ /** How far (world units, >= 0) a simplified contour may stray from the rasterised one. Default 1.3 × `cellSize`. */
40
+ maxSimplification?: number;
41
+ /** Vertices per polygon at most, an integer 3..6. Default 6. */
42
+ maxVertsPerPoly?: number;
43
+ }
44
+ export declare const NULL_AREA = 0;
45
+ export declare const WALKABLE_AREA = 1;
46
+ export declare const NOT_CONNECTED = -1;
47
+ /** Neighbour offsets by direction: 0 = -x, 1 = +z, 2 = +x, 3 = -z. */
48
+ export declare const DIR_X: readonly [-1, 0, 1, 0];
49
+ export declare const DIR_Z: readonly [0, 1, 0, -1];
50
+ export interface Heightfield {
51
+ width: number;
52
+ height: number;
53
+ bmin: [number, number, number];
54
+ bmax: [number, number, number];
55
+ cs: number;
56
+ ch: number;
57
+ /** First span of each column (`x + z * width`), or -1. */
58
+ first: Int32Array;
59
+ smin: Int32Array;
60
+ smax: Int32Array;
61
+ area: Uint8Array;
62
+ next: Int32Array;
63
+ /** Spans allocated so far (the pool's high-water mark). */
64
+ count: number;
65
+ /** Head of the free list of span slots, or -1. */
66
+ free: number;
67
+ }
68
+ export interface CompactHeightfield {
69
+ width: number;
70
+ height: number;
71
+ spanCount: number;
72
+ walkableHeight: number;
73
+ walkableClimb: number;
74
+ bmin: [number, number, number];
75
+ bmax: [number, number, number];
76
+ cs: number;
77
+ ch: number;
78
+ /** First span and span count of each column. */
79
+ cellIndex: Int32Array;
80
+ cellCount: Int32Array;
81
+ /** Per span: floor height (cells), free height above it, area, region. */
82
+ y: Int32Array;
83
+ h: Int32Array;
84
+ areas: Uint8Array;
85
+ regs: Uint16Array;
86
+ /** Per span × 4 directions: the neighbour span index, or `NOT_CONNECTED`. */
87
+ con: Int32Array;
88
+ maxRegions: number;
89
+ }
90
+ export declare function computeBounds(sources: readonly NavBakeSource[], outMin: number[], outMax: number[]): boolean;
91
+ export declare function createHeightfield(width: number, height: number, bmin: readonly number[], bmax: readonly number[], cs: number, ch: number): Heightfield;
92
+ /** Adds a span to a column, merging the spans it overlaps (Recast `rcAddSpan`). */
93
+ export declare function addSpan(hf: Heightfield, x: number, z: number, smin: number, smax: number, area: number, flagMergeThr: number): void;
94
+ /** Rasterises one triangle (world coordinates) into the heightfield. */
95
+ export declare function rasterizeTriangle(hf: Heightfield, x0: number, y0: number, z0: number, x1: number, y1: number, z1: number, x2: number, y2: number, z2: number, area: number, flagMergeThr: number): void;
96
+ /**
97
+ * Rasterises every triangle of every source. A triangle whose normal is steeper than
98
+ * `maxSlopeDeg` from +y is rasterised as an obstacle (`NULL_AREA`) so it blocks; others as
99
+ * walkable floor.
100
+ */
101
+ export declare function rasterizeSources(hf: Heightfield, sources: readonly NavBakeSource[], maxSlopeDeg: number, flagMergeThr: number): number;
102
+ /** A blocking span resting on a walkable one, no higher than a step, becomes walkable (a kerb). */
103
+ export declare function filterLowHangingWalkableObstacles(hf: Heightfield, walkableClimb: number): void;
104
+ /** A span whose drop to a neighbour exceeds the climb, or whose neighbours differ too much in height, is a ledge. */
105
+ export declare function filterLedgeSpans(hf: Heightfield, walkableHeight: number, walkableClimb: number): void;
106
+ /** A span with less than the agent's height of free space above it is not walkable. */
107
+ export declare function filterWalkableLowHeightSpans(hf: Heightfield, walkableHeight: number): void;
108
+ /** One record per walkable span, with its four neighbour connections. */
109
+ export declare function buildCompactHeightfield(hf: Heightfield, walkableHeight: number, walkableClimb: number): CompactHeightfield;
110
+ /** Marks every walkable span within `radius` cells of a boundary unwalkable (Recast `rcErodeWalkableArea`). */
111
+ export declare function erodeWalkableArea(chf: CompactHeightfield, radius: number): void;