@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,158 @@
1
+ import { WGSL_MOTION } from '../render/scene-pipelines.js';
2
+ import { WGSL_GLOBALS } from '../render/wgsl.js';
3
+ /** Floats per billboard instance in the storage buffer (`BILLBOARD_BYTES` / 4). */
4
+ export const BILLBOARD_FLOATS = 20;
5
+ export const BILLBOARD_BYTES = BILLBOARD_FLOATS * 4;
6
+ /** Instance flag bits, in `pos.w` as a float. */
7
+ export const BB_FLAG_PX = 1;
8
+ export const BB_FLAG_YAW = 2;
9
+ export const BB_FLAG_TEXTURED = 4;
10
+ export const BB_FLAG_BAR = 8;
11
+ /**
12
+ * The billboard batch's shader: six vertices per instance, read from a storage buffer.
13
+ *
14
+ * - `pos.xyz` is the world anchor (position plus offset); `pos.w` carries the flags above.
15
+ * - `size.xy` is the quad size: world units, or logical px with `BB_FLAG_PX` (then the quad is
16
+ * screen-aligned and sized from `globals.logicalSize`, `globals.targetSize` and the view's
17
+ * `camera.viewport`, so it keeps its px size at any distance). `size.z` is the bar fraction.
18
+ * - World-unit quads face the camera (`camera.view` rows 0 and 1), or turn only about y with
19
+ * `BB_FLAG_YAW` (right = the view's right flattened onto xz, up = +y).
20
+ * - `color` multiplies the atlas sample (`BB_FLAG_TEXTURED`) or stands alone; with `BB_FLAG_BAR`
21
+ * the fragment is `color` where `uv.x < size.z` and `color2` beyond.
22
+ */
23
+ export const BILLBOARD_WGSL = /* wgsl */ `
24
+ ${WGSL_GLOBALS}
25
+ struct Billboard {
26
+ pos: vec4f,
27
+ size: vec4f,
28
+ uv: vec4f,
29
+ color: vec4f,
30
+ color2: vec4f,
31
+ };
32
+ @group(1) @binding(0) var<storage, read> billboards: array<Billboard>;
33
+ @group(1) @binding(1) var atlas_sampler: sampler;
34
+ @group(1) @binding(2) var atlas: texture_2d<f32>;
35
+
36
+ struct VSOut {
37
+ @builtin(position) clip: vec4f,
38
+ @location(0) uv: vec2f,
39
+ @location(1) q: vec2f,
40
+ @location(2) color: vec4f,
41
+ @location(3) color2: vec4f,
42
+ @location(4) @interpolate(flat) flags: u32,
43
+ @location(5) fraction: f32,
44
+ };
45
+ struct FragOut {
46
+ @location(0) color: vec4f,
47
+ @location(1) emissive: vec4f,
48
+ };
49
+
50
+ fn view_row(r: u32) -> vec3f {
51
+ return vec3f(camera.view[0][r], camera.view[1][r], camera.view[2][r]);
52
+ }
53
+
54
+ @vertex fn vs(@builtin(vertex_index) vi: u32, @builtin(instance_index) ii: u32) -> VSOut {
55
+ var o: VSOut;
56
+ let b = billboards[ii];
57
+ var corners = array<vec2f, 6>(
58
+ vec2f(-1.0, -1.0), vec2f(1.0, -1.0), vec2f(1.0, 1.0),
59
+ vec2f(-1.0, -1.0), vec2f(1.0, 1.0), vec2f(-1.0, 1.0)
60
+ );
61
+ let q = corners[vi];
62
+ let flags = u32(b.pos.w + 0.5);
63
+ let half = b.size.xy * 0.5;
64
+ if ((flags & ${BB_FLAG_PX}u) != 0u) {
65
+ var clip = camera.view_proj * vec4f(b.pos.xyz, 1.0);
66
+ // Logical px → target px → NDC, scaled by w so the division leaves the px size intact.
67
+ let px_per_logical = globals.targetSize / globals.logicalSize;
68
+ let ndc = (q * half * px_per_logical) / max(camera.viewport.zw, vec2f(1.0)) * 2.0;
69
+ clip = vec4f(clip.xy + ndc * clip.w, clip.zw);
70
+ o.clip = clip;
71
+ } else {
72
+ var right = view_row(0u);
73
+ var up = view_row(1u);
74
+ if ((flags & ${BB_FLAG_YAW}u) != 0u) {
75
+ let flat = vec3f(right.x, 0.0, right.z);
76
+ let len = length(flat);
77
+ right = select(vec3f(1.0, 0.0, 0.0), flat / max(len, 1e-6), len > 1e-6);
78
+ up = vec3f(0.0, 1.0, 0.0);
79
+ }
80
+ let world = b.pos.xyz + right * (q.x * half.x) + up * (q.y * half.y);
81
+ o.clip = camera.view_proj * vec4f(world, 1.0);
82
+ }
83
+ // Canvas uv: v grows downward, so the top of the quad (q.y = 1) samples v0.
84
+ let t = q * 0.5 + 0.5;
85
+ o.uv = vec2f(mix(b.uv.x, b.uv.z, t.x), mix(b.uv.w, b.uv.y, t.y));
86
+ o.q = t;
87
+ o.color = b.color;
88
+ o.color2 = b.color2;
89
+ o.flags = flags;
90
+ o.fraction = b.size.z;
91
+ return o;
92
+ }
93
+
94
+ @fragment fn fs(in: VSOut) -> FragOut {
95
+ var c = in.color;
96
+ if ((in.flags & ${BB_FLAG_BAR}u) != 0u) {
97
+ c = select(in.color2, in.color, in.q.x < in.fraction);
98
+ }
99
+ // Sampled unconditionally: textureSample needs uniform control flow.
100
+ let s = textureSample(atlas, atlas_sampler, in.uv);
101
+ c *= select(vec4f(1.0), s, (in.flags & ${BB_FLAG_TEXTURED}u) != 0u);
102
+ var o: FragOut;
103
+ o.color = c;
104
+ o.emissive = vec4f(0.0, 0.0, 0.0, c.a);
105
+ return o;
106
+ }
107
+ `;
108
+ /** Insert `add` after the one occurrence of `at` in `src` (throws unless there is exactly one). */
109
+ function after(src, at, add) {
110
+ const i = src.indexOf(at);
111
+ if (i < 0 || src.indexOf(at, i + 1) >= 0)
112
+ throw new Error(`billboardWgsl: anchor ${at}`);
113
+ return src.slice(0, i + at.length) + add + src.slice(i + at.length);
114
+ }
115
+ /**
116
+ * `BILLBOARD_WGSL`, or with `velocity` (the velocity attachment's fragment location, 2 or 3)
117
+ * the build that writes its own motion (ws/render-11): binding 3 holds each sorted instance's
118
+ * previous anchor (`xyz`, `w` = 1 when known), the vertex stage projects the same corner of
119
+ * last frame's quad through `camera.prev_view_proj` / `prev_view`, and the fragment writes
120
+ * `vec4f(engine_motion(..), 0, alpha)` there. Internal; `0` is the exported string itself.
121
+ */
122
+ export function billboardWgsl(velocity) {
123
+ if (velocity <= 0)
124
+ return BILLBOARD_WGSL;
125
+ let s = after(BILLBOARD_WGSL, WGSL_GLOBALS, WGSL_MOTION);
126
+ s = after(s, '@group(1) @binding(2) var atlas: texture_2d<f32>;', '\n@group(1) @binding(3) var<storage, read> billboard_prev: array<vec4f>;');
127
+ s = after(s, ' @location(5) fraction: f32,', '\n @location(6) prev_clip: vec4f,');
128
+ s = after(s, ' @location(1) emissive: vec4f,', `\n @location(${velocity}) velocity: vec4f,`);
129
+ s = after(s, `fn view_row(r: u32) -> vec3f {
130
+ return vec3f(camera.view[0][r], camera.view[1][r], camera.view[2][r]);
131
+ }
132
+ `, `
133
+ fn prev_view_row(r: u32) -> vec3f {
134
+ return vec3f(camera.prev_view[0][r], camera.prev_view[1][r], camera.prev_view[2][r]);
135
+ }
136
+ fn yaw_right(r: vec3f) -> vec3f {
137
+ let flat = vec3f(r.x, 0.0, r.z);
138
+ let len = length(flat);
139
+ return select(vec3f(1.0, 0.0, 0.0), flat / max(len, 1e-6), len > 1e-6);
140
+ }
141
+ `);
142
+ s = after(s, ' let half = b.size.xy * 0.5;', `
143
+ let pv = billboard_prev[ii];
144
+ let pa = select(b.pos.xyz, pv.xyz, pv.w > 0.5);`);
145
+ s = after(s, ' o.clip = clip;', `
146
+ let pc = camera.prev_view_proj * vec4f(pa, 1.0);
147
+ o.prev_clip = vec4f(pc.xy + ndc * pc.w, pc.zw);`);
148
+ s = after(s, ' o.clip = camera.view_proj * vec4f(world, 1.0);', `
149
+ var pr = prev_view_row(0u);
150
+ var pu = prev_view_row(1u);
151
+ if ((flags & ${BB_FLAG_YAW}u) != 0u) {
152
+ pr = yaw_right(pr);
153
+ pu = vec3f(0.0, 1.0, 0.0);
154
+ }
155
+ let prev_world = pa + pr * (q.x * half.x) + pu * (q.y * half.y);
156
+ o.prev_clip = camera.prev_view_proj * vec4f(prev_world, 1.0);`);
157
+ return after(s, ' o.emissive = vec4f(0.0, 0.0, 0.0, c.a);', '\n o.velocity = vec4f(engine_motion(in.clip, in.prev_clip), 0.0, c.a);');
158
+ }
@@ -0,0 +1,249 @@
1
+ import type { Camera } from '../render/camera.js';
2
+ import type { Drawable, Frame } from '../render/frame.js';
3
+ import type { Renderer } from '../render/renderer.js';
4
+ import type { Texture } from '../render/texture.js';
5
+ import { type AtlasRegion, TextAtlas, type TextAtlasOptions, type TextStyle } from './text-atlas.js';
6
+ /** `'camera'`: the quad faces the eye. `'cameraY'`: it turns about y only (stays upright). */
7
+ export type BillboardFacing = 'camera' | 'cameraY';
8
+ /** `'test'`: hidden behind scene geometry (no depth write). `'always'`: drawn over everything. */
9
+ export type BillboardDepth = 'test' | 'always';
10
+ /** `[w, h]` in world units, or `{ px: [w, h] }` in logical px, the same size at any distance. */
11
+ export type BillboardSize = readonly [number, number] | {
12
+ readonly px: readonly [number, number];
13
+ };
14
+ export interface BillboardDesc {
15
+ /**
16
+ * World anchor. A `Float32Array` (x, y, z at 0..2) is followed live, so a plate tracks the
17
+ * thing it is over without being told; a tuple is copied.
18
+ */
19
+ position: Float32Array | readonly [number, number, number];
20
+ /** World-space offset from `position` (a head height). Default none. */
21
+ offset?: readonly [number, number, number];
22
+ size: BillboardSize;
23
+ /** An atlas region to show (`billboards.text(...)`), or `null`/unset for a solid colour. */
24
+ region?: AtlasRegion | null;
25
+ /**
26
+ * A text plate (ws/fx-4): `text` in its own atlas cell (`TextAtlas.cell`), changed later with
27
+ * `handle.setText`. Overrides `region`. Size the quad to the text with `billboards.measure`.
28
+ */
29
+ text?: string;
30
+ /** The plate's style (with `text`). */
31
+ textStyle?: TextStyle;
32
+ /** Linear RGBA multiplier (straight alpha). Default white. */
33
+ color?: ArrayLike<number>;
34
+ /** Default `'camera'`. `{ px }` sizes are always screen-aligned. */
35
+ facing?: BillboardFacing;
36
+ /** Default `'test'`. */
37
+ depth?: BillboardDepth;
38
+ /**
39
+ * Seconds to live: the quad holds for the first half, fades over the second and removes
40
+ * itself at the end. Default none (lives until `remove`).
41
+ */
42
+ life?: number;
43
+ /** World units per second added to the anchor (damage numbers drift up). Default none. */
44
+ velocity?: readonly [number, number, number];
45
+ /**
46
+ * A health bar in one quad: `color` fills `fraction` of the width from the left, `bg` the
47
+ * rest. `billboards.bar(...)` builds this. Default none.
48
+ */
49
+ bar?: {
50
+ fraction: number;
51
+ bg: ArrayLike<number>;
52
+ };
53
+ }
54
+ export interface BillboardsOptions {
55
+ /** Billboards the buffers start with (they grow when full). Default 1024. */
56
+ capacity?: number;
57
+ /** The text atlas: canvas `size` (default 1024) and default `font`. */
58
+ atlas?: TextAtlasOptions;
59
+ label?: string;
60
+ }
61
+ /**
62
+ * World units a span of `px` logical px covers at `viewDistance` from a camera whose projection
63
+ * is `projection` (column-major; `projection[5]` is the vertical scale) on a viewport
64
+ * `viewportPx` logical px tall. The shader applies the same ratio in clip space for `{ px }`
65
+ * sizes; use this on the CPU to size something in world units to match a px plate.
66
+ */
67
+ export declare function pxToWorld(px: number, viewDistance: number, projection: ArrayLike<number>, viewportPx: number): number;
68
+ /**
69
+ * One billboard, returned by `Billboards.add`. Setters change it in place; it is `alive` until
70
+ * `remove` or its `life` runs out, after which the setters do nothing.
71
+ */
72
+ export declare class BillboardHandle {
73
+ private readonly owner;
74
+ /** @internal slot in the owner's arrays, -1 when dead. */
75
+ slot: number;
76
+ constructor(owner: Billboards);
77
+ get alive(): boolean;
78
+ set position(p: Float32Array | readonly [number, number, number]);
79
+ set offset(o: readonly [number, number, number]);
80
+ set color(c: ArrayLike<number>);
81
+ set size(s: BillboardSize);
82
+ set region(r: AtlasRegion | null);
83
+ /** The text plate's text (`desc.text`, `setText`); null when not a plate. */
84
+ get text(): string | null;
85
+ /**
86
+ * Change a text plate's text (ws/fx-4). Re-rasterised into the plate's own atlas cell when it
87
+ * fits (no new region, no new texture), else into a wider cell: the quad's height stays and
88
+ * its width grows with the cell, so the glyphs keep their scale. A handle that is not a plate
89
+ * becomes one, in the default style, at its current size.
90
+ */
91
+ setText(text: string): void;
92
+ /** The filled share of a bar quad, 0..1. */
93
+ set fraction(f: number);
94
+ }
95
+ /**
96
+ * World-anchored, camera-facing quads in one batch: name plates, damage numbers, health bars,
97
+ * markers. Each shows a region of the shared text atlas or a solid colour, is sized in world
98
+ * units or in screen px, optionally fades out over `life` and drifts by `velocity`. Alpha
99
+ * blended, depth tested without writing (or drawn over everything with `depth: 'always'`),
100
+ * sorted back to front each `update`. Draw with `frame.drawable(billboards)`.
101
+ *
102
+ * ```ts
103
+ * const bb = createBillboards(renderer);
104
+ * const plate = bb.add({ position: hero.position, offset: [0, 2, 0], size: { px: [160, 40] },
105
+ * region: bb.text('Hero', { size: 28, stroke: '#000', strokeWidth: 4 }) });
106
+ * bb.add({ position: hero.position, offset: [0, 2.3, 0], size: [1, 0.12], life: 0.9,
107
+ * velocity: [0, 1.2, 0], region: bb.text('-37', { color: '#f44' }) });
108
+ * bb.update(dt, camera); // ages, drifts, sorts
109
+ * frame.drawable(bb); // inside the scene's render
110
+ * ```
111
+ *
112
+ * Nothing allocates per frame once the buffers are big enough; `add` past `capacity` doubles
113
+ * them.
114
+ */
115
+ export declare class Billboards implements Drawable {
116
+ /** The atlas canvas as a texture, uploaded when the atlas changed (once per frame at most). */
117
+ readonly atlasTexture: Texture;
118
+ /** The text atlas behind `text()`. */
119
+ readonly atlas: TextAtlas;
120
+ /** Draw calls the last `draw` issued (0, 1 or 2: one per depth mode in use). */
121
+ draws: number;
122
+ private readonly renderer;
123
+ private readonly device;
124
+ private readonly label;
125
+ private capacity;
126
+ private n;
127
+ private anchor;
128
+ private tracked;
129
+ private offset;
130
+ private velocity;
131
+ /** age, life (life <= 0: immortal). */
132
+ private life;
133
+ private rgba;
134
+ private mode;
135
+ private regions;
136
+ /** A text plate's text (its region an owned atlas cell); null when not a plate. */
137
+ private plates;
138
+ private handles;
139
+ /** Instance data per slot, in `BILLBOARD_WGSL`'s layout. */
140
+ private inst;
141
+ private order;
142
+ private keys;
143
+ private upload;
144
+ /**
145
+ * Motion (ws/render-11): per slot the anchor its quad was last drawn at (`xyz`, `w` = 1 once
146
+ * drawn), and the previous anchors in sorted order for `prevBuffer` (binding 3), which the
147
+ * velocity build of the shader reads. Kept only once a view with a velocity attachment drew
148
+ * the batch (`motion`); until then the buffer holds zeros, read as "unknown" (no motion).
149
+ */
150
+ private drawn;
151
+ private prevUpload;
152
+ private prevBuffer;
153
+ private motion;
154
+ /** The velocity builds of the shader, by fragment location (2 or 3), made on first use. */
155
+ private readonly motionModules;
156
+ private testCount;
157
+ private alwaysCount;
158
+ private uploadDirty;
159
+ private buffer;
160
+ private group;
161
+ private readonly groupLayout;
162
+ private readonly pipelineDesc;
163
+ /**
164
+ * Pipelines per depth format (null: none) × the view target's aux key, made on first use
165
+ * from `renderer.sceneTargets` (ws/render-10): `testPipelines` depth-test (and hold the
166
+ * depthless one), `alwaysPipelines` ignore depth.
167
+ */
168
+ private readonly testPipelines;
169
+ private readonly alwaysPipelines;
170
+ constructor(renderer: Renderer, opts?: BillboardsOptions);
171
+ /** Live billboards. */
172
+ get count(): number;
173
+ /** Share of the atlas canvas in use, 0..1. */
174
+ get atlasUsed(): number;
175
+ private makeBuffer;
176
+ private makePrevBuffer;
177
+ private makeGroup;
178
+ /** Double every array and the GPU buffer (only when `add` finds the batch full). */
179
+ private grow;
180
+ /** Add a billboard; the handle changes or removes it later. */
181
+ add(desc: BillboardDesc): BillboardHandle;
182
+ /** Remove a billboard now (a no-op for one already gone). */
183
+ remove(handle: BillboardHandle): void;
184
+ /** Remove every billboard. Atlas text stays cached; text plates give their cells back. */
185
+ clear(): void;
186
+ /** Swap-remove slot `i`: the last slot moves into it. */
187
+ private removeAt;
188
+ /**
189
+ * The atlas region for `text` in `style`, rasterised on first use and cached (text + style).
190
+ * Throws when the string is larger than the whole atlas canvas.
191
+ */
192
+ text(text: string, style?: TextStyle): AtlasRegion;
193
+ /**
194
+ * A health bar in one quad, `fraction` (0..1) of its width in `fg` and the rest in `bg`:
195
+ * spread it into `add` with a `position`, then set `handle.fraction`.
196
+ */
197
+ bar(fraction: number, size: BillboardSize, fg: ArrayLike<number>, bg: ArrayLike<number>): Omit<BillboardDesc, 'position'>;
198
+ /** @internal */
199
+ setPosition(i: number, p: Float32Array | readonly [number, number, number]): void;
200
+ /** @internal */
201
+ setOffset(i: number, o: readonly [number, number, number]): void;
202
+ /** @internal */
203
+ setColor(i: number, c: ArrayLike<number>): void;
204
+ /** @internal */
205
+ setSize(i: number, s: BillboardSize): void;
206
+ /**
207
+ * The width and height, in atlas px, a text plate of `text` in `style` gets (its cell): size
208
+ * a plate's quad to this aspect.
209
+ */
210
+ measure(text: string, style?: TextStyle): {
211
+ width: number;
212
+ height: number;
213
+ };
214
+ /** @internal */
215
+ plateText(i: number): string | null;
216
+ /** @internal */
217
+ setText(i: number, text: string): void;
218
+ private makePlate;
219
+ private releasePlate;
220
+ /** @internal */
221
+ setRegion(i: number, r: AtlasRegion | null): void;
222
+ private writeRegion;
223
+ /** @internal */
224
+ setFraction(i: number, f: number): void;
225
+ /**
226
+ * Age and drift every billboard, remove the ones past their `life`, resolve anchors and fades
227
+ * into the instance data and sort back to front for `camera` (without one, submission order).
228
+ * Call once per update or frame; allocation-free.
229
+ */
230
+ update(dt: number, camera?: Camera | null): void;
231
+ /**
232
+ * Upload the instance data, last frame's drawn anchors when the view has velocity and, when
233
+ * the atlas changed, its canvas. Runs before the pass.
234
+ */
235
+ prepare(_encoder: GPUCommandEncoder, _frame?: Frame): void;
236
+ /**
237
+ * Once per frame with `motion` on: each drawn quad's previous anchor (where it was drawn last
238
+ * frame, or its current one the first time) into `prevBuffer` in draw order, then remember
239
+ * the current anchors. Without an `update` since, current equals previous (no motion).
240
+ */
241
+ private writePrevious;
242
+ /** Draw inside the scene pass: the `'test'` quads, then the `'always'` ones. */
243
+ draw(pass: GPURenderPassEncoder, frame?: Frame): void;
244
+ private pipelineFor;
245
+ private motionModule;
246
+ destroy(): void;
247
+ }
248
+ /** `new Billboards(renderer, opts)`. */
249
+ export declare function createBillboards(renderer: Renderer, opts?: BillboardsOptions): Billboards;