@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,66 @@
1
+ /**
2
+ * Move and slide: the character-controller loop a game would otherwise write. `slide` sweeps the
3
+ * shape along its displacement, stops `skin` short of the first hit, projects what is left of the
4
+ * displacement onto the hit plane and repeats up to `maxIterations` times. A hit whose normal is
5
+ * within `maxSlope` of up is ground: the downward part of the remaining displacement is dropped
6
+ * there (standing on walkable ground is not sliding down it) and the rest follows the surface.
7
+ * Anything steeper is a wall: the remaining displacement slides along it horizontally (a wall
8
+ * cannot be climbed by pushing into it); when a wall blocks horizontal motion from the ground, or
9
+ * catches the shape no higher than `stepHeight` above its bottom, the shape first tries the same
10
+ * move `stepHeight` higher and drops back onto whatever walkable ground it finds (stairs; a
11
+ * rounded bottom landing on a step's lip counts when walkable ground lies under its centre).
12
+ * After the move a short probe downward decides `grounded`; a shape that was grounded and is not
13
+ * any more looks `snapDown` below for ground to stay on (so a step down or a slope's crest does
14
+ * not launch it). The shape itself is not moved: the final position goes into `out`, the game
15
+ * writes it back.
16
+ */
17
+ import type { StaticCollider } from './bvh.js';
18
+ import { type Shape, type Shape2 } from './shapes.js';
19
+ export interface SlideOptions {
20
+ /** Sweep-and-project passes. Default 4. */
21
+ maxIterations?: number;
22
+ /** Gap kept between the shape and what it hit. Default 0.005. */
23
+ skin?: number;
24
+ /** Steepest ground that counts as walkable, in degrees from flat. Default 50. */
25
+ maxSlope?: number;
26
+ /** Highest ledge the shape walks up when a wall blocks it; 0 disables. Default 0.35. */
27
+ stepHeight?: number;
28
+ /** How far below to look for ground after the move when the shape has left it; 0 disables. Default 0.2. */
29
+ snapDown?: number;
30
+ /** Which layers collide. Default all. */
31
+ layerMask?: number;
32
+ /**
33
+ * Whether the shape stood on ground before this move (the previous result's `grounded`): the
34
+ * snap-down and the step-up only run from the ground. Default true.
35
+ */
36
+ wasGrounded?: boolean;
37
+ }
38
+ export interface SlideResult {
39
+ /** The shape's final centre. */
40
+ x: number;
41
+ y: number;
42
+ z: number;
43
+ /** Whether the shape ended on walkable ground (within `2 × skin` below it). */
44
+ grounded: boolean;
45
+ /** The ground's unit normal when `grounded`, else `[0, 1, 0]`. */
46
+ groundNormal: [number, number, number];
47
+ /** Whether a wall (a hit steeper than `maxSlope`) blocked part of the motion. */
48
+ hitWall: boolean;
49
+ /** Sweep hits during the move (step-ups counted once). */
50
+ hits: number;
51
+ /** Displacement not applied when the iterations ran out (zero otherwise). */
52
+ remaining: [number, number, number];
53
+ }
54
+ export declare function createSlideResult(): SlideResult;
55
+ /**
56
+ * Moves `shape` by `(dx, dy, dz)` through the collider with the move-and-slide loop described
57
+ * above and writes where it ends up (the shape's centre) and how into `out`. The shape is read,
58
+ * not moved.
59
+ */
60
+ export declare function slide(c: StaticCollider, shape: Shape, dx: number, dy: number, dz: number, opts?: SlideOptions, out?: SlideResult): SlideResult;
61
+ /**
62
+ * `slide` for a circle or 2D box moving by `(dx, dz)` in the xz plane: every hit is a wall, no
63
+ * step or slope or snap; `out.y` is 0 and `grounded` false. The shape is lifted to the collider's
64
+ * height like the 2D queries.
65
+ */
66
+ export declare function slide2(c: StaticCollider, shape: Shape2, dx: number, dz: number, opts?: SlideOptions, out?: SlideResult): SlideResult;
@@ -0,0 +1,375 @@
1
+ import { ALL_LAYERS, createHit, createSweepHit, raycastReg, SW, sweepMove, } from './queries.js';
2
+ import { isBox2, loadShape, SH, SH_BOX, SH_CAPSULE, SH_SPHERE, } from './shapes.js';
3
+ export function createSlideResult() {
4
+ return {
5
+ x: 0,
6
+ y: 0,
7
+ z: 0,
8
+ grounded: false,
9
+ groundNormal: [0, 1, 0],
10
+ hitWall: false,
11
+ hits: 0,
12
+ remaining: [0, 0, 0],
13
+ };
14
+ }
15
+ /**
16
+ * The controller's registers: box half extents (0..2), position (3..5), remaining displacement
17
+ * (6..8), skin (9), cos of the slope limit (10), step height (11), snap-down (12), a saved
18
+ * position (13..15), the move's dy (16), the shape's half height (17: centre to bottom).
19
+ * Doubles live here and in `SW` / `SH` rather than in locals passed between functions, which
20
+ * V8 would box on every call.
21
+ */
22
+ const P = new Float64Array(18);
23
+ const P_SKIN = 9;
24
+ const P_COS = 10;
25
+ const P_STEP = 11;
26
+ const P_SNAP = 12;
27
+ const P_DY = 16;
28
+ const P_HALF = 17;
29
+ const hit = createSweepHit();
30
+ const lineHit = createHit();
31
+ /** Loads `shape` into `SH` and its centre into `P[3..5]`. */
32
+ function copyShape(shape) {
33
+ loadShape(shape);
34
+ if (SH[0] === SH_BOX) {
35
+ P[0] = (SH[4] - SH[1]) / 2;
36
+ P[1] = (SH[5] - SH[2]) / 2;
37
+ P[2] = (SH[6] - SH[3]) / 2;
38
+ P[3] = SH[1] + P[0];
39
+ P[4] = SH[2] + P[1];
40
+ P[5] = SH[3] + P[2];
41
+ P[P_HALF] = P[1];
42
+ }
43
+ else {
44
+ P[3] = SH[1];
45
+ P[4] = SH[2];
46
+ P[5] = SH[3];
47
+ P[P_HALF] = SH[4] + SH[5];
48
+ }
49
+ }
50
+ /** Moves the working shape in `SH` to `P[3..5]`. */
51
+ function place() {
52
+ if (SH[0] === SH_BOX) {
53
+ SH[1] = P[3] - P[0];
54
+ SH[2] = P[4] - P[1];
55
+ SH[3] = P[5] - P[2];
56
+ SH[4] = P[3] + P[0];
57
+ SH[5] = P[4] + P[1];
58
+ SH[6] = P[5] + P[2];
59
+ }
60
+ else {
61
+ SH[1] = P[3];
62
+ SH[2] = P[4];
63
+ SH[3] = P[5];
64
+ }
65
+ }
66
+ /** Sweeps the working shape along `P[6..8]`. */
67
+ function sweepRemaining(c, mask) {
68
+ SW[0] = P[6];
69
+ SW[1] = P[7];
70
+ SW[2] = P[8];
71
+ return sweepMove(c, hit, mask);
72
+ }
73
+ /** Sweeps the working shape vertically by `SW[1]` (set by the caller: a double argument would be boxed). */
74
+ function sweepY(c, mask) {
75
+ SW[0] = 0;
76
+ SW[2] = 0;
77
+ return sweepMove(c, hit, mask);
78
+ }
79
+ /**
80
+ * Moves the working shape toward the hit, stopping `skin` short of the surface along its normal,
81
+ * and takes the travelled part off the remaining displacement.
82
+ */
83
+ function advanceToHit() {
84
+ if (hit.t === 0)
85
+ return;
86
+ const len = Math.sqrt(P[6] * P[6] + P[7] * P[7] + P[8] * P[8]);
87
+ const dirX = P[6] / len;
88
+ const dirY = P[7] / len;
89
+ const dirZ = P[8] / len;
90
+ const closing = -(dirX * hit.nx + dirY * hit.ny + dirZ * hit.nz);
91
+ const backoff = closing > 1e-6 ? P[P_SKIN] / closing : P[P_SKIN];
92
+ const travel = Math.max(0, hit.t * len - backoff);
93
+ P[3] += dirX * travel;
94
+ P[4] += dirY * travel;
95
+ P[5] += dirZ * travel;
96
+ const left = 1 - travel / len;
97
+ P[6] *= left;
98
+ P[7] *= left;
99
+ P[8] *= left;
100
+ place();
101
+ }
102
+ /** The plane normal `projectRemaining` works with. */
103
+ const N = new Float64Array(3);
104
+ /** Removes the component of the remaining displacement that goes into the plane with normal `N`. */
105
+ function projectRemaining() {
106
+ const nx = N[0];
107
+ const ny = N[1];
108
+ const nz = N[2];
109
+ const into = P[6] * nx + P[7] * ny + P[8] * nz;
110
+ if (into < 0) {
111
+ P[6] -= nx * into;
112
+ P[7] -= ny * into;
113
+ P[8] -= nz * into;
114
+ }
115
+ }
116
+ /** Ground: drop the downward part of the remaining displacement, follow the surface with the rest. */
117
+ function projectOnGround() {
118
+ if (P[7] < 0)
119
+ P[7] = 0;
120
+ N[0] = hit.nx;
121
+ N[1] = hit.ny;
122
+ N[2] = hit.nz;
123
+ projectRemaining();
124
+ }
125
+ /** Wall: slide along it horizontally (a ceiling, with no horizontal normal, uses its own). */
126
+ function projectOnWall() {
127
+ const h = Math.sqrt(hit.nx * hit.nx + hit.nz * hit.nz);
128
+ if (h > 1e-6) {
129
+ N[0] = hit.nx / h;
130
+ N[1] = 0;
131
+ N[2] = hit.nz / h;
132
+ }
133
+ else {
134
+ N[0] = hit.nx;
135
+ N[1] = hit.ny;
136
+ N[2] = hit.nz;
137
+ }
138
+ projectRemaining();
139
+ }
140
+ /**
141
+ * The step-up: from the current position, go up to `stepHeight`, move the horizontal remainder
142
+ * there, come back down onto walkable ground no lower than where we started. Commits the move
143
+ * and returns true, or leaves everything as it was.
144
+ */
145
+ function tryStep(c, mask, out) {
146
+ const hx = P[6];
147
+ const hz = P[8];
148
+ const horiz = Math.sqrt(hx * hx + hz * hz);
149
+ if (horiz < 1e-9)
150
+ return false;
151
+ const skin = P[P_SKIN];
152
+ P[13] = P[3];
153
+ P[14] = P[4];
154
+ P[15] = P[5];
155
+ // Up.
156
+ let up = P[P_STEP];
157
+ SW[1] = up;
158
+ if (sweepY(c, mask)) {
159
+ up = Math.max(0, hit.t * up - skin / Math.max(1e-6, -hit.ny));
160
+ }
161
+ if (up <= skin)
162
+ return false;
163
+ // Forward, at the raised height.
164
+ P[4] += up;
165
+ place();
166
+ SW[0] = hx;
167
+ SW[1] = 0;
168
+ SW[2] = hz;
169
+ let frac = 1;
170
+ if (sweepMove(c, hit, mask)) {
171
+ if (hit.t === 0)
172
+ return restore();
173
+ const closing = -((hx * hit.nx + hz * hit.nz) / horiz);
174
+ const backoff = closing > 1e-6 ? skin / closing : skin;
175
+ frac = Math.max(0, (hit.t * horiz - backoff) / horiz);
176
+ if (frac * horiz < 1e-6)
177
+ return restore();
178
+ }
179
+ P[3] += hx * frac;
180
+ P[5] += hz * frac;
181
+ place();
182
+ // Down onto the step: ground within `up` of the raised height, walkable.
183
+ const drop = up + skin;
184
+ SW[1] = -drop;
185
+ if (!sweepY(c, mask))
186
+ return restore();
187
+ if (hit.t === 0)
188
+ return restore();
189
+ if (hit.ny < P[P_COS]) {
190
+ // Not ground: a step's lip under the rounded bottom (the next moves carry the shape onto
191
+ // the step) or a slope too steep to stand on. Only the lip, no higher than a step above
192
+ // where we started, with walkable ground under the centre, counts.
193
+ const lip = hit.y <= P[14] - P[P_HALF] + P[P_STEP] + skin;
194
+ if (!lip || !lineGround(c, mask, drop + P[P_STEP]))
195
+ return restore();
196
+ }
197
+ // Commit.
198
+ P[4] -= Math.max(0, hit.t * drop - skin / hit.ny);
199
+ P[6] = hx * (1 - frac);
200
+ P[7] = 0;
201
+ P[8] = hz * (1 - frac);
202
+ place();
203
+ out.hits++;
204
+ return true;
205
+ }
206
+ /**
207
+ * Whether a line straight down from the working shape's centre meets walkable ground within
208
+ * `below` of the shape's bottom. A rounded bottom coming down onto a step's lip touches it on
209
+ * the hemisphere, where the contact normal is too steep to be ground although the shape is
210
+ * about to stand on the step: the line under the centre tells a lip (ground below) from a
211
+ * steep slope (the slope itself below).
212
+ */
213
+ function lineGround(c, mask, below) {
214
+ return (raycastReg(c, P[3], P[4], P[5], 0, -1, 0, P[P_HALF] + below, lineHit, mask) &&
215
+ lineHit.ny >= P[P_COS]);
216
+ }
217
+ /** Puts the working shape back where `tryStep` started; always false. */
218
+ function restore() {
219
+ P[3] = P[13];
220
+ P[4] = P[14];
221
+ P[5] = P[15];
222
+ place();
223
+ return false;
224
+ }
225
+ /**
226
+ * The loop over the working shape in `SH` from `P[3..5]` along `P[6..8]`. `flat` is the 2D
227
+ * case: every hit a wall, no ground, step or snap.
228
+ */
229
+ function run(c, opts, out, flat) {
230
+ const maxIterations = opts.maxIterations ?? 4;
231
+ P[P_SKIN] = opts.skin ?? 0.005;
232
+ P[P_COS] = flat ? 2 : Math.cos(((opts.maxSlope ?? 50) * Math.PI) / 180);
233
+ P[P_STEP] = flat ? 0 : (opts.stepHeight ?? 0.35);
234
+ P[P_SNAP] = flat ? 0 : (opts.snapDown ?? 0.2);
235
+ const mask = opts.layerMask ?? ALL_LAYERS;
236
+ const wasGrounded = opts.wasGrounded ?? true;
237
+ P[P_DY] = P[7];
238
+ out.grounded = false;
239
+ out.groundNormal[0] = 0;
240
+ out.groundNormal[1] = 1;
241
+ out.groundNormal[2] = 0;
242
+ out.hitWall = false;
243
+ out.hits = 0;
244
+ let onGround = false;
245
+ for (let i = 0; i < maxIterations; i++) {
246
+ const len = Math.sqrt(P[6] * P[6] + P[7] * P[7] + P[8] * P[8]);
247
+ if (len < 1e-9) {
248
+ P[6] = P[7] = P[8] = 0;
249
+ break;
250
+ }
251
+ if (!sweepRemaining(c, mask)) {
252
+ P[3] += P[6];
253
+ P[4] += P[7];
254
+ P[5] += P[8];
255
+ P[6] = P[7] = P[8] = 0;
256
+ place();
257
+ break;
258
+ }
259
+ out.hits++;
260
+ if (hit.t === 0 && hit.depth > 0) {
261
+ // Started inside something: push out along the normal first.
262
+ const push = hit.depth + P[P_SKIN];
263
+ P[3] += hit.nx * push;
264
+ P[4] += hit.ny * push;
265
+ P[5] += hit.nz * push;
266
+ place();
267
+ }
268
+ else {
269
+ advanceToHit();
270
+ }
271
+ if (hit.ny >= P[P_COS]) {
272
+ onGround = true;
273
+ projectOnGround();
274
+ continue;
275
+ }
276
+ // A wall. From the ground, or when the obstacle is no higher than a step above the shape's
277
+ // bottom and the shape is not rising (a stair's edge caught under a capsule's lower cap),
278
+ // try to step over it.
279
+ if (P[P_STEP] > 0 &&
280
+ (wasGrounded || onGround || (P[P_DY] <= 0 && hit.y <= P[4] - P[P_HALF] + P[P_STEP])) &&
281
+ Math.sqrt(P[6] * P[6] + P[8] * P[8]) > 1e-9) {
282
+ const nx = hit.nx;
283
+ const ny = hit.ny;
284
+ const nz = hit.nz;
285
+ if (tryStep(c, mask, out)) {
286
+ onGround = true;
287
+ continue;
288
+ }
289
+ hit.nx = nx;
290
+ hit.ny = ny;
291
+ hit.nz = nz;
292
+ }
293
+ out.hitWall = true;
294
+ projectOnWall();
295
+ }
296
+ out.remaining[0] = P[6];
297
+ out.remaining[1] = P[7];
298
+ out.remaining[2] = P[8];
299
+ // Ground probe: a hair below for `grounded`; `snapDown` below when the shape has just left the ground.
300
+ if (!flat) {
301
+ const skin = P[P_SKIN];
302
+ const snap = P[P_SNAP] > 0 && wasGrounded && P[P_DY] <= 0;
303
+ const drop = snap ? P[P_SNAP] + skin : 2 * skin;
304
+ SW[1] = -drop;
305
+ if (sweepY(c, mask)) {
306
+ if (hit.ny >= P[P_COS]) {
307
+ if (hit.t > 0) {
308
+ P[4] -= Math.max(0, hit.t * drop - skin / hit.ny);
309
+ place();
310
+ }
311
+ out.grounded = true;
312
+ out.groundNormal[0] = hit.nx;
313
+ out.groundNormal[1] = hit.ny;
314
+ out.groundNormal[2] = hit.nz;
315
+ }
316
+ else if (lineGround(c, mask, P[P_STEP])) {
317
+ // Held up by a step's lip under the rounded bottom, ground under the centre: standing.
318
+ out.grounded = true;
319
+ out.groundNormal[0] = lineHit.nx;
320
+ out.groundNormal[1] = lineHit.ny;
321
+ out.groundNormal[2] = lineHit.nz;
322
+ }
323
+ }
324
+ }
325
+ out.x = P[3];
326
+ out.y = P[4];
327
+ out.z = P[5];
328
+ return out;
329
+ }
330
+ /**
331
+ * Moves `shape` by `(dx, dy, dz)` through the collider with the move-and-slide loop described
332
+ * above and writes where it ends up (the shape's centre) and how into `out`. The shape is read,
333
+ * not moved.
334
+ */
335
+ export function slide(c, shape, dx, dy, dz, opts = {}, out = createSlideResult()) {
336
+ copyShape(shape);
337
+ P[6] = dx;
338
+ P[7] = dy;
339
+ P[8] = dz;
340
+ return run(c, opts, out, false);
341
+ }
342
+ const EPS_2D = 1e-3;
343
+ /**
344
+ * `slide` for a circle or 2D box moving by `(dx, dz)` in the xz plane: every hit is a wall, no
345
+ * step or slope or snap; `out.y` is 0 and `grounded` false. The shape is lifted to the collider's
346
+ * height like the 2D queries.
347
+ */
348
+ export function slide2(c, shape, dx, dz, opts = {}, out = createSlideResult()) {
349
+ const y0 = c.bounds.min[1] + EPS_2D;
350
+ const y1 = c.bounds.max[1] - EPS_2D;
351
+ P[3] = shape.x;
352
+ P[4] = (y0 + y1) / 2;
353
+ P[5] = shape.z;
354
+ if (isBox2(shape)) {
355
+ SH[0] = SH_BOX;
356
+ P[0] = shape.hw;
357
+ P[1] = Math.max(0, (y1 - y0) / 2);
358
+ P[2] = shape.hh;
359
+ P[P_HALF] = P[1];
360
+ }
361
+ else {
362
+ const half = (y1 - y0) / 2 - shape.r;
363
+ SH[0] = half <= 0 ? SH_SPHERE : SH_CAPSULE;
364
+ SH[4] = Math.max(0, half);
365
+ SH[5] = shape.r;
366
+ P[P_HALF] = SH[4] + shape.r;
367
+ }
368
+ place();
369
+ P[6] = dx;
370
+ P[7] = 0;
371
+ P[8] = dz;
372
+ run(c, opts, out, true);
373
+ out.y = 0;
374
+ return out;
375
+ }
@@ -0,0 +1,88 @@
1
+ /**
2
+ * `slideTiles`: a 2D box moved against a tile grid, the platformer case. Axis-separated: each
3
+ * sub-step (at most half a tile) moves x then y and pushes the box out of what it entered.
4
+ * Solid tiles block from every side; one-way tiles only hold a box falling onto them from above;
5
+ * moving platforms (`movers`) are solid boxes that also carry what stands on them.
6
+ *
7
+ * Screen convention: y grows downward, so `+dy` falls, "ground" is below (`y + h`) and a
8
+ * ceiling above (`y`). A `GridSource` maps its column `x` and row `z` to tile `(cx, cy)`, its
9
+ * `origin` `[x, z]` to the world x, y of tile (0, 0). Pure arithmetic: no allocation per call.
10
+ */
11
+ import { type GridSource } from './grid.js';
12
+ /** What a tile is: `TILE_EMPTY`, `TILE_SOLID` or `TILE_ONE_WAY`. */
13
+ export type TileKind = number;
14
+ export declare const TILE_EMPTY = 0;
15
+ export declare const TILE_SOLID = 1;
16
+ /** Holds only from above: a box rising or moving sideways passes through. */
17
+ export declare const TILE_ONE_WAY = 2;
18
+ /** A tile map by query: `solidAt(cx, cy)` for any tile, `cellSize` wide, (0, 0) at `origin`. */
19
+ export interface TileQuery {
20
+ cellSize: number;
21
+ /** World x, y of tile (0, 0)'s top-left corner. Default `[0, 0]`. */
22
+ origin?: readonly [number, number];
23
+ solidAt(cx: number, cy: number): TileKind;
24
+ }
25
+ /** A box: top-left corner and size. */
26
+ export interface TileBox {
27
+ x: number;
28
+ y: number;
29
+ w: number;
30
+ h: number;
31
+ }
32
+ /** A moving platform's box this tick and how far it moved since the last one. */
33
+ export interface TileMover extends TileBox {
34
+ dx: number;
35
+ dy: number;
36
+ }
37
+ export interface TileSlideOptions {
38
+ /** One-way tiles hold a falling box. Default true; false drops through them. */
39
+ oneWay?: boolean;
40
+ /**
41
+ * A box on the ground blocked sideways climbs a ledge up to this high (world units) instead
42
+ * of stopping. Default 0.
43
+ */
44
+ stepUp?: number;
45
+ /** Moving platforms: solid, and a box landing on one rides it (`riding`, then `carryBy`). */
46
+ movers?: readonly TileMover[];
47
+ }
48
+ /** Where `slideTiles` left the box, and what it touched. `createTileSlideResult` makes one. */
49
+ export interface TileSlideResult {
50
+ x: number;
51
+ y: number;
52
+ /** The displacement made, carry included (`x - box.x`, `y - box.y`). */
53
+ dx: number;
54
+ dy: number;
55
+ /** Resting on a solid or one-way tile, or a mover, at the end of the move. */
56
+ onGround: boolean;
57
+ hitCeiling: boolean;
58
+ hitWall: boolean;
59
+ /** Index into `movers` of the platform the box stands on, or -1. */
60
+ riding: number;
61
+ /**
62
+ * A carry queued by `carryBy`, applied (against the tiles) before the next `slideTiles`
63
+ * moves the box with this result, then cleared.
64
+ */
65
+ carried: {
66
+ dx: number;
67
+ dy: number;
68
+ };
69
+ }
70
+ export declare function createTileSlideResult(): TileSlideResult;
71
+ /**
72
+ * Queue `mover`'s motion this tick into `result.carried`, for the next `slideTiles` with that
73
+ * result to apply first. Call it with the platform the box rode last tick
74
+ * (`movers[result.riding]`), after the platforms move and before the box does. Returns `result`.
75
+ */
76
+ export declare function carryBy(result: TileSlideResult, mover: {
77
+ readonly dx: number;
78
+ readonly dy: number;
79
+ }): TileSlideResult;
80
+ /**
81
+ * Move `box` by `(dx, dy)` against `tiles` (a `GridSource` or a `TileQuery`), writing where it
82
+ * ended and what it touched into `out` (returned). A carry queued in `out.carried` (`carryBy`)
83
+ * is applied first and cleared. The box is never moved more than half a tile per sub-step, so
84
+ * it cannot tunnel; a box sliding along a floor or wall of separate tiles never catches on their
85
+ * seams (each axis only tests the tiles ahead of its leading edge, inset by a small epsilon).
86
+ * `box` itself is not changed: copy `out.x`, `out.y` back.
87
+ */
88
+ export declare function slideTiles(tiles: GridSource | TileQuery, box: TileBox, dx: number, dy: number, out: TileSlideResult, opts?: TileSlideOptions): TileSlideResult;