@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,47 @@
1
+ /** Wrapped parallax offset: `camera - (camera × factor mod wrap)`, in `camera - wrap .. camera`. */
2
+ export function parallaxOffset(camera, factor, wrap) {
3
+ if (wrap === undefined || !(wrap > 0))
4
+ return camera * (1 - factor);
5
+ const scroll = camera * factor;
6
+ return camera - (((scroll % wrap) + wrap) % wrap);
7
+ }
8
+ /**
9
+ * Make a `Parallax` over layers built on `renderer`. Each layer's `origin` at this moment is its
10
+ * base position. Allocates once.
11
+ */
12
+ export function createParallax(_renderer, layers) {
13
+ const list = layers.map((l) => ({
14
+ layer: l.layer,
15
+ factorX: l.factorX,
16
+ factorY: l.factorY,
17
+ wrapW: l.wrapW,
18
+ wrapH: l.wrapH,
19
+ params: l.params,
20
+ baseX: l.layer.origin.x,
21
+ baseY: l.layer.origin.y,
22
+ offsetX: 0,
23
+ offsetY: 0,
24
+ }));
25
+ return {
26
+ layers: list,
27
+ update(cameraX, cameraY) {
28
+ for (let i = 0; i < list.length; i++) {
29
+ const l = list[i];
30
+ l.offsetX = parallaxOffset(cameraX, l.factorX, l.wrapW);
31
+ l.offsetY = parallaxOffset(cameraY, l.factorY, l.wrapH);
32
+ l.layer.origin.x = l.baseX + l.offsetX;
33
+ l.layer.origin.y = l.baseY + l.offsetY;
34
+ }
35
+ },
36
+ draw(frame) {
37
+ for (let i = 0; i < list.length; i++) {
38
+ const l = list[i];
39
+ l.layer.draw(frame, l.params);
40
+ }
41
+ },
42
+ destroy() {
43
+ for (const l of list)
44
+ l.layer.destroy();
45
+ },
46
+ };
47
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Physically based shading helpers for custom materials (`WGSL_PBR`). Appended by
3
+ * `createStandardMaterial`; a game's own material appends the same text after the prelude and
4
+ * calls `engine_pbr` from its `fs_main`. Everything here reads the engine's lighting block
5
+ * (`lights`, `engine_shadow`, `engine_fog` from `WGSL_LIGHTS`) and the camera block, so it only
6
+ * compiles after `materialPrelude`.
7
+ *
8
+ * Model: GGX normal distribution (`engine_d_ggx`), height-correlated Smith-GGX visibility
9
+ * (`engine_v_smith_ggx`), Schlick Fresnel (`engine_f_schlick`) and Lambert diffuse. Radiance is
10
+ * in the same units as `engine_lambert`: a light of colour `c` on a white rough dielectric facing
11
+ * it returns about `c` (the specular lobe is scaled by π to match, so a PBR material and a Lambert
12
+ * one agree on brightness under the same `Lights`).
13
+ *
14
+ * `engine_pbr_layers(base, metallic, roughness, N, V, world_pos, ao, emissive, layer_mask)` sums
15
+ * ambient × `ao` (diffuse plus a roughness-aware Fresnel term so metals are not black in the
16
+ * dark), every light of the block whose `layers` share a bit with `layer_mask` through
17
+ * `engine_pbr_accum` (the engine light loop, `wgslLightLoop` with `engine_brdf`: the sun ×
18
+ * `engine_shadow`, the point lights with the `(1 - d/radius)²` falloff of `engine_point_lights`,
19
+ * the spot lights with that falloff × `engine_spot_cone`) and `emissive`, then applies
20
+ * `engine_fog`. `N` and `V` are unit world-space vectors; `V` points from the surface to the eye.
21
+ * `engine_pbr(base, metallic, roughness, N, V, world_pos, ao, emissive)` is the same over every
22
+ * layer (`0xffffffffu`); the standard material passes `engine_instance_layers(in.flags)`.
23
+ *
24
+ * `engine_perturb_normal(n, world_pos, uv, map, scale)` applies a tangent-space normal map
25
+ * (`map` is the decoded texel, 0..1; +Y is up in the image, the OpenGL / glTF convention; `scale`
26
+ * scales its xy) using a tangent frame built from screen-space derivatives (`dpdx` / `dpdy` of the
27
+ * world position and the uv), so meshes need no tangent attribute: `VERTEX_LAYOUT_3D` has none
28
+ * (xyz, normal, uv, rgba). It is fragment-stage only. When the uv has no screen-space change
29
+ * (a collapsed uv rect, a sliver) it returns `n`.
30
+ */
31
+ export declare const WGSL_PBR: string;
@@ -0,0 +1,119 @@
1
+ import { wgslLightLoop } from './wgsl.js';
2
+ /**
3
+ * Physically based shading helpers for custom materials (`WGSL_PBR`). Appended by
4
+ * `createStandardMaterial`; a game's own material appends the same text after the prelude and
5
+ * calls `engine_pbr` from its `fs_main`. Everything here reads the engine's lighting block
6
+ * (`lights`, `engine_shadow`, `engine_fog` from `WGSL_LIGHTS`) and the camera block, so it only
7
+ * compiles after `materialPrelude`.
8
+ *
9
+ * Model: GGX normal distribution (`engine_d_ggx`), height-correlated Smith-GGX visibility
10
+ * (`engine_v_smith_ggx`), Schlick Fresnel (`engine_f_schlick`) and Lambert diffuse. Radiance is
11
+ * in the same units as `engine_lambert`: a light of colour `c` on a white rough dielectric facing
12
+ * it returns about `c` (the specular lobe is scaled by π to match, so a PBR material and a Lambert
13
+ * one agree on brightness under the same `Lights`).
14
+ *
15
+ * `engine_pbr_layers(base, metallic, roughness, N, V, world_pos, ao, emissive, layer_mask)` sums
16
+ * ambient × `ao` (diffuse plus a roughness-aware Fresnel term so metals are not black in the
17
+ * dark), every light of the block whose `layers` share a bit with `layer_mask` through
18
+ * `engine_pbr_accum` (the engine light loop, `wgslLightLoop` with `engine_brdf`: the sun ×
19
+ * `engine_shadow`, the point lights with the `(1 - d/radius)²` falloff of `engine_point_lights`,
20
+ * the spot lights with that falloff × `engine_spot_cone`) and `emissive`, then applies
21
+ * `engine_fog`. `N` and `V` are unit world-space vectors; `V` points from the surface to the eye.
22
+ * `engine_pbr(base, metallic, roughness, N, V, world_pos, ao, emissive)` is the same over every
23
+ * layer (`0xffffffffu`); the standard material passes `engine_instance_layers(in.flags)`.
24
+ *
25
+ * `engine_perturb_normal(n, world_pos, uv, map, scale)` applies a tangent-space normal map
26
+ * (`map` is the decoded texel, 0..1; +Y is up in the image, the OpenGL / glTF convention; `scale`
27
+ * scales its xy) using a tangent frame built from screen-space derivatives (`dpdx` / `dpdy` of the
28
+ * world position and the uv), so meshes need no tangent attribute: `VERTEX_LAYOUT_3D` has none
29
+ * (xyz, normal, uv, rgba). It is fragment-stage only. When the uv has no screen-space change
30
+ * (a collapsed uv rect, a sliver) it returns `n`.
31
+ */
32
+ export const WGSL_PBR = /* wgsl */ `
33
+ const ENGINE_PI: f32 = 3.14159265;
34
+ const ENGINE_MIN_ROUGHNESS: f32 = 0.045;
35
+
36
+ fn engine_d_ggx(n_dot_h: f32, a2: f32) -> f32 {
37
+ let d = n_dot_h * n_dot_h * (a2 - 1.0) + 1.0;
38
+ return a2 / (ENGINE_PI * d * d + 1e-7);
39
+ }
40
+
41
+ fn engine_v_smith_ggx(n_dot_v: f32, n_dot_l: f32, a2: f32) -> f32 {
42
+ let gv = n_dot_l * sqrt(n_dot_v * n_dot_v * (1.0 - a2) + a2);
43
+ let gl = n_dot_v * sqrt(n_dot_l * n_dot_l * (1.0 - a2) + a2);
44
+ return 0.5 / (gv + gl + 1e-5);
45
+ }
46
+
47
+ fn engine_f_schlick(f0: vec3f, v_dot_h: f32) -> vec3f {
48
+ let f = pow(1.0 - v_dot_h, 5.0);
49
+ return f0 + (vec3f(1.0) - f0) * f;
50
+ }
51
+
52
+ /** One light's reflected radiance factor: (diffuse + specular) × N·L, before the light colour. */
53
+ fn engine_brdf(
54
+ n: vec3f, v: vec3f, l: vec3f, diffuse_color: vec3f, f0: vec3f, a2: f32, n_dot_v: f32,
55
+ ) -> vec3f {
56
+ let n_dot_l = dot(n, l);
57
+ if (n_dot_l <= 0.0) { return vec3f(0.0); }
58
+ let h = normalize(l + v);
59
+ let n_dot_h = saturate(dot(n, h));
60
+ let v_dot_h = saturate(dot(v, h));
61
+ let d = engine_d_ggx(n_dot_h, a2);
62
+ let vis = engine_v_smith_ggx(n_dot_v, n_dot_l, a2);
63
+ let f = engine_f_schlick(f0, v_dot_h);
64
+ let specular = (d * vis * ENGINE_PI) * f;
65
+ return (diffuse_color + specular) * n_dot_l;
66
+ }
67
+
68
+ ${wgslLightLoop('engine_pbr_accum', 'engine_brdf(normal, v, l, diffuse_color, f0, a2, n_dot_v)', ', v: vec3f, diffuse_color: vec3f, f0: vec3f, a2: f32, n_dot_v: f32')}
69
+
70
+ fn engine_pbr_layers(
71
+ base: vec3f, metallic: f32, roughness: f32, n: vec3f, v: vec3f, world_pos: vec3f,
72
+ ao: f32, emissive: vec3f, layer_mask: u32,
73
+ ) -> vec3f {
74
+ let r = clamp(roughness, ENGINE_MIN_ROUGHNESS, 1.0);
75
+ let a = r * r;
76
+ let a2 = a * a;
77
+ let m = saturate(metallic);
78
+ let f0 = mix(vec3f(0.04), base, m);
79
+ let diffuse_color = base * (1.0 - m);
80
+ let n_dot_v = max(dot(n, v), 1e-4);
81
+ // Ambient: diffuse plus a roughness-aware Fresnel so metals keep their colour in the dark.
82
+ let fr = max(vec3f(1.0 - r), f0) - f0;
83
+ let ambient_spec = f0 + fr * pow(1.0 - n_dot_v, 5.0);
84
+ var color = lights.ambient * ao * (diffuse_color + ambient_spec);
85
+ color += engine_pbr_accum(world_pos, n, layer_mask, v, diffuse_color, f0, a2, n_dot_v);
86
+ color += emissive;
87
+ return engine_fog(color, world_pos);
88
+ }
89
+
90
+ fn engine_pbr(
91
+ base: vec3f, metallic: f32, roughness: f32, n: vec3f, v: vec3f, world_pos: vec3f,
92
+ ao: f32, emissive: vec3f,
93
+ ) -> vec3f {
94
+ return engine_pbr_layers(base, metallic, roughness, n, v, world_pos, ao, emissive, 0xffffffffu);
95
+ }
96
+
97
+ fn engine_perturb_normal(n: vec3f, world_pos: vec3f, uv: vec2f, map: vec3f, scale: f32) -> vec3f {
98
+ let dp1 = dpdx(world_pos);
99
+ let dp2 = dpdy(world_pos);
100
+ let duv1 = dpdx(uv);
101
+ let duv2 = dpdy(uv);
102
+ // Solve dp1 = t du1 + b dv1, dp2 = t du2 + b dv2 for t and b (times |det|: only the sign of
103
+ // the determinant matters, the lengths are normalised away below). Unlike the cross-product
104
+ // frame this does not assume cross(dp1, dp2) points along n, which it does not with a y-down
105
+ // framebuffer.
106
+ let det = duv1.x * duv2.y - duv2.x * duv1.y;
107
+ let s = select(-1.0, 1.0, det >= 0.0);
108
+ var t = (dp1 * duv2.y - dp2 * duv1.y) * s;
109
+ var b = (dp2 * duv1.x - dp1 * duv2.x) * s;
110
+ t -= n * dot(n, t);
111
+ b -= n * dot(n, b);
112
+ let m2 = max(dot(t, t), dot(b, b));
113
+ if (m2 < 1e-16) { return n; }
114
+ let inv = inverseSqrt(m2);
115
+ // uv v runs down the image, so the map's +Y (up in the image) is -b.
116
+ let tn = (map * 2.0 - 1.0) * vec3f(scale, scale, 1.0);
117
+ return normalize(t * inv * tn.x - b * inv * tn.y + n * tn.z);
118
+ }
119
+ `;
@@ -0,0 +1,42 @@
1
+ import type { FullscreenPass } from './fullscreen.js';
2
+ import { Texture, type TextureDesc } from './texture.js';
3
+ export interface PingPongStepOptions {
4
+ /** Texture slot of `pass` that reads the previous state. Default 0. */
5
+ slot?: number;
6
+ /** Clear colour for the write target; `null` loads it. Default transparent black. */
7
+ clear?: GPUColor | null;
8
+ }
9
+ /**
10
+ * Two same-sized render targets for feedback effects (fluid sims, trails, blur chains):
11
+ * each `step` runs a fullscreen pass that reads `read` and writes `write`, then swaps.
12
+ * Alternating textures reuses cached bind groups, so a steady ping-pong allocates nothing.
13
+ *
14
+ * ```ts
15
+ * const sim = renderer.createPingPong({ width: 256, height: 256, label: 'sim' });
16
+ * frame.prePass(stepSim); // a stable function:
17
+ * function stepSim(enc: GPUCommandEncoder) {
18
+ * sim.step(enc, simPass); // simPass samples slot 0 = previous state
19
+ * material.setTexture(0, sim.read); // sample the newest state in this frame's draws
20
+ * }
21
+ * ```
22
+ */
23
+ export declare class PingPong {
24
+ private readonly device;
25
+ private readonly desc;
26
+ private a;
27
+ private b;
28
+ constructor(device: GPUDevice, desc: TextureDesc);
29
+ /** The latest state (written by the last `step`). Sample this. */
30
+ get read(): Texture;
31
+ /** The target the next `step` writes. */
32
+ get write(): Texture;
33
+ get width(): number;
34
+ get height(): number;
35
+ swap(): void;
36
+ /** Encode `pass` reading `read` (texture `slot`) into `write`, then swap. */
37
+ step(encoder: GPUCommandEncoder, pass: FullscreenPass, opts?: PingPongStepOptions): void;
38
+ /** Recreate both targets at a new size (contents are lost). No-op when unchanged. */
39
+ resize(width: number, height: number): void;
40
+ destroy(): void;
41
+ private make;
42
+ }
@@ -0,0 +1,74 @@
1
+ import { Texture } from './texture.js';
2
+ /**
3
+ * Two same-sized render targets for feedback effects (fluid sims, trails, blur chains):
4
+ * each `step` runs a fullscreen pass that reads `read` and writes `write`, then swaps.
5
+ * Alternating textures reuses cached bind groups, so a steady ping-pong allocates nothing.
6
+ *
7
+ * ```ts
8
+ * const sim = renderer.createPingPong({ width: 256, height: 256, label: 'sim' });
9
+ * frame.prePass(stepSim); // a stable function:
10
+ * function stepSim(enc: GPUCommandEncoder) {
11
+ * sim.step(enc, simPass); // simPass samples slot 0 = previous state
12
+ * material.setTexture(0, sim.read); // sample the newest state in this frame's draws
13
+ * }
14
+ * ```
15
+ */
16
+ export class PingPong {
17
+ device;
18
+ desc;
19
+ a;
20
+ b;
21
+ constructor(device, desc) {
22
+ this.device = device;
23
+ this.desc = desc;
24
+ this.a = this.make('a');
25
+ this.b = this.make('b');
26
+ }
27
+ /** The latest state (written by the last `step`). Sample this. */
28
+ get read() {
29
+ return this.a;
30
+ }
31
+ /** The target the next `step` writes. */
32
+ get write() {
33
+ return this.b;
34
+ }
35
+ get width() {
36
+ return this.a.width;
37
+ }
38
+ get height() {
39
+ return this.a.height;
40
+ }
41
+ swap() {
42
+ const t = this.a;
43
+ this.a = this.b;
44
+ this.b = t;
45
+ }
46
+ /** Encode `pass` reading `read` (texture `slot`) into `write`, then swap. */
47
+ step(encoder, pass, opts = {}) {
48
+ pass.setTexture(opts.slot ?? 0, this.a);
49
+ pass.encode(encoder, this.b.view, { clear: opts.clear });
50
+ this.swap();
51
+ }
52
+ /** Recreate both targets at a new size (contents are lost). No-op when unchanged. */
53
+ resize(width, height) {
54
+ const w = Math.max(1, Math.floor(width));
55
+ const h = Math.max(1, Math.floor(height));
56
+ if (w === this.a.width && h === this.a.height)
57
+ return;
58
+ this.destroy();
59
+ this.desc.width = w;
60
+ this.desc.height = h;
61
+ this.a = this.make('a');
62
+ this.b = this.make('b');
63
+ }
64
+ destroy() {
65
+ this.a.destroy();
66
+ this.b.destroy();
67
+ }
68
+ make(which) {
69
+ return new Texture(this.device, {
70
+ ...this.desc,
71
+ label: `${this.desc.label ?? 'ping-pong'}:${which}`,
72
+ });
73
+ }
74
+ }