@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,555 @@
1
+ import { VERTEX_LAYOUT_3D, VERTEX3D_FLOATS } from '../render/mesh.js';
2
+ import { Transform } from '../render/transform.js';
3
+ import { TRAIL_TEXTURED_WGSL, TRAIL_WGSL } from './trail-wgsl.js';
4
+ /** Point stride in the ring: x, y, z, birth time. */
5
+ const PF = 4;
6
+ const VF = VERTEX3D_FLOATS;
7
+ const DEFAULT_FADE = new Float32Array([1, 0]);
8
+ const UP = new Float32Array([0, 1, 0]);
9
+ const Z = new Float32Array([0, 0, 1]);
10
+ /** Linear sample of channel `ch` of a table of `stride`-float stops at `t` in 0..1. */
11
+ function sampleCurve(table, stride, ch, t) {
12
+ const stops = table.length / stride;
13
+ if (stops <= 1)
14
+ return table[ch] ?? 0;
15
+ const k = t * (stops - 1);
16
+ const i = Math.min(Math.floor(k), stops - 2);
17
+ const f = k - i;
18
+ return table[i * stride + ch] * (1 - f) + table[(i + 1) * stride + ch] * f;
19
+ }
20
+ function toTable(src) {
21
+ if (!src || src.length === 0)
22
+ return null;
23
+ const out = new Float32Array(src.length);
24
+ for (let i = 0; i < src.length; i++)
25
+ out[i] = src[i];
26
+ return out;
27
+ }
28
+ /** Index buffer for `quads` ribbon quads over vertices 0.. (two per point). */
29
+ function ribbonIndices(quads, vertices) {
30
+ const idx = vertices > 0xffff ? new Uint32Array(quads * 6) : new Uint16Array(quads * 6);
31
+ writeQuads(idx, 0, 0, quads);
32
+ return idx;
33
+ }
34
+ /** Write `quads` quads starting at vertex `base` into `idx` at `at`; returns the next index. */
35
+ function writeQuads(idx, at, base, quads) {
36
+ let o = at;
37
+ for (let q = 0; q < quads; q++) {
38
+ const a = base + q * 2;
39
+ idx[o++] = a;
40
+ idx[o++] = a + 1;
41
+ idx[o++] = a + 2;
42
+ idx[o++] = a + 1;
43
+ idx[o++] = a + 3;
44
+ idx[o++] = a + 2;
45
+ }
46
+ return o;
47
+ }
48
+ /**
49
+ * The points of one ribbon: a ring of stored points (x, y, z, birth time) plus the tip, the
50
+ * latest pushed position, which is drawn as an extra, age-0 point when it sits apart from the
51
+ * newest stored point. Nothing here touches the GPU.
52
+ */
53
+ class Ring {
54
+ cap;
55
+ pts;
56
+ tail = 0;
57
+ /** Stored points. */
58
+ n = 0;
59
+ tip = new Float32Array(3);
60
+ hasTip = false;
61
+ constructor(cap) {
62
+ this.cap = cap;
63
+ this.pts = new Float32Array(cap * PF);
64
+ }
65
+ /** Store or move the tip; true when a point was stored. */
66
+ push(x, y, z, now, minDistance) {
67
+ const tip = this.tip;
68
+ tip[0] = x;
69
+ tip[1] = y;
70
+ tip[2] = z;
71
+ this.hasTip = true;
72
+ if (this.n > 0) {
73
+ const o = ((this.tail + this.n - 1) % this.cap) * PF;
74
+ const p = this.pts;
75
+ const dx = x - p[o];
76
+ const dy = y - p[o + 1];
77
+ const dz = z - p[o + 2];
78
+ if (dx * dx + dy * dy + dz * dz < minDistance * minDistance)
79
+ return false;
80
+ }
81
+ if (this.n === this.cap) {
82
+ this.tail = (this.tail + 1) % this.cap;
83
+ this.n--;
84
+ }
85
+ const o = ((this.tail + this.n) % this.cap) * PF;
86
+ const p = this.pts;
87
+ p[o] = x;
88
+ p[o + 1] = y;
89
+ p[o + 2] = z;
90
+ p[o + 3] = now;
91
+ this.n++;
92
+ return true;
93
+ }
94
+ /** Drop stored points older than `lifetime`. */
95
+ expire(now, lifetime) {
96
+ const p = this.pts;
97
+ while (this.n > 0 && now - p[this.tail * PF + 3] > lifetime) {
98
+ this.tail = (this.tail + 1) % this.cap;
99
+ this.n--;
100
+ }
101
+ }
102
+ /** Does the tip sit apart from the newest stored point (so it is drawn)? */
103
+ tipApart() {
104
+ if (!this.hasTip)
105
+ return false;
106
+ if (this.n === 0)
107
+ return true;
108
+ const o = ((this.tail + this.n - 1) % this.cap) * PF;
109
+ const p = this.pts;
110
+ const t = this.tip;
111
+ return p[o] !== t[0] || p[o + 1] !== t[1] || p[o + 2] !== t[2];
112
+ }
113
+ /** Points drawn: stored points plus the tip when apart. */
114
+ count() {
115
+ return this.n + (this.tipApart() ? 1 : 0);
116
+ }
117
+ /** Point `i` (0 = newest, the tip when apart) into `out` (x, y, z, birth time). */
118
+ read(i, now, out) {
119
+ let k = i;
120
+ if (this.tipApart()) {
121
+ if (k === 0) {
122
+ out[0] = this.tip[0];
123
+ out[1] = this.tip[1];
124
+ out[2] = this.tip[2];
125
+ out[3] = now;
126
+ return;
127
+ }
128
+ k--;
129
+ }
130
+ const o = ((this.tail + this.n - 1 - k) % this.cap) * PF;
131
+ const p = this.pts;
132
+ out[0] = p[o];
133
+ out[1] = p[o + 1];
134
+ out[2] = p[o + 2];
135
+ out[3] = p[o + 3];
136
+ }
137
+ clear() {
138
+ this.tail = 0;
139
+ this.n = 0;
140
+ this.hasTip = false;
141
+ }
142
+ }
143
+ const prev = new Float32Array(4);
144
+ const cur = new Float32Array(4);
145
+ const next = new Float32Array(4);
146
+ const side = new Float32Array(3);
147
+ const axis = new Float32Array(3);
148
+ /**
149
+ * Build the ribbon of `ring` into `verts` (3D layout, two vertices per point, oldest first)
150
+ * from float `at`; returns the vertices written (0 when fewer than two points). Allocates
151
+ * nothing. `camera` drives `facing: 'camera'`: in world space the face turns toward the eye at
152
+ * each point, in 2D (or without a camera) it lies in the XY plane.
153
+ */
154
+ function writeRibbon(ring, style, now, camera, verts, at) {
155
+ const m = ring.count();
156
+ if (m < 2)
157
+ return 0;
158
+ const facing = style.facing;
159
+ const toEye = facing === 'camera' && style.space === 'world' && camera !== null;
160
+ let eye = null;
161
+ if (facing === 'camera') {
162
+ if (toEye)
163
+ eye = camera.position;
164
+ else if (camera) {
165
+ const v = camera.view;
166
+ axis[0] = v[2];
167
+ axis[1] = v[6];
168
+ axis[2] = v[10];
169
+ }
170
+ else
171
+ axis.set(Z);
172
+ }
173
+ else if (facing === 'up')
174
+ axis.set(UP);
175
+ else {
176
+ axis[0] = facing[0];
177
+ axis[1] = facing[1];
178
+ axis[2] = facing[2];
179
+ }
180
+ const lifetime = style.lifetime;
181
+ const inv = lifetime > 0 ? 1 / lifetime : 0;
182
+ const tile = style.uvMode === 'tile';
183
+ const tileLen = style.width > 0 ? style.width : 1;
184
+ const color = style.color;
185
+ side[0] = 1;
186
+ side[1] = 0;
187
+ side[2] = 0;
188
+ let dist = 0;
189
+ ring.read(0, now, cur);
190
+ for (let j = 0; j < m; j++) {
191
+ if (j + 1 < m)
192
+ ring.read(j + 1, now, next);
193
+ let dx;
194
+ let dy;
195
+ let dz;
196
+ if (j === 0) {
197
+ dx = cur[0] - next[0];
198
+ dy = cur[1] - next[1];
199
+ dz = cur[2] - next[2];
200
+ }
201
+ else if (j + 1 < m) {
202
+ dx = prev[0] - next[0];
203
+ dy = prev[1] - next[1];
204
+ dz = prev[2] - next[2];
205
+ }
206
+ else {
207
+ dx = prev[0] - cur[0];
208
+ dy = prev[1] - cur[1];
209
+ dz = prev[2] - cur[2];
210
+ }
211
+ if (eye) {
212
+ axis[0] = eye[0] - cur[0];
213
+ axis[1] = eye[1] - cur[1];
214
+ axis[2] = eye[2] - cur[2];
215
+ }
216
+ // side = normalize(dir × axis); a degenerate pair keeps the previous side.
217
+ const sx = dy * axis[2] - dz * axis[1];
218
+ const sy = dz * axis[0] - dx * axis[2];
219
+ const sz = dx * axis[1] - dy * axis[0];
220
+ const sl = Math.hypot(sx, sy, sz);
221
+ if (sl > 1e-12) {
222
+ side[0] = sx / sl;
223
+ side[1] = sy / sl;
224
+ side[2] = sz / sl;
225
+ }
226
+ // normal = side × dir, the face direction (toward the eye / the axis).
227
+ let nx = side[1] * dz - side[2] * dy;
228
+ let ny = side[2] * dx - side[0] * dz;
229
+ let nz = side[0] * dy - side[1] * dx;
230
+ const nl = Math.hypot(nx, ny, nz);
231
+ if (nl > 1e-12) {
232
+ nx /= nl;
233
+ ny /= nl;
234
+ nz /= nl;
235
+ }
236
+ else {
237
+ nx = axis[0];
238
+ ny = axis[1];
239
+ nz = axis[2];
240
+ }
241
+ const t = Math.min(Math.max((now - cur[3]) * inv, 0), 1);
242
+ const hw = (style.widthCurve ? sampleCurve(style.widthCurve, 1, 0, t) : style.width) / 2;
243
+ let a = style.colorCurve ? sampleCurve(style.colorCurve, 4, 3, t) : color[3];
244
+ if (style.fade)
245
+ a *= sampleCurve(style.fade, 1, 0, t);
246
+ const r = style.colorCurve ? sampleCurve(style.colorCurve, 4, 0, t) : color[0];
247
+ const g = style.colorCurve ? sampleCurve(style.colorCurve, 4, 1, t) : color[1];
248
+ const b = style.colorCurve ? sampleCurve(style.colorCurve, 4, 2, t) : color[2];
249
+ if (j > 0)
250
+ dist += Math.hypot(cur[0] - prev[0], cur[1] - prev[1], cur[2] - prev[2]);
251
+ const u = tile ? dist / tileLen : j / (m - 1);
252
+ const px = cur[0];
253
+ const py = cur[1];
254
+ const pz = cur[2];
255
+ const ox = side[0] * hw;
256
+ const oy = side[1] * hw;
257
+ const oz = side[2] * hw;
258
+ // Oldest first in the buffer so the index buffer is static.
259
+ let o = at + (m - 1 - j) * 2 * VF;
260
+ verts[o++] = px + ox;
261
+ verts[o++] = py + oy;
262
+ verts[o++] = pz + oz;
263
+ verts[o++] = nx;
264
+ verts[o++] = ny;
265
+ verts[o++] = nz;
266
+ verts[o++] = u;
267
+ verts[o++] = 0;
268
+ verts[o++] = r;
269
+ verts[o++] = g;
270
+ verts[o++] = b;
271
+ verts[o++] = a;
272
+ verts[o++] = px - ox;
273
+ verts[o++] = py - oy;
274
+ verts[o++] = pz - oz;
275
+ verts[o++] = nx;
276
+ verts[o++] = ny;
277
+ verts[o++] = nz;
278
+ verts[o++] = u;
279
+ verts[o++] = 1;
280
+ verts[o++] = r;
281
+ verts[o++] = g;
282
+ verts[o++] = b;
283
+ verts[o++] = a;
284
+ prev.set(cur);
285
+ cur.set(next);
286
+ }
287
+ return m * 2;
288
+ }
289
+ /** Untextured trail materials, one per renderer and blend mode (textured ones are per trail). */
290
+ const sharedMaterials = new WeakMap();
291
+ function trailMaterial(renderer, opts, label) {
292
+ const blend = opts.blend ?? 'additive';
293
+ if (opts.texture) {
294
+ const m = renderer.createMaterial({
295
+ label: `${label}-textured`,
296
+ wgsl: TRAIL_TEXTURED_WGSL,
297
+ blend,
298
+ textures: 1,
299
+ sampler: opts.uvMode === 'tile' ? 'linear-repeat' : 'linear-clamp',
300
+ });
301
+ m.setTexture(0, opts.texture);
302
+ return m;
303
+ }
304
+ let byBlend = sharedMaterials.get(renderer);
305
+ if (!byBlend) {
306
+ byBlend = new Map();
307
+ sharedMaterials.set(renderer, byBlend);
308
+ }
309
+ let m = byBlend.get(blend);
310
+ if (!m) {
311
+ m = renderer.createMaterial({ label: `trail-${blend}`, wgsl: TRAIL_WGSL, blend });
312
+ byBlend.set(blend, m);
313
+ }
314
+ return m;
315
+ }
316
+ /** Fields `Trail` and `TrailBatch` share; `TrailStyle` plus the GPU side. */
317
+ class RibbonBase {
318
+ space;
319
+ /** Seconds a point lives. Mutable. */
320
+ lifetime;
321
+ /** Ribbon width (or the tile length under `widthCurve`). Mutable. */
322
+ width;
323
+ /** See `TrailOptions.minDistance`. Mutable. */
324
+ minDistance;
325
+ /** See `TrailFacing`. Mutable. */
326
+ facing;
327
+ widthCurve;
328
+ /** Linear RGBA; mutate in place. */
329
+ color;
330
+ colorCurve;
331
+ fade;
332
+ uvMode;
333
+ /** The mesh the ribbon is written into (3D vertex layout; two vertices per point). */
334
+ mesh;
335
+ /** The unlit soft-edged material (shared per renderer and blend unless textured). */
336
+ material;
337
+ /**
338
+ * Places the ribbon: identity by default (points are already in trail space). Parent it or
339
+ * move it like any `Transform`.
340
+ */
341
+ transform = new Transform();
342
+ /**
343
+ * Per-draw instance fields (`tint`, `emissive`, `order`, `layers`, ...); `params.x` is the
344
+ * edge softness and is owned by the trail (`softness`).
345
+ */
346
+ instance;
347
+ params = new Float32Array(4);
348
+ ownsMaterial;
349
+ time = 0;
350
+ /** Vertices the last `update` wrote. */
351
+ written = 0;
352
+ vertexUpdate = { vertexCount: 0, indexCount: 0 };
353
+ constructor(renderer, opts, vertices, indices, label) {
354
+ const world = opts.space === 'world';
355
+ this.space = world ? 'world' : '2d';
356
+ this.lifetime = opts.lifetime ?? 0.5;
357
+ this.width = opts.width ?? (world ? 0.2 : 12);
358
+ this.minDistance = opts.minDistance ?? (world ? 0.02 : 2);
359
+ this.facing = opts.facing ?? 'camera';
360
+ this.widthCurve = toTable(opts.widthCurve);
361
+ this.color = new Float32Array(4);
362
+ const c = opts.color;
363
+ this.color[0] = c ? c[0] : 1;
364
+ this.color[1] = c ? c[1] : 1;
365
+ this.color[2] = c ? c[2] : 1;
366
+ this.color[3] = c ? (c[3] ?? 1) : 1;
367
+ this.colorCurve = toTable(opts.colorCurve);
368
+ this.fade = opts.fade === null ? null : (toTable(opts.fade) ?? DEFAULT_FADE);
369
+ this.uvMode = opts.uvMode ?? 'stretch';
370
+ this.params[0] = opts.softness ?? 0.5;
371
+ this.instance = { params: this.params };
372
+ this.ownsMaterial = !!opts.texture;
373
+ this.material = trailMaterial(renderer, opts, label);
374
+ this.mesh = renderer.createMesh({
375
+ label,
376
+ layout: VERTEX_LAYOUT_3D,
377
+ capacity: { vertices, indices: indices ? indices.length : 0 },
378
+ indices,
379
+ });
380
+ this.mesh.update({ vertexCount: 0, indexCount: 0 });
381
+ }
382
+ /** Share of the half width that fades toward each long edge, 0..1. */
383
+ get softness() {
384
+ return this.params[0];
385
+ }
386
+ set softness(v) {
387
+ this.params[0] = v;
388
+ }
389
+ /** Upload `count` vertices of `verts` and set the index range (allocation-free). */
390
+ upload(verts, count, indexCount) {
391
+ const u = this.vertexUpdate;
392
+ u.vertices = verts;
393
+ u.vertexCount = count;
394
+ u.indexCount = indexCount;
395
+ this.written = count;
396
+ this.mesh.update(u);
397
+ }
398
+ /** Record the ribbon into `frame` (nothing when it has fewer than two points). */
399
+ draw(frame) {
400
+ if (this.written < 4)
401
+ return;
402
+ frame.mesh(this.mesh, this.material, this.transform, this.instance);
403
+ }
404
+ destroy() {
405
+ this.mesh.destroy();
406
+ if (this.ownsMaterial)
407
+ this.material.destroy();
408
+ }
409
+ }
410
+ /**
411
+ * A ribbon trail: a strip that follows a moving point, with width, colour and alpha over age,
412
+ * camera-facing or fixed-axis, in 2D or world space.
413
+ *
414
+ * ```ts
415
+ * const trail = new Trail(renderer, { space: 'world', width: 0.15, lifetime: 0.4 });
416
+ * trail.push(tip.x, tip.y, tip.z); // every update, wherever the point is
417
+ * trail.update(dt, camera); // ages points and rebuilds the ribbon
418
+ * trail.draw(frame); // inside the scene's render
419
+ * ```
420
+ *
421
+ * Geometry is built on the CPU into one preallocated array (two vertices per point, the
422
+ * oldest first, over a static index buffer) and uploaded through `Mesh.update` each frame;
423
+ * nothing allocates after construction.
424
+ */
425
+ export class Trail extends RibbonBase {
426
+ maxPoints;
427
+ ring;
428
+ verts;
429
+ constructor(renderer, opts = {}) {
430
+ const cap = Math.max(2, Math.floor(opts.maxPoints ?? 64));
431
+ const vertices = (cap + 1) * 2;
432
+ super(renderer, opts, vertices, ribbonIndices(cap, vertices), opts.label ?? 'trail');
433
+ this.maxPoints = cap;
434
+ this.ring = new Ring(cap);
435
+ this.verts = new Float32Array(vertices * VF);
436
+ }
437
+ /** Points the ribbon currently has (stored points plus the tip when it sits apart). */
438
+ get count() {
439
+ return this.ring.count();
440
+ }
441
+ /**
442
+ * Point `i` (0 = newest) into `out` as `x, y, z`. Out of range leaves `out` untouched and
443
+ * returns false.
444
+ */
445
+ pointAt(i, out) {
446
+ if (i < 0 || i >= this.ring.count())
447
+ return false;
448
+ this.ring.read(i, this.time, cur);
449
+ out.x = cur[0];
450
+ out.y = cur[1];
451
+ out.z = cur[2];
452
+ return true;
453
+ }
454
+ /**
455
+ * Move the trail's tip to a point. A point farther than `minDistance` from the newest stored
456
+ * one is stored (true); a closer one only moves the tip (false). When `maxPoints` are stored
457
+ * the oldest drops.
458
+ */
459
+ push(x, y, z = 0) {
460
+ return this.ring.push(x, y, z, this.time, this.minDistance);
461
+ }
462
+ /**
463
+ * Advance time, drop points older than `lifetime` and rebuild the ribbon. `camera` turns a
464
+ * `facing: 'camera'` ribbon (needed in world space; in 2D the ribbon lies flat without it).
465
+ */
466
+ update(dt, camera) {
467
+ this.time += dt;
468
+ const ring = this.ring;
469
+ ring.expire(this.time, this.lifetime);
470
+ const n = writeRibbon(ring, this, this.time, camera ?? null, this.verts, 0);
471
+ this.upload(this.verts, n, n >= 4 ? (n / 2 - 1) * 6 : 0);
472
+ }
473
+ /** Forget every point; the ribbon is empty until the next `push` and `update`. */
474
+ clear() {
475
+ this.ring.clear();
476
+ this.upload(this.verts, 0, 0);
477
+ }
478
+ }
479
+ /**
480
+ * Many ribbons of one style in one mesh and one draw (projectiles, a flock). Each ribbon is
481
+ * addressed by its index; `update` rebuilds the shared vertex and index arrays in place.
482
+ */
483
+ export class TrailBatch extends RibbonBase {
484
+ /** Ribbons in the batch. */
485
+ size;
486
+ maxPoints;
487
+ rings;
488
+ verts;
489
+ indices;
490
+ indexUpdate;
491
+ constructor(renderer, size, opts = {}) {
492
+ const cap = Math.max(2, Math.floor(opts.maxPoints ?? 64));
493
+ const count = Math.max(1, Math.floor(size));
494
+ const vertices = (cap + 1) * 2 * count;
495
+ super(renderer, opts, vertices, ribbonIndices(cap * count, vertices), opts.label ?? 'trails');
496
+ this.size = count;
497
+ this.maxPoints = cap;
498
+ this.rings = [];
499
+ for (let i = 0; i < count; i++)
500
+ this.rings.push(new Ring(cap));
501
+ this.verts = new Float32Array(vertices * VF);
502
+ this.indices =
503
+ vertices > 0xffff ? new Uint32Array(cap * count * 6) : new Uint16Array(cap * count * 6);
504
+ this.indexUpdate = { indices: this.indices, indexCount: 0 };
505
+ }
506
+ /** Points ribbon `i` currently has. */
507
+ count(i) {
508
+ return this.rings[i]?.count() ?? 0;
509
+ }
510
+ /** `Trail.pointAt` for ribbon `i`: point `j` (0 = newest) into `out`. */
511
+ pointAt(i, j, out) {
512
+ const r = this.rings[i];
513
+ if (!r || j < 0 || j >= r.count())
514
+ return false;
515
+ r.read(j, this.time, cur);
516
+ out.x = cur[0];
517
+ out.y = cur[1];
518
+ out.z = cur[2];
519
+ return true;
520
+ }
521
+ /** `Trail.push` for ribbon `i`. */
522
+ push(i, x, y, z = 0) {
523
+ const r = this.rings[i];
524
+ return r ? r.push(x, y, z, this.time, this.minDistance) : false;
525
+ }
526
+ /** `Trail.update` for every ribbon, packed into one mesh. */
527
+ update(dt, camera) {
528
+ this.time += dt;
529
+ const cam = camera ?? null;
530
+ let vb = 0;
531
+ let ib = 0;
532
+ for (const ring of this.rings) {
533
+ ring.expire(this.time, this.lifetime);
534
+ const n = writeRibbon(ring, this, this.time, cam, this.verts, vb * VF);
535
+ if (n < 4)
536
+ continue;
537
+ ib = writeQuads(this.indices, ib, vb, n / 2 - 1);
538
+ vb += n;
539
+ }
540
+ const u = this.indexUpdate;
541
+ u.indexCount = ib;
542
+ this.mesh.update(u);
543
+ this.upload(this.verts, vb, ib);
544
+ }
545
+ /** Forget ribbon `i`'s points, or every ribbon's without an index. */
546
+ clear(i) {
547
+ if (i === undefined)
548
+ for (const r of this.rings)
549
+ r.clear();
550
+ else
551
+ this.rings[i]?.clear();
552
+ if (i === undefined)
553
+ this.upload(this.verts, 0, 0);
554
+ }
555
+ }
@@ -0,0 +1,34 @@
1
+ /** Wave layers the params block carries (`WaterOptions.waves` beyond this are ignored). */
2
+ export declare const WATER_MAX_WAVES = 4;
3
+ /**
4
+ * The water shader: a plane in the engine's 3D vertex layout, no instance, group 1 = the
5
+ * water's params block and its copy of the scene depth.
6
+ *
7
+ * Waves. Each layer is an analytic field with a closed-form gradient (`water_wave`):
8
+ * `p = (x, z) * scale + dir * (t * speed)`, `a = p.x + 0.6 sin(1.3 p.y)`,
9
+ * `b = 0.8 p.y + 0.5 sin(0.9 p.x)`, value `sin(a) cos(b)` in -1..1, and its derivatives by the
10
+ * chain rule. The height is `level + displace * Σ amplitude_i * value_i` (the vertex shader
11
+ * offsets y by it; `waterHeight` in `water.ts` is the same sum in TypeScript), and the normal
12
+ * is `normalize(-slope.x, 1, -slope.z)` with `slope = Σ amplitude_i * scale_i * grad_i`, so
13
+ * `amplitude` is the normal strength whether or not vertices move.
14
+ *
15
+ * Shading, all linear: the view ray's Schlick Fresnel (f0 0.02) times `fresnel` lerps the
16
+ * refraction colour (`shallow` → `deep` by the linear depth below the surface over
17
+ * `depth_fade`, from the depth copy) towards the reflection colour (a sky gradient between
18
+ * `lights.fog.rgb`, or a pale haze without fog, at the horizon and a bluer zenith, darkened at
19
+ * night like `Sky`); the sun adds a GGX lobe of `roughness` (`engine_d_ggx`,
20
+ * `engine_v_smith_ggx`, `engine_f_schlick` from `WGSL_PBR`), which also goes to the emissive
21
+ * target so bloom picks it up; foam (`foam.w` > 0) mixes `foam.rgb` in where the depth below the
22
+ * surface is under `foam.w`, through a two-octave noise mask; the alpha ramps up from zero at
23
+ * the shoreline over a quarter of `depth_fade` to `opacity`, then `engine_fog`.
24
+ *
25
+ * Depth copy. `misc.z` says whether `scene_depth` holds this frame's copy. Its texel is turned
26
+ * into view-space z (`view_z_of`) and compared with the fragment's own: the difference is the
27
+ * water depth along the ray. A texel within a sliver of the fragment's own depth is the water
28
+ * surface itself (the copy was taken after a frame that drew this water into the same depth
29
+ * buffer) and counts as no information: fully deep, no foam. Without a copy the surface is
30
+ * deep everywhere, foam off.
31
+ */
32
+ export declare const WATER_WGSL: string;
33
+ /** Copies a depth texture into the water's own depth32float copy (one fullscreen triangle). */
34
+ export declare const WATER_DEPTH_COPY_WGSL = "\n@group(0) @binding(0) var src: texture_depth_2d;\n@vertex fn vs(@builtin(vertex_index) i: u32) -> @builtin(position) vec4f {\n let p = vec2f(f32((i << 1u) & 2u), f32(i & 2u));\n return vec4f(p * 2.0 - 1.0, 0.0, 1.0);\n}\n@fragment fn fs(@builtin(position) pos: vec4f) -> @builtin(frag_depth) f32 {\n return textureLoad(src, vec2i(pos.xy), 0);\n}\n";