@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,306 @@
1
+ import { createPointerDispatcher, POINTER_PRIORITY, } from './pointer-dispatch.js';
2
+ import { createRay, screenRay } from './rays.js';
3
+ export function createSample(key, device) {
4
+ return {
5
+ key,
6
+ device,
7
+ hand: null,
8
+ ray: createRay(),
9
+ x: Number.NaN,
10
+ y: Number.NaN,
11
+ select: false,
12
+ secondary: false,
13
+ xr: null,
14
+ synthetic: false,
15
+ };
16
+ }
17
+ /**
18
+ * Mouse, pen and touch as router pointers. Mouse and pen hover (a pointer while over the
19
+ * target); touch is a pointer only while the finger is down, plus one more tick after it lifts so
20
+ * a tap's tick still sees what it was on. Positions go through the pointer transform into the
21
+ * camera's screen units. With linked `Gestures` that have `magnify`, a single touch points at the
22
+ * gesture's aim (the snapped target's centre, else the lifted aim point) instead of the finger.
23
+ *
24
+ * Feed methods (`pointerDown`, `pointerMove`, `pointerUp`, `pointerLeave`, `pointerCancel`,
25
+ * `cancelAll`) take client coordinates and are public for tests and replays. `synthetic` on
26
+ * `pointerDown`/`pointerMove` marks a replayed pointer (see `PointerSample.synthetic`).
27
+ */
28
+ export class ScreenPointers {
29
+ transform = null;
30
+ gestures = null;
31
+ contacts = [];
32
+ out = [];
33
+ detachFn = null;
34
+ /**
35
+ * Hides a pointer from `poll` while it reads true: installed by `attach` with a dispatcher as
36
+ * "claimed and not `hoverWhileClaimed`", so an orbit drag or a touch-zone thumb produces no
37
+ * hits until it is released. Public so tests can stand one in.
38
+ */
39
+ claim = null;
40
+ setPointerTransform(fn) {
41
+ this.transform = fn;
42
+ this.ownDispatcher?.setTransform(fn);
43
+ }
44
+ setGestures(g) {
45
+ this.gestures = g;
46
+ }
47
+ // ---------------------------------------------------------------- feed
48
+ pointerDown(id, x, y, device = 'mouse', button = 0, synthetic = false) {
49
+ const c = this.contact(id, device, true, synthetic);
50
+ if (!c)
51
+ return;
52
+ c.cx = x;
53
+ c.cy = y;
54
+ if (button === 2)
55
+ c.secondary = true;
56
+ else if (button === 0) {
57
+ c.select = true;
58
+ c.tapped = true;
59
+ }
60
+ }
61
+ pointerMove(id, x, y, device = 'mouse', synthetic = false) {
62
+ // Touch is a pointer only while down; mouse and pen hover.
63
+ const c = this.contact(id, device, device !== 'touch', synthetic);
64
+ if (!c)
65
+ return;
66
+ c.cx = x;
67
+ c.cy = y;
68
+ }
69
+ pointerUp(id, x, y, button = 0) {
70
+ const c = this.find(id);
71
+ if (!c)
72
+ return;
73
+ c.cx = x;
74
+ c.cy = y;
75
+ if (button === 2)
76
+ c.secondary = false;
77
+ else if (button === 0)
78
+ c.select = false;
79
+ if (c.device === 'touch')
80
+ c.gone = true;
81
+ }
82
+ /** A hovering mouse or pen left the target. */
83
+ pointerLeave(id) {
84
+ const c = this.find(id);
85
+ if (c && c.device !== 'touch' && !c.select && !c.secondary)
86
+ c.cancelled = true;
87
+ }
88
+ pointerCancel(id) {
89
+ const c = this.find(id);
90
+ if (c)
91
+ c.cancelled = true;
92
+ }
93
+ cancelAll() {
94
+ for (const c of this.contacts)
95
+ c.cancelled = true;
96
+ }
97
+ // ---------------------------------------------------------------- poll
98
+ poll(camera) {
99
+ const out = this.out;
100
+ out.length = 0;
101
+ const aim = this.gestures?.aim ?? null;
102
+ let touches = 0;
103
+ for (const c of this.contacts)
104
+ if (c.device === 'touch' && !c.cancelled)
105
+ touches++;
106
+ for (let i = 0; i < this.contacts.length; i++) {
107
+ const c = this.contacts[i];
108
+ if (c.cancelled) {
109
+ this.contacts.splice(i--, 1);
110
+ continue;
111
+ }
112
+ const s = c.sample;
113
+ let sx;
114
+ let sy;
115
+ if (aim && c.device === 'touch' && touches === 1) {
116
+ // The magnify aim: where the finger is pointing, not where it covers.
117
+ sx = aim.target ? aim.target.x : aim.x;
118
+ sy = aim.target ? aim.target.y : aim.y;
119
+ if (!aim.inside && !aim.target)
120
+ sx = Number.NaN;
121
+ }
122
+ else if (this.transform) {
123
+ const p = this.transform(c.cx, c.cy);
124
+ sx = p ? p.x : Number.NaN;
125
+ sy = p ? p.y : Number.NaN;
126
+ }
127
+ else {
128
+ sx = c.cx;
129
+ sy = c.cy;
130
+ }
131
+ s.select = c.select || c.tapped;
132
+ s.secondary = c.secondary;
133
+ s.synthetic = c.synthetic;
134
+ c.tapped = false;
135
+ if (c.gone)
136
+ this.contacts.splice(i--, 1);
137
+ if (this.claim?.(c.id))
138
+ continue;
139
+ if (!camera || Number.isNaN(sx) || !screenRay(camera, sx, sy, s.ray))
140
+ continue;
141
+ s.x = sx;
142
+ s.y = sy;
143
+ out.push(s);
144
+ }
145
+ return out;
146
+ }
147
+ // ---------------------------------------------------------------- DOM
148
+ /**
149
+ * Listen to pointer events on `target` (the router calls this from its `attach`). Positions are
150
+ * client px with a transform, target-relative px without one.
151
+ */
152
+ attach(target, dispatcher) {
153
+ this.detach();
154
+ const shared = dispatcher ?? null;
155
+ const d = shared ?? createPointerDispatcher(target, { transform: this.transform });
156
+ if (!shared)
157
+ this.ownDispatcher = d;
158
+ // Sees claimed pointers too (their contacts must end cleanly); `poll` hides them.
159
+ const remove = d.add(this.consumer, POINTER_PRIORITY.screen, true);
160
+ this.claim = (id) => !d.hoverWhileClaimed && d.claimed(id);
161
+ this.detachFn = () => {
162
+ remove();
163
+ if (!shared)
164
+ d.destroy();
165
+ this.ownDispatcher = null;
166
+ this.claim = null;
167
+ };
168
+ }
169
+ ownDispatcher = null;
170
+ consumer = {
171
+ pointerDown: (p) => this.pointerDown(p.id, p.x, p.y, p.device, p.button, p.synthetic),
172
+ pointerMove: (p) => this.pointerMove(p.id, p.x, p.y, p.device, p.synthetic),
173
+ pointerUp: (p) => this.pointerUp(p.id, p.x, p.y, p.button),
174
+ pointerLeave: (p) => this.pointerLeave(p.id),
175
+ pointerCancel: (p) => this.pointerCancel(p.id),
176
+ cancelAll: () => this.cancelAll(),
177
+ };
178
+ detach() {
179
+ this.detachFn?.();
180
+ this.detachFn = null;
181
+ this.cancelAll();
182
+ }
183
+ find(id) {
184
+ for (const c of this.contacts)
185
+ if (c.id === id && !c.cancelled && !c.gone)
186
+ return c;
187
+ return null;
188
+ }
189
+ contact(id, device, create, synthetic) {
190
+ const found = this.find(id);
191
+ if (found)
192
+ found.synthetic = synthetic;
193
+ if (found || !create)
194
+ return found;
195
+ const c = {
196
+ id,
197
+ device,
198
+ cx: 0,
199
+ cy: 0,
200
+ select: false,
201
+ secondary: false,
202
+ tapped: false,
203
+ gone: false,
204
+ cancelled: false,
205
+ synthetic,
206
+ sample: createSample(id, device),
207
+ };
208
+ this.contacts.push(c);
209
+ return c;
210
+ }
211
+ }
212
+ function defaultGamepads() {
213
+ try {
214
+ return typeof navigator !== 'undefined' && navigator.getGamepads ? navigator.getGamepads() : [];
215
+ }
216
+ catch {
217
+ return [];
218
+ }
219
+ }
220
+ /**
221
+ * A virtual pointer a gamepad stick moves over the camera's screen, so a pad aims like a mouse.
222
+ * It appears (at the screen centre) the first time its stick passes the deadzone or its select
223
+ * button is pressed, then stays until `hide()`. `x`, `y` are camera screen units.
224
+ */
225
+ export class PadCursor {
226
+ x = Number.NaN;
227
+ y = Number.NaN;
228
+ /** True while the cursor is shown (it reports a pointer). */
229
+ active = false;
230
+ getGamepads;
231
+ opts;
232
+ sample = createSample(0, 'gamepad');
233
+ out = [];
234
+ constructor(opts = {}) {
235
+ this.getGamepads = opts.getGamepads ?? defaultGamepads;
236
+ this.opts = {
237
+ pad: opts.pad,
238
+ axes: opts.axes ?? [0, 1],
239
+ deadzone: opts.deadzone ?? 0.2,
240
+ speed: opts.speed ?? 0.012,
241
+ selectButton: opts.selectButton ?? 0,
242
+ secondaryButton: opts.secondaryButton ?? 2,
243
+ };
244
+ }
245
+ /** Put the cursor at a screen point and show it. */
246
+ moveTo(x, y) {
247
+ this.x = x;
248
+ this.y = y;
249
+ this.active = true;
250
+ }
251
+ /** Hide the cursor (for example when the mouse moves); the stick shows it again. */
252
+ hide() {
253
+ this.active = false;
254
+ }
255
+ poll(camera) {
256
+ const out = this.out;
257
+ out.length = 0;
258
+ const o = this.opts;
259
+ let ax = 0;
260
+ let ay = 0;
261
+ let sel = false;
262
+ let sec = false;
263
+ const pads = this.getGamepads();
264
+ for (let i = 0; i < pads.length; i++) {
265
+ if (o.pad !== undefined && i !== o.pad)
266
+ continue;
267
+ const p = pads[i];
268
+ if (!p || p.connected === false)
269
+ continue;
270
+ const x = p.axes[o.axes[0]] ?? 0;
271
+ const y = p.axes[o.axes[1]] ?? 0;
272
+ if (ax === 0 && ay === 0 && Math.hypot(x, y) > o.deadzone) {
273
+ ax = x;
274
+ ay = y;
275
+ }
276
+ if (p.buttons[o.selectButton]?.pressed)
277
+ sel = true;
278
+ if (p.buttons[o.secondaryButton]?.pressed)
279
+ sec = true;
280
+ }
281
+ if (!camera)
282
+ return out;
283
+ const sc = camera.screen;
284
+ if ((ax !== 0 || ay !== 0 || sel) && !this.active) {
285
+ this.active = true;
286
+ if (Number.isNaN(this.x)) {
287
+ this.x = sc.x + sc.width / 2;
288
+ this.y = sc.y + sc.height / 2;
289
+ }
290
+ }
291
+ if (!this.active)
292
+ return out;
293
+ const step = o.speed * Math.min(sc.width, sc.height);
294
+ this.x = Math.min(sc.x + sc.width, Math.max(sc.x, this.x + ax * step));
295
+ this.y = Math.min(sc.y + sc.height, Math.max(sc.y, this.y + ay * step));
296
+ const s = this.sample;
297
+ s.select = sel;
298
+ s.secondary = sec;
299
+ if (!screenRay(camera, this.x, this.y, s.ray))
300
+ return out;
301
+ s.x = this.x;
302
+ s.y = this.y;
303
+ out.push(s);
304
+ return out;
305
+ }
306
+ }
@@ -0,0 +1,138 @@
1
+ /**
2
+ * Rays and hit testing for the pointer router (`pointer-router.ts`). Plain math, no DOM, no
3
+ * game nouns: a `HitTester` turns a world-space `Ray` into the nearest `PickHit` it knows, and the
4
+ * game decides what `target` means.
5
+ */
6
+ import type { Camera } from '../render/camera.js';
7
+ import type { MeshBounds } from '../render/mesh.js';
8
+ import type { Transform } from '../render/transform.js';
9
+ /** A 3-vector, mutable and reused (`[x, y, z]`). */
10
+ export type Vec3 = [number, number, number];
11
+ /** A world-space ray. `dir` is unit length. Reuse one per pointer; nothing here allocates. */
12
+ export interface Ray {
13
+ readonly origin: Vec3;
14
+ readonly dir: Vec3;
15
+ }
16
+ /**
17
+ * The nearest thing a ray met. `distance` is along `ray.dir` from `ray.origin` (world units).
18
+ * `normal` faces the ray (unit), or `null` when the tester has none (the ray started inside).
19
+ * Hits the router hands out are reused: read them in the listener or copy them.
20
+ */
21
+ export interface PickHit<T = unknown> {
22
+ readonly point: Vec3;
23
+ normal: Vec3 | null;
24
+ distance: number;
25
+ /** What was hit, as the game named it (a box's `target`, a plane's `target`). */
26
+ target: T;
27
+ }
28
+ /**
29
+ * Returns the nearest hit of `ray` against what this tester knows, or `null`. It may return the
30
+ * same object on every call (the router copies it before calling again).
31
+ */
32
+ export type HitTester<T = unknown> = (ray: Ray) => PickHit<T> | null;
33
+ /** The camera slice the router needs: `screen` and the inverse projection (`render`'s `Camera`). */
34
+ export type RayCamera = Pick<Camera, 'screen' | 'screenToWorld'>;
35
+ export declare function createRay(): Ray;
36
+ export declare function createHit<T = unknown>(target: T): PickHit<T>;
37
+ /** `out = ray.origin + t * ray.dir`. */
38
+ export declare function rayAt(ray: Ray, t: number, out: Vec3): Vec3;
39
+ /**
40
+ * The ray through screen point (`sx`, `sy`) (the camera's screen units): from the near plane
41
+ * (`screenToWorld(…, 0)`) towards the far one (`…, 1`; depth 0.5 when the far plane is at
42
+ * infinity). For `Camera.ortho2d` the origin is the world point on the near plane
43
+ * (z = -ORTHO2D_HALF_DEPTH) and `dir` is +z, into the screen.
44
+ * Returns false (and leaves `out` alone) when the camera gives no usable ray.
45
+ */
46
+ export declare function screenRay(camera: RayCamera, sx: number, sy: number, out: Ray): boolean;
47
+ /**
48
+ * Any plane for `planeTester` (ws/api-core): the points `p` with `dot(normal, p) = offset`.
49
+ * `normal` need not be unit length; it must not be zero. Read on every call, so the game may
50
+ * move the plane in place. `{ normal: [0, 0, 1], offset: z }` is the plane z = `z`.
51
+ */
52
+ export interface RayPlane {
53
+ normal: readonly [number, number, number];
54
+ /** Default 0 (the plane through the origin). */
55
+ offset?: number;
56
+ }
57
+ /**
58
+ * Hits a plane: the plane z = `plane` when it is a number (a 2D game's world, default 0), or
59
+ * any `RayPlane` (a floor at y = 0 is `{ normal: [0, 1, 0] }`). The hit point is where the ray
60
+ * crosses it, so through `Camera.ortho2d` the z-plane hit is the world point under the pointer.
61
+ * Rays parallel to the plane or pointing away from it miss. The hit's normal is the plane's,
62
+ * unit length, turned to face the ray. `target` is what every hit carries (default `null`).
63
+ */
64
+ export declare function planeTester<T = null>(plane?: number | RayPlane, target?: T): HitTester<T>;
65
+ /** An axis-aligned box for `aabbTester`. `min` ≤ `max` per axis; a flat box (2D quad) is fine. */
66
+ export interface RayBox<T = unknown> {
67
+ min: readonly [number, number, number];
68
+ max: readonly [number, number, number];
69
+ target: T;
70
+ }
71
+ /**
72
+ * Hits the nearest of `boxes` (read on every call, so the game may edit the array and its
73
+ * boxes). A ray that starts inside a box hits it at distance 0 with no normal. Equal distances
74
+ * go to the earlier box. Flat boxes (`min[i] === max[i]`) work, so 2D quads at z = 0 can be
75
+ * picked through `Camera.ortho2d`.
76
+ */
77
+ export declare function aabbTester<T = unknown>(boxes: readonly RayBox<T>[]): HitTester<T>;
78
+ /**
79
+ * The slice of `render`'s `Transform` a transformed tester reads: the 3×4 row-major world
80
+ * matrix (12 floats, `[r0 | tx, r1 | ty, r2 | tz]`). Read on every call, so a moving object
81
+ * picks correctly without re-registering its tester.
82
+ */
83
+ export type RayTransform = Pick<Transform, 'world'>;
84
+ /** A bounding sphere in object space (`render`'s `MeshBounds`): `center` and `radius`. */
85
+ export type RayBounds = MeshBounds;
86
+ /**
87
+ * `outRay` = `ray` in the object space of `worldMatrix3x4` (12 floats, row-major, as
88
+ * `Transform.world`): the 3×3 is inverted (non-uniform scale is fine), the translation
89
+ * removed, and `outRay.dir` normalised. Returns the world units per object-space unit along
90
+ * the ray, so a distance found in object space times the result is the world distance. Returns
91
+ * 0 (and leaves `outRay` alone) when the matrix is singular. No allocation.
92
+ */
93
+ export declare function transformRayInto(ray: Ray, worldMatrix3x4: ArrayLike<number>, outRay: Ray): number;
94
+ /**
95
+ * Möller–Trumbore: the distance along `ray` to triangle `a, b, c` (counter-clockwise seen from
96
+ * the front), or -1 for a miss. With `cullBack` a triangle whose back faces the ray misses.
97
+ * `out`, when given, receives the unit triangle normal turned to face the ray. No allocation.
98
+ */
99
+ export declare function rayTriangle(ray: Ray, a: ArrayLike<number>, b: ArrayLike<number>, c: ArrayLike<number>, cullBack: boolean, out: Vec3 | null): number;
100
+ /**
101
+ * Hits `bounds` (an object-space sphere, read each call) placed by `transform` (read each call).
102
+ * The hit carries `point` and `normal` in world space and `distance` in world units, under any
103
+ * rotation and non-uniform scale (an ellipsoid). A ray that starts inside hits at distance 0
104
+ * with `normal: null`. Zero allocations per call.
105
+ */
106
+ export declare function sphereTester<T = null>(transform: RayTransform, bounds: RayBounds, target?: T): HitTester<T>;
107
+ /**
108
+ * Hits an oriented box: the object-space box `[-halfExtents, +halfExtents]` placed by
109
+ * `transform` (both read each call). The hit's `normal` is the entering face's, in world space;
110
+ * `distance` is in world units. A ray that starts inside hits at distance 0 with `normal: null`.
111
+ * Zero allocations per call.
112
+ */
113
+ export declare function obbTester<T = null>(transform: RayTransform, halfExtents: readonly [number, number, number], target?: T): HitTester<T>;
114
+ export interface MeshTesterOptions {
115
+ /**
116
+ * Object-space bounding sphere the ray must enter before any triangle is tested (read each
117
+ * call, so a mesh rebuilt in place can update it). Default: computed once from `positions`.
118
+ * `radius` Infinity skips the test.
119
+ */
120
+ bounds?: RayBounds;
121
+ /** Skip triangles whose back faces the ray (counter-clockwise front). Default false. */
122
+ cullBack?: boolean;
123
+ /** Floats per vertex in `positions` (`VertexLayout.floats`). Default 12 (`VERTEX_LAYOUT_3D`). */
124
+ stride?: number;
125
+ /** Float offset of x, y, z within a vertex. Default 0 (every shipped layout). */
126
+ offset?: number;
127
+ }
128
+ /**
129
+ * Hits the triangles of a mesh whose positions the game keeps on the CPU: `positions` is the
130
+ * interleaved vertex buffer it uploaded (`MeshDesc.vertices`; `stride`/`offset` in floats say
131
+ * where x, y, z sit, default `VERTEX_LAYOUT_3D`), `indices` its index buffer or `null` for a
132
+ * plain triangle list. Both are read each call, so a mesh rebuilt in place is picked as drawn,
133
+ * and `transform` is read each call too. The ray is moved into object space, rejected on the
134
+ * bounds sphere first, then tested against every triangle (Möller–Trumbore); the nearest wins.
135
+ * The hit carries the world-space `point`, the triangle's unit `normal` facing the ray and
136
+ * `distance` in world units. Zero allocations per call; O(triangles) after the sphere.
137
+ */
138
+ export declare function meshTester<T = null>(transform: RayTransform, positions: Float32Array, indices: Uint16Array | Uint32Array | null, target?: T, opts?: MeshTesterOptions): HitTester<T>;