@driftengine/core 3.61.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 (955) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +9 -0
  3. package/README.md +9 -0
  4. package/dist/behavior/behaviorTree.d.ts +140 -0
  5. package/dist/behavior/behaviorTree.js +289 -0
  6. package/dist/build/shaderComments.d.ts +64 -0
  7. package/dist/build/shaderComments.js +0 -0
  8. package/dist/cinematic/player.d.ts +80 -0
  9. package/dist/cinematic/player.js +184 -0
  10. package/dist/cinematic/script.d.ts +63 -0
  11. package/dist/cinematic/script.js +141 -0
  12. package/dist/core/bootGate.d.ts +37 -0
  13. package/dist/core/bootGate.js +47 -0
  14. package/dist/core/loadTracker.d.ts +78 -0
  15. package/dist/core/loadTracker.js +106 -0
  16. package/dist/core/loop.d.ts +118 -0
  17. package/dist/core/loop.js +84 -0
  18. package/dist/core/messageQueue.d.ts +61 -0
  19. package/dist/core/messageQueue.js +104 -0
  20. package/dist/core/onceSet.d.ts +27 -0
  21. package/dist/core/onceSet.js +62 -0
  22. package/dist/core/preferences.d.ts +47 -0
  23. package/dist/core/preferences.js +140 -0
  24. package/dist/core/remoteSave.d.ts +154 -0
  25. package/dist/core/remoteSave.js +249 -0
  26. package/dist/core/rng.d.ts +64 -0
  27. package/dist/core/rng.js +72 -0
  28. package/dist/core/stepBudget.d.ts +91 -0
  29. package/dist/core/stepBudget.js +105 -0
  30. package/dist/core/storage.d.ts +52 -0
  31. package/dist/core/storage.js +85 -0
  32. package/dist/core/tickTrace.d.ts +72 -0
  33. package/dist/core/tickTrace.js +102 -0
  34. package/dist/core/timeCurve.d.ts +83 -0
  35. package/dist/core/timeCurve.js +107 -0
  36. package/dist/core/withDefaults.d.ts +21 -0
  37. package/dist/core/withDefaults.js +29 -0
  38. package/dist/dev/contactProbe.d.ts +41 -0
  39. package/dist/dev/contactProbe.js +58 -0
  40. package/dist/dev/fpsMeter.d.ts +45 -0
  41. package/dist/dev/fpsMeter.js +86 -0
  42. package/dist/environment/celestialClock.d.ts +141 -0
  43. package/dist/environment/celestialClock.js +262 -0
  44. package/dist/geometry/decal.d.ts +61 -0
  45. package/dist/geometry/decal.js +178 -0
  46. package/dist/geometry/filmPatch.d.ts +35 -0
  47. package/dist/geometry/filmPatch.js +112 -0
  48. package/dist/geometry/growable.d.ts +70 -0
  49. package/dist/geometry/growable.js +167 -0
  50. package/dist/geometry/lightVolume.d.ts +76 -0
  51. package/dist/geometry/lightVolume.js +65 -0
  52. package/dist/geometry/meshBuilder.d.ts +426 -0
  53. package/dist/geometry/meshBuilder.js +1184 -0
  54. package/dist/geometry/pixelFont.d.ts +59 -0
  55. package/dist/geometry/pixelFont.js +179 -0
  56. package/dist/geometry/ribbon.d.ts +101 -0
  57. package/dist/geometry/ribbon.js +546 -0
  58. package/dist/geometry/shellFill.d.ts +101 -0
  59. package/dist/geometry/shellFill.js +203 -0
  60. package/dist/geometry/spline.d.ts +162 -0
  61. package/dist/geometry/spline.js +527 -0
  62. package/dist/geometry/tangents.d.ts +30 -0
  63. package/dist/geometry/tangents.js +142 -0
  64. package/dist/geometry/textMesh.d.ts +51 -0
  65. package/dist/geometry/textMesh.js +57 -0
  66. package/dist/geometry/treeBuilder.d.ts +37 -0
  67. package/dist/geometry/treeBuilder.js +56 -0
  68. package/dist/host/display.d.ts +135 -0
  69. package/dist/host/display.js +114 -0
  70. package/dist/host/files.d.ts +25 -0
  71. package/dist/host/files.js +44 -0
  72. package/dist/host/lifecycle.d.ts +45 -0
  73. package/dist/host/lifecycle.js +28 -0
  74. package/dist/host/platformServices.d.ts +23 -0
  75. package/dist/host/platformServices.js +1 -0
  76. package/dist/host/screen.d.ts +49 -0
  77. package/dist/host/screen.js +90 -0
  78. package/dist/index.d.ts +289 -0
  79. package/dist/index.js +320 -0
  80. package/dist/input/actionMap.d.ts +181 -0
  81. package/dist/input/actionMap.js +314 -0
  82. package/dist/input/activeDevice.d.ts +55 -0
  83. package/dist/input/activeDevice.js +83 -0
  84. package/dist/input/gamepadIdentity.d.ts +43 -0
  85. package/dist/input/gamepadIdentity.js +108 -0
  86. package/dist/input/gamepadMapping.d.ts +56 -0
  87. package/dist/input/gamepadMapping.js +91 -0
  88. package/dist/input/input.d.ts +281 -0
  89. package/dist/input/input.js +703 -0
  90. package/dist/input/inputHarness.d.ts +42 -0
  91. package/dist/input/inputHarness.js +193 -0
  92. package/dist/input/rightGesture.d.ts +57 -0
  93. package/dist/input/rightGesture.js +49 -0
  94. package/dist/input/rumble.d.ts +71 -0
  95. package/dist/input/rumble.js +119 -0
  96. package/dist/input/touchControls.d.ts +138 -0
  97. package/dist/input/touchControls.js +352 -0
  98. package/dist/input/typingTarget.d.ts +6 -0
  99. package/dist/input/typingTarget.js +27 -0
  100. package/dist/math/bounds.d.ts +61 -0
  101. package/dist/math/bounds.js +121 -0
  102. package/dist/math/color.d.ts +8 -0
  103. package/dist/math/color.js +35 -0
  104. package/dist/math/exact.d.ts +66 -0
  105. package/dist/math/exact.js +262 -0
  106. package/dist/math/frustum.d.ts +44 -0
  107. package/dist/math/frustum.js +90 -0
  108. package/dist/math/intersect.d.ts +76 -0
  109. package/dist/math/intersect.js +185 -0
  110. package/dist/math/scalar.d.ts +51 -0
  111. package/dist/math/scalar.js +99 -0
  112. package/dist/math/spring.d.ts +59 -0
  113. package/dist/math/spring.js +88 -0
  114. package/dist/nav/navGraph.d.ts +71 -0
  115. package/dist/nav/navGraph.js +111 -0
  116. package/dist/nav/navPath.d.ts +93 -0
  117. package/dist/nav/navPath.js +162 -0
  118. package/dist/nav/navSearch.d.ts +74 -0
  119. package/dist/nav/navSearch.js +198 -0
  120. package/dist/physics/boxSurface.d.ts +48 -0
  121. package/dist/physics/boxSurface.js +73 -0
  122. package/dist/physics/colliderSurface.d.ts +46 -0
  123. package/dist/physics/colliderSurface.js +146 -0
  124. package/dist/physics/compositeSurface.d.ts +33 -0
  125. package/dist/physics/compositeSurface.js +108 -0
  126. package/dist/physics/heightSurface.d.ts +103 -0
  127. package/dist/physics/heightSurface.js +153 -0
  128. package/dist/physics/ribbonSurface.d.ts +239 -0
  129. package/dist/physics/ribbonSurface.js +522 -0
  130. package/dist/render/ambientOcclusionPass.d.ts +53 -0
  131. package/dist/render/ambientOcclusionPass.js +179 -0
  132. package/dist/render/areaLights.d.ts +116 -0
  133. package/dist/render/areaLights.js +91 -0
  134. package/dist/render/areaShadowSet.d.ts +184 -0
  135. package/dist/render/areaShadowSet.js +277 -0
  136. package/dist/render/atmosphere.d.ts +94 -0
  137. package/dist/render/atmosphere.js +91 -0
  138. package/dist/render/backend/api.d.ts +496 -0
  139. package/dist/render/backend/api.js +1 -0
  140. package/dist/render/backend/budget.d.ts +82 -0
  141. package/dist/render/backend/budget.js +99 -0
  142. package/dist/render/backend/createRenderer.d.ts +135 -0
  143. package/dist/render/backend/createRenderer.js +201 -0
  144. package/dist/render/backend/deadline.d.ts +24 -0
  145. package/dist/render/backend/deadline.js +38 -0
  146. package/dist/render/backend/probe.d.ts +30 -0
  147. package/dist/render/backend/probe.js +129 -0
  148. package/dist/render/backend/select.d.ts +70 -0
  149. package/dist/render/backend/select.js +249 -0
  150. package/dist/render/backend/timer.d.ts +50 -0
  151. package/dist/render/backend/timer.js +1 -0
  152. package/dist/render/backend/webgl2/instanced.d.ts +21 -0
  153. package/dist/render/backend/webgl2/instanced.js +42 -0
  154. package/dist/render/backend/webgl2/morphTexture.d.ts +21 -0
  155. package/dist/render/backend/webgl2/morphTexture.js +55 -0
  156. package/dist/render/backend/webgl2/renderer.d.ts +3027 -0
  157. package/dist/render/backend/webgl2/renderer.js +6041 -0
  158. package/dist/render/backend/webgl2/skinPaletteTexture.d.ts +32 -0
  159. package/dist/render/backend/webgl2/skinPaletteTexture.js +68 -0
  160. package/dist/render/backend/webgpu/boltPass.d.ts +42 -0
  161. package/dist/render/backend/webgpu/boltPass.js +160 -0
  162. package/dist/render/backend/webgpu/buffers.d.ts +159 -0
  163. package/dist/render/backend/webgpu/buffers.js +402 -0
  164. package/dist/render/backend/webgpu/causticsPass.d.ts +36 -0
  165. package/dist/render/backend/webgpu/causticsPass.js +138 -0
  166. package/dist/render/backend/webgpu/clusterBinner.d.ts +51 -0
  167. package/dist/render/backend/webgpu/clusterBinner.js +206 -0
  168. package/dist/render/backend/webgpu/depthPass.d.ts +114 -0
  169. package/dist/render/backend/webgpu/depthPass.js +228 -0
  170. package/dist/render/backend/webgpu/device.d.ts +52 -0
  171. package/dist/render/backend/webgpu/device.js +121 -0
  172. package/dist/render/backend/webgpu/drawCommand.d.ts +43 -0
  173. package/dist/render/backend/webgpu/drawCommand.js +54 -0
  174. package/dist/render/backend/webgpu/environmentTexels.d.ts +28 -0
  175. package/dist/render/backend/webgpu/environmentTexels.js +79 -0
  176. package/dist/render/backend/webgpu/filmPass.d.ts +29 -0
  177. package/dist/render/backend/webgpu/filmPass.js +97 -0
  178. package/dist/render/backend/webgpu/flatPass.d.ts +213 -0
  179. package/dist/render/backend/webgpu/flatPass.js +482 -0
  180. package/dist/render/backend/webgpu/flockPass.d.ts +34 -0
  181. package/dist/render/backend/webgpu/flockPass.js +129 -0
  182. package/dist/render/backend/webgpu/gpuTimestamps.d.ts +94 -0
  183. package/dist/render/backend/webgpu/gpuTimestamps.js +213 -0
  184. package/dist/render/backend/webgpu/insetPass.d.ts +19 -0
  185. package/dist/render/backend/webgpu/insetPass.js +108 -0
  186. package/dist/render/backend/webgpu/instanced.d.ts +27 -0
  187. package/dist/render/backend/webgpu/instanced.js +49 -0
  188. package/dist/render/backend/webgpu/lightVolumePass.d.ts +75 -0
  189. package/dist/render/backend/webgpu/lightVolumePass.js +154 -0
  190. package/dist/render/backend/webgpu/linePass.d.ts +90 -0
  191. package/dist/render/backend/webgpu/linePass.js +220 -0
  192. package/dist/render/backend/webgpu/morphTexture.d.ts +18 -0
  193. package/dist/render/backend/webgpu/morphTexture.js +51 -0
  194. package/dist/render/backend/webgpu/panelPass.d.ts +37 -0
  195. package/dist/render/backend/webgpu/panelPass.js +114 -0
  196. package/dist/render/backend/webgpu/particlePass.d.ts +89 -0
  197. package/dist/render/backend/webgpu/particlePass.js +280 -0
  198. package/dist/render/backend/webgpu/pipelineCache.d.ts +93 -0
  199. package/dist/render/backend/webgpu/pipelineCache.js +140 -0
  200. package/dist/render/backend/webgpu/plumePass.d.ts +69 -0
  201. package/dist/render/backend/webgpu/plumePass.js +213 -0
  202. package/dist/render/backend/webgpu/pointShadowPass.d.ts +88 -0
  203. package/dist/render/backend/webgpu/pointShadowPass.js +280 -0
  204. package/dist/render/backend/webgpu/postPass.d.ts +342 -0
  205. package/dist/render/backend/webgpu/postPass.js +366 -0
  206. package/dist/render/backend/webgpu/probePass.d.ts +108 -0
  207. package/dist/render/backend/webgpu/probePass.js +188 -0
  208. package/dist/render/backend/webgpu/reflectionPass.d.ts +29 -0
  209. package/dist/render/backend/webgpu/reflectionPass.js +87 -0
  210. package/dist/render/backend/webgpu/renderer.d.ts +3082 -0
  211. package/dist/render/backend/webgpu/renderer.js +10911 -0
  212. package/dist/render/backend/webgpu/scatterPass.d.ts +95 -0
  213. package/dist/render/backend/webgpu/scatterPass.js +266 -0
  214. package/dist/render/backend/webgpu/sdfTextPass.d.ts +86 -0
  215. package/dist/render/backend/webgpu/sdfTextPass.js +190 -0
  216. package/dist/render/backend/webgpu/shaderModules.d.ts +9 -0
  217. package/dist/render/backend/webgpu/shaderModules.js +45 -0
  218. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.d.ts +23 -0
  219. package/dist/render/backend/webgpu/shaders/clusterBin.wgsl.js +208 -0
  220. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +67 -0
  221. package/dist/render/backend/webgpu/skinPaletteRing.js +97 -0
  222. package/dist/render/backend/webgpu/skinPaletteTexture.d.ts +17 -0
  223. package/dist/render/backend/webgpu/skinPaletteTexture.js +68 -0
  224. package/dist/render/backend/webgpu/skyPass.d.ts +102 -0
  225. package/dist/render/backend/webgpu/skyPass.js +70 -0
  226. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +41 -0
  227. package/dist/render/backend/webgpu/surfaceTexturePass.js +228 -0
  228. package/dist/render/backend/webgpu/textPass.d.ts +73 -0
  229. package/dist/render/backend/webgpu/textPass.js +190 -0
  230. package/dist/render/backend/webgpu/uniformRing.d.ts +133 -0
  231. package/dist/render/backend/webgpu/uniformRing.js +208 -0
  232. package/dist/render/backend/webgpu/waterPass.d.ts +73 -0
  233. package/dist/render/backend/webgpu/waterPass.js +160 -0
  234. package/dist/render/backend/webgpu/windStreakPass.d.ts +46 -0
  235. package/dist/render/backend/webgpu/windStreakPass.js +153 -0
  236. package/dist/render/billboard.d.ts +27 -0
  237. package/dist/render/billboard.js +79 -0
  238. package/dist/render/bloomChain.d.ts +66 -0
  239. package/dist/render/bloomChain.js +83 -0
  240. package/dist/render/bloomPass.d.ts +54 -0
  241. package/dist/render/bloomPass.js +219 -0
  242. package/dist/render/boltBatch.d.ts +39 -0
  243. package/dist/render/boltBatch.js +121 -0
  244. package/dist/render/boltPool.d.ts +135 -0
  245. package/dist/render/boltPool.js +259 -0
  246. package/dist/render/boom.d.ts +46 -0
  247. package/dist/render/boom.js +81 -0
  248. package/dist/render/camera.d.ts +119 -0
  249. package/dist/render/camera.js +304 -0
  250. package/dist/render/causticsRenderer.d.ts +63 -0
  251. package/dist/render/causticsRenderer.js +119 -0
  252. package/dist/render/cinematicCamera.d.ts +102 -0
  253. package/dist/render/cinematicCamera.js +227 -0
  254. package/dist/render/clusteredLights.d.ts +260 -0
  255. package/dist/render/clusteredLights.js +479 -0
  256. package/dist/render/colourGrade.d.ts +62 -0
  257. package/dist/render/colourGrade.js +91 -0
  258. package/dist/render/compute.d.ts +74 -0
  259. package/dist/render/compute.js +8 -0
  260. package/dist/render/contextLoss.d.ts +32 -0
  261. package/dist/render/contextLoss.js +46 -0
  262. package/dist/render/debugLines.d.ts +75 -0
  263. package/dist/render/debugLines.js +281 -0
  264. package/dist/render/decalPass.d.ts +34 -0
  265. package/dist/render/decalPass.js +103 -0
  266. package/dist/render/decalProjector.d.ts +140 -0
  267. package/dist/render/decalProjector.js +282 -0
  268. package/dist/render/decalQueue.d.ts +53 -0
  269. package/dist/render/decalQueue.js +87 -0
  270. package/dist/render/depthConvention.d.ts +314 -0
  271. package/dist/render/depthConvention.js +346 -0
  272. package/dist/render/drawingBuffer.d.ts +52 -0
  273. package/dist/render/drawingBuffer.js +67 -0
  274. package/dist/render/emptyTexture.d.ts +60 -0
  275. package/dist/render/emptyTexture.js +103 -0
  276. package/dist/render/envProbeArray.d.ts +85 -0
  277. package/dist/render/envProbeArray.js +164 -0
  278. package/dist/render/equirectToCube.d.ts +54 -0
  279. package/dist/render/equirectToCube.js +123 -0
  280. package/dist/render/flockGeometry.d.ts +23 -0
  281. package/dist/render/flockGeometry.js +43 -0
  282. package/dist/render/flockRenderer.d.ts +37 -0
  283. package/dist/render/flockRenderer.js +70 -0
  284. package/dist/render/frame/arena.d.ts +32 -0
  285. package/dist/render/frame/arena.js +65 -0
  286. package/dist/render/frame/index.d.ts +18 -0
  287. package/dist/render/frame/index.js +4 -0
  288. package/dist/render/frame/replay.d.ts +34 -0
  289. package/dist/render/frame/replay.js +48 -0
  290. package/dist/render/frame/resources.d.ts +25 -0
  291. package/dist/render/frame/resources.js +55 -0
  292. package/dist/render/frame/schedule.d.ts +37 -0
  293. package/dist/render/frame/schedule.js +61 -0
  294. package/dist/render/frameView.d.ts +19 -0
  295. package/dist/render/frameView.js +1 -0
  296. package/dist/render/gizmo.d.ts +236 -0
  297. package/dist/render/gizmo.js +727 -0
  298. package/dist/render/globalMedium.d.ts +124 -0
  299. package/dist/render/globalMedium.js +100 -0
  300. package/dist/render/globalMediumPass.d.ts +101 -0
  301. package/dist/render/globalMediumPass.js +250 -0
  302. package/dist/render/gpuCapability.d.ts +111 -0
  303. package/dist/render/gpuCapability.js +194 -0
  304. package/dist/render/gpuTimer.d.ts +87 -0
  305. package/dist/render/gpuTimer.js +145 -0
  306. package/dist/render/halfFloat.d.ts +4 -0
  307. package/dist/render/halfFloat.js +38 -0
  308. package/dist/render/handleRegistry.d.ts +54 -0
  309. package/dist/render/handleRegistry.js +84 -0
  310. package/dist/render/iesProfile.d.ts +64 -0
  311. package/dist/render/iesProfile.js +179 -0
  312. package/dist/render/imageTexels.d.ts +50 -0
  313. package/dist/render/imageTexels.js +91 -0
  314. package/dist/render/instancedMesh.d.ts +48 -0
  315. package/dist/render/instancedMesh.js +127 -0
  316. package/dist/render/instances.d.ts +69 -0
  317. package/dist/render/instances.js +52 -0
  318. package/dist/render/lightBudget.d.ts +397 -0
  319. package/dist/render/lightBudget.js +524 -0
  320. package/dist/render/lightMatrix.d.ts +3 -0
  321. package/dist/render/lightMatrix.js +45 -0
  322. package/dist/render/lightVolumeDraw.d.ts +132 -0
  323. package/dist/render/lightVolumeDraw.js +181 -0
  324. package/dist/render/lineBatch.d.ts +60 -0
  325. package/dist/render/lineBatch.js +160 -0
  326. package/dist/render/linePoints.d.ts +33 -0
  327. package/dist/render/linePoints.js +46 -0
  328. package/dist/render/livePointShadowSet.d.ts +72 -0
  329. package/dist/render/livePointShadowSet.js +258 -0
  330. package/dist/render/lod.d.ts +35 -0
  331. package/dist/render/lod.js +65 -0
  332. package/dist/render/mesh.d.ts +177 -0
  333. package/dist/render/mesh.js +466 -0
  334. package/dist/render/occlusion.d.ts +81 -0
  335. package/dist/render/occlusion.js +378 -0
  336. package/dist/render/oitPass.d.ts +67 -0
  337. package/dist/render/oitPass.js +213 -0
  338. package/dist/render/orderIndependent.d.ts +92 -0
  339. package/dist/render/orderIndependent.js +108 -0
  340. package/dist/render/particleBatch.d.ts +140 -0
  341. package/dist/render/particleBatch.js +186 -0
  342. package/dist/render/particleMaterial.d.ts +54 -0
  343. package/dist/render/particleMaterial.js +42 -0
  344. package/dist/render/particlePool.d.ts +124 -0
  345. package/dist/render/particlePool.js +182 -0
  346. package/dist/render/pass.d.ts +195 -0
  347. package/dist/render/pass.js +9 -0
  348. package/dist/render/passTarget.d.ts +86 -0
  349. package/dist/render/passTarget.js +121 -0
  350. package/dist/render/pickable.d.ts +31 -0
  351. package/dist/render/pickable.js +172 -0
  352. package/dist/render/planarReflection.d.ts +59 -0
  353. package/dist/render/planarReflection.js +194 -0
  354. package/dist/render/planarReflectionDraw.d.ts +31 -0
  355. package/dist/render/planarReflectionDraw.js +65 -0
  356. package/dist/render/plumeGeometry.d.ts +25 -0
  357. package/dist/render/plumeGeometry.js +61 -0
  358. package/dist/render/plumeMaterial.d.ts +31 -0
  359. package/dist/render/plumeMaterial.js +64 -0
  360. package/dist/render/plumeRenderer.d.ts +96 -0
  361. package/dist/render/plumeRenderer.js +185 -0
  362. package/dist/render/pointLightSelection.d.ts +175 -0
  363. package/dist/render/pointLightSelection.js +301 -0
  364. package/dist/render/pointShadowArray.d.ts +95 -0
  365. package/dist/render/pointShadowArray.js +219 -0
  366. package/dist/render/pointShadowBudget.d.ts +118 -0
  367. package/dist/render/pointShadowBudget.js +221 -0
  368. package/dist/render/pointShadowImage.d.ts +265 -0
  369. package/dist/render/pointShadowImage.js +339 -0
  370. package/dist/render/pointShadowMap.d.ts +93 -0
  371. package/dist/render/pointShadowMap.js +167 -0
  372. package/dist/render/pointShadowSystem.d.ts +195 -0
  373. package/dist/render/pointShadowSystem.js +336 -0
  374. package/dist/render/prefilterEnvMap.d.ts +124 -0
  375. package/dist/render/prefilterEnvMap.js +146 -0
  376. package/dist/render/prefilterPass.d.ts +44 -0
  377. package/dist/render/prefilterPass.js +98 -0
  378. package/dist/render/probeGrid.d.ts +122 -0
  379. package/dist/render/probeGrid.js +174 -0
  380. package/dist/render/rainField.d.ts +99 -0
  381. package/dist/render/rainField.js +168 -0
  382. package/dist/render/reflectionProbe.d.ts +188 -0
  383. package/dist/render/reflectionProbe.js +437 -0
  384. package/dist/render/renderQuality.d.ts +699 -0
  385. package/dist/render/renderQuality.js +293 -0
  386. package/dist/render/rendererHarness.d.ts +39 -0
  387. package/dist/render/rendererHarness.js +185 -0
  388. package/dist/render/resolutionGovernor.d.ts +107 -0
  389. package/dist/render/resolutionGovernor.js +144 -0
  390. package/dist/render/scatterDeform.d.ts +17 -0
  391. package/dist/render/scatterDeform.js +46 -0
  392. package/dist/render/sceneTarget.d.ts +288 -0
  393. package/dist/render/sceneTarget.js +856 -0
  394. package/dist/render/screenSpaceReflection.d.ts +233 -0
  395. package/dist/render/screenSpaceReflection.js +415 -0
  396. package/dist/render/sdfFont.d.ts +77 -0
  397. package/dist/render/sdfFont.js +86 -0
  398. package/dist/render/sdfTextLayout.d.ts +46 -0
  399. package/dist/render/sdfTextLayout.js +145 -0
  400. package/dist/render/sdfTextRenderer.d.ts +75 -0
  401. package/dist/render/sdfTextRenderer.js +194 -0
  402. package/dist/render/seaState.d.ts +25 -0
  403. package/dist/render/seaState.js +34 -0
  404. package/dist/render/segmentQuads.d.ts +29 -0
  405. package/dist/render/segmentQuads.js +75 -0
  406. package/dist/render/shader.d.ts +5 -0
  407. package/dist/render/shader.js +172 -0
  408. package/dist/render/shaders/ambientOcclusion.d.ts +45 -0
  409. package/dist/render/shaders/ambientOcclusion.js +352 -0
  410. package/dist/render/shaders/arcane.d.ts +19 -0
  411. package/dist/render/shaders/arcane.js +102 -0
  412. package/dist/render/shaders/bloom.d.ts +70 -0
  413. package/dist/render/shaders/bloom.js +227 -0
  414. package/dist/render/shaders/bolt.d.ts +17 -0
  415. package/dist/render/shaders/bolt.js +161 -0
  416. package/dist/render/shaders/caustics.d.ts +38 -0
  417. package/dist/render/shaders/caustics.js +167 -0
  418. package/dist/render/shaders/conditionals.d.ts +21 -0
  419. package/dist/render/shaders/conditionals.js +55 -0
  420. package/dist/render/shaders/decalProject.d.ts +25 -0
  421. package/dist/render/shaders/decalProject.js +125 -0
  422. package/dist/render/shaders/depth.d.ts +14 -0
  423. package/dist/render/shaders/depth.js +114 -0
  424. package/dist/render/shaders/depthOfField.d.ts +41 -0
  425. package/dist/render/shaders/depthOfField.js +139 -0
  426. package/dist/render/shaders/film.d.ts +15 -0
  427. package/dist/render/shaders/film.js +283 -0
  428. package/dist/render/shaders/fire.d.ts +12 -0
  429. package/dist/render/shaders/fire.js +178 -0
  430. package/dist/render/shaders/flat/directionalShadow.d.ts +1 -0
  431. package/dist/render/shaders/flat/directionalShadow.js +195 -0
  432. package/dist/render/shaders/flat/index.d.ts +135 -0
  433. package/dist/render/shaders/flat/index.js +387 -0
  434. package/dist/render/shaders/flat/lobes.d.ts +1 -0
  435. package/dist/render/shaders/flat/lobes.js +398 -0
  436. package/dist/render/shaders/flat/main.d.ts +2 -0
  437. package/dist/render/shaders/flat/main.js +1630 -0
  438. package/dist/render/shaders/flat/pointShadow.d.ts +1 -0
  439. package/dist/render/shaders/flat/pointShadow.js +322 -0
  440. package/dist/render/shaders/flat/preamble.d.ts +15 -0
  441. package/dist/render/shaders/flat/preamble.js +864 -0
  442. package/dist/render/shaders/flat/probeGrid.d.ts +21 -0
  443. package/dist/render/shaders/flat/probeGrid.js +151 -0
  444. package/dist/render/shaders/flat/surface.d.ts +2 -0
  445. package/dist/render/shaders/flat/surface.js +40 -0
  446. package/dist/render/shaders/flock.d.ts +11 -0
  447. package/dist/render/shaders/flock.js +102 -0
  448. package/dist/render/shaders/fog.d.ts +37 -0
  449. package/dist/render/shaders/fog.js +98 -0
  450. package/dist/render/shaders/fullscreen.d.ts +16 -0
  451. package/dist/render/shaders/fullscreen.js +27 -0
  452. package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +65 -0
  453. package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +71 -0
  454. package/dist/render/shaders/generated/arcane.wgsl.d.ts +90 -0
  455. package/dist/render/shaders/generated/arcane.wgsl.js +96 -0
  456. package/dist/render/shaders/generated/bloom.wgsl.d.ts +69 -0
  457. package/dist/render/shaders/generated/bloom.wgsl.js +75 -0
  458. package/dist/render/shaders/generated/bolt.wgsl.d.ts +118 -0
  459. package/dist/render/shaders/generated/bolt.wgsl.js +124 -0
  460. package/dist/render/shaders/generated/caustics.wgsl.d.ts +118 -0
  461. package/dist/render/shaders/generated/caustics.wgsl.js +124 -0
  462. package/dist/render/shaders/generated/decalProject.wgsl.d.ts +61 -0
  463. package/dist/render/shaders/generated/decalProject.wgsl.js +67 -0
  464. package/dist/render/shaders/generated/depth.wgsl.d.ts +131 -0
  465. package/dist/render/shaders/generated/depth.wgsl.js +137 -0
  466. package/dist/render/shaders/generated/film.wgsl.d.ts +134 -0
  467. package/dist/render/shaders/generated/film.wgsl.js +140 -0
  468. package/dist/render/shaders/generated/fire.wgsl.d.ts +128 -0
  469. package/dist/render/shaders/generated/fire.wgsl.js +134 -0
  470. package/dist/render/shaders/generated/flat.wgsl.d.ts +9163 -0
  471. package/dist/render/shaders/generated/flat.wgsl.js +9192 -0
  472. package/dist/render/shaders/generated/flock.wgsl.d.ts +73 -0
  473. package/dist/render/shaders/generated/flock.wgsl.js +79 -0
  474. package/dist/render/shaders/generated/fullscreen.wgsl.d.ts +12 -0
  475. package/dist/render/shaders/generated/fullscreen.wgsl.js +18 -0
  476. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +130 -0
  477. package/dist/render/shaders/generated/globalMedium.wgsl.js +136 -0
  478. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +230 -0
  479. package/dist/render/shaders/generated/lightVolume.wgsl.js +239 -0
  480. package/dist/render/shaders/generated/line.wgsl.d.ts +128 -0
  481. package/dist/render/shaders/generated/line.wgsl.js +134 -0
  482. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +51 -0
  483. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +57 -0
  484. package/dist/render/shaders/generated/oitResolve.wgsl.d.ts +23 -0
  485. package/dist/render/shaders/generated/oitResolve.wgsl.js +29 -0
  486. package/dist/render/shaders/generated/panel.wgsl.d.ts +48 -0
  487. package/dist/render/shaders/generated/panel.wgsl.js +54 -0
  488. package/dist/render/shaders/generated/particle.wgsl.d.ts +332 -0
  489. package/dist/render/shaders/generated/particle.wgsl.js +338 -0
  490. package/dist/render/shaders/generated/prefilter.wgsl.d.ts +61 -0
  491. package/dist/render/shaders/generated/prefilter.wgsl.js +67 -0
  492. package/dist/render/shaders/generated/rush.wgsl.d.ts +131 -0
  493. package/dist/render/shaders/generated/rush.wgsl.js +137 -0
  494. package/dist/render/shaders/generated/scatter.wgsl.d.ts +195 -0
  495. package/dist/render/shaders/generated/scatter.wgsl.js +201 -0
  496. package/dist/render/shaders/generated/sdfText.wgsl.d.ts +69 -0
  497. package/dist/render/shaders/generated/sdfText.wgsl.js +75 -0
  498. package/dist/render/shaders/generated/sky.wgsl.d.ts +100 -0
  499. package/dist/render/shaders/generated/sky.wgsl.js +106 -0
  500. package/dist/render/shaders/generated/smoke.wgsl.d.ts +85 -0
  501. package/dist/render/shaders/generated/smoke.wgsl.js +91 -0
  502. package/dist/render/shaders/generated/ssrResolve.wgsl.d.ts +18 -0
  503. package/dist/render/shaders/generated/ssrResolve.wgsl.js +24 -0
  504. package/dist/render/shaders/generated/ssrTrace.wgsl.d.ts +86 -0
  505. package/dist/render/shaders/generated/ssrTrace.wgsl.js +92 -0
  506. package/dist/render/shaders/generated/temporalResolve.wgsl.d.ts +46 -0
  507. package/dist/render/shaders/generated/temporalResolve.wgsl.js +52 -0
  508. package/dist/render/shaders/generated/text.wgsl.d.ts +98 -0
  509. package/dist/render/shaders/generated/text.wgsl.js +104 -0
  510. package/dist/render/shaders/generated/water.wgsl.d.ts +247 -0
  511. package/dist/render/shaders/generated/water.wgsl.js +253 -0
  512. package/dist/render/shaders/generated/windStreaks.wgsl.d.ts +73 -0
  513. package/dist/render/shaders/generated/windStreaks.wgsl.js +79 -0
  514. package/dist/render/shaders/gerstner.d.ts +21 -0
  515. package/dist/render/shaders/gerstner.js +110 -0
  516. package/dist/render/shaders/globalMedium.d.ts +56 -0
  517. package/dist/render/shaders/globalMedium.js +393 -0
  518. package/dist/render/shaders/lightVolume.d.ts +61 -0
  519. package/dist/render/shaders/lightVolume.js +527 -0
  520. package/dist/render/shaders/line.d.ts +18 -0
  521. package/dist/render/shaders/line.js +122 -0
  522. package/dist/render/shaders/morph.d.ts +26 -0
  523. package/dist/render/shaders/morph.js +61 -0
  524. package/dist/render/shaders/octahedral.d.ts +76 -0
  525. package/dist/render/shaders/octahedral.js +161 -0
  526. package/dist/render/shaders/octahedralResolve.d.ts +25 -0
  527. package/dist/render/shaders/octahedralResolve.js +81 -0
  528. package/dist/render/shaders/oitResolve.d.ts +17 -0
  529. package/dist/render/shaders/oitResolve.js +42 -0
  530. package/dist/render/shaders/outputTransform.d.ts +37 -0
  531. package/dist/render/shaders/outputTransform.js +106 -0
  532. package/dist/render/shaders/panel.d.ts +17 -0
  533. package/dist/render/shaders/panel.js +50 -0
  534. package/dist/render/shaders/particle.d.ts +82 -0
  535. package/dist/render/shaders/particle.js +431 -0
  536. package/dist/render/shaders/prefilter.d.ts +37 -0
  537. package/dist/render/shaders/prefilter.js +276 -0
  538. package/dist/render/shaders/rush.d.ts +21 -0
  539. package/dist/render/shaders/rush.js +355 -0
  540. package/dist/render/shaders/scatter.d.ts +14 -0
  541. package/dist/render/shaders/scatter.js +206 -0
  542. package/dist/render/shaders/sdfText.d.ts +9 -0
  543. package/dist/render/shaders/sdfText.js +65 -0
  544. package/dist/render/shaders/skinning.d.ts +17 -0
  545. package/dist/render/shaders/skinning.js +59 -0
  546. package/dist/render/shaders/sky.d.ts +10 -0
  547. package/dist/render/shaders/sky.js +242 -0
  548. package/dist/render/shaders/smoke.d.ts +8 -0
  549. package/dist/render/shaders/smoke.js +88 -0
  550. package/dist/render/shaders/ssrResolve.d.ts +15 -0
  551. package/dist/render/shaders/ssrResolve.js +28 -0
  552. package/dist/render/shaders/ssrTrace.d.ts +22 -0
  553. package/dist/render/shaders/ssrTrace.js +230 -0
  554. package/dist/render/shaders/tangentFrame.d.ts +17 -0
  555. package/dist/render/shaders/tangentFrame.js +70 -0
  556. package/dist/render/shaders/temporalResolve.d.ts +1 -0
  557. package/dist/render/shaders/temporalResolve.js +150 -0
  558. package/dist/render/shaders/text.d.ts +17 -0
  559. package/dist/render/shaders/text.js +155 -0
  560. package/dist/render/shaders/vertexChannel.d.ts +39 -0
  561. package/dist/render/shaders/vertexChannel.js +69 -0
  562. package/dist/render/shaders/water.d.ts +18 -0
  563. package/dist/render/shaders/water.js +354 -0
  564. package/dist/render/shaders/windStreaks.d.ts +14 -0
  565. package/dist/render/shaders/windStreaks.js +129 -0
  566. package/dist/render/shadowCasters.d.ts +107 -0
  567. package/dist/render/shadowCasters.js +1 -0
  568. package/dist/render/shadowMap.d.ts +10 -0
  569. package/dist/render/shadowMap.js +80 -0
  570. package/dist/render/shotPlacement.d.ts +80 -0
  571. package/dist/render/shotPlacement.js +183 -0
  572. package/dist/render/skinPalette.d.ts +90 -0
  573. package/dist/render/skinPalette.js +136 -0
  574. package/dist/render/ssrPass.d.ts +59 -0
  575. package/dist/render/ssrPass.js +196 -0
  576. package/dist/render/surfaceSheet.d.ts +52 -0
  577. package/dist/render/surfaceSheet.js +99 -0
  578. package/dist/render/surfaceTexture.d.ts +197 -0
  579. package/dist/render/surfaceTexture.js +116 -0
  580. package/dist/render/temporalAa.d.ts +104 -0
  581. package/dist/render/temporalAa.js +194 -0
  582. package/dist/render/temporalPass.d.ts +54 -0
  583. package/dist/render/temporalPass.js +135 -0
  584. package/dist/render/textLayout.d.ts +88 -0
  585. package/dist/render/textLayout.js +201 -0
  586. package/dist/render/textRenderer.d.ts +32 -0
  587. package/dist/render/textRenderer.js +176 -0
  588. package/dist/render/thirdPersonCamera.d.ts +272 -0
  589. package/dist/render/thirdPersonCamera.js +479 -0
  590. package/dist/render/trample.d.ts +57 -0
  591. package/dist/render/trample.js +134 -0
  592. package/dist/render/translucentQueue.d.ts +76 -0
  593. package/dist/render/translucentQueue.js +90 -0
  594. package/dist/render/uniformVectorBudget.d.ts +105 -0
  595. package/dist/render/uniformVectorBudget.js +201 -0
  596. package/dist/render/uploadStep.d.ts +14 -0
  597. package/dist/render/uploadStep.js +14 -0
  598. package/dist/render/vertexDefaults.d.ts +48 -0
  599. package/dist/render/vertexDefaults.js +111 -0
  600. package/dist/render/visibility.d.ts +22 -0
  601. package/dist/render/visibility.js +47 -0
  602. package/dist/render/waterDraw.d.ts +57 -0
  603. package/dist/render/waterDraw.js +102 -0
  604. package/dist/render/waterGrid.d.ts +62 -0
  605. package/dist/render/waterGrid.js +151 -0
  606. package/dist/render/waterRenderer.d.ts +163 -0
  607. package/dist/render/waterRenderer.js +165 -0
  608. package/dist/render/wind.d.ts +45 -0
  609. package/dist/render/wind.js +32 -0
  610. package/dist/render/windField.d.ts +34 -0
  611. package/dist/render/windField.js +13 -0
  612. package/dist/render/windStreakDraw.d.ts +73 -0
  613. package/dist/render/windStreakDraw.js +86 -0
  614. package/dist/render/windStreakRenderer.d.ts +37 -0
  615. package/dist/render/windStreakRenderer.js +86 -0
  616. package/dist/scene/node.d.ts +128 -0
  617. package/dist/scene/node.js +319 -0
  618. package/dist/scene/visit.d.ts +38 -0
  619. package/dist/scene/visit.js +43 -0
  620. package/dist/ui/clipMime.d.ts +46 -0
  621. package/dist/ui/clipMime.js +88 -0
  622. package/dist/ui/exportTarget.d.ts +305 -0
  623. package/dist/ui/exportTarget.js +368 -0
  624. package/dist/ui/frameOverlay.d.ts +59 -0
  625. package/dist/ui/frameOverlay.js +76 -0
  626. package/dist/ui/framePacer.d.ts +142 -0
  627. package/dist/ui/framePacer.js +284 -0
  628. package/dist/ui/frameRecorder.d.ts +188 -0
  629. package/dist/ui/frameRecorder.js +221 -0
  630. package/dist/ui/fullscreen.d.ts +72 -0
  631. package/dist/ui/fullscreen.js +92 -0
  632. package/dist/ui/pixelCursor.d.ts +28 -0
  633. package/dist/ui/pixelCursor.js +66 -0
  634. package/dist/ui/splash.d.ts +86 -0
  635. package/dist/ui/splash.js +300 -0
  636. package/dist/ui/stillFrame.d.ts +22 -0
  637. package/dist/ui/stillFrame.js +40 -0
  638. package/package.json +60 -0
  639. package/src/behavior/behaviorTree.ts +346 -0
  640. package/src/build/shaderComments.ts +0 -0
  641. package/src/cinematic/player.ts +209 -0
  642. package/src/cinematic/script.ts +231 -0
  643. package/src/core/bootGate.ts +49 -0
  644. package/src/core/loadTracker.ts +144 -0
  645. package/src/core/loop.ts +211 -0
  646. package/src/core/messageQueue.ts +145 -0
  647. package/src/core/onceSet.ts +65 -0
  648. package/src/core/preferences.ts +177 -0
  649. package/src/core/remoteSave.ts +347 -0
  650. package/src/core/rng.ts +101 -0
  651. package/src/core/stepBudget.ts +136 -0
  652. package/src/core/storage.ts +114 -0
  653. package/src/core/tickTrace.ts +129 -0
  654. package/src/core/timeCurve.ts +175 -0
  655. package/src/core/withDefaults.ts +28 -0
  656. package/src/dev/contactProbe.ts +115 -0
  657. package/src/dev/fpsMeter.ts +101 -0
  658. package/src/environment/celestialClock.ts +385 -0
  659. package/src/geometry/decal.ts +260 -0
  660. package/src/geometry/filmPatch.ts +158 -0
  661. package/src/geometry/growable.ts +165 -0
  662. package/src/geometry/lightVolume.ts +161 -0
  663. package/src/geometry/meshBuilder.ts +1397 -0
  664. package/src/geometry/pixelFont.ts +189 -0
  665. package/src/geometry/ribbon.ts +790 -0
  666. package/src/geometry/shellFill.ts +265 -0
  667. package/src/geometry/spline.ts +659 -0
  668. package/src/geometry/tangents.ts +173 -0
  669. package/src/geometry/textMesh.ts +96 -0
  670. package/src/geometry/treeBuilder.ts +114 -0
  671. package/src/host/display.ts +180 -0
  672. package/src/host/files.ts +77 -0
  673. package/src/host/lifecycle.ts +63 -0
  674. package/src/host/platformServices.ts +23 -0
  675. package/src/host/screen.ts +134 -0
  676. package/src/index.ts +730 -0
  677. package/src/input/actionMap.ts +377 -0
  678. package/src/input/activeDevice.ts +86 -0
  679. package/src/input/gamepadIdentity.ts +131 -0
  680. package/src/input/gamepadMapping.ts +121 -0
  681. package/src/input/input.ts +872 -0
  682. package/src/input/inputHarness.ts +226 -0
  683. package/src/input/rightGesture.ts +76 -0
  684. package/src/input/rumble.ts +138 -0
  685. package/src/input/touchControls.ts +451 -0
  686. package/src/input/typingTarget.ts +26 -0
  687. package/src/math/bounds.ts +153 -0
  688. package/src/math/color.ts +37 -0
  689. package/src/math/exact.ts +274 -0
  690. package/src/math/frustum.ts +115 -0
  691. package/src/math/intersect.ts +228 -0
  692. package/src/math/scalar.ts +109 -0
  693. package/src/math/spring.ts +106 -0
  694. package/src/nav/navGraph.ts +168 -0
  695. package/src/nav/navPath.ts +217 -0
  696. package/src/nav/navSearch.ts +200 -0
  697. package/src/physics/boxSurface.ts +96 -0
  698. package/src/physics/colliderSurface.ts +213 -0
  699. package/src/physics/compositeSurface.ts +111 -0
  700. package/src/physics/heightSurface.ts +234 -0
  701. package/src/physics/ribbonSurface.ts +642 -0
  702. package/src/render/ambientOcclusionPass.ts +200 -0
  703. package/src/render/areaLights.ts +194 -0
  704. package/src/render/areaShadowSet.ts +405 -0
  705. package/src/render/atmosphere.ts +186 -0
  706. package/src/render/backend/api.ts +802 -0
  707. package/src/render/backend/budget.ts +139 -0
  708. package/src/render/backend/createRenderer.ts +343 -0
  709. package/src/render/backend/deadline.ts +37 -0
  710. package/src/render/backend/probe.ts +152 -0
  711. package/src/render/backend/select.ts +288 -0
  712. package/src/render/backend/timer.ts +59 -0
  713. package/src/render/backend/webgl2/instanced.ts +46 -0
  714. package/src/render/backend/webgl2/morphTexture.ts +58 -0
  715. package/src/render/backend/webgl2/renderer.ts +7484 -0
  716. package/src/render/backend/webgl2/skinPaletteTexture.ts +70 -0
  717. package/src/render/backend/webgpu/boltPass.ts +205 -0
  718. package/src/render/backend/webgpu/buffers.ts +553 -0
  719. package/src/render/backend/webgpu/causticsPass.ts +174 -0
  720. package/src/render/backend/webgpu/clusterBinner.ts +259 -0
  721. package/src/render/backend/webgpu/depthPass.ts +261 -0
  722. package/src/render/backend/webgpu/device.ts +148 -0
  723. package/src/render/backend/webgpu/drawCommand.ts +79 -0
  724. package/src/render/backend/webgpu/environmentTexels.ts +96 -0
  725. package/src/render/backend/webgpu/filmPass.ts +123 -0
  726. package/src/render/backend/webgpu/flatPass.ts +635 -0
  727. package/src/render/backend/webgpu/flockPass.ts +163 -0
  728. package/src/render/backend/webgpu/gpuTimestamps.ts +255 -0
  729. package/src/render/backend/webgpu/insetPass.ts +123 -0
  730. package/src/render/backend/webgpu/instanced.ts +55 -0
  731. package/src/render/backend/webgpu/lightVolumePass.ts +203 -0
  732. package/src/render/backend/webgpu/linePass.ts +270 -0
  733. package/src/render/backend/webgpu/morphTexture.ts +61 -0
  734. package/src/render/backend/webgpu/panelPass.ts +138 -0
  735. package/src/render/backend/webgpu/particlePass.ts +370 -0
  736. package/src/render/backend/webgpu/pipelineCache.ts +152 -0
  737. package/src/render/backend/webgpu/plumePass.ts +292 -0
  738. package/src/render/backend/webgpu/pointShadowPass.ts +368 -0
  739. package/src/render/backend/webgpu/postPass.ts +470 -0
  740. package/src/render/backend/webgpu/probePass.ts +218 -0
  741. package/src/render/backend/webgpu/reflectionPass.ts +137 -0
  742. package/src/render/backend/webgpu/renderer.ts +13004 -0
  743. package/src/render/backend/webgpu/scatterPass.ts +354 -0
  744. package/src/render/backend/webgpu/sdfTextPass.ts +220 -0
  745. package/src/render/backend/webgpu/shaderModules.ts +49 -0
  746. package/src/render/backend/webgpu/shaders/clusterBin.wgsl.ts +219 -0
  747. package/src/render/backend/webgpu/skinPaletteRing.ts +105 -0
  748. package/src/render/backend/webgpu/skinPaletteTexture.ts +79 -0
  749. package/src/render/backend/webgpu/skyPass.ts +85 -0
  750. package/src/render/backend/webgpu/surfaceTexturePass.ts +257 -0
  751. package/src/render/backend/webgpu/textPass.ts +224 -0
  752. package/src/render/backend/webgpu/uniformRing.ts +228 -0
  753. package/src/render/backend/webgpu/waterPass.ts +211 -0
  754. package/src/render/backend/webgpu/windStreakPass.ts +196 -0
  755. package/src/render/billboard.ts +108 -0
  756. package/src/render/bloomChain.ts +101 -0
  757. package/src/render/bloomPass.ts +256 -0
  758. package/src/render/boltBatch.ts +141 -0
  759. package/src/render/boltPool.ts +360 -0
  760. package/src/render/boom.ts +123 -0
  761. package/src/render/camera.ts +348 -0
  762. package/src/render/causticsRenderer.ts +171 -0
  763. package/src/render/cinematicCamera.ts +278 -0
  764. package/src/render/clusteredLights.ts +598 -0
  765. package/src/render/colourGrade.ts +109 -0
  766. package/src/render/compute.ts +83 -0
  767. package/src/render/contextLoss.ts +50 -0
  768. package/src/render/debugLines.ts +411 -0
  769. package/src/render/decalPass.ts +124 -0
  770. package/src/render/decalProjector.ts +390 -0
  771. package/src/render/decalQueue.ts +110 -0
  772. package/src/render/depthConvention.ts +383 -0
  773. package/src/render/drawingBuffer.ts +89 -0
  774. package/src/render/emptyTexture.ts +130 -0
  775. package/src/render/envProbeArray.ts +201 -0
  776. package/src/render/equirectToCube.ts +160 -0
  777. package/src/render/flockGeometry.ts +53 -0
  778. package/src/render/flockRenderer.ts +111 -0
  779. package/src/render/frame/arena.ts +93 -0
  780. package/src/render/frame/index.ts +29 -0
  781. package/src/render/frame/replay.ts +50 -0
  782. package/src/render/frame/resources.ts +61 -0
  783. package/src/render/frame/schedule.ts +85 -0
  784. package/src/render/frameView.ts +20 -0
  785. package/src/render/gizmo.ts +923 -0
  786. package/src/render/globalMedium.ts +154 -0
  787. package/src/render/globalMediumPass.ts +323 -0
  788. package/src/render/gpuCapability.ts +244 -0
  789. package/src/render/gpuTimer.ts +182 -0
  790. package/src/render/halfFloat.ts +39 -0
  791. package/src/render/handleRegistry.ts +96 -0
  792. package/src/render/iesProfile.ts +215 -0
  793. package/src/render/imageTexels.ts +109 -0
  794. package/src/render/instancedMesh.ts +187 -0
  795. package/src/render/instances.ts +92 -0
  796. package/src/render/lightBudget.ts +655 -0
  797. package/src/render/lightMatrix.ts +69 -0
  798. package/src/render/lightVolumeDraw.ts +216 -0
  799. package/src/render/lineBatch.ts +180 -0
  800. package/src/render/linePoints.ts +61 -0
  801. package/src/render/livePointShadowSet.ts +285 -0
  802. package/src/render/lod.ts +86 -0
  803. package/src/render/mesh.ts +536 -0
  804. package/src/render/occlusion.ts +406 -0
  805. package/src/render/oitPass.ts +230 -0
  806. package/src/render/orderIndependent.ts +136 -0
  807. package/src/render/particleBatch.ts +299 -0
  808. package/src/render/particleMaterial.ts +84 -0
  809. package/src/render/particlePool.ts +291 -0
  810. package/src/render/pass.ts +203 -0
  811. package/src/render/passTarget.ts +225 -0
  812. package/src/render/pickable.ts +222 -0
  813. package/src/render/planarReflection.ts +233 -0
  814. package/src/render/planarReflectionDraw.ts +87 -0
  815. package/src/render/plumeGeometry.ts +75 -0
  816. package/src/render/plumeMaterial.ts +99 -0
  817. package/src/render/plumeRenderer.ts +272 -0
  818. package/src/render/pointLightSelection.ts +447 -0
  819. package/src/render/pointShadowArray.ts +276 -0
  820. package/src/render/pointShadowBudget.ts +305 -0
  821. package/src/render/pointShadowImage.ts +470 -0
  822. package/src/render/pointShadowMap.ts +228 -0
  823. package/src/render/pointShadowSystem.ts +408 -0
  824. package/src/render/prefilterEnvMap.ts +162 -0
  825. package/src/render/prefilterPass.ts +115 -0
  826. package/src/render/probeGrid.ts +248 -0
  827. package/src/render/rainField.ts +240 -0
  828. package/src/render/reflectionProbe.ts +530 -0
  829. package/src/render/renderQuality.ts +1054 -0
  830. package/src/render/rendererHarness.ts +214 -0
  831. package/src/render/resolutionGovernor.ts +189 -0
  832. package/src/render/scatterDeform.ts +72 -0
  833. package/src/render/sceneTarget.ts +1032 -0
  834. package/src/render/screenSpaceReflection.ts +524 -0
  835. package/src/render/sdfFont.ts +157 -0
  836. package/src/render/sdfTextLayout.ts +206 -0
  837. package/src/render/sdfTextRenderer.ts +233 -0
  838. package/src/render/seaState.ts +55 -0
  839. package/src/render/segmentQuads.ts +92 -0
  840. package/src/render/shader.ts +190 -0
  841. package/src/render/shaders/ambientOcclusion.ts +354 -0
  842. package/src/render/shaders/arcane.ts +103 -0
  843. package/src/render/shaders/bloom.ts +232 -0
  844. package/src/render/shaders/bolt.ts +164 -0
  845. package/src/render/shaders/caustics.ts +169 -0
  846. package/src/render/shaders/conditionals.ts +58 -0
  847. package/src/render/shaders/decalProject.ts +127 -0
  848. package/src/render/shaders/depth.ts +131 -0
  849. package/src/render/shaders/depthOfField.ts +141 -0
  850. package/src/render/shaders/film.ts +285 -0
  851. package/src/render/shaders/fire.ts +180 -0
  852. package/src/render/shaders/flat/directionalShadow.ts +196 -0
  853. package/src/render/shaders/flat/index.ts +502 -0
  854. package/src/render/shaders/flat/lobes.ts +399 -0
  855. package/src/render/shaders/flat/main.ts +1631 -0
  856. package/src/render/shaders/flat/pointShadow.ts +323 -0
  857. package/src/render/shaders/flat/preamble.ts +875 -0
  858. package/src/render/shaders/flat/probeGrid.ts +152 -0
  859. package/src/render/shaders/flat/surface.ts +41 -0
  860. package/src/render/shaders/flock.ts +103 -0
  861. package/src/render/shaders/fog.ts +99 -0
  862. package/src/render/shaders/fullscreen.ts +28 -0
  863. package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +74 -0
  864. package/src/render/shaders/generated/arcane.wgsl.ts +98 -0
  865. package/src/render/shaders/generated/bloom.wgsl.ts +79 -0
  866. package/src/render/shaders/generated/bolt.wgsl.ts +127 -0
  867. package/src/render/shaders/generated/caustics.wgsl.ts +127 -0
  868. package/src/render/shaders/generated/decalProject.wgsl.ts +69 -0
  869. package/src/render/shaders/generated/depth.wgsl.ts +142 -0
  870. package/src/render/shaders/generated/film.wgsl.ts +143 -0
  871. package/src/render/shaders/generated/fire.wgsl.ts +137 -0
  872. package/src/render/shaders/generated/flat.wgsl.ts +9195 -0
  873. package/src/render/shaders/generated/flock.wgsl.ts +82 -0
  874. package/src/render/shaders/generated/fullscreen.wgsl.ts +20 -0
  875. package/src/render/shaders/generated/globalMedium.wgsl.ts +139 -0
  876. package/src/render/shaders/generated/lightVolume.wgsl.ts +242 -0
  877. package/src/render/shaders/generated/line.wgsl.ts +137 -0
  878. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +60 -0
  879. package/src/render/shaders/generated/oitResolve.wgsl.ts +31 -0
  880. package/src/render/shaders/generated/panel.wgsl.ts +57 -0
  881. package/src/render/shaders/generated/particle.wgsl.ts +343 -0
  882. package/src/render/shaders/generated/prefilter.wgsl.ts +69 -0
  883. package/src/render/shaders/generated/rush.wgsl.ts +139 -0
  884. package/src/render/shaders/generated/scatter.wgsl.ts +205 -0
  885. package/src/render/shaders/generated/sdfText.wgsl.ts +78 -0
  886. package/src/render/shaders/generated/sky.wgsl.ts +109 -0
  887. package/src/render/shaders/generated/smoke.wgsl.ts +93 -0
  888. package/src/render/shaders/generated/ssrResolve.wgsl.ts +26 -0
  889. package/src/render/shaders/generated/ssrTrace.wgsl.ts +94 -0
  890. package/src/render/shaders/generated/temporalResolve.wgsl.ts +54 -0
  891. package/src/render/shaders/generated/text.wgsl.ts +107 -0
  892. package/src/render/shaders/generated/water.wgsl.ts +256 -0
  893. package/src/render/shaders/generated/windStreaks.wgsl.ts +82 -0
  894. package/src/render/shaders/gerstner.ts +110 -0
  895. package/src/render/shaders/globalMedium.ts +396 -0
  896. package/src/render/shaders/lightVolume.ts +546 -0
  897. package/src/render/shaders/line.ts +125 -0
  898. package/src/render/shaders/morph.ts +62 -0
  899. package/src/render/shaders/octahedral.ts +170 -0
  900. package/src/render/shaders/octahedralResolve.ts +83 -0
  901. package/src/render/shaders/oitResolve.ts +42 -0
  902. package/src/render/shaders/outputTransform.ts +107 -0
  903. package/src/render/shaders/panel.ts +51 -0
  904. package/src/render/shaders/particle.ts +438 -0
  905. package/src/render/shaders/prefilter.ts +278 -0
  906. package/src/render/shaders/rush.ts +357 -0
  907. package/src/render/shaders/scatter.ts +211 -0
  908. package/src/render/shaders/sdfText.ts +68 -0
  909. package/src/render/shaders/skinning.ts +59 -0
  910. package/src/render/shaders/sky.ts +243 -0
  911. package/src/render/shaders/smoke.ts +89 -0
  912. package/src/render/shaders/ssrResolve.ts +28 -0
  913. package/src/render/shaders/ssrTrace.ts +233 -0
  914. package/src/render/shaders/tangentFrame.ts +70 -0
  915. package/src/render/shaders/temporalResolve.ts +151 -0
  916. package/src/render/shaders/text.ts +156 -0
  917. package/src/render/shaders/vertexChannel.ts +71 -0
  918. package/src/render/shaders/water.ts +356 -0
  919. package/src/render/shaders/windStreaks.ts +130 -0
  920. package/src/render/shadowCasters.ts +124 -0
  921. package/src/render/shadowMap.ts +89 -0
  922. package/src/render/shotPlacement.ts +266 -0
  923. package/src/render/skinPalette.ts +157 -0
  924. package/src/render/ssrPass.ts +241 -0
  925. package/src/render/surfaceSheet.ts +158 -0
  926. package/src/render/surfaceTexture.ts +310 -0
  927. package/src/render/temporalAa.ts +221 -0
  928. package/src/render/temporalPass.ts +153 -0
  929. package/src/render/textLayout.ts +239 -0
  930. package/src/render/textRenderer.ts +201 -0
  931. package/src/render/thirdPersonCamera.ts +578 -0
  932. package/src/render/trample.ts +140 -0
  933. package/src/render/translucentQueue.ts +161 -0
  934. package/src/render/uniformVectorBudget.ts +246 -0
  935. package/src/render/uploadStep.ts +14 -0
  936. package/src/render/vertexDefaults.ts +115 -0
  937. package/src/render/visibility.ts +56 -0
  938. package/src/render/waterDraw.ts +167 -0
  939. package/src/render/waterGrid.ts +180 -0
  940. package/src/render/waterRenderer.ts +352 -0
  941. package/src/render/wind.ts +79 -0
  942. package/src/render/windField.ts +50 -0
  943. package/src/render/windStreakDraw.ts +131 -0
  944. package/src/render/windStreakRenderer.ts +130 -0
  945. package/src/scene/node.ts +336 -0
  946. package/src/scene/visit.ts +82 -0
  947. package/src/ui/clipMime.ts +109 -0
  948. package/src/ui/exportTarget.ts +491 -0
  949. package/src/ui/frameOverlay.ts +159 -0
  950. package/src/ui/framePacer.ts +351 -0
  951. package/src/ui/frameRecorder.ts +333 -0
  952. package/src/ui/fullscreen.ts +113 -0
  953. package/src/ui/pixelCursor.ts +99 -0
  954. package/src/ui/splash.ts +347 -0
  955. package/src/ui/stillFrame.ts +44 -0
@@ -0,0 +1,470 @@
1
+ import { FULLSCREEN_VERT_WGSL } from '../../shaders/generated/fullscreen.wgsl.ts';
2
+ import { RUSH_BINDINGS, RUSH_FRAG_WGSL } from '../../shaders/generated/rush.wgsl.ts';
3
+ import {
4
+ BLOOM_BINDINGS,
5
+ BLOOM_DOWNSAMPLE_FRAG_WGSL,
6
+ BLOOM_PREFILTER_FRAG_WGSL,
7
+ BLOOM_UPSAMPLE_FRAG_WGSL,
8
+ } from '../../shaders/generated/bloom.wgsl.ts';
9
+ import {
10
+ AMBIENTOCCLUSION_BINDINGS as AO_BINDINGS,
11
+ AO_BLUR_FRAG_WGSL,
12
+ AO_FRAG_WGSL,
13
+ } from '../../shaders/generated/ambientOcclusion.wgsl.ts';
14
+ import {
15
+ TEMPORALRESOLVE_BINDINGS as TAA_BINDINGS,
16
+ TEMPORAL_RESOLVE_FRAG_WGSL,
17
+ } from '../../shaders/generated/temporalResolve.wgsl.ts';
18
+ import {
19
+ OITRESOLVE_BINDINGS as OIT_BINDINGS,
20
+ OIT_RESOLVE_FRAG_WGSL,
21
+ } from '../../shaders/generated/oitResolve.wgsl.ts';
22
+ import {
23
+ DECALPROJECT_BINDINGS as DECAL_BINDINGS,
24
+ DECAL_PROJECT_FRAG_WGSL,
25
+ } from '../../shaders/generated/decalProject.wgsl.ts';
26
+ import {
27
+ SSRTRACE_BINDINGS as SSR_BINDINGS,
28
+ SSR_TRACE_FRAG_WGSL,
29
+ } from '../../shaders/generated/ssrTrace.wgsl.ts';
30
+ import {
31
+ SSRRESOLVE_BINDINGS as SSR_RESOLVE_BINDINGS,
32
+ SSR_RESOLVE_FRAG_WGSL,
33
+ } from '../../shaders/generated/ssrResolve.wgsl.ts';
34
+ import {
35
+ GLOBALMEDIUM_BINDINGS as MEDIUM_BINDINGS,
36
+ MEDIUM_FRAG_WGSL,
37
+ MEDIUM_UPSAMPLE_FRAG_WGSL,
38
+ } from '../../shaders/generated/globalMedium.wgsl.ts';
39
+ import type { UniformFields } from './scatterPass.ts';
40
+ import type { PipelineCache } from './pipelineCache.ts';
41
+ import { shaderModule } from './shaderModules.ts';
42
+
43
+ /**
44
+ * The composite: everything that happens to the frame after the world is drawn.
45
+ *
46
+ * **The scene lands off-screen and one pass puts it on the canvas.** That pass is `rush.ts`, and
47
+ * it is one shader rather than four because every one of these effects reads the same resolved
48
+ * image: the speed blur, the camera motion blur, the occlusion it multiplies in, the bloom it
49
+ * adds and the tone curve it ends on. `sceneTarget.ts` makes the same argument on the other
50
+ * backend, and both are why `bindMeshPass` grades in the mesh pass *only* when there is no
51
+ * composite to grade in.
52
+ *
53
+ * **What differs here is depth.** WebGL2 resolves a multisampled depth buffer with
54
+ * `blitFramebuffer` and reads it back; WebGPU has no multisample depth resolve at all. So a
55
+ * frame that wants occlusion or motion blur gets a resolve of its own, written below, which
56
+ * reads sample zero through `texture_depth_multisampled_2d` and writes it to a single-sample
57
+ * float target the generated shaders can sample as an ordinary texture.
58
+ */
59
+
60
+ export const RUSH_FRAG_FIELDS: UniformFields = RUSH_BINDINGS.RUSH_FRAG.fields;
61
+ export const RUSH_FRAG_SIZE = RUSH_BINDINGS.RUSH_FRAG.uniformSize;
62
+ const RUSH_UNIFORMS = RUSH_BINDINGS.RUSH_FRAG.uniforms;
63
+ const RUSH_TEXTURES = RUSH_BINDINGS.RUSH_FRAG.textures;
64
+
65
+ export const AO_FRAG_FIELDS: UniformFields = AO_BINDINGS.AO_FRAG.fields;
66
+ export const AO_FRAG_SIZE = AO_BINDINGS.AO_FRAG.uniformSize;
67
+ export const AO_BLUR_FIELDS: UniformFields = AO_BINDINGS.AO_BLUR_FRAG.fields;
68
+ export const AO_BLUR_SIZE = AO_BINDINGS.AO_BLUR_FRAG.uniformSize;
69
+
70
+ export const MEDIUM_FRAG_FIELDS: UniformFields = MEDIUM_BINDINGS.MEDIUM_FRAG.fields;
71
+ export const MEDIUM_FRAG_SIZE = MEDIUM_BINDINGS.MEDIUM_FRAG.uniformSize;
72
+ export const MEDIUM_UPSAMPLE_FIELDS: UniformFields = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.fields;
73
+ export const MEDIUM_UPSAMPLE_SIZE = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.uniformSize;
74
+
75
+ export const BLOOM_PREFILTER_FIELDS: UniformFields = BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.fields;
76
+ /**
77
+ * The other two stages' blocks, read by name like every other block here.
78
+ *
79
+ * **Named rather than assumed to be the prefilter's**, because they are not: the downsample has
80
+ * a texel and no threshold, and the upsample has neither — it has a radius. All three happen to
81
+ * be sixteen bytes, which is exactly the coincidence that would let a wrong offset go unnoticed.
82
+ * `postField` throws on a name a block does not have, and that is the point of asking.
83
+ */
84
+ export const BLOOM_DOWNSAMPLE_FIELDS: UniformFields = BLOOM_BINDINGS.BLOOM_DOWNSAMPLE_FRAG.fields;
85
+ export const BLOOM_UPSAMPLE_FIELDS: UniformFields = BLOOM_BINDINGS.BLOOM_UPSAMPLE_FRAG.fields;
86
+ /** The widest of the three, so one slot shape holds any stage's block. */
87
+ export const BLOOM_STAGE_SIZE = Math.max(
88
+ BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.uniformSize,
89
+ BLOOM_BINDINGS.BLOOM_DOWNSAMPLE_FRAG.uniformSize,
90
+ BLOOM_BINDINGS.BLOOM_UPSAMPLE_FRAG.uniformSize,
91
+ );
92
+
93
+ const VISIBILITY_FRAGMENT = 0x2;
94
+
95
+ /**
96
+ * What the scene is drawn into when the composite exists.
97
+ *
98
+ * `rgba16float` where the profile asks for an HDR scene, because that is the whole point of one:
99
+ * a bright pixel keeps its range until the tone curve, instead of being clipped at 1 by the mesh
100
+ * pass and then tone-mapped from a value that has already lost the information. `renderer.ts`
101
+ * calls the same option `hdrScene` and `keepsRange` for the same reason — a bloom threshold in
102
+ * scene units means nothing against a clamped buffer.
103
+ */
104
+ export function sceneColorFormat(hdr: boolean): GPUTextureFormat {
105
+ return hdr ? 'rgba16float' : 'rgba8unorm';
106
+ }
107
+
108
+ /** A single-sample depth the generated shaders can sample. See the module comment. */
109
+ export const RESOLVED_DEPTH_FORMAT: GPUTextureFormat = 'r32float';
110
+
111
+ /**
112
+ * Sample zero of a multisampled depth buffer, written to a colour target.
113
+ *
114
+ * **Because WebGPU cannot resolve depth.** `blitFramebuffer` does it on the other backend and
115
+ * this has no equivalent, so the choice is between this and switching occlusion off at any
116
+ * sample count above one. Sample zero rather than an average, deliberately: occlusion and
117
+ * reprojection both want *a* surface's depth, and the mean of four samples across a silhouette
118
+ * is a depth where no surface is — which reads as a halo along every edge.
119
+ */
120
+ const DEPTH_RESOLVE_WGSL = `
121
+ @group(0) @binding(0) var source: texture_depth_multisampled_2d;
122
+
123
+ @vertex
124
+ fn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {
125
+ let x = f32((index << 1u) & 2u);
126
+ let y = f32(index & 2u);
127
+ return vec4<f32>(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0);
128
+ }
129
+
130
+ @fragment
131
+ fn fragmentMain(@builtin(position) position: vec4<f32>) -> @location(0) f32 {
132
+ return textureLoad(source, vec2<i32>(position.xy), 0);
133
+ }
134
+ `;
135
+
136
+ /** The same, for a frame drawn at one sample: a plain copy so the composite has one input shape. */
137
+ const DEPTH_COPY_WGSL = `
138
+ @group(0) @binding(0) var source: texture_depth_2d;
139
+
140
+ @vertex
141
+ fn vertexMain(@builtin(vertex_index) index: u32) -> @builtin(position) vec4<f32> {
142
+ let x = f32((index << 1u) & 2u);
143
+ let y = f32(index & 2u);
144
+ return vec4<f32>(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0);
145
+ }
146
+
147
+ @fragment
148
+ fn fragmentMain(@builtin(position) position: vec4<f32>) -> @location(0) f32 {
149
+ return textureLoad(source, vec2<i32>(position.xy), 0);
150
+ }
151
+ `;
152
+
153
+ export function createDepthResolveLayout(
154
+ device: GPUDevice,
155
+ multisampled: boolean,
156
+ ): GPUBindGroupLayout {
157
+ return device.createBindGroupLayout({
158
+ label: 'post.depthResolveLayout',
159
+ entries: [
160
+ {
161
+ binding: 0,
162
+ visibility: VISIBILITY_FRAGMENT,
163
+ texture: { sampleType: 'depth', multisampled },
164
+ },
165
+ ],
166
+ });
167
+ }
168
+
169
+ export function depthResolvePipeline(
170
+ cache: PipelineCache,
171
+ device: GPUDevice,
172
+ layout: GPUBindGroupLayout,
173
+ multisampled: boolean,
174
+ ): GPURenderPipeline {
175
+ return cache.get(`post.depthResolve:${multisampled}`, () => {
176
+ const module = shaderModule(device, {
177
+ label: 'post.depthResolve',
178
+ code: multisampled ? DEPTH_RESOLVE_WGSL : DEPTH_COPY_WGSL,
179
+ });
180
+ return {
181
+ label: `post.depthResolve:${multisampled}`,
182
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
183
+ vertex: { module, entryPoint: 'vertexMain' },
184
+ fragment: {
185
+ module,
186
+ entryPoint: 'fragmentMain',
187
+ targets: [{ format: RESOLVED_DEPTH_FORMAT }],
188
+ },
189
+ primitive: { topology: 'triangle-list' as const },
190
+ };
191
+ });
192
+ }
193
+
194
+ /**
195
+ * One texture, one sampler, one uniform block: the shape every stage of this chain has.
196
+ *
197
+ * The bloom stages and the occlusion blur all read a source and a size, so they share a layout
198
+ * builder rather than three copies of the same six lines.
199
+ */
200
+ export function createPostStageLayout(
201
+ device: GPUDevice,
202
+ uniformBinding: number,
203
+ uniformSize: number,
204
+ textures: readonly {
205
+ binding: { texture: number; sampler: number };
206
+ filterable?: boolean;
207
+ /**
208
+ * `'2d'` unless said otherwise, because every post input but one is a screen-sized target.
209
+ *
210
+ * The exception is the colour grade's lookup table, which is a cube of display values and
211
+ * declares `texture_3d<f32>` in the generated WGSL. A layout that left this at `'2d'` is
212
+ * rejected at bind-group creation rather than at draw — which is the *good* case, and is
213
+ * only good because it is stated: a dimension is a property of the texture and never of the
214
+ * pass reading it, which is the lesson `filterable` above records twice already.
215
+ */
216
+ dimension?: GPUTextureViewDimension;
217
+ }[],
218
+ ): GPUBindGroupLayout {
219
+ const entries: GPUBindGroupLayoutEntry[] = [
220
+ {
221
+ binding: uniformBinding,
222
+ visibility: VISIBILITY_FRAGMENT,
223
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: uniformSize },
224
+ },
225
+ ];
226
+ for (const { binding, filterable = true, dimension = '2d' } of textures) {
227
+ /*
228
+ * **The resolved depth is `r32float`, which is `UnfilterableFloat` and nothing else.**
229
+ *
230
+ * The colour inputs are ordinary render targets and filter fine; this one does not, and
231
+ * declaring it alongside them is rejected in the words this backend has now heard three
232
+ * times: *"None of the supported sample types (UnfilterableFloat) of [Texture
233
+ * "post.resolvedDepth"] match the expected sample types (Float)"*. `depthPass.ts` learned
234
+ * it on a shadow map and `flatPass.ts` on the environment cube; the lesson is that a
235
+ * texture's filterability is a property of its format and never of the pass using it.
236
+ *
237
+ * `r16float` would filter, and would throw away the depth precision occlusion and
238
+ * reprojection are built on. So the format stays and the declaration bends.
239
+ */
240
+ entries.push({
241
+ binding: binding.texture,
242
+ visibility: VISIBILITY_FRAGMENT,
243
+ texture: filterable
244
+ ? { viewDimension: dimension }
245
+ : { sampleType: 'unfilterable-float', viewDimension: dimension },
246
+ });
247
+ entries.push({
248
+ binding: binding.sampler,
249
+ visibility: VISIBILITY_FRAGMENT,
250
+ sampler: { type: filterable ? 'filtering' : 'non-filtering' },
251
+ });
252
+ }
253
+ return device.createBindGroupLayout({ label: 'post.stageLayout', entries });
254
+ }
255
+
256
+ /**
257
+ * Additive, for the way back up the bloom pyramid.
258
+ *
259
+ * Each level is added *into* the one above it rather than replacing it, so level 0 ends up
260
+ * holding every octave at once — which is what makes the falloff the sum of the octaves rather
261
+ * than one kernel's. `bloomPass.ts` reaches the same place with `blendFunc(ONE, ONE)` and a
262
+ * `loadOp` of `load` is the other half of it here: a cleared attachment would discard the
263
+ * level the downsample just wrote and add the octave to nothing.
264
+ */
265
+ /**
266
+ * What composites the order-independent buffers over the finished scene.
267
+ *
268
+ * Against a fragment carrying the average colour and the revealage, this computes
269
+ * `average * (1 - reveal) + scene * reveal` — which is the resolve. Doing it in the blend rather
270
+ * than by sampling means the pass never reads the target it writes.
271
+ */
272
+ export const OIT_COMPOSITE_BLEND: GPUBlendState = {
273
+ color: { srcFactor: 'one-minus-src-alpha', dstFactor: 'src-alpha', operation: 'add' },
274
+ alpha: { srcFactor: 'one-minus-src-alpha', dstFactor: 'src-alpha', operation: 'add' },
275
+ };
276
+
277
+ /**
278
+ * What a drawn decal does to the pixel under it: `dst * src`.
279
+ *
280
+ * White is the identity, so a fragment the projector missed changes nothing and the shader needs
281
+ * no branch and no discard. It multiplies the *lit* pixel, which is the whole reason a mark placed
282
+ * this late still takes the receiver's lighting — `decalProject.ts` argues that where it is
283
+ * written, and `decalPass.ts` sets the same pair on the other backend.
284
+ */
285
+ /**
286
+ * What a global medium does to the pixel under it: `dst * transmittance + inscatter`.
287
+ *
288
+ * **The transfer equation for one segment, written as a blend state.** The march puts scattered
289
+ * light in `rgb` and how much of the frame survives the journey in `a`, so `(one, src-alpha)` is
290
+ * exactly the integral — and the composite therefore never samples the colour it is modifying,
291
+ * which is the read both backends are entitled to call undefined.
292
+ *
293
+ * Alpha is `(zero, one)`: the frame's own alpha is not the medium's to spend. The scene target
294
+ * carries it to the canvas, and a medium that wrote there would make a foggy frame translucent.
295
+ */
296
+ export const MEDIUM_TRANSMIT_BLEND: GPUBlendState = {
297
+ color: { srcFactor: 'one', dstFactor: 'src-alpha', operation: 'add' },
298
+ alpha: { srcFactor: 'zero', dstFactor: 'one', operation: 'add' },
299
+ };
300
+
301
+ export const DECAL_MULTIPLY_BLEND: GPUBlendState = {
302
+ color: { srcFactor: 'zero', dstFactor: 'src', operation: 'add' },
303
+ alpha: { srcFactor: 'zero', dstFactor: 'src', operation: 'add' },
304
+ };
305
+
306
+ /**
307
+ * `over`, against colour a pass has already multiplied by its own coverage.
308
+ *
309
+ * What the screen-space reflection writes and what composites it: the trace multiplies what it
310
+ * found by how much of it lands, so two reflective surfaces overlapping layer the way two blended
311
+ * surfaces do rather than the way two independent guesses do — and the resolve then never has to
312
+ * sample the colour it is compositing onto.
313
+ */
314
+ export const PREMULTIPLIED_OVER_BLEND: GPUBlendState = {
315
+ color: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
316
+ alpha: { srcFactor: 'one', dstFactor: 'one-minus-src-alpha', operation: 'add' },
317
+ };
318
+
319
+ export const ADDITIVE_BLEND: GPUBlendState = {
320
+ color: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
321
+ alpha: { srcFactor: 'one', dstFactor: 'one', operation: 'add' },
322
+ };
323
+
324
+ /** A fullscreen pass over one or more inputs, writing to one colour target. */
325
+ export function postPipeline(
326
+ cache: PipelineCache,
327
+ device: GPUDevice,
328
+ layout: GPUBindGroupLayout,
329
+ key: string,
330
+ fragment: string,
331
+ format: GPUTextureFormat,
332
+ blend?: GPUBlendState,
333
+ ): GPURenderPipeline {
334
+ return cache.get(key, () => ({
335
+ label: key,
336
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
337
+ vertex: {
338
+ module: shaderModule(device, { label: 'post.vert', code: FULLSCREEN_VERT_WGSL }),
339
+ entryPoint: 'main',
340
+ },
341
+ fragment: {
342
+ module: shaderModule(device, { label: key, code: fragment }),
343
+ entryPoint: 'main',
344
+ targets: [blend === undefined ? { format } : { format, blend }],
345
+ },
346
+ /*
347
+ * No depth at all, which is what makes this different from every other pipeline here: the
348
+ * composite writes over a finished frame and has nothing to sort against. `sceneTarget.ts`
349
+ * disables the test, the write and culling by hand for the same draw.
350
+ */
351
+ primitive: { topology: 'triangle-list' as const, cullMode: 'none' as const },
352
+ }));
353
+ }
354
+
355
+ /**
356
+ * The temporal resolve's block and its three inputs.
357
+ *
358
+ * Named like the occlusion's beside it, and for the same reason `BLOOM_DOWNSAMPLE_FIELDS` is: a
359
+ * block read by assumption rather than by name is a uniform written to the wrong offset, which
360
+ * draws a plausible picture.
361
+ */
362
+ export const TAA_FRAG_FIELDS: UniformFields = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.fields;
363
+ export const TAA_FRAG_SIZE = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.uniformSize;
364
+ export const TAA_UNIFORMS = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.uniforms;
365
+ export const TAA_TEXTURES = TAA_BINDINGS.TEMPORAL_RESOLVE_FRAG.textures;
366
+
367
+ /**
368
+ * The order-independent resolve's inputs. It has no uniform block of its own — the whole pass is
369
+ * two texture fetches and a divide — so only the textures are named here.
370
+ */
371
+ export const OIT_TEXTURES = OIT_BINDINGS.OIT_RESOLVE_FRAG.textures;
372
+
373
+ /**
374
+ * A drawn decal's block and the one texture it reads.
375
+ *
376
+ * One block per mark and a frame may draw many, so the buffer holds an aligned slot each and the
377
+ * pass binds by dynamic offset — the arrangement the bloom chain already uses, and for the same
378
+ * reason: `queue.writeBuffer` does not interleave with recorded commands, so one block rewritten
379
+ * between two passes gives both passes the last write.
380
+ */
381
+ export const DECAL_FRAG_FIELDS: UniformFields = DECAL_BINDINGS.DECAL_PROJECT_FRAG.fields;
382
+ export const DECAL_FRAG_SIZE = DECAL_BINDINGS.DECAL_PROJECT_FRAG.uniformSize;
383
+ export const DECAL_UNIFORMS = DECAL_BINDINGS.DECAL_PROJECT_FRAG.uniforms;
384
+ export const DECAL_TEXTURES = DECAL_BINDINGS.DECAL_PROJECT_FRAG.textures;
385
+
386
+ /**
387
+ * The reflection trace's block and its two inputs, and the resolve's one.
388
+ *
389
+ * One block per surface and a frame may draw several, so the buffer holds an aligned slot each and
390
+ * the pass binds by dynamic offset — the arrangement the bloom chain and the decals already use,
391
+ * and for the reason `bloomStaging` states: `queue.writeBuffer` does not interleave with recorded
392
+ * commands, so one block rewritten between two passes gives both passes the last write.
393
+ */
394
+ export const SSR_FRAG_FIELDS: UniformFields = SSR_BINDINGS.SSR_TRACE_FRAG.fields;
395
+ export const SSR_FRAG_SIZE = SSR_BINDINGS.SSR_TRACE_FRAG.uniformSize;
396
+ export const SSR_UNIFORMS = SSR_BINDINGS.SSR_TRACE_FRAG.uniforms;
397
+ export const SSR_TEXTURES = SSR_BINDINGS.SSR_TRACE_FRAG.textures;
398
+ export const SSR_RESOLVE_TEXTURES = SSR_RESOLVE_BINDINGS.SSR_RESOLVE_FRAG.textures;
399
+
400
+ /**
401
+ * The resolve's layout: one texture and no uniform block.
402
+ *
403
+ * `createPostStageLayout` cannot express this — it makes a block mandatory, every other stage in
404
+ * the chain having one — and this pass has nothing to parameterise: it fetches a texel and hands it
405
+ * to the blend state. A buffer allocated, bound and never read is worse than a second builder.
406
+ */
407
+ export function createSsrResolveLayout(device: GPUDevice): GPUBindGroupLayout {
408
+ const binding = SSR_RESOLVE_TEXTURES.uSsrReflection;
409
+ return device.createBindGroupLayout({
410
+ label: 'post.ssrResolveLayout',
411
+ entries: [
412
+ {
413
+ binding: binding.texture,
414
+ visibility: VISIBILITY_FRAGMENT,
415
+ texture: { viewDimension: '2d' },
416
+ },
417
+ { binding: binding.sampler, visibility: VISIBILITY_FRAGMENT, sampler: { type: 'filtering' } },
418
+ ],
419
+ });
420
+ }
421
+
422
+ /**
423
+ * The resolve's layout: two textures and no uniform block.
424
+ *
425
+ * **`createPostStageLayout` cannot express this**, because every other pass in the chain has a
426
+ * block and it makes one mandatory. This pass has nothing to parameterise — it fetches the two
427
+ * buffers, divides and hands the result to the blend state — so a layout with a uniform binding
428
+ * nothing writes would be a buffer allocated, bound and never read.
429
+ */
430
+ export function createOitResolveLayout(device: GPUDevice): GPUBindGroupLayout {
431
+ const entries: GPUBindGroupLayoutEntry[] = [];
432
+ for (const binding of [OIT_TEXTURES.uOitAccum, OIT_TEXTURES.uOitReveal]) {
433
+ entries.push({
434
+ binding: binding.texture,
435
+ visibility: VISIBILITY_FRAGMENT,
436
+ texture: { viewDimension: '2d' },
437
+ });
438
+ entries.push({
439
+ binding: binding.sampler,
440
+ visibility: VISIBILITY_FRAGMENT,
441
+ sampler: { type: 'filtering' },
442
+ });
443
+ }
444
+ return device.createBindGroupLayout({ label: 'post.oitResolveLayout', entries });
445
+ }
446
+
447
+ export { MEDIUM_FRAG_WGSL, MEDIUM_UPSAMPLE_FRAG_WGSL };
448
+ export const MEDIUM_UNIFORMS = MEDIUM_BINDINGS.MEDIUM_FRAG.uniforms;
449
+ export const MEDIUM_TEXTURES = MEDIUM_BINDINGS.MEDIUM_FRAG.textures;
450
+ export const MEDIUM_UPSAMPLE_UNIFORMS = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.uniforms;
451
+ export const MEDIUM_UPSAMPLE_TEXTURES = MEDIUM_BINDINGS.MEDIUM_UPSAMPLE_FRAG.textures;
452
+
453
+ export {
454
+ RUSH_FRAG_WGSL,
455
+ AO_FRAG_WGSL,
456
+ AO_BLUR_FRAG_WGSL,
457
+ TEMPORAL_RESOLVE_FRAG_WGSL,
458
+ OIT_RESOLVE_FRAG_WGSL,
459
+ DECAL_PROJECT_FRAG_WGSL,
460
+ SSR_TRACE_FRAG_WGSL,
461
+ SSR_RESOLVE_FRAG_WGSL,
462
+ };
463
+ export { BLOOM_PREFILTER_FRAG_WGSL, BLOOM_DOWNSAMPLE_FRAG_WGSL, BLOOM_UPSAMPLE_FRAG_WGSL };
464
+ export { RUSH_UNIFORMS, RUSH_TEXTURES };
465
+ export const AO_UNIFORMS = AO_BINDINGS.AO_FRAG.uniforms;
466
+ export const AO_TEXTURES = AO_BINDINGS.AO_FRAG.textures;
467
+ export const AO_BLUR_UNIFORMS = AO_BINDINGS.AO_BLUR_FRAG.uniforms;
468
+ export const AO_BLUR_TEXTURES = AO_BINDINGS.AO_BLUR_FRAG.textures;
469
+ export const BLOOM_UNIFORMS = BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.uniforms;
470
+ export const BLOOM_TEXTURES = BLOOM_BINDINGS.BLOOM_PREFILTER_FRAG.textures;
@@ -0,0 +1,218 @@
1
+ import { FULLSCREEN_VERT_WGSL } from '../../shaders/generated/fullscreen.wgsl.ts';
2
+ import { PREFILTER_BINDINGS, PREFILTER_FRAG_WGSL } from '../../shaders/generated/prefilter.wgsl.ts';
3
+ import type { PipelineCache } from './pipelineCache.ts';
4
+ import { shaderModule } from './shaderModules.ts';
5
+
6
+ /**
7
+ * The room, captured into a cubemap so reflective surfaces can mirror it.
8
+ *
9
+ * `reflectionProbe.ts` carries the argument for the feature: a reflection is an improvement to
10
+ * an appearance rather than a requirement, the scene still renders without one, and a device
11
+ * that cannot afford six faces keeps everything else.
12
+ *
13
+ * **Two things differ from the other backend and both are the same difference.** WebGPU has no
14
+ * `generateMipmap`, and the chain here *is* the roughness — a polished surface samples level 0
15
+ * and a satin one samples further up, which is a blur that costs a fetch rather than a pass. So
16
+ * the chain is built by rendering each level from the one above it, six faces at a time, with a
17
+ * blit that samples a **cube** rather than a 2D texture.
18
+ */
19
+
20
+ /** Where each face looks, in the order a cubemap's layers are indexed. */
21
+ export const PROBE_FACES: readonly { readonly yaw: number; readonly pitch: number }[] = [
22
+ { yaw: Math.PI / 2, pitch: 0 },
23
+ { yaw: -Math.PI / 2, pitch: 0 },
24
+ { yaw: 0, pitch: Math.PI / 2 },
25
+ { yaw: 0, pitch: -Math.PI / 2 },
26
+ /*
27
+ * **`+Z` is yaw `PI`, not yaw 0, and these two were the wrong way round.**
28
+ *
29
+ * `Camera`'s convention is that yaw 0 looks toward **-Z** and positive yaw turns toward +X, so
30
+ * cubemap layer 4, which the hardware reads as +Z, has to be rendered from yaw `PI`. This table
31
+ * had layer 4 at yaw 0, which put the -Z view in the +Z slot and the +Z view in the -Z slot —
32
+ * and it contradicted `PROBE_FACE_BASIS` in this same file, which has always said layer 4 is
33
+ * `forward: [0, 0, 1]`. `reflectionProbe.ts`'s table on the other backend has always been right.
34
+ *
35
+ * **It survived because a reflection of a swapped pair still looks like a reflection.** What
36
+ * finally separated them was projecting both backends' cubes onto spherical harmonics with one
37
+ * shared basis: every coefficient agreed except the linear Z, which came back +0.005 on one and
38
+ * -0.003 on the other. A sign, on the one axis these two faces span.
39
+ */
40
+ { yaw: Math.PI, pitch: 0 },
41
+ { yaw: 0, pitch: 0 },
42
+ ];
43
+
44
+ export const PROBE_FOV_DEG = 90;
45
+ export const PROBE_NEAR_M = 0.1;
46
+ export const PROBE_FAR_M = 200;
47
+
48
+ /**
49
+ * The blur that fills one mip level of one face from the level above.
50
+ *
51
+ * **Directions, not texture coordinates.** A cube level cannot be filled by sampling the 2D
52
+ * face above it: the neighbouring texels across an edge belong to a different face, and taking
53
+ * them from the same face is exactly how a seam appears along every edge. So the fragment
54
+ * rebuilds the direction its texel stands for and samples the cube, which crosses edges the way
55
+ * the hardware does when the shader reads it later.
56
+ */
57
+ const PROBE_MIP_WGSL = `
58
+ struct Face { basisX: vec4<f32>, basisY: vec4<f32>, forward: vec4<f32>, level: vec4<f32> }
59
+ @group(0) @binding(0) var<uniform> face: Face;
60
+ @group(0) @binding(1) var source: texture_cube<f32>;
61
+ @group(0) @binding(2) var samp: sampler;
62
+
63
+ struct Varying {
64
+ @builtin(position) position: vec4<f32>,
65
+ @location(0) uv: vec2<f32>,
66
+ }
67
+
68
+ @vertex
69
+ fn vertexMain(@builtin(vertex_index) index: u32) -> Varying {
70
+ var out: Varying;
71
+ let x = f32((index << 1u) & 2u);
72
+ let y = f32(index & 2u);
73
+ out.uv = vec2<f32>(x, y);
74
+ out.position = vec4<f32>(x * 2.0 - 1.0, 1.0 - y * 2.0, 0.0, 1.0);
75
+ return out;
76
+ }
77
+
78
+ @fragment
79
+ fn fragmentMain(in: Varying) -> @location(0) vec4<f32> {
80
+ // The texel's place on the face, in [-1, 1], and the direction it stands for.
81
+ let plane = in.uv * 2.0 - 1.0;
82
+ let dir = normalize(face.forward.xyz + face.basisX.xyz * plane.x + face.basisY.xyz * plane.y);
83
+ return textureSampleLevel(source, samp, dir, face.level.x);
84
+ }
85
+ `;
86
+
87
+ /** `basisX`, `basisY`, `forward`, `level` — four vec4s, so one aligned block. */
88
+ export const PROBE_MIP_UNIFORM_SIZE = 64;
89
+
90
+ /**
91
+ * The axes of each cube face, as the direction of its centre and its two in-plane steps.
92
+ *
93
+ * Written out rather than derived from the yaw and pitch above, because a cube's face basis has
94
+ * a handedness convention that a camera does not: getting one sign wrong mirrors a single face
95
+ * of the blur and shows up as one edge of a reflection that does not line up.
96
+ */
97
+ export const PROBE_FACE_BASIS: readonly {
98
+ readonly forward: readonly [number, number, number];
99
+ readonly basisX: readonly [number, number, number];
100
+ readonly basisY: readonly [number, number, number];
101
+ }[] = [
102
+ { forward: [1, 0, 0], basisX: [0, 0, -1], basisY: [0, -1, 0] },
103
+ { forward: [-1, 0, 0], basisX: [0, 0, 1], basisY: [0, -1, 0] },
104
+ { forward: [0, 1, 0], basisX: [1, 0, 0], basisY: [0, 0, 1] },
105
+ { forward: [0, -1, 0], basisX: [1, 0, 0], basisY: [0, 0, -1] },
106
+ { forward: [0, 0, 1], basisX: [1, 0, 0], basisY: [0, -1, 0] },
107
+ { forward: [0, 0, -1], basisX: [-1, 0, 0], basisY: [0, -1, 0] },
108
+ ];
109
+
110
+ export function createProbeMipBindGroupLayout(device: GPUDevice): GPUBindGroupLayout {
111
+ return device.createBindGroupLayout({
112
+ label: 'probe.mipLayout',
113
+ entries: [
114
+ {
115
+ binding: 0,
116
+ visibility: 0x1 | 0x2,
117
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: PROBE_MIP_UNIFORM_SIZE },
118
+ },
119
+ { binding: 1, visibility: 0x2, texture: { viewDimension: 'cube' } },
120
+ { binding: 2, visibility: 0x2, sampler: {} },
121
+ ],
122
+ });
123
+ }
124
+
125
+ export function probeMipPipeline(
126
+ cache: PipelineCache,
127
+ device: GPUDevice,
128
+ layout: GPUBindGroupLayout,
129
+ format: GPUTextureFormat,
130
+ ): GPURenderPipeline {
131
+ return cache.get(`probe.mip:${format}`, () => {
132
+ const module = shaderModule(device, { label: 'probe.mip', code: PROBE_MIP_WGSL });
133
+ return {
134
+ label: `probe.mip:${format}`,
135
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
136
+ vertex: { module, entryPoint: 'vertexMain' },
137
+ fragment: { module, entryPoint: 'fragmentMain', targets: [{ format }] },
138
+ primitive: { topology: 'triangle-list' as const },
139
+ };
140
+ });
141
+ }
142
+
143
+ /** How many levels a cube of this size has, counting the one the bake fills. */
144
+ export function probeLevels(size: number): number {
145
+ return Math.floor(Math.log2(size)) + 1;
146
+ }
147
+
148
+ /**
149
+ * The convolution's bind group, whose numbering is the generator's rather than this file's.
150
+ *
151
+ * **It cannot share `probe.mipLayout` and the reason is worth stating.** That layout was written
152
+ * by hand and numbered 0, 1, 2. The prefilter's WGSL is generated from GLSL, and the transform
153
+ * assigns its own numbers — the uniform block at 1 and a combined sampler split into a texture at
154
+ * 32 and a sampler at 33. Reusing the hand-written layout would be a pipeline whose bind group
155
+ * does not match its shader, which WebGPU reports at `finish` rather than at the call that caused
156
+ * it, as no picture from a frame that recorded correctly.
157
+ *
158
+ * The numbers are read from `PREFILTER_BINDINGS` rather than written again here, so the generator
159
+ * moving one cannot leave this silently wrong.
160
+ */
161
+ export function createProbePrefilterBindGroupLayout(device: GPUDevice): GPUBindGroupLayout {
162
+ const bindings = PREFILTER_BINDINGS.PREFILTER_FRAG;
163
+ const source = bindings.textures.uPrefilterSource;
164
+ return device.createBindGroupLayout({
165
+ label: 'probe.prefilterLayout',
166
+ entries: [
167
+ {
168
+ binding: bindings.uniforms,
169
+ visibility: 0x1 | 0x2,
170
+ buffer: {
171
+ type: 'uniform',
172
+ hasDynamicOffset: true,
173
+ minBindingSize: PROBE_MIP_UNIFORM_SIZE,
174
+ },
175
+ },
176
+ { binding: source.texture, visibility: 0x2, texture: { viewDimension: 'cube' } },
177
+ { binding: source.sampler, visibility: 0x2, sampler: {} },
178
+ ],
179
+ });
180
+ }
181
+
182
+ /**
183
+ * Where each field lands in the convolution's uniform block, from the generator's own table.
184
+ *
185
+ * Restating these as literals at the write site is how a struct layout and its writer drift, and
186
+ * the drift is invisible: a roughness written at the wrong offset is a level convolved for some
187
+ * other roughness, which looks like a plausible reflection.
188
+ */
189
+ export const PREFILTER_UNIFORM_OFFSETS = PREFILTER_BINDINGS.PREFILTER_FRAG.fields;
190
+
191
+ /** The generator's binding numbers, named once so a bind group and its layout cannot disagree. */
192
+ export const PREFILTER_UNIFORM_BINDING = PREFILTER_BINDINGS.PREFILTER_FRAG.uniforms;
193
+ export const PREFILTER_TEXTURE_BINDING =
194
+ PREFILTER_BINDINGS.PREFILTER_FRAG.textures.uPrefilterSource.texture;
195
+ export const PREFILTER_SAMPLER_BINDING =
196
+ PREFILTER_BINDINGS.PREFILTER_FRAG.textures.uPrefilterSource.sampler;
197
+
198
+ export function probePrefilterPipeline(
199
+ cache: PipelineCache,
200
+ device: GPUDevice,
201
+ layout: GPUBindGroupLayout,
202
+ format: GPUTextureFormat,
203
+ ): GPURenderPipeline {
204
+ return cache.get(`probe.prefilter:${format}`, () => ({
205
+ label: `probe.prefilter:${format}`,
206
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
207
+ vertex: {
208
+ module: shaderModule(device, { label: 'probe.prefilter.vert', code: FULLSCREEN_VERT_WGSL }),
209
+ entryPoint: 'main',
210
+ },
211
+ fragment: {
212
+ module: shaderModule(device, { label: 'probe.prefilter', code: PREFILTER_FRAG_WGSL }),
213
+ entryPoint: 'main',
214
+ targets: [{ format }],
215
+ },
216
+ primitive: { topology: 'triangle-list' as const, cullMode: 'none' as const },
217
+ }));
218
+ }