@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,552 @@
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
+ export const NULL_AREA = 0;
8
+ export const WALKABLE_AREA = 1;
9
+ /** Spans are clamped to this many cells up. */
10
+ const SPAN_MAX_HEIGHT = 0x1fffffff;
11
+ export const NOT_CONNECTED = -1;
12
+ /** Neighbour offsets by direction: 0 = -x, 1 = +z, 2 = +x, 3 = -z. */
13
+ export const DIR_X = [-1, 0, 1, 0];
14
+ export const DIR_Z = [0, 1, 0, -1];
15
+ export function computeBounds(sources, outMin, outMax) {
16
+ let any = false;
17
+ outMin[0] = outMin[1] = outMin[2] = Number.POSITIVE_INFINITY;
18
+ outMax[0] = outMax[1] = outMax[2] = Number.NEGATIVE_INFINITY;
19
+ for (const src of sources) {
20
+ const stride = src.stride ?? 3;
21
+ const offset = src.offset ?? 0;
22
+ const p = src.positions;
23
+ const idx = src.indices;
24
+ for (let i = 0; i < idx.length; i++) {
25
+ const b = idx[i] * stride + offset;
26
+ const x = p[b];
27
+ const y = p[b + 1];
28
+ const z = p[b + 2];
29
+ if (x < outMin[0])
30
+ outMin[0] = x;
31
+ if (y < outMin[1])
32
+ outMin[1] = y;
33
+ if (z < outMin[2])
34
+ outMin[2] = z;
35
+ if (x > outMax[0])
36
+ outMax[0] = x;
37
+ if (y > outMax[1])
38
+ outMax[1] = y;
39
+ if (z > outMax[2])
40
+ outMax[2] = z;
41
+ any = true;
42
+ }
43
+ }
44
+ return any;
45
+ }
46
+ export function createHeightfield(width, height, bmin, bmax, cs, ch) {
47
+ const cap = Math.max(64, width * height);
48
+ return {
49
+ width,
50
+ height,
51
+ bmin: [bmin[0], bmin[1], bmin[2]],
52
+ bmax: [bmax[0], bmax[1], bmax[2]],
53
+ cs,
54
+ ch,
55
+ first: new Int32Array(width * height).fill(-1),
56
+ smin: new Int32Array(cap),
57
+ smax: new Int32Array(cap),
58
+ area: new Uint8Array(cap),
59
+ next: new Int32Array(cap),
60
+ count: 0,
61
+ free: -1,
62
+ };
63
+ }
64
+ function allocSpan(hf) {
65
+ if (hf.free >= 0) {
66
+ const s = hf.free;
67
+ hf.free = hf.next[s];
68
+ return s;
69
+ }
70
+ if (hf.count >= hf.smin.length) {
71
+ const cap = Math.ceil(hf.smin.length * 1.5);
72
+ const grow = (a) => {
73
+ const n = new a.constructor(cap);
74
+ n.set(a);
75
+ return n;
76
+ };
77
+ hf.smin = grow(hf.smin);
78
+ hf.smax = grow(hf.smax);
79
+ hf.area = grow(hf.area);
80
+ hf.next = grow(hf.next);
81
+ }
82
+ return hf.count++;
83
+ }
84
+ /** Adds a span to a column, merging the spans it overlaps (Recast `rcAddSpan`). */
85
+ export function addSpan(hf, x, z, smin, smax, area, flagMergeThr) {
86
+ const idx = x + z * hf.width;
87
+ let prev = -1;
88
+ let cur = hf.first[idx];
89
+ while (cur !== -1) {
90
+ if (hf.smin[cur] > smax)
91
+ break;
92
+ if (hf.smax[cur] < smin) {
93
+ prev = cur;
94
+ cur = hf.next[cur];
95
+ continue;
96
+ }
97
+ if (hf.smin[cur] < smin)
98
+ smin = hf.smin[cur];
99
+ if (hf.smax[cur] > smax)
100
+ smax = hf.smax[cur];
101
+ if (Math.abs(smax - hf.smax[cur]) <= flagMergeThr)
102
+ area = Math.max(area, hf.area[cur]);
103
+ const nxt = hf.next[cur];
104
+ if (prev !== -1)
105
+ hf.next[prev] = nxt;
106
+ else
107
+ hf.first[idx] = nxt;
108
+ hf.next[cur] = hf.free;
109
+ hf.free = cur;
110
+ cur = nxt;
111
+ }
112
+ const s = allocSpan(hf);
113
+ hf.smin[s] = smin;
114
+ hf.smax[s] = smax;
115
+ hf.area[s] = area;
116
+ if (prev !== -1) {
117
+ hf.next[s] = hf.next[prev];
118
+ hf.next[prev] = s;
119
+ }
120
+ else {
121
+ hf.next[s] = hf.first[idx];
122
+ hf.first[idx] = s;
123
+ }
124
+ }
125
+ // Clipping scratch: polygons of at most 7 vertices (a triangle gains at most two per cut), xyz.
126
+ const inBuf = new Float64Array(7 * 3);
127
+ const inRow = new Float64Array(7 * 3);
128
+ const p1 = new Float64Array(7 * 3);
129
+ const p2 = new Float64Array(7 * 3);
130
+ const cellBuf = new Float64Array(7 * 3);
131
+ const dBuf = new Float64Array(7);
132
+ const nOut = [0, 0];
133
+ /**
134
+ * Splits a convex polygon by the plane `axis = offset` into `out1` (the side at or below the
135
+ * offset) and `out2` (above); writes their vertex counts into `nOut`.
136
+ */
137
+ function dividePoly(inp, nin, out1, out2, offset, axis) {
138
+ for (let i = 0; i < nin; i++)
139
+ dBuf[i] = offset - inp[i * 3 + axis];
140
+ let m = 0;
141
+ let n = 0;
142
+ for (let i = 0, j = nin - 1; i < nin; j = i, i++) {
143
+ const di = dBuf[i];
144
+ const dj = dBuf[j];
145
+ const ina = dj >= 0;
146
+ const inb = di >= 0;
147
+ if (ina !== inb) {
148
+ const s = dj / (dj - di);
149
+ for (let k = 0; k < 3; k++) {
150
+ const v = inp[j * 3 + k] + (inp[i * 3 + k] - inp[j * 3 + k]) * s;
151
+ out1[m * 3 + k] = v;
152
+ out2[n * 3 + k] = v;
153
+ }
154
+ m++;
155
+ n++;
156
+ if (di > 0) {
157
+ for (let k = 0; k < 3; k++)
158
+ out1[m * 3 + k] = inp[i * 3 + k];
159
+ m++;
160
+ }
161
+ else if (di < 0) {
162
+ for (let k = 0; k < 3; k++)
163
+ out2[n * 3 + k] = inp[i * 3 + k];
164
+ n++;
165
+ }
166
+ }
167
+ else {
168
+ if (di >= 0) {
169
+ for (let k = 0; k < 3; k++)
170
+ out1[m * 3 + k] = inp[i * 3 + k];
171
+ m++;
172
+ if (di !== 0)
173
+ continue;
174
+ }
175
+ for (let k = 0; k < 3; k++)
176
+ out2[n * 3 + k] = inp[i * 3 + k];
177
+ n++;
178
+ }
179
+ }
180
+ nOut[0] = m;
181
+ nOut[1] = n;
182
+ }
183
+ function clampInt(v, lo, hi) {
184
+ return Math.min(hi, Math.max(lo, v));
185
+ }
186
+ /** Rasterises one triangle (world coordinates) into the heightfield. */
187
+ export function rasterizeTriangle(hf, x0, y0, z0, x1, y1, z1, x2, y2, z2, area, flagMergeThr) {
188
+ const bmin = hf.bmin;
189
+ const bmax = hf.bmax;
190
+ const tminX = Math.min(x0, x1, x2);
191
+ const tmaxX = Math.max(x0, x1, x2);
192
+ const tminZ = Math.min(z0, z1, z2);
193
+ const tmaxZ = Math.max(z0, z1, z2);
194
+ const tminY = Math.min(y0, y1, y2);
195
+ const tmaxY = Math.max(y0, y1, y2);
196
+ if (tmaxX < bmin[0] || tminX > bmax[0] || tmaxZ < bmin[2] || tminZ > bmax[2])
197
+ return;
198
+ if (tmaxY < bmin[1] || tminY > bmax[1])
199
+ return;
200
+ const w = hf.width;
201
+ const h = hf.height;
202
+ const cs = hf.cs;
203
+ const ics = 1 / cs;
204
+ const ich = 1 / hf.ch;
205
+ const by = bmax[1] - bmin[1];
206
+ let zc0 = Math.floor((tminZ - bmin[2]) * ics);
207
+ let zc1 = Math.floor((tmaxZ - bmin[2]) * ics);
208
+ zc0 = clampInt(zc0, -1, h - 1);
209
+ zc1 = clampInt(zc1, 0, h - 1);
210
+ let inp = inBuf;
211
+ let rem = p1;
212
+ inp[0] = x0;
213
+ inp[1] = y0;
214
+ inp[2] = z0;
215
+ inp[3] = x1;
216
+ inp[4] = y1;
217
+ inp[5] = z1;
218
+ inp[6] = x2;
219
+ inp[7] = y2;
220
+ inp[8] = z2;
221
+ let nvIn = 3;
222
+ for (let z = zc0; z <= zc1; z++) {
223
+ const cellZ = bmin[2] + z * cs;
224
+ dividePoly(inp, nvIn, inRow, rem, cellZ + cs, 2);
225
+ const nvRow = nOut[0];
226
+ nvIn = nOut[1];
227
+ const t = inp;
228
+ inp = rem;
229
+ rem = t;
230
+ if (nvRow < 3)
231
+ continue;
232
+ if (z < 0)
233
+ continue;
234
+ let minX = inRow[0];
235
+ let maxX = inRow[0];
236
+ for (let i = 1; i < nvRow; i++) {
237
+ const vx = inRow[i * 3];
238
+ if (vx < minX)
239
+ minX = vx;
240
+ if (vx > maxX)
241
+ maxX = vx;
242
+ }
243
+ let xc0 = Math.floor((minX - bmin[0]) * ics);
244
+ let xc1 = Math.floor((maxX - bmin[0]) * ics);
245
+ if (xc1 < 0 || xc0 >= w)
246
+ continue;
247
+ xc0 = clampInt(xc0, -1, w - 1);
248
+ xc1 = clampInt(xc1, 0, w - 1);
249
+ let row = inRow;
250
+ let rowRem = p2;
251
+ let nv2 = nvRow;
252
+ for (let x = xc0; x <= xc1; x++) {
253
+ const cx = bmin[0] + x * cs;
254
+ dividePoly(row, nv2, cellBuf, rowRem, cx + cs, 0);
255
+ const cell = cellBuf;
256
+ const nv = nOut[0];
257
+ nv2 = nOut[1];
258
+ const t2 = row;
259
+ row = rowRem;
260
+ rowRem = t2;
261
+ if (nv < 3)
262
+ continue;
263
+ if (x < 0)
264
+ continue;
265
+ let smin = cell[1];
266
+ let smax = cell[1];
267
+ for (let i = 1; i < nv; i++) {
268
+ const vy = cell[i * 3 + 1];
269
+ if (vy < smin)
270
+ smin = vy;
271
+ if (vy > smax)
272
+ smax = vy;
273
+ }
274
+ smin -= bmin[1];
275
+ smax -= bmin[1];
276
+ if (smax < 0 || smin > by)
277
+ continue;
278
+ if (smin < 0)
279
+ smin = 0;
280
+ if (smax > by)
281
+ smax = by;
282
+ const ismin = clampInt(Math.floor(smin * ich), 0, SPAN_MAX_HEIGHT);
283
+ const ismax = clampInt(Math.ceil(smax * ich), ismin + 1, SPAN_MAX_HEIGHT);
284
+ addSpan(hf, x, z, ismin, ismax, area, flagMergeThr);
285
+ }
286
+ }
287
+ }
288
+ /**
289
+ * Rasterises every triangle of every source. A triangle whose normal is steeper than
290
+ * `maxSlopeDeg` from +y is rasterised as an obstacle (`NULL_AREA`) so it blocks; others as
291
+ * walkable floor.
292
+ */
293
+ export function rasterizeSources(hf, sources, maxSlopeDeg, flagMergeThr) {
294
+ const cosSlope = Math.cos((maxSlopeDeg * Math.PI) / 180);
295
+ let tris = 0;
296
+ for (const src of sources) {
297
+ const stride = src.stride ?? 3;
298
+ const offset = src.offset ?? 0;
299
+ const p = src.positions;
300
+ const idx = src.indices;
301
+ for (let i = 0; i + 2 < idx.length; i += 3) {
302
+ const a = idx[i] * stride + offset;
303
+ const b = idx[i + 1] * stride + offset;
304
+ const c = idx[i + 2] * stride + offset;
305
+ const ax = p[a];
306
+ const ay = p[a + 1];
307
+ const az = p[a + 2];
308
+ const bx = p[b];
309
+ const by = p[b + 1];
310
+ const bz = p[b + 2];
311
+ const cx = p[c];
312
+ const cy = p[c + 1];
313
+ const cz = p[c + 2];
314
+ const e0x = bx - ax;
315
+ const e0y = by - ay;
316
+ const e0z = bz - az;
317
+ const e1x = cx - ax;
318
+ const e1y = cy - ay;
319
+ const e1z = cz - az;
320
+ const nx = e0y * e1z - e0z * e1y;
321
+ const ny = e0z * e1x - e0x * e1z;
322
+ const nz = e0x * e1y - e0y * e1x;
323
+ const len = Math.sqrt(nx * nx + ny * ny + nz * nz);
324
+ const area = len > 0 && ny / len > cosSlope ? WALKABLE_AREA : NULL_AREA;
325
+ rasterizeTriangle(hf, ax, ay, az, bx, by, bz, cx, cy, cz, area, flagMergeThr);
326
+ tris++;
327
+ }
328
+ }
329
+ return tris;
330
+ }
331
+ /** A blocking span resting on a walkable one, no higher than a step, becomes walkable (a kerb). */
332
+ export function filterLowHangingWalkableObstacles(hf, walkableClimb) {
333
+ const n = hf.width * hf.height;
334
+ for (let c = 0; c < n; c++) {
335
+ let ps = -1;
336
+ let previousWalkable = false;
337
+ let previousArea = NULL_AREA;
338
+ for (let s = hf.first[c]; s !== -1; ps = s, s = hf.next[s]) {
339
+ const walkable = hf.area[s] !== NULL_AREA;
340
+ if (!walkable && previousWalkable && ps !== -1) {
341
+ if (Math.abs(hf.smax[s] - hf.smax[ps]) <= walkableClimb)
342
+ hf.area[s] = previousArea;
343
+ }
344
+ previousWalkable = walkable;
345
+ previousArea = hf.area[s];
346
+ }
347
+ }
348
+ }
349
+ /** A span whose drop to a neighbour exceeds the climb, or whose neighbours differ too much in height, is a ledge. */
350
+ export function filterLedgeSpans(hf, walkableHeight, walkableClimb) {
351
+ const w = hf.width;
352
+ const h = hf.height;
353
+ for (let z = 0; z < h; z++) {
354
+ for (let x = 0; x < w; x++) {
355
+ for (let s = hf.first[x + z * w]; s !== -1; s = hf.next[s]) {
356
+ if (hf.area[s] === NULL_AREA)
357
+ continue;
358
+ const bot = hf.smax[s];
359
+ const nextS = hf.next[s];
360
+ const top = nextS !== -1 ? hf.smin[nextS] : SPAN_MAX_HEIGHT;
361
+ let minHeight = SPAN_MAX_HEIGHT;
362
+ let asmin = bot;
363
+ let asmax = bot;
364
+ for (let dir = 0; dir < 4; dir++) {
365
+ const dx = x + DIR_X[dir];
366
+ const dz = z + DIR_Z[dir];
367
+ if (dx < 0 || dz < 0 || dx >= w || dz >= h) {
368
+ minHeight = Math.min(minHeight, -walkableClimb - bot);
369
+ continue;
370
+ }
371
+ const ns0 = hf.first[dx + dz * w];
372
+ let nbot = -walkableClimb;
373
+ let ntop = ns0 !== -1 ? hf.smin[ns0] : SPAN_MAX_HEIGHT;
374
+ if (Math.min(top, ntop) - Math.max(bot, nbot) > walkableHeight) {
375
+ minHeight = Math.min(minHeight, nbot - bot);
376
+ }
377
+ for (let ns = ns0; ns !== -1; ns = hf.next[ns]) {
378
+ nbot = hf.smax[ns];
379
+ const nn = hf.next[ns];
380
+ ntop = nn !== -1 ? hf.smin[nn] : SPAN_MAX_HEIGHT;
381
+ if (Math.min(top, ntop) - Math.max(bot, nbot) > walkableHeight) {
382
+ minHeight = Math.min(minHeight, nbot - bot);
383
+ if (Math.abs(nbot - bot) <= walkableClimb) {
384
+ if (nbot < asmin)
385
+ asmin = nbot;
386
+ if (nbot > asmax)
387
+ asmax = nbot;
388
+ }
389
+ }
390
+ }
391
+ }
392
+ if (minHeight < -walkableClimb)
393
+ hf.area[s] = NULL_AREA;
394
+ else if (asmax - asmin > walkableClimb)
395
+ hf.area[s] = NULL_AREA;
396
+ }
397
+ }
398
+ }
399
+ }
400
+ /** A span with less than the agent's height of free space above it is not walkable. */
401
+ export function filterWalkableLowHeightSpans(hf, walkableHeight) {
402
+ const n = hf.width * hf.height;
403
+ for (let c = 0; c < n; c++) {
404
+ for (let s = hf.first[c]; s !== -1; s = hf.next[s]) {
405
+ const bot = hf.smax[s];
406
+ const nextS = hf.next[s];
407
+ const top = nextS !== -1 ? hf.smin[nextS] : SPAN_MAX_HEIGHT;
408
+ if (top - bot <= walkableHeight)
409
+ hf.area[s] = NULL_AREA;
410
+ }
411
+ }
412
+ }
413
+ /** One record per walkable span, with its four neighbour connections. */
414
+ export function buildCompactHeightfield(hf, walkableHeight, walkableClimb) {
415
+ const w = hf.width;
416
+ const h = hf.height;
417
+ let spanCount = 0;
418
+ for (let c = 0; c < w * h; c++) {
419
+ for (let s = hf.first[c]; s !== -1; s = hf.next[s])
420
+ if (hf.area[s] !== NULL_AREA)
421
+ spanCount++;
422
+ }
423
+ const chf = {
424
+ width: w,
425
+ height: h,
426
+ spanCount,
427
+ walkableHeight,
428
+ walkableClimb,
429
+ bmin: [hf.bmin[0], hf.bmin[1], hf.bmin[2]],
430
+ bmax: [hf.bmax[0], hf.bmax[1] + walkableHeight * hf.ch, hf.bmax[2]],
431
+ cs: hf.cs,
432
+ ch: hf.ch,
433
+ cellIndex: new Int32Array(w * h),
434
+ cellCount: new Int32Array(w * h),
435
+ y: new Int32Array(spanCount),
436
+ h: new Int32Array(spanCount),
437
+ areas: new Uint8Array(spanCount),
438
+ regs: new Uint16Array(spanCount),
439
+ con: new Int32Array(spanCount * 4).fill(NOT_CONNECTED),
440
+ maxRegions: 0,
441
+ };
442
+ let idx = 0;
443
+ for (let z = 0; z < h; z++) {
444
+ for (let x = 0; x < w; x++) {
445
+ const c = x + z * w;
446
+ chf.cellIndex[c] = idx;
447
+ let count = 0;
448
+ for (let s = hf.first[c]; s !== -1; s = hf.next[s]) {
449
+ if (hf.area[s] === NULL_AREA)
450
+ continue;
451
+ const bot = hf.smax[s];
452
+ const nextS = hf.next[s];
453
+ const top = nextS !== -1 ? hf.smin[nextS] : SPAN_MAX_HEIGHT;
454
+ chf.y[idx] = bot;
455
+ chf.h[idx] = Math.min(top - bot, SPAN_MAX_HEIGHT);
456
+ chf.areas[idx] = hf.area[s];
457
+ idx++;
458
+ count++;
459
+ }
460
+ chf.cellCount[c] = count;
461
+ }
462
+ }
463
+ for (let z = 0; z < h; z++) {
464
+ for (let x = 0; x < w; x++) {
465
+ const c = x + z * w;
466
+ const end = chf.cellIndex[c] + chf.cellCount[c];
467
+ for (let i = chf.cellIndex[c]; i < end; i++) {
468
+ const sy = chf.y[i];
469
+ const sh = chf.h[i];
470
+ for (let dir = 0; dir < 4; dir++) {
471
+ const nx = x + DIR_X[dir];
472
+ const nz = z + DIR_Z[dir];
473
+ if (nx < 0 || nz < 0 || nx >= w || nz >= h)
474
+ continue;
475
+ const nc = nx + nz * w;
476
+ const nend = chf.cellIndex[nc] + chf.cellCount[nc];
477
+ for (let k = chf.cellIndex[nc]; k < nend; k++) {
478
+ const ny = chf.y[k];
479
+ const bot = Math.max(sy, ny);
480
+ const top = Math.min(sy + sh, ny + chf.h[k]);
481
+ if (top - bot >= walkableHeight && Math.abs(ny - sy) <= walkableClimb) {
482
+ chf.con[i * 4 + dir] = k;
483
+ break;
484
+ }
485
+ }
486
+ }
487
+ }
488
+ }
489
+ }
490
+ return chf;
491
+ }
492
+ /** Marks every walkable span within `radius` cells of a boundary unwalkable (Recast `rcErodeWalkableArea`). */
493
+ export function erodeWalkableArea(chf, radius) {
494
+ const w = chf.width;
495
+ const h = chf.height;
496
+ const n = chf.spanCount;
497
+ const dist = new Uint8Array(n).fill(255);
498
+ const con = chf.con;
499
+ const areas = chf.areas;
500
+ for (let i = 0; i < n; i++) {
501
+ if (areas[i] === NULL_AREA) {
502
+ dist[i] = 0;
503
+ continue;
504
+ }
505
+ let nc = 0;
506
+ for (let dir = 0; dir < 4; dir++) {
507
+ const ai = con[i * 4 + dir];
508
+ if (ai !== NOT_CONNECTED && areas[ai] !== NULL_AREA)
509
+ nc++;
510
+ }
511
+ if (nc !== 4)
512
+ dist[i] = 0;
513
+ }
514
+ const relax = (i, dir, diag) => {
515
+ const ai = con[i * 4 + dir];
516
+ if (ai === NOT_CONNECTED)
517
+ return;
518
+ let nd = Math.min(dist[ai] + 2, 255);
519
+ if (nd < dist[i])
520
+ dist[i] = nd;
521
+ const aai = con[ai * 4 + diag];
522
+ if (aai === NOT_CONNECTED)
523
+ return;
524
+ nd = Math.min(dist[aai] + 3, 255);
525
+ if (nd < dist[i])
526
+ dist[i] = nd;
527
+ };
528
+ for (let z = 0; z < h; z++) {
529
+ for (let x = 0; x < w; x++) {
530
+ const c = x + z * w;
531
+ const end = chf.cellIndex[c] + chf.cellCount[c];
532
+ for (let i = chf.cellIndex[c]; i < end; i++) {
533
+ relax(i, 0, 3);
534
+ relax(i, 3, 2);
535
+ }
536
+ }
537
+ }
538
+ for (let z = h - 1; z >= 0; z--) {
539
+ for (let x = w - 1; x >= 0; x--) {
540
+ const c = x + z * w;
541
+ const end = chf.cellIndex[c] + chf.cellCount[c];
542
+ for (let i = chf.cellIndex[c]; i < end; i++) {
543
+ relax(i, 2, 1);
544
+ relax(i, 1, 0);
545
+ }
546
+ }
547
+ }
548
+ const thr = radius * 2;
549
+ for (let i = 0; i < n; i++)
550
+ if (dist[i] < thr)
551
+ areas[i] = NULL_AREA;
552
+ }
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Dynamic obstacles: discs and yawed boxes dropped onto a `NavMesh` or a `NavGrid` at runtime.
3
+ * `apply()` stamps only what moved since the last apply: on a mesh the polygons the footprint
4
+ * touches take the reserved area 255 (nothing is split; the ones it left get their area back),
5
+ * on a grid a cost layer the grid's `edgeCost` hook reads gets `Infinity` under the footprint.
6
+ * Either way the target's `version` bumps, so paths, fields and corridors read as stale.
7
+ * Everything is allocated at creation for `maxObstacles`; `apply` allocates nothing.
8
+ */
9
+ import type { NavGrid } from './grid.js';
10
+ import { NavMesh } from './mesh/navmesh.js';
11
+ export interface ObstacleDisc {
12
+ x: number;
13
+ z: number;
14
+ radius: number;
15
+ }
16
+ export interface ObstacleBox {
17
+ x: number;
18
+ z: number;
19
+ /** Full extents along the box's local x and z. */
20
+ w: number;
21
+ d: number;
22
+ /** Rotation about y, radians. */
23
+ yaw: number;
24
+ }
25
+ export type ObstacleShape = ObstacleDisc | ObstacleBox;
26
+ /** One obstacle slot; `active` false for an empty one. Read-only: edit through the set. */
27
+ export interface Obstacle {
28
+ active: boolean;
29
+ id: number;
30
+ kind: 'disc' | 'box';
31
+ x: number;
32
+ z: number;
33
+ /** Disc radius, or for a box half its diagonal (the bounding disc). */
34
+ radius: number;
35
+ w: number;
36
+ d: number;
37
+ yaw: number;
38
+ }
39
+ export interface ObstacleSetOptions {
40
+ maxObstacles: number;
41
+ /**
42
+ * Grid only: the per-cell cost layer to write (`grid.size` floats, `Infinity` under an
43
+ * obstacle, 0 elsewhere), so a hook created before the set can read it. Default: a fresh one.
44
+ */
45
+ layer?: Float32Array;
46
+ }
47
+ export interface ObstacleSet {
48
+ /** One slot per index up to `maxObstacles`; check `active`. Never changes identity. */
49
+ readonly obstacles: readonly Obstacle[];
50
+ /** Active obstacles. */
51
+ readonly count: number;
52
+ /** Bumps on every `apply` that changed a polygon or a cell. */
53
+ readonly version: number;
54
+ /**
55
+ * Grid only: the cost layer per cell (`Infinity` under an obstacle, 0 elsewhere). Read it from
56
+ * the grid's hook: `edgeCost: (from, to) => set.layer[to]`. Empty on a mesh.
57
+ */
58
+ readonly layer: Float32Array;
59
+ /** Adds an obstacle and returns its id (never 0), or -1 when the set is full. Takes effect on `apply`. */
60
+ add(shape: ObstacleShape): number;
61
+ /** Moves an obstacle (and turns a box when `yaw` is given). Takes effect on `apply`. */
62
+ move(id: number, x: number, z: number, yaw?: number): void;
63
+ /** Removes an obstacle; false when there is none. Takes effect on `apply`. */
64
+ remove(id: number): boolean;
65
+ /** The slot of an obstacle, or undefined. */
66
+ get(id: number): Obstacle | undefined;
67
+ /**
68
+ * Stamps every change since the last apply onto the target, touching only the polygons or
69
+ * cells the old and new footprints cover, and bumps the target's version when anything
70
+ * changed. Returns the number of polygons or cells whose state changed (0: nothing to do).
71
+ */
72
+ apply(): number;
73
+ }
74
+ /** A set of up to `maxObstacles` obstacles over a mesh or a grid. */
75
+ export declare function createObstacleSet(target: NavMesh | NavGrid, opts: ObstacleSetOptions): ObstacleSet;