@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,741 @@
1
+ import { Camera } from './camera.js';
2
+ import { type RendererCaps } from './compressed.js';
3
+ import { type Drawable, type DrawParams, Frame, type FrameSink, type InstanceBatch, type InstanceParams } from './frame.js';
4
+ import { FullscreenPass, type FullscreenPassDesc } from './fullscreen.js';
5
+ import { type GpuPassTimes, GpuTimer } from './gpu-timer.js';
6
+ import { InstanceList, type InstanceListOptions } from './instance-list.js';
7
+ import { type MeshLod, type MeshLodChain, type MeshLodDesc } from './lod.js';
8
+ import { Material, type MaterialDesc } from './material.js';
9
+ import { Mesh, type MeshBounds, type MeshDesc } from './mesh.js';
10
+ import { PingPong } from './ping-pong.js';
11
+ import { SceneTarget, type SceneTargetAux, type SceneTargetDesc, type SceneTargetViewport } from './scene-target.js';
12
+ import { type PixelData, type SamplerKind, Texture, type TextureDesc, type TextureLike, type TextureSource } from './texture.js';
13
+ import { type Transform } from './transform.js';
14
+ export interface PostInputs {
15
+ color: TextureLike;
16
+ emissive: TextureLike;
17
+ time: number;
18
+ dt: number;
19
+ /**
20
+ * The target's depth buffer when a depth camera rendered into it this frame (ws/post-depth),
21
+ * else `null` (the 2D path). Same size as `color`; `depth24plus`, bind it as `texture_depth_2d`.
22
+ */
23
+ depth: TextureLike | null;
24
+ /** The last depth camera's projection, with `depth`; `null` without it. */
25
+ projection: PostProjection | null;
26
+ /**
27
+ * The matrices of the last camera that rendered into the target this frame (ws/render-4):
28
+ * what a reprojecting pass (TAA, motion blur) needs. `null` before any view.
29
+ */
30
+ view: PostView | null;
31
+ /** The target's `rg8unorm` roughness/metalness attachment (`SceneTargetDesc.aux`), else null. */
32
+ roughMetal: TextureLike | null;
33
+ /** The target's `rg16float` screen-space velocity attachment (`SceneTargetDesc.aux`), else null. */
34
+ velocity: TextureLike | null;
35
+ }
36
+ /** A view's matrices for post passes: this frame's (with jitter) and last frame's (without). */
37
+ export interface PostView {
38
+ viewProj: Float32Array;
39
+ invViewProj: Float32Array;
40
+ previousViewProj: Float32Array;
41
+ previousView: Float32Array;
42
+ /** The sub-pixel jitter applied this frame, in target pixels; `[0, 0]` without. */
43
+ jitter: [number, number];
44
+ }
45
+ /** A frame's projection for depth-reading post passes: clip planes and the column-major matrix. */
46
+ export interface PostProjection {
47
+ near: number;
48
+ /** `Infinity` for an infinite far plane. */
49
+ far: number;
50
+ proj: Float32Array;
51
+ }
52
+ /**
53
+ * The final stage: turns the HDR scene into swapchain pixels. See `@thunderclap-engine/engine/post`.
54
+ * `viewport` (ws/xr-post) asks for the result in that part of `output` only (texture px, so an
55
+ * eye of a shared XR layer), loading the rest; without it the whole output is written. The
56
+ * inputs may be smaller or larger than the last `resize`: a processor sizes itself to them.
57
+ */
58
+ export interface PostProcessor {
59
+ /**
60
+ * The processor reads `PostInputs.view.jitter` and reprojects (TAA): the renderer then applies
61
+ * each camera's `setJitter` offset to its projection. Without it no camera is ever jittered,
62
+ * whatever `setJitter` was given, so existing pages never move.
63
+ */
64
+ wantsJitter?: boolean;
65
+ resize(width: number, height: number): void;
66
+ encode(encoder: GPUCommandEncoder, inputs: PostInputs, output: GPUTextureView, viewport?: SceneTargetViewport): void;
67
+ }
68
+ /** Arguments to `Renderer.createSpriteMaterial`. */
69
+ export interface SpriteMaterialOptions {
70
+ /** The sprite texture (an atlas, a `Texture`, `defaultTextures(device).white`). */
71
+ texture: TextureLike;
72
+ /** Debug label. Default `'sprite'`. */
73
+ label?: string;
74
+ /** Default `'alpha'`. */
75
+ blend?: MaterialDesc['blend'];
76
+ /** Default `'linear-clamp'`; pixel art wants `'nearest-clamp'`. */
77
+ sampler?: SamplerKind;
78
+ }
79
+ export interface RendererOptions {
80
+ logicalWidth?: number;
81
+ logicalHeight?: number;
82
+ /** Initial instance capacity (grows by doubling). Default 4096. */
83
+ initialInstances?: number;
84
+ /** Aux attachments of the default `target` (`SceneTargetDesc.aux`); none by default. */
85
+ aux?: SceneTargetAux;
86
+ }
87
+ export interface RendererGpu {
88
+ device: GPUDevice;
89
+ context: GPUCanvasContext;
90
+ format: GPUTextureFormat;
91
+ }
92
+ export interface RenderStats {
93
+ drawCalls: number;
94
+ /**
95
+ * Triangles the scene passes asked the GPU for, summed over views: each draw's indices (or
96
+ * vertices, non-indexed) / 3 × its instance count. Drawables and the shadow pass are not
97
+ * counted (a drawable issues its own draws).
98
+ */
99
+ triangles: number;
100
+ /** Instances the scene passes drew (`frame.mesh` / `sprite` draws and batch instances), summed over views. */
101
+ instances: number;
102
+ drawables: number;
103
+ /** Batches (`frame.meshes`) and lists (`frame.list`) the scene passes drew, summed over views. */
104
+ batches: number;
105
+ /** Mesh draws skipped by frustum culling (`camera.cull`), summed over the frame's views. */
106
+ culled: number;
107
+ /**
108
+ * Instances drawn into the sun's shadow map, summed over the frame's views: the opaque
109
+ * casters inside the sun's box, whether or not the view's frustum sees them.
110
+ */
111
+ shadowDraws: number;
112
+ /**
113
+ * Scene render passes encoded this frame: one per view, two for a view that split at the
114
+ * opaque/blended boundary for a `readsDepth` drawable (ws/render-hooks). Shadow and post
115
+ * passes are not counted.
116
+ */
117
+ passes: number;
118
+ /**
119
+ * Instances drawn per LOD level (`frame.mesh` with a `MeshLod`, ws/render-5), summed over the
120
+ * scene passes of the frame: `lodCounts[i]` drew level `i`. Grows to the longest chain drawn;
121
+ * zeroed by `beginFrame`.
122
+ */
123
+ lodCounts: number[];
124
+ }
125
+ /** Options of `Renderer.textureFromSource`. */
126
+ export interface TextureFromSourceOptions {
127
+ /** Store the bytes as `rgba8unorm` (no sRGB decode) for data maps. Default false (sRGB colour). */
128
+ linear?: boolean;
129
+ /** Allocate and fill the full mip chain. Default false (one level). */
130
+ mips?: boolean;
131
+ /** Texture label when the options object replaces the label argument. Default `'image'`. */
132
+ label?: string;
133
+ }
134
+ /**
135
+ * Internal resolution of the scene targets relative to the output (the canvas backbuffer).
136
+ * The post stack (or the built-in present pass) upscales to the full output, so DOM UI and
137
+ * the final composite stay at native resolution.
138
+ */
139
+ export interface ResolutionOptions {
140
+ /** Linear scale of the scene targets vs the output, 0.25..1. Default 1. */
141
+ scale?: number;
142
+ /** Cap on scene-target pixels (width × height). Default unlimited. */
143
+ maxPixels?: number;
144
+ }
145
+ /**
146
+ * Frame timing, filled in when `Renderer.timingEvery > 0`.
147
+ *
148
+ * With `timestamp-query` (`source: 'timestamp'`), `gpuMs` is the GPU time from the frame's
149
+ * first pass to its last, and `passes` splits it by pass label (`pre`, `scene`, plus whatever
150
+ * the post processor labels, e.g. `bloom`, `rays`, `composite`).
151
+ *
152
+ * Without it (`source: 'queue'`), `gpuMs` is the time from submit to
153
+ * `queue.onSubmittedWorkDone()`. With vsync the queue is normally idle at submit, so this
154
+ * approximates the GPU cost of the frame; when the GPU falls behind it also includes
155
+ * queueing, which still reads as "over budget". `passes` stays empty.
156
+ */
157
+ export interface FrameTiming {
158
+ /** Last GPU sample (ms). */
159
+ gpuMs: number;
160
+ /** Where `gpuMs` comes from. */
161
+ source: 'timestamp' | 'queue';
162
+ /** Per-pass GPU ms of the last timestamp sample (empty on `queue`). */
163
+ passes: GpuPassTimes;
164
+ /** CPU time of the last frame, `beginFrame` → `endFrame` returning (ms). */
165
+ cpuMs: number;
166
+ /** GPU samples taken so far. */
167
+ samples: number;
168
+ /**
169
+ * Resolves once the first GPU sample has landed (`samples` > 0; immediately when one already
170
+ * has), so a bench or demo can wait for a real `gpuMs` instead of polling. Set `timingEvery`
171
+ * before (or right after) calling it: with timing off, no sample is ever taken. Resolves at
172
+ * once when GPU timing is unsupported (a device with neither `timestamp-query` nor
173
+ * `queue.onSubmittedWorkDone`) or the renderer is destroyed before a sample arrives.
174
+ */
175
+ ready(): Promise<void>;
176
+ }
177
+ /** Smallest scale `setResolution` accepts (a quarter of the output in each direction). */
178
+ export declare const MIN_RESOLUTION_SCALE = 0.25;
179
+ /**
180
+ * Effective scene-target size for an output size and resolution options. Pure (unit-tested).
181
+ * Sizes are rounded to even numbers so the half-res bloom/ray targets stay pixel aligned.
182
+ */
183
+ export declare function sceneSize(outW: number, outH: number, opts: Required<ResolutionOptions>): {
184
+ width: number;
185
+ height: number;
186
+ scale: number;
187
+ };
188
+ /** The per-frame jitter hook of `Renderer.setJitter`: pixels `[x, y]` for frame `frame`. */
189
+ export type JitterFn = (frame: number) => readonly [number, number];
190
+ /**
191
+ * WebGPU renderer: owns the HDR scene targets, instanced batch, materials and the hand-off to
192
+ * the post stack. One per canvas.
193
+ *
194
+ * ```ts
195
+ * const r = new Renderer(gpu);
196
+ * r.resize(w, h);
197
+ * const f = r.beginFrame(time, dt);
198
+ * f.sprite(myMaterial, { x: 960, y: 540, w: 200, h: 200 });
199
+ * r.endFrame(); // = r.render(f, r.camera) into r.target, then post + present
200
+ * ```
201
+ *
202
+ * A frame is `beginFrame` → record → `render(frame, camera, target?, viewport?)` any number of
203
+ * times → `endFrame`. Each `render` runs the recorded draw lists through one camera (its layer
204
+ * mask, sort and depth) into a `SceneTarget` (default `renderer.target`, what the surface
205
+ * shows); `endFrame` renders through `renderer.camera` when nothing called `render`, then runs
206
+ * the post stack (or the built-in present) from `renderer.target` to the swapchain and submits.
207
+ */
208
+ export declare class Renderer implements FrameSink {
209
+ readonly device: GPUDevice;
210
+ readonly context: GPUCanvasContext;
211
+ /** Swapchain format. */
212
+ readonly format: GPUTextureFormat;
213
+ /**
214
+ * Formats of the scene pass's two base colour targets (HDR colour, HDR emissive). A target
215
+ * with aux attachments adds more after them: build a pipeline's target list with
216
+ * `sceneTargets`, not from this.
217
+ */
218
+ readonly sceneFormats: readonly GPUTextureFormat[];
219
+ readonly logicalWidth: number;
220
+ readonly logicalHeight: number;
221
+ /**
222
+ * The camera the scene pass draws through, uploaded to the camera block each frame.
223
+ * Default `Camera.ortho2d(logicalWidth, logicalHeight)`; its `x`, `y`, `zoom` and
224
+ * `rotation` pan the 2D view. Assign another `Camera` to swap presets.
225
+ */
226
+ camera: Camera;
227
+ readonly samplers: Record<SamplerKind, GPUSampler>;
228
+ /**
229
+ * What the device can do beyond core WebGPU, read from its features at construction
230
+ * (ws/render-5): `caps.compressed.bc` / `.etc2` / `.astc` are the block-compression families
231
+ * `uploadKtx2` can upload. A device gets them only when created with them
232
+ * (`compressionFeatures(adapter)` in `requiredFeatures`).
233
+ */
234
+ readonly caps: RendererCaps;
235
+ readonly globalsLayout: GPUBindGroupLayout;
236
+ /**
237
+ * The engine uniforms of the frame's first view (`@group(0)`: globals, camera and lights
238
+ * blocks, the sun's shadow map and its sampler). Replaced when the shadow map is (re)created.
239
+ */
240
+ globalsBindGroup: GPUBindGroup;
241
+ readonly quad: Mesh;
242
+ /** Built-in sprite material bound to the default white texture (solid colour quads via tint). */
243
+ readonly defaultSprite: Material;
244
+ readonly stats: RenderStats;
245
+ /**
246
+ * The band around each LOD threshold an instance must cross before it changes level, as a
247
+ * fraction of the threshold (default 0.1): see `pickLodLevel`. 0 turns it off.
248
+ */
249
+ lodHysteresis: number;
250
+ /** See `FrameTiming`. Only updated while `timingEvery > 0`. */
251
+ readonly timing: FrameTiming;
252
+ /** Resolvers of `timing.ready()` promises waiting on the first GPU sample. */
253
+ private readonly readyWaiters;
254
+ /**
255
+ * Pass timer when the device has `timestamp-query`, else null. Passes encoded during
256
+ * `endFrame` (the post processor's included) label themselves with `gpuTimer.pass(label)`;
257
+ * it returns undefined except on sampled frames.
258
+ */
259
+ readonly gpuTimer: GpuTimer | null;
260
+ /**
261
+ * Sample GPU time every N frames (0 = off). One sample is in flight at a time; each costs one
262
+ * `onSubmittedWorkDone` promise.
263
+ */
264
+ timingEvery: number;
265
+ /** Final stage. Defaults to a plain tonemap + sRGB present; set to a `PostStack`. */
266
+ post: PostProcessor | null;
267
+ /** Scene-target size (internal resolution). The post stack reads these. */
268
+ width: number;
269
+ height: number;
270
+ /** Output (canvas backbuffer) size, as passed to `resize`. */
271
+ outputWidth: number;
272
+ outputHeight: number;
273
+ /**
274
+ * The default `SceneTarget`, at the scene resolution: what `render` draws into unless given
275
+ * another, what the post stack reads and what the surface shows.
276
+ */
277
+ readonly target: SceneTarget;
278
+ private readonly views;
279
+ private viewCount;
280
+ /** The sun's shadow map and its pipelines (see `shadow.ts`). */
281
+ private readonly shadow;
282
+ /** Engine uniform slots for the shadow passes of a frame (the sun camera in the camera block). */
283
+ private readonly shadowSlots;
284
+ private shadowCount;
285
+ private readonly shadowRect;
286
+ private readonly globalsData;
287
+ private readonly globalsU32;
288
+ private readonly viewRect;
289
+ /** Targets rendered into so far this frame, and whether their depth was cleared. */
290
+ private readonly usedTargets;
291
+ private readonly usedDepth;
292
+ /** The last depth camera into each used target (ws/post-depth: `PostInputs.projection`). */
293
+ private readonly usedCamera;
294
+ /** `sceneTargets` lists per blend state object (`NO_BLEND` for none; weak, so a caller's
295
+ * fresh blend object is not kept), indexed by aux key. */
296
+ private readonly sceneTargetLists;
297
+ /** The target `buildDraws` is building for (its aux set keys the pipelines). */
298
+ private drawTarget;
299
+ private readonly postProjection;
300
+ /** `PostInputs.view` storage, one per inputs object (`postInputs`, `resolveInputs`). */
301
+ private readonly postView;
302
+ private readonly resolveView;
303
+ private usedCount;
304
+ private instanceData;
305
+ private instanceBuffer;
306
+ /** Byte offset in `instanceBuffer` where the next view's instances go. */
307
+ private instanceBase;
308
+ /** Instance buffers outgrown this frame, destroyed after submit (passes still reference them). */
309
+ private readonly retired;
310
+ /**
311
+ * The shared previous-matrix lane (ws/render-7): 12 floats per instance, indexed like the
312
+ * view's upload, for batches with `prevMatrices` drawn into a velocity target by an aux
313
+ * material. Made on first use; `laneBase` is the current view's byte offset in it.
314
+ */
315
+ private laneData;
316
+ private laneBuffer;
317
+ private laneBase;
318
+ /** The previous matrices `copyBatch` / `copyBatchLod` copy into `laneData`, else null. */
319
+ private laneSrc;
320
+ /** Batch records with `prev` this frame, and whether the current view drew one with the lane. */
321
+ private laneRecs;
322
+ private laneUsed;
323
+ private instanceCount;
324
+ /** Instances in this frame's batches (`pushBatch`), excluding lists; they take the sort path. */
325
+ private batchInstances;
326
+ /** Batch records this frame (lists included). */
327
+ private batchRecs;
328
+ /** Records with a LOD chain this frame. */
329
+ private lodRecs;
330
+ /** The camera `pickLods` is picking for. */
331
+ private lodCam;
332
+ /** The LOD level memory of each camera (view) that drew a LOD record. */
333
+ private readonly lodMemory;
334
+ /** Per camera: each single draw's Transform history for the velocity lane (ws/render-8). */
335
+ private readonly motionMemory;
336
+ /** Per-instance level scratch of `copyBatchLod` (-1: culled). */
337
+ private lodScratch;
338
+ /** `copyBatchLod`'s buckets: first instance, count and write cursor per level. */
339
+ private bucketFirst;
340
+ private bucketCount;
341
+ private bucketAt;
342
+ /** `setJitter`'s hook, the frames it has run and this frame's offset. */
343
+ private jitterFn;
344
+ private jitterFrame;
345
+ private jitterX;
346
+ private jitterY;
347
+ /** Cameras the hook has jittered (cleared when it is removed). */
348
+ private readonly jitterCams;
349
+ /** Batch or list draws of the current view's scene pass, and instances `copyBatch` dropped. */
350
+ private sceneBatches;
351
+ private batchCulled;
352
+ /** Instances of the lists the current view's scene pass draws (not in the upload). */
353
+ private sceneListInstances;
354
+ /** This view's scene commands (`buildDraws`). */
355
+ private readonly scene;
356
+ /** This view's shadow-pass commands (`buildShadowDraws`): opaque casters inside the sun box. */
357
+ private readonly shadowCmds;
358
+ private readonly recs;
359
+ private recCount;
360
+ /** True while every draw this frame had `order` >= the previous draw's. */
361
+ private ordered;
362
+ private lastOrder;
363
+ private sortIdx;
364
+ private sortTmp;
365
+ private sortDepth;
366
+ /** Record indices of the shadow list, sorted by mesh then material (`sortShadow`). */
367
+ private shadowIdx;
368
+ private shadowTmp;
369
+ /** True while `sortDraws` orders the shadow list (mesh, material, index) instead of the scene. */
370
+ private sortShadow;
371
+ /** Stable numeric keys for meshes and materials, for the shadow sort; grows per new object. */
372
+ private readonly keys;
373
+ private nextKey;
374
+ /** Instance data in draw order, used when sorting or layer culling reorders draws. */
375
+ private sortedData;
376
+ /** The array `endFrame` uploads: `instanceData` (submission order) or `sortedData`. */
377
+ private uploadData;
378
+ /** Instances `render` uploads for this view: the scene's, then the shadow list's copies. */
379
+ private uploadCount;
380
+ /** Instances the scene pass draws this view (layer- and frustum-culled draws excluded). */
381
+ private sceneCount;
382
+ /** Draws the last `buildDraws` dropped by the frustum test. */
383
+ private culledCount;
384
+ private readonly prePasses;
385
+ private readonly prepared;
386
+ /**
387
+ * Where the last `buildDraws` would split the scene commands for a `readsDepth` drawable:
388
+ * the index of the first blended command at or above the lowest hooked order; -1 when no
389
+ * visible drawable asked (or the camera has no depth test).
390
+ */
391
+ private splitAt;
392
+ /** Drawables whose `afterOpaque` ran for the current view (once each). */
393
+ private readonly hooked;
394
+ /** The `ViewInfo` handed to `afterOpaque`, reused across views. */
395
+ private readonly viewInfo;
396
+ /** Per-draw uniform sets with blocks staged this frame. */
397
+ private readonly drawUniformSets;
398
+ private readonly dynamicOffsets;
399
+ private readonly frame;
400
+ private readonly present;
401
+ private presentGroup;
402
+ private readonly postInputs;
403
+ /** `resolve` (ws/xr-post): inputs for an explicit target and the present group cached for it. */
404
+ private readonly resolveInputs;
405
+ private resolveTarget;
406
+ private resolveColor;
407
+ private resolveGroup;
408
+ /** The frame's command encoder, opened by the first `render`, submitted by `endFrame`. */
409
+ private encoder;
410
+ private sampled;
411
+ private readonly resizeListeners;
412
+ private readonly resolution;
413
+ private inFrame;
414
+ private destroyed;
415
+ private frameStart;
416
+ private timingFrame;
417
+ private timingPending;
418
+ private timingSubmit;
419
+ private readonly timingListeners;
420
+ private readonly onTimingDone;
421
+ private readonly onTimerResult;
422
+ constructor(gpu: RendererGpu, opts?: RendererOptions);
423
+ /** The default target's HDR colour texture (`target.color`). */
424
+ get sceneColor(): Texture;
425
+ /** The default target's HDR emissive texture (`target.emissive`). */
426
+ get sceneEmissive(): Texture;
427
+ /**
428
+ * Set the output size (canvas backbuffer pixels). The HDR scene targets follow it, scaled
429
+ * by `setResolution`. Cheap no-op when nothing changes.
430
+ */
431
+ resize(width: number, height: number): void;
432
+ /**
433
+ * Render the scene below output resolution: `scale` (0.25..1, linear) and/or a `maxPixels`
434
+ * budget. The final pass upscales to the canvas. Only the given fields change. Changing it
435
+ * reallocates the scene and post targets, so do it rarely (a resolution controller should
436
+ * step, not track every frame).
437
+ */
438
+ setResolution(opts: ResolutionOptions): void;
439
+ /** Current resolution settings (scale as requested, before the pixel budget). */
440
+ get resolutionOptions(): Readonly<Required<ResolutionOptions>>;
441
+ /** Effective linear scale of the scene targets vs the output (after the pixel budget). */
442
+ get resolutionScale(): number;
443
+ private applyResolution;
444
+ /** Called with every GPU time sample (see `timingEvery`). Returns unsubscribe. */
445
+ onGpuTime(fn: (gpuMs: number) => void): () => void;
446
+ /** Called after the scene targets change size, with the scene size. Returns unsubscribe. */
447
+ onResize(fn: (width: number, height: number) => void): () => void;
448
+ /**
449
+ * The colour target list (`GPUFragmentState.targets`) of a pipeline that draws into the
450
+ * scene pass of a target with aux key `aux` (`SceneTarget.auxKey`; default
451
+ * `renderer.target`'s, ws/render-10): colour and emissive (`sceneFormats`) with `blend`,
452
+ * then each aux attachment the target has (rough-metal, velocity) with `writeMask: 0`. Every
453
+ * pipeline drawing into the scene pass takes its targets from here (materials build theirs
454
+ * the same way), so its count matches the pass's whichever aux attachments are on. A
455
+ * `Drawable` that may draw into more than one target keys its pipelines on
456
+ * `frame.auxKey` (set per view, like `frame.depthFormat`) and passes it here. The list is
457
+ * built once per (`blend`, `aux`) and the same array returned after; do not mutate it.
458
+ */
459
+ sceneTargets(blend?: GPUBlendState, aux?: number): GPUColorTargetState[];
460
+ createMaterial(desc: MaterialDesc): Material;
461
+ /**
462
+ * The built-in textured sprite material (`texture × vertex colour × tint`; emissive is the
463
+ * colour × `emissive`): `createSpriteMaterial({ texture, label, blend, sampler })`, the same
464
+ * option-object shape as `createMaterial`. `label` defaults to `'sprite'`, `blend` to
465
+ * `'alpha'` and `sampler` to `'linear-clamp'`.
466
+ */
467
+ createSpriteMaterial(opts: SpriteMaterialOptions): Material;
468
+ createMesh(desc: MeshDesc): Mesh;
469
+ /**
470
+ * Upload a LOD chain (ws/api-render): one mesh per `geometries` entry, labelled
471
+ * `<label>-lod<i>`, returned with the thresholds and the geometries as a `MeshLod` that
472
+ * `frame.mesh` takes in place of a mesh. geom's `createLodChain(g, ratios)` builds the
473
+ * geometries (level 0 is `g`, so `ratios.length + 1` levels and `ratios.length` thresholds).
474
+ * Throws on an empty chain or more thresholds than levels.
475
+ */
476
+ createMeshLod(desc: MeshLodDesc): MeshLodChain;
477
+ createTexture(desc: TextureDesc): Texture;
478
+ /**
479
+ * A scene target of its own size for `render` to draw a view into offscreen (a portal, a
480
+ * minimap, a picture-in-picture camera). Its `color`/`emissive` are sampleable textures;
481
+ * it is not resized with the surface. The caller destroys it.
482
+ */
483
+ createSceneTarget(desc: SceneTargetDesc): SceneTarget;
484
+ /** Offscreen render target (sampleable). Default format is the HDR scene format. */
485
+ createRenderTarget(desc: TextureDesc): Texture;
486
+ createFullscreenPass(desc: FullscreenPassDesc): FullscreenPass;
487
+ /**
488
+ * Upload an image/canvas/ImageData. By default it is an sRGB colour texture (sampled as
489
+ * linear). Pass `{ linear: true }` for data (masks, normals, lookup tables): the bytes are
490
+ * stored as `rgba8unorm` and sampled exactly as written, with no sRGB decode. `{ mips: true }`
491
+ * allocates the full mip chain and fills it on the GPU (`generateMipmaps`), the same as
492
+ * `loadTexture`; the default is one level. The options object may replace the label
493
+ * (`textureFromSource(src, { mips: true })`), or follow it.
494
+ */
495
+ textureFromSource(source: TextureSource, label?: string | TextureFromSourceOptions, opts?: TextureFromSourceOptions): Texture;
496
+ /**
497
+ * Upload raw texels. Default format `rgba8unorm` (linear data, no sRGB decode); any format
498
+ * from `bytesPerTexel` works, e.g. `r8unorm` masks or `rgba32float` lookup tables. `data`
499
+ * holds `width × height` tightly packed texels.
500
+ */
501
+ textureFromPixels(desc: {
502
+ width: number;
503
+ height: number;
504
+ data: PixelData;
505
+ format?: GPUTextureFormat;
506
+ label?: string;
507
+ usage?: GPUTextureUsageFlags;
508
+ }): Texture;
509
+ /** Overwrite a whole texture with tightly packed texels (e.g. a CPU-updated data texture). */
510
+ writePixels(tex: Texture, data: PixelData): void;
511
+ /**
512
+ * Two render targets for feedback passes (see `PingPong`). Default format is the HDR
513
+ * scene format.
514
+ */
515
+ createPingPong(desc: TextureDesc): PingPong;
516
+ /**
517
+ * Generate a texture procedurally on the GPU. `wgsl` must define
518
+ * `fn shade(uv: vec2f) -> vec4f` returning **linear** colour (uv 0..1, top-left origin).
519
+ * Engine noise helpers (`engine_fbm` …) are available. Optional uniforms at
520
+ * `@group(0) @binding(0)`.
521
+ */
522
+ textureFromShader(opts: {
523
+ width: number;
524
+ height: number;
525
+ wgsl: string;
526
+ label?: string;
527
+ format?: GPUTextureFormat;
528
+ uniforms?: Float32Array<ArrayBuffer>;
529
+ }): Texture;
530
+ /**
531
+ * The renderer's jitter hook (ws/render-6): `fn(frame)` runs once per `beginFrame` (`frame`
532
+ * counts from 0 since the hook was set) and its `[x, y]` (target pixels, +x right, +y down)
533
+ * goes to every camera `render` draws this frame, XR eyes included, through
534
+ * `camera.setJitter`, with the jitter target set per view as when the post processor
535
+ * `wantsJitter`. The renderer keeps each camera's history (`recordHistory`), so
536
+ * `previousViewProj` and `previousView` stay unjittered. `null` removes the hook and clears
537
+ * the jitter of every camera it reached. Without a hook `Camera.setJitter` works as before.
538
+ * Return a reused tuple to keep the frame allocation-free.
539
+ */
540
+ setJitter(fn: JitterFn | null): void;
541
+ /**
542
+ * The jitter hook installed by `setJitter`, or null when none is (ws/render-8). Read-only:
543
+ * compare it by identity, so a post stack can check whether the renderer still holds the
544
+ * hook it installed (`renderer.jitter === myHook`) before clearing it, and leave another
545
+ * owner's hook alone.
546
+ */
547
+ get jitter(): JitterFn | null;
548
+ /**
549
+ * The LOD level instance `index` of a LOD batch or list (`frame.meshes` / `frame.list` on a
550
+ * `MeshLod`) drew at for `camera` (default `this.camera`) in the last frame that drew it,
551
+ * or -1 when it has none (ws/render-7). For probes and debug overlays: it reads the view's
552
+ * level memory, which a keyed `InstanceList` carries by key across flushes.
553
+ */
554
+ lodLevelOf(batch: object, index: number, camera?: Camera): number;
555
+ /** Start recording a frame. `time`/`dt` in seconds are exposed to shaders via `globals`. */
556
+ beginFrame(time: number, dt: number): Frame;
557
+ /**
558
+ * Run the draw lists recorded in `frame` through `camera` into `target` (default: the
559
+ * renderer's own, which the surface shows). Call it any number of times between
560
+ * `beginFrame` and `endFrame`; `endFrame` calls it with `renderer.camera` when nothing did.
561
+ *
562
+ * Each call is one scene pass: the camera's layer mask culls, its depth flags pick the sort
563
+ * and the depth attachment, and its `screen` rect is the viewport. A `screen` in logical
564
+ * units (the `ortho2d` default is the whole design space) maps onto the target in
565
+ * proportion; one inside the unit square (the perspective default `0,0,1,1`) is a fraction
566
+ * of it. The first view into a target this frame clears it (`frame.clearColor`); later ones
567
+ * draw over it, so a UI camera over a world camera or two half-screen cameras just work.
568
+ * The first call opens the frame's command encoder and runs the pre-passes and drawable
569
+ * `prepare` hooks (once per frame). No allocation in steady state.
570
+ */
571
+ render(frame: Frame, camera: Camera, target?: SceneTarget): void;
572
+ /** Viewport and scissor of a view that does not cover its target. */
573
+ private setViewRect;
574
+ /**
575
+ * Encode scene commands `[from, to)` into `pass` (group 0 already bound to `slot.group`),
576
+ * counting draw calls and drawables into `stats`.
577
+ */
578
+ private encodeDraws;
579
+ /**
580
+ * Run the post stack (or the built-in present) from `target` into `out` now, inside the frame
581
+ * (ws/xr-post): what `endFrame` does from `renderer.target` to the swapchain, for any target
582
+ * and any output. `viewport` confines the result to that part of `out` (texture px) and loads
583
+ * the rest, so two eyes resolve into one XR layer texture one after the other. The target is
584
+ * consumed: the next `render` into it this frame clears it again, so one HDR target serves
585
+ * every eye in turn. Needs a `render` before it this frame (the encoder is open then).
586
+ */
587
+ resolve(target: SceneTarget, out: GPUTextureView, viewport?: SceneTargetViewport): void;
588
+ /**
589
+ * `PostInputs.depth` / `projection` (ws/post-depth): the target's depth and the last depth
590
+ * camera's projection when one rendered into it this frame, else `null`. No allocation.
591
+ */
592
+ private fillDepthInputs;
593
+ /**
594
+ * Finish the frame: `render(frame, renderer.camera)` when nothing rendered yet, then the
595
+ * post stack (or the built-in present) from `renderer.target` to the swapchain, and submit.
596
+ * `{ present: false }` skips the post stack and the swapchain (no `getCurrentTexture`): the
597
+ * frame's views went to their own targets, as an XR session's eyes do (ws/xr), resolved into
598
+ * the layer with `resolve` (ws/xr-post).
599
+ */
600
+ endFrame(opts?: {
601
+ present?: boolean;
602
+ }): void;
603
+ /** Every `timingEvery` frames, when no sample is in flight. */
604
+ private wantSample;
605
+ private emitGpuTime;
606
+ /** `timing.ready()`: a settled promise once a sample exists, else one kept until the first. */
607
+ private timingReady;
608
+ private resolveReady;
609
+ destroy(): void;
610
+ pushInstance(material: Material, mesh: Mesh, tr: Transform | null, p: DrawParams | InstanceParams, bounds: MeshBounds | null, lod?: MeshLod | null): void;
611
+ pushBatch(material: Material, mesh: Mesh, batch: InstanceBatch, bounds: MeshBounds | null, list: InstanceList | null, lod?: MeshLod | null): void;
612
+ /**
613
+ * A retained `InstanceList` of up to `capacity` instances of `mesh` with `material`, drawn
614
+ * with `frame.list(list)`. Owns a GPU buffer; `list.destroy()` releases it. A `MeshLod`
615
+ * (ws/render-6) makes a list whose instances pick their level per view.
616
+ */
617
+ createInstanceList(mesh: Mesh | MeshLod, material: Material, capacity: number, opts?: InstanceListOptions): InstanceList;
618
+ pushDrawable(d: Drawable, order: number, layers: number): void;
619
+ pushPrePass(fn: (encoder: GPUCommandEncoder) => void): void;
620
+ private nextRec;
621
+ /**
622
+ * Turn this frame's draw records into batched commands. Draws whose `layers` miss the
623
+ * camera's mask are dropped; with `camera.cull`, so are mesh draws whose world bounding
624
+ * sphere lies outside any plane of `camera.frustum` (counted in `culledCount`). Without
625
+ * depth or culling, draws sort by `order` then submission index; when every `order` is
626
+ * already non-decreasing (the default) nothing moves and the instance data uploads as
627
+ * recorded. With `camera.depthTest`, the keys are `order`, then opaque before blended, then
628
+ * depth (opaque front-to-back, blended back-to-front), then submission index. Sets
629
+ * `uploadData` / `uploadCount`; returns whether depth is on. With `frame.lights.sun.shadow`
630
+ * set, `buildShadowDraws` then appends the shadow list's instances to the same upload.
631
+ */
632
+ private buildDraws;
633
+ /** `cam`'s motion memory, advanced to a new view (one per `render` with lane records). */
634
+ private motionView;
635
+ /**
636
+ * Write the previous world matrix of a single draw's `tr` into lane slot `slot`: the matrix
637
+ * `tr` held at this view's last frame, or the current one (zero motion) when the view did
638
+ * not draw it then (first seen, or culled or skipped last frame). The current matrix is
639
+ * `src[from..from+12]`, as recorded. A transform drawn twice with different matrices in one
640
+ * view is a scratch transform: it reports no motion of its own from then on. Allocates only
641
+ * on a transform's first draw in a view.
642
+ */
643
+ private writeMotion;
644
+ /**
645
+ * Pick this view's level of every LOD record (`frame.mesh` with a `MeshLod`): the projected
646
+ * height of its world sphere through `cam` on the view's viewport (`lodSizePx`) times
647
+ * `cam.lodBias`, against the chain's thresholds with `lodHysteresis` around the level its key
648
+ * drew last (`pickLodLevel`). Sets the record's `mesh` (so the scene and shadow lists draw the
649
+ * level) and, for opaque materials, the sort keys that group a level's instances into one
650
+ * draw. No allocation.
651
+ */
652
+ private pickLods;
653
+ /**
654
+ * `pickLods` for a batch or list record: every instance's level for this view, from the
655
+ * sphere of `meshes[0].bounds` through its matrix (as `pushInstance` places it), with the
656
+ * hysteresis held per instance index in the view's memory for the batch. The levels land in
657
+ * `r.lodLevels` (that memory), read by the scene and the shadow copy alike, so a shadow pass
658
+ * draws the level the view picked. Grows the memory only when the batch does.
659
+ */
660
+ private pickBatchLods;
661
+ /** Count `n` scene instances of LOD level `level` in `stats.lodCounts`. */
662
+ private countLod;
663
+ /**
664
+ * Copy the instances of batch record `r` into `dst` from instance `inst` on, in the instance
665
+ * format (matrices, then `params` or the defaults with the matrix columns' lengths as size).
666
+ * With `planes` and a batch without bounds (`r.mb` set), each instance is tested the way
667
+ * `pushInstance` places a mesh sphere and the ones outside are skipped, counted in
668
+ * `batchCulled`. Returns the instances written. No allocation.
669
+ */
670
+ private copyBatch;
671
+ /**
672
+ * `copyBatch` for a LOD batch or list: the instances that pass the same per-instance test,
673
+ * written bucketed by the level `pickLods` chose for this view (`r.lodLevels`), level 0
674
+ * first. Sets `bucketFirst` / `bucketCount` per level and `batchCulled`; returns the
675
+ * instances written. Grows its scratch only when a batch outgrows it.
676
+ */
677
+ private copyBatchLod;
678
+ /** The shadow pipeline of a caster record (its current `mesh`). */
679
+ private shadowPipeline;
680
+ /**
681
+ * Build this view's shadow-pass commands: every opaque mesh draw with `castShadow` on the
682
+ * camera's layers whose bounding sphere touches the sun's box (`ShadowMap.sunCamera.frustum`,
683
+ * placed by `render` before the lists are built), whether or not the view's own frustum sees
684
+ * it. The casters are sorted by mesh, then material, then submission index, their instance
685
+ * data copied into `dst` from `inst` on (after the scene's), and batched into `shadowCmds`
686
+ * with the scene's keys, so one `(mesh, material)` is one instanced draw. Returns the new
687
+ * instance count of the upload. No allocation in steady state.
688
+ */
689
+ private buildShadowDraws;
690
+ /** A stable small integer for a mesh or material (assigned on first sight). */
691
+ private keyOf;
692
+ /** The scene pipeline of a mesh record for `depth` into the view's target. */
693
+ private scenePipeline;
694
+ /**
695
+ * Append a record to `list` as a command drawn with `pipeline`, merging into the previous
696
+ * one when it continues it (same pipeline, material, mesh, offset and shadow flag, and its
697
+ * instances follow on). Drawables pass `pipeline` null.
698
+ */
699
+ private batch;
700
+ /**
701
+ * True when record `a` draws before record `b` (a total order: ties go by index). For the
702
+ * scene list: `order`, then (with depth) group and depth; for the shadow list
703
+ * (`sortShadow`): mesh key, then material key.
704
+ */
705
+ private drawsBefore;
706
+ /** Bottom-up merge sort of `idx[0..n)` with `drawsBefore`, `tmp` as scratch; no allocation. */
707
+ private sortDraws;
708
+ private nextCmd;
709
+ private growInstances;
710
+ /**
711
+ * Upload this view's scene instances of the shared previous-matrix lane at the byte offset
712
+ * matching `base` in the instance buffer (48 bytes per instance where it has 112), growing
713
+ * the lane buffer when the frame outgrows it (the old one retires after submit).
714
+ */
715
+ private uploadLane;
716
+ private makeInstanceBuffer;
717
+ /**
718
+ * The engine uniform slot for view `i` of a frame, made on first use (slot 0 at startup).
719
+ * Its bind group carries the sun's shadow map at binding 3 (the 1×1 placeholder until a
720
+ * shadow pass has rendered; `encodeShadow` rebuilds the groups when the map changes).
721
+ */
722
+ private viewSlot;
723
+ /** The uniform slot for shadow pass `i` of a frame; binds the placeholder, not the map. */
724
+ private shadowSlot;
725
+ /** A `globalsLayout` bind group over `buffer`, with the shadow map (or its placeholder) at 3. */
726
+ private globalsGroup;
727
+ /**
728
+ * When `frame.lights.sun.shadow` is set and this view has opaque shadow casters inside the
729
+ * sun's box, encode one depth-only pass into the sun's shadow map (through
730
+ * `ShadowMap.sunCamera`, an ortho box centred on `camera.position`, placed by `render`) over
731
+ * `shadowCmds` (built by `buildShadowDraws`: casters the view frustum culled included), before
732
+ * its scene pass. Returns what `writeView` puts in the lights block, or null when no shadow
733
+ * was rendered.
734
+ */
735
+ private encodeShadow;
736
+ /**
737
+ * Upload the globals, camera and lighting blocks of one view (`viewRect` holds its viewport;
738
+ * `view_index` is `camera.viewIndex`; `shadow` is this view's shadow pass, if any).
739
+ */
740
+ private writeView;
741
+ }