@driftengine/core 4.4.2 → 4.6.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 (339) hide show
  1. package/CHANGELOG.json +97 -0
  2. package/README.md +1 -1
  3. package/dist/geometry/boxCsg.d.ts +28 -0
  4. package/dist/geometry/boxCsg.js +139 -0
  5. package/dist/geometry/csg.d.ts +36 -0
  6. package/dist/geometry/csg.js +329 -0
  7. package/dist/geometry/meshBuilder.js +13 -0
  8. package/dist/geometry/meshConcat.js +1 -0
  9. package/dist/geometry/pixelFont.js +2 -0
  10. package/dist/geometry/solid.d.ts +61 -0
  11. package/dist/geometry/solid.js +152 -0
  12. package/dist/geometry/solidFlat.d.ts +35 -0
  13. package/dist/geometry/solidFlat.js +428 -0
  14. package/dist/geometry/solidHarness.d.ts +19 -0
  15. package/dist/geometry/solidHarness.js +66 -0
  16. package/dist/geometry/solidNormals.d.ts +17 -0
  17. package/dist/geometry/solidNormals.js +86 -0
  18. package/dist/geometry/solidRound.d.ts +41 -0
  19. package/dist/geometry/solidRound.js +323 -0
  20. package/dist/geometry/solidWriter.d.ts +16 -0
  21. package/dist/geometry/solidWriter.js +42 -0
  22. package/dist/index.d.ts +28 -3
  23. package/dist/index.js +20 -1
  24. package/dist/render/backend/api.d.ts +34 -14
  25. package/dist/render/backend/drawFog.d.ts +26 -0
  26. package/dist/render/backend/drawFog.js +30 -0
  27. package/dist/render/backend/materialChanges.d.ts +2 -1
  28. package/dist/render/backend/materialChanges.js +6 -1
  29. package/dist/render/backend/webgl2/glassTintPrograms.d.ts +13 -0
  30. package/dist/render/backend/webgl2/glassTintPrograms.js +38 -0
  31. package/dist/render/backend/webgl2/instanced.d.ts +24 -5
  32. package/dist/render/backend/webgl2/instanced.js +72 -15
  33. package/dist/render/backend/webgl2/renderer.d.ts +201 -16
  34. package/dist/render/backend/webgl2/renderer.js +596 -224
  35. package/dist/render/backend/webgpu/buffers.d.ts +29 -1
  36. package/dist/render/backend/webgpu/buffers.js +61 -4
  37. package/dist/render/backend/webgpu/depthPass.d.ts +1 -1
  38. package/dist/render/backend/webgpu/depthPass.js +7 -2
  39. package/dist/render/backend/webgpu/drawCommand.d.ts +5 -0
  40. package/dist/render/backend/webgpu/drawCommand.js +1 -0
  41. package/dist/render/backend/webgpu/flatPass.d.ts +6 -1
  42. package/dist/render/backend/webgpu/flatPass.js +57 -9
  43. package/dist/render/backend/webgpu/glassTintPass.d.ts +28 -0
  44. package/dist/render/backend/webgpu/glassTintPass.js +206 -0
  45. package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +60 -1
  46. package/dist/render/backend/webgpu/gpuDrivenPass.js +305 -5
  47. package/dist/render/backend/webgpu/instanceCullPass.d.ts +34 -0
  48. package/dist/render/backend/webgpu/instanceCullPass.js +144 -0
  49. package/dist/render/backend/webgpu/instanced.d.ts +23 -2
  50. package/dist/render/backend/webgpu/instanced.js +41 -4
  51. package/dist/render/backend/webgpu/latePass.d.ts +30 -0
  52. package/dist/render/backend/webgpu/latePass.js +140 -0
  53. package/dist/render/backend/webgpu/lightVolumePass.js +5 -1
  54. package/dist/render/backend/webgpu/motionPass.d.ts +95 -0
  55. package/dist/render/backend/webgpu/motionPass.js +491 -0
  56. package/dist/render/backend/webgpu/pipelineCache.d.ts +10 -1
  57. package/dist/render/backend/webgpu/pipelineCache.js +11 -1
  58. package/dist/render/backend/webgpu/pointGlassTintPass.d.ts +32 -0
  59. package/dist/render/backend/webgpu/pointGlassTintPass.js +193 -0
  60. package/dist/render/backend/webgpu/pointShadowPass.d.ts +35 -6
  61. package/dist/render/backend/webgpu/pointShadowPass.js +105 -20
  62. package/dist/render/backend/webgpu/postPass.d.ts +3 -13
  63. package/dist/render/backend/webgpu/renderer.d.ts +271 -64
  64. package/dist/render/backend/webgpu/renderer.js +1395 -580
  65. package/dist/render/backend/webgpu/scatterPass.js +2 -1
  66. package/dist/render/backend/webgpu/sdfTextPass.js +6 -1
  67. package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.d.ts +18 -0
  68. package/dist/render/backend/webgpu/shaders/instanceCull.wgsl.js +59 -0
  69. package/dist/render/backend/webgpu/skinPaletteRing.d.ts +4 -0
  70. package/dist/render/backend/webgpu/skinPaletteRing.js +4 -0
  71. package/dist/render/backend/webgpu/snapshotMips.d.ts +29 -0
  72. package/dist/render/backend/webgpu/snapshotMips.js +52 -0
  73. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +22 -3
  74. package/dist/render/backend/webgpu/surfaceTexturePass.js +78 -39
  75. package/dist/render/driftLight/bake.d.ts +7 -0
  76. package/dist/render/driftLight/bake.js +61 -56
  77. package/dist/render/driftLight/denseField.d.ts +46 -0
  78. package/dist/render/driftLight/denseField.js +109 -0
  79. package/dist/render/driftLight/lightField.d.ts +10 -5
  80. package/dist/render/driftLight/lightField.js +25 -19
  81. package/dist/render/driftLight/presence.d.ts +50 -0
  82. package/dist/render/driftLight/presence.js +43 -0
  83. package/dist/render/driftLight/uniforms.d.ts +3 -3
  84. package/dist/render/driftLight/uniforms.js +5 -6
  85. package/dist/render/driftLight/worldLightField.d.ts +41 -0
  86. package/dist/render/driftLight/worldLightField.js +66 -0
  87. package/dist/render/fixtureAtlas.d.ts +20 -0
  88. package/dist/render/fixtureAtlas.js +49 -0
  89. package/dist/render/glass.d.ts +45 -0
  90. package/dist/render/glass.js +39 -0
  91. package/dist/render/glassCasters.d.ts +40 -0
  92. package/dist/render/glassCasters.js +84 -0
  93. package/dist/render/glassShadow.d.ts +78 -0
  94. package/dist/render/glassShadow.js +125 -0
  95. package/dist/render/globalMediumPass.d.ts +2 -3
  96. package/dist/render/globalMediumPass.js +2 -8
  97. package/dist/render/gpudriven/lit.d.ts +12 -0
  98. package/dist/render/gpudriven/lit.js +23 -0
  99. package/dist/render/gpudriven/materialTable.d.ts +15 -5
  100. package/dist/render/gpudriven/materialTable.js +26 -6
  101. package/dist/render/gpudriven/pipeline.d.ts +1 -1
  102. package/dist/render/gpudriven/pipeline.js +4 -3
  103. package/dist/render/gpudriven/sunGlass.d.ts +35 -0
  104. package/dist/render/gpudriven/sunGlass.js +89 -0
  105. package/dist/render/instanceCull.d.ts +63 -0
  106. package/dist/render/instanceCull.js +160 -0
  107. package/dist/render/instances.d.ts +15 -0
  108. package/dist/render/lightBudget.d.ts +36 -35
  109. package/dist/render/lightBudget.js +38 -37
  110. package/dist/render/lightGrid.d.ts +42 -0
  111. package/dist/render/lightGrid.js +87 -0
  112. package/dist/render/mesh.d.ts +18 -24
  113. package/dist/render/mesh.js +51 -68
  114. package/dist/render/occlusion.d.ts +10 -0
  115. package/dist/render/occlusion.js +36 -7
  116. package/dist/render/pointGlassTint.d.ts +59 -0
  117. package/dist/render/pointGlassTint.js +198 -0
  118. package/dist/render/pointLightSelection.d.ts +7 -0
  119. package/dist/render/pointLightSelection.js +29 -4
  120. package/dist/render/pointShadowArray.d.ts +56 -3
  121. package/dist/render/pointShadowArray.js +127 -16
  122. package/dist/render/pointShadowMap.d.ts +23 -1
  123. package/dist/render/pointShadowMap.js +27 -1
  124. package/dist/render/rainField.d.ts +13 -0
  125. package/dist/render/rainField.js +27 -5
  126. package/dist/render/recon/changeFrames.d.ts +15 -0
  127. package/dist/render/recon/changeFrames.js +21 -0
  128. package/dist/render/recon/lateDepth.d.ts +11 -0
  129. package/dist/render/recon/lateDepth.js +70 -0
  130. package/dist/render/recon/lateRouting.d.ts +14 -0
  131. package/dist/render/recon/lateRouting.js +18 -0
  132. package/dist/render/recon/mover.d.ts +57 -0
  133. package/dist/render/recon/mover.js +86 -0
  134. package/dist/render/recon/resolve.d.ts +34 -4
  135. package/dist/render/recon/resolve.js +161 -20
  136. package/dist/render/renderQuality.d.ts +35 -0
  137. package/dist/render/renderQuality.js +7 -0
  138. package/dist/render/rendererHarness.js +16 -0
  139. package/dist/render/sceneTarget.d.ts +9 -1
  140. package/dist/render/sceneTarget.js +60 -12
  141. package/dist/render/shaders/depth.d.ts +16 -1
  142. package/dist/render/shaders/depth.js +94 -15
  143. package/dist/render/shaders/flat/directionalShadow.js +91 -6
  144. package/dist/render/shaders/flat/driftLight.d.ts +1 -1
  145. package/dist/render/shaders/flat/driftLight.js +32 -7
  146. package/dist/render/shaders/flat/glassTint.d.ts +6 -0
  147. package/dist/render/shaders/flat/glassTint.js +25 -0
  148. package/dist/render/shaders/flat/index.d.ts +13 -0
  149. package/dist/render/shaders/flat/index.js +9 -3
  150. package/dist/render/shaders/flat/lampGlass.d.ts +1 -0
  151. package/dist/render/shaders/flat/lampGlass.js +183 -0
  152. package/dist/render/shaders/flat/main.d.ts +1 -1
  153. package/dist/render/shaders/flat/main.js +190 -38
  154. package/dist/render/shaders/flat/pointShadow.d.ts +1 -1
  155. package/dist/render/shaders/flat/pointShadow.js +2 -0
  156. package/dist/render/shaders/flat/preamble.js +96 -26
  157. package/dist/render/shaders/flat/surfaceEffects.d.ts +29 -0
  158. package/dist/render/shaders/flat/surfaceEffects.js +152 -0
  159. package/dist/render/shaders/generated/depth.wgsl.d.ts +230 -7
  160. package/dist/render/shaders/generated/depth.wgsl.js +230 -7
  161. package/dist/render/shaders/generated/flat.wgsl.d.ts +1644 -1596
  162. package/dist/render/shaders/generated/flat.wgsl.js +1683 -1621
  163. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +3 -13
  164. package/dist/render/shaders/generated/globalMedium.wgsl.js +3 -13
  165. package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +3 -13
  166. package/dist/render/shaders/generated/lightVolume.wgsl.js +21 -17
  167. package/dist/render/shaders/generated/octahedralResolve.wgsl.d.ts +29 -0
  168. package/dist/render/shaders/generated/octahedralResolve.wgsl.js +29 -0
  169. package/dist/render/shaders/generated/rush.wgsl.d.ts +21 -16
  170. package/dist/render/shaders/generated/rush.wgsl.js +21 -16
  171. package/dist/render/shaders/generated/sdfText.wgsl.d.ts +2 -2
  172. package/dist/render/shaders/generated/sdfText.wgsl.js +2 -2
  173. package/dist/render/shaders/generated/text.wgsl.d.ts +1 -1
  174. package/dist/render/shaders/generated/text.wgsl.js +1 -1
  175. package/dist/render/shaders/gi/driftLight.wgsl.d.ts +1 -1
  176. package/dist/render/shaders/gi/driftLight.wgsl.js +27 -4
  177. package/dist/render/shaders/globalMedium.js +6 -6
  178. package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +7 -0
  179. package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +86 -1
  180. package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +1 -1
  181. package/dist/render/shaders/gpudriven/cull.wgsl.js +11 -2
  182. package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +1 -1
  183. package/dist/render/shaders/gpudriven/materialTable.wgsl.js +3 -1
  184. package/dist/render/shaders/gpudriven/shade.wgsl.js +50 -1
  185. package/dist/render/shaders/gpudriven/sunGlass.wgsl.d.ts +9 -0
  186. package/dist/render/shaders/gpudriven/sunGlass.wgsl.js +133 -0
  187. package/dist/render/shaders/lightVolume.js +6 -6
  188. package/dist/render/shaders/octahedralResolve.d.ts +8 -0
  189. package/dist/render/shaders/octahedralResolve.js +48 -17
  190. package/dist/render/shaders/recon/lateDepth.wgsl.d.ts +1 -0
  191. package/dist/render/shaders/recon/lateDepth.wgsl.js +69 -0
  192. package/dist/render/shaders/recon/motion.wgsl.d.ts +1 -1
  193. package/dist/render/shaders/recon/motion.wgsl.js +84 -0
  194. package/dist/render/shaders/recon/resolve.wgsl.d.ts +8 -7
  195. package/dist/render/shaders/recon/resolve.wgsl.js +161 -27
  196. package/dist/render/shaders/rush.js +11 -1
  197. package/dist/render/shaders/sdfText.d.ts +1 -1
  198. package/dist/render/shaders/sdfText.js +3 -2
  199. package/dist/render/shaders/text.d.ts +1 -1
  200. package/dist/render/shaders/text.js +18 -9
  201. package/dist/render/shadowCasters.d.ts +20 -1
  202. package/dist/render/shadowCasters.js +15 -1
  203. package/dist/render/shadowMap.d.ts +54 -5
  204. package/dist/render/shadowMap.js +190 -36
  205. package/dist/render/sunGlassTint.d.ts +25 -0
  206. package/dist/render/sunGlassTint.js +79 -0
  207. package/dist/render/surfaceEffects.d.ts +83 -0
  208. package/dist/render/surfaceEffects.js +75 -0
  209. package/dist/render/surfaceScene.d.ts +8 -0
  210. package/dist/render/surfaceScene.js +8 -0
  211. package/dist/render/surfaceTexture.d.ts +18 -2
  212. package/dist/render/surfaceTexture.js +68 -15
  213. package/dist/render/temporalAa.d.ts +25 -6
  214. package/dist/render/temporalAa.js +45 -15
  215. package/dist/render/textureSource.d.ts +30 -0
  216. package/dist/render/textureSource.js +53 -0
  217. package/dist/render/translucentQueue.d.ts +6 -0
  218. package/dist/render/translucentQueue.js +15 -1
  219. package/dist/render/vertexDefaults.js +2 -0
  220. package/dist/world/hlod.d.ts +104 -0
  221. package/dist/world/hlod.js +214 -0
  222. package/package.json +6 -6
  223. package/src/geometry/boxCsg.ts +186 -0
  224. package/src/geometry/csg.ts +384 -0
  225. package/src/geometry/meshBuilder.ts +15 -0
  226. package/src/geometry/meshConcat.ts +1 -0
  227. package/src/geometry/pixelFont.ts +2 -0
  228. package/src/geometry/solid.ts +189 -0
  229. package/src/geometry/solidFlat.ts +522 -0
  230. package/src/geometry/solidHarness.ts +83 -0
  231. package/src/geometry/solidNormals.ts +103 -0
  232. package/src/geometry/solidRound.ts +443 -0
  233. package/src/geometry/solidWriter.ts +58 -0
  234. package/src/index.ts +61 -1
  235. package/src/render/backend/api.ts +36 -11
  236. package/src/render/backend/drawFog.ts +31 -0
  237. package/src/render/backend/materialChanges.ts +9 -2
  238. package/src/render/backend/webgl2/glassTintPrograms.ts +58 -0
  239. package/src/render/backend/webgl2/instanced.ts +80 -14
  240. package/src/render/backend/webgl2/renderer.ts +700 -250
  241. package/src/render/backend/webgpu/buffers.ts +92 -5
  242. package/src/render/backend/webgpu/depthPass.ts +7 -2
  243. package/src/render/backend/webgpu/drawCommand.ts +6 -0
  244. package/src/render/backend/webgpu/flatPass.ts +62 -11
  245. package/src/render/backend/webgpu/glassTintPass.ts +245 -0
  246. package/src/render/backend/webgpu/gpuDrivenPass.ts +349 -5
  247. package/src/render/backend/webgpu/instanceCullPass.ts +165 -0
  248. package/src/render/backend/webgpu/instanced.ts +42 -4
  249. package/src/render/backend/webgpu/latePass.ts +161 -0
  250. package/src/render/backend/webgpu/lightVolumePass.ts +5 -1
  251. package/src/render/backend/webgpu/motionPass.ts +535 -0
  252. package/src/render/backend/webgpu/pipelineCache.ts +12 -1
  253. package/src/render/backend/webgpu/pointGlassTintPass.ts +233 -0
  254. package/src/render/backend/webgpu/pointShadowPass.ts +158 -26
  255. package/src/render/backend/webgpu/renderer.ts +1671 -670
  256. package/src/render/backend/webgpu/scatterPass.ts +2 -1
  257. package/src/render/backend/webgpu/sdfTextPass.ts +6 -1
  258. package/src/render/backend/webgpu/shaders/instanceCull.wgsl.ts +61 -0
  259. package/src/render/backend/webgpu/skinPaletteRing.ts +4 -0
  260. package/src/render/backend/webgpu/snapshotMips.ts +80 -0
  261. package/src/render/backend/webgpu/surfaceTexturePass.ts +91 -51
  262. package/src/render/driftLight/bake.ts +85 -62
  263. package/src/render/driftLight/denseField.ts +149 -0
  264. package/src/render/driftLight/lightField.ts +33 -18
  265. package/src/render/driftLight/presence.ts +69 -0
  266. package/src/render/driftLight/uniforms.ts +8 -9
  267. package/src/render/driftLight/worldLightField.ts +83 -0
  268. package/src/render/fixtureAtlas.ts +63 -0
  269. package/src/render/glass.ts +74 -0
  270. package/src/render/glassCasters.ts +164 -0
  271. package/src/render/glassShadow.ts +153 -0
  272. package/src/render/globalMediumPass.ts +4 -11
  273. package/src/render/gpudriven/lit.ts +31 -0
  274. package/src/render/gpudriven/materialTable.ts +28 -6
  275. package/src/render/gpudriven/pipeline.ts +4 -3
  276. package/src/render/gpudriven/sunGlass.ts +117 -0
  277. package/src/render/instanceCull.ts +205 -0
  278. package/src/render/instances.ts +16 -0
  279. package/src/render/lightBudget.ts +41 -38
  280. package/src/render/lightGrid.ts +130 -0
  281. package/src/render/mesh.ts +59 -72
  282. package/src/render/occlusion.ts +51 -7
  283. package/src/render/pointGlassTint.ts +250 -0
  284. package/src/render/pointLightSelection.ts +72 -4
  285. package/src/render/pointShadowArray.ts +188 -22
  286. package/src/render/pointShadowMap.ts +41 -0
  287. package/src/render/rainField.ts +39 -5
  288. package/src/render/recon/changeFrames.ts +24 -0
  289. package/src/render/recon/lateDepth.ts +83 -0
  290. package/src/render/recon/lateRouting.ts +29 -0
  291. package/src/render/recon/mover.ts +118 -0
  292. package/src/render/recon/resolve.ts +206 -20
  293. package/src/render/renderQuality.ts +47 -0
  294. package/src/render/rendererHarness.ts +16 -0
  295. package/src/render/sceneTarget.ts +62 -11
  296. package/src/render/shaders/depth.ts +118 -15
  297. package/src/render/shaders/flat/directionalShadow.ts +97 -6
  298. package/src/render/shaders/flat/driftLight.ts +32 -7
  299. package/src/render/shaders/flat/glassTint.ts +25 -0
  300. package/src/render/shaders/flat/index.ts +22 -3
  301. package/src/render/shaders/flat/lampGlass.ts +185 -0
  302. package/src/render/shaders/flat/main.ts +190 -38
  303. package/src/render/shaders/flat/pointShadow.ts +2 -0
  304. package/src/render/shaders/flat/preamble.ts +96 -26
  305. package/src/render/shaders/flat/surfaceEffects.ts +152 -0
  306. package/src/render/shaders/generated/depth.wgsl.ts +237 -7
  307. package/src/render/shaders/generated/flat.wgsl.ts +1685 -1621
  308. package/src/render/shaders/generated/globalMedium.wgsl.ts +3 -13
  309. package/src/render/shaders/generated/lightVolume.wgsl.ts +23 -17
  310. package/src/render/shaders/generated/octahedralResolve.wgsl.ts +30 -0
  311. package/src/render/shaders/generated/rush.wgsl.ts +21 -16
  312. package/src/render/shaders/generated/sdfText.wgsl.ts +2 -2
  313. package/src/render/shaders/generated/text.wgsl.ts +1 -1
  314. package/src/render/shaders/gi/driftLight.wgsl.ts +27 -4
  315. package/src/render/shaders/globalMedium.ts +6 -6
  316. package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +88 -1
  317. package/src/render/shaders/gpudriven/cull.wgsl.ts +11 -2
  318. package/src/render/shaders/gpudriven/materialTable.wgsl.ts +3 -1
  319. package/src/render/shaders/gpudriven/shade.wgsl.ts +50 -1
  320. package/src/render/shaders/gpudriven/sunGlass.wgsl.ts +139 -0
  321. package/src/render/shaders/lightVolume.ts +6 -6
  322. package/src/render/shaders/octahedralResolve.ts +50 -17
  323. package/src/render/shaders/recon/lateDepth.wgsl.ts +72 -0
  324. package/src/render/shaders/recon/motion.wgsl.ts +84 -0
  325. package/src/render/shaders/recon/resolve.wgsl.ts +161 -27
  326. package/src/render/shaders/rush.ts +11 -1
  327. package/src/render/shaders/sdfText.ts +3 -2
  328. package/src/render/shaders/text.ts +18 -9
  329. package/src/render/shadowCasters.ts +28 -1
  330. package/src/render/shadowMap.ts +231 -37
  331. package/src/render/sunGlassTint.ts +86 -0
  332. package/src/render/surfaceEffects.ts +132 -0
  333. package/src/render/surfaceScene.ts +16 -0
  334. package/src/render/surfaceTexture.ts +110 -19
  335. package/src/render/temporalAa.ts +78 -14
  336. package/src/render/textureSource.ts +72 -0
  337. package/src/render/translucentQueue.ts +20 -1
  338. package/src/render/vertexDefaults.ts +2 -0
  339. package/src/world/hlod.ts +290 -0
@@ -0,0 +1,193 @@
1
+ /**
2
+ * What a lamp's light keeps through glass, on this device: an `rgba8unorm` array of one layer a
3
+ * light, the face-sized colour scratch a face's glass is multiplied into, and the resolve that
4
+ * copies a face into its octahedral region. The twin of `pointGlassTint.ts`, which says what the
5
+ * channels hold and why the chain exists.
6
+ *
7
+ * **The chain is a `SnapshotMips` per layer**, made the first time that layer is touched and
8
+ * recorded once a round for the layers the round touched — a layer's levels are its own
9
+ * subresources here, so nothing is staged the way the other backend must.
10
+ */
11
+ import { mat3 } from 'gl-matrix';
12
+ import { pointShadowFaceRotation } from '../../pointShadowImage.js';
13
+ import { OCTAHEDRAL_RESOLVE_TINT_FRAG_WGSL, OCTAHEDRAL_RESOLVE_VERT_WGSL, OCTAHEDRALRESOLVE_BINDINGS, } from '../../shaders/generated/octahedralResolve.wgsl.js';
14
+ import { SnapshotMips } from './snapshotMips.js';
15
+ import { UniformRing } from './uniformRing.js';
16
+ const USAGE_RENDER_ATTACHMENT = 0x10;
17
+ const USAGE_TEXTURE_BINDING = 0x4;
18
+ const USAGE_UNIFORM_DST = 0x40 | 0x8; // UNIFORM | COPY_DST
19
+ const VISIBILITY_FRAGMENT = 0x2;
20
+ const TINT = OCTAHEDRALRESOLVE_BINDINGS.OCTAHEDRAL_RESOLVE_TINT_FRAG;
21
+ const faceRotation = mat3.create();
22
+ const rotationColumn = new Float32Array(3);
23
+ export class GpuPointGlassTint {
24
+ texture;
25
+ /** The whole array, for the lit pass. */
26
+ view;
27
+ /** The colour scratch a face's glass is multiplied into. */
28
+ scratchView;
29
+ edge;
30
+ device;
31
+ pipelines;
32
+ scratch;
33
+ layerViews = [];
34
+ mips = [];
35
+ pipeline;
36
+ bindGroup;
37
+ ring;
38
+ heldFaces;
39
+ dirty;
40
+ constructor(device, pipelines, faceSize, edge, layers,
41
+ /** Resolves a frame can make: the array's own figure, since every face resolves once. */
42
+ slots, encoder) {
43
+ this.device = device;
44
+ this.pipelines = pipelines;
45
+ this.edge = edge;
46
+ this.heldFaces = new Uint8Array(layers);
47
+ /* Every layer's chain is filled once at birth, so a level nothing has touched is white too. */
48
+ this.dirty = new Uint8Array(layers).fill(1);
49
+ this.texture = device.createTexture({
50
+ label: 'pointShadow.tint',
51
+ size: [edge, edge, layers],
52
+ format: 'rgba8unorm',
53
+ mipLevelCount: Math.floor(Math.log2(Math.max(1, edge))) + 1,
54
+ usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING,
55
+ });
56
+ this.view = this.texture.createView({ dimension: '2d-array' });
57
+ for (let layer = 0; layer < layers; layer++) {
58
+ this.layerViews.push(this.texture.createView({
59
+ label: `pointShadow.tint.layer${layer}`,
60
+ dimension: '2d',
61
+ baseArrayLayer: layer,
62
+ arrayLayerCount: 1,
63
+ baseMipLevel: 0,
64
+ mipLevelCount: 1,
65
+ }));
66
+ }
67
+ this.scratch = device.createTexture({
68
+ label: 'pointShadow.tint.scratch',
69
+ size: [faceSize, faceSize],
70
+ format: 'rgba8unorm',
71
+ usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING,
72
+ });
73
+ this.scratchView = this.scratch.createView();
74
+ this.ring = new UniformRing(device, TINT.uniformSize, slots, USAGE_UNIFORM_DST, 'pointShadow.tint.uniforms');
75
+ const layout = device.createBindGroupLayout({
76
+ label: 'pointShadow.tint.resolve.layout',
77
+ entries: [
78
+ {
79
+ binding: TINT.uniforms,
80
+ visibility: VISIBILITY_FRAGMENT,
81
+ buffer: { type: 'uniform', hasDynamicOffset: true, minBindingSize: TINT.uniformSize },
82
+ },
83
+ {
84
+ binding: TINT.textures.uFace.texture,
85
+ visibility: VISIBILITY_FRAGMENT,
86
+ texture: { sampleType: 'float' },
87
+ },
88
+ {
89
+ binding: TINT.textures.uFace.sampler,
90
+ visibility: VISIBILITY_FRAGMENT,
91
+ sampler: { type: 'non-filtering' },
92
+ },
93
+ ],
94
+ });
95
+ this.bindGroup = device.createBindGroup({
96
+ label: 'pointShadow.tint.resolve',
97
+ layout,
98
+ entries: [
99
+ { binding: TINT.uniforms, resource: { buffer: this.ring.buffer, size: TINT.uniformSize } },
100
+ { binding: TINT.textures.uFace.texture, resource: this.scratchView },
101
+ {
102
+ binding: TINT.textures.uFace.sampler,
103
+ resource: device.createSampler({ label: 'pointShadow.tint.resolve.sampler' }),
104
+ },
105
+ ],
106
+ });
107
+ this.pipeline = device.createRenderPipeline({
108
+ label: 'pointShadow.tint.resolve',
109
+ layout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),
110
+ vertex: {
111
+ module: device.createShaderModule({ code: OCTAHEDRAL_RESOLVE_VERT_WGSL }),
112
+ entryPoint: 'main',
113
+ },
114
+ fragment: {
115
+ module: device.createShaderModule({ code: OCTAHEDRAL_RESOLVE_TINT_FRAG_WGSL }),
116
+ entryPoint: 'main',
117
+ targets: [{ format: 'rgba8unorm' }],
118
+ },
119
+ primitive: { topology: 'triangle-list' },
120
+ });
121
+ /* Every layer born clear: a light no pane has reached lets everything through. */
122
+ for (const view of this.layerViews) {
123
+ encoder
124
+ .beginRenderPass({
125
+ label: 'pointShadow.tint.clear',
126
+ colorAttachments: [{ view, loadOp: 'clear', clearValue: [1, 1, 1, 1], storeOp: 'store' }],
127
+ })
128
+ .end();
129
+ }
130
+ }
131
+ /** Whether `face` of `layer` holds glass: a face that does must be cleared before it is reused. */
132
+ held(layer, face) {
133
+ return (((this.heldFaces[layer] ?? 0) >> face) & 1) === 1;
134
+ }
135
+ /** Copy the colour scratch into `face`'s region of `layer`, and remember whether it held glass. */
136
+ resolve(encoder, layer, face, drawn) {
137
+ const view = this.layerViews[layer];
138
+ if (view === undefined)
139
+ return;
140
+ const slot = this.ring.allocate();
141
+ if (slot === null)
142
+ return;
143
+ pointShadowFaceRotation(face, faceRotation);
144
+ /* WGSL pads a mat3x3 to three four-float columns; the generated struct expects that. */
145
+ const rotation = TINT.fields.uFaceRotation.offset;
146
+ for (let column = 0; column < 3; column++) {
147
+ rotationColumn[0] = faceRotation[column * 3];
148
+ rotationColumn[1] = faceRotation[column * 3 + 1];
149
+ rotationColumn[2] = faceRotation[column * 3 + 2];
150
+ this.ring.writeFloats(slot, rotation + column * 16, rotationColumn);
151
+ }
152
+ this.ring.writeInt(slot, TINT.fields.uFaceIndex.offset, face);
153
+ this.ring.writeFloat(slot, TINT.fields.uEdge.offset, this.edge);
154
+ const pass = encoder.beginRenderPass({
155
+ label: 'pointShadow.tint.resolve',
156
+ colorAttachments: [{ view, loadOp: 'load', storeOp: 'store' }],
157
+ });
158
+ pass.setPipeline(this.pipeline);
159
+ pass.setBindGroup(0, this.bindGroup, [slot]);
160
+ pass.draw(3);
161
+ pass.end();
162
+ const bit = 1 << face;
163
+ const was = this.heldFaces[layer] ?? 0;
164
+ this.heldFaces[layer] = drawn ? was | bit : was & ~bit;
165
+ this.dirty[layer] = 1;
166
+ }
167
+ /** The chain frost reads, for every layer touched since the last call. */
168
+ recordMips(encoder) {
169
+ for (let layer = 0; layer < this.dirty.length; layer++) {
170
+ if (this.dirty[layer] !== 1)
171
+ continue;
172
+ this.dirty[layer] = 0;
173
+ let chain = this.mips[layer];
174
+ if (chain === undefined) {
175
+ chain = new SnapshotMips(this.device, this.pipelines, this.texture, 'rgba8unorm', layer, 'pointShadow.tint.mips');
176
+ this.mips[layer] = chain;
177
+ }
178
+ chain.record(encoder);
179
+ }
180
+ }
181
+ beginFrame() {
182
+ this.ring.reset();
183
+ }
184
+ /** Before the round's submit: the slots are written and must be up before any pass reads. */
185
+ flush() {
186
+ this.ring.flush();
187
+ }
188
+ dispose() {
189
+ this.texture.destroy();
190
+ this.scratch.destroy();
191
+ this.ring.dispose();
192
+ }
193
+ }
@@ -1,5 +1,7 @@
1
1
  import { type mat4 } from 'gl-matrix';
2
2
  import { type PointShadowSource } from '../../pointShadowImage.ts';
3
+ import { GpuPointGlassTint } from './pointGlassTintPass.ts';
4
+ import type { MipPipelines } from './surfaceTexturePass.ts';
3
5
  /**
4
6
  * Every point light's shadow as one array texture, and the scratch that fills it.
5
7
  *
@@ -10,14 +12,18 @@ import { type PointShadowSource } from '../../pointShadowImage.ts';
10
12
  * both say the resolve reads the scratch.
11
13
  */
12
14
  export declare class GpuPointShadowArray {
13
- /** The array, as the shader samples it. */
14
- readonly view: GPUTextureView;
15
+ /** Lights this array holds; the storage doubles under it once glass arrives. */
15
16
  readonly layers: number;
16
17
  /** Where a face is rendered before it is resolved. One, shared by every light. */
17
18
  readonly scratchView: GPUTextureView;
18
- private readonly texture;
19
+ /** Replaced once, when glass first casts: see `growForGlass`. */
20
+ private texture;
21
+ private arrayView;
22
+ private tint;
23
+ private readonly device;
24
+ private readonly faceSize;
19
25
  private readonly scratch;
20
- private readonly layerViews;
26
+ private layerViews;
21
27
  private readonly pipeline;
22
28
  private readonly bindGroup;
23
29
  /**
@@ -46,6 +52,26 @@ export declare class GpuPointShadowArray {
46
52
  * keeps this face to its own region.
47
53
  */
48
54
  resolve(encoder: GPUCommandEncoder, layer: number, face: number, far: number, near: number): void;
55
+ /** The face's glass depth into light `layer`'s glass layer, 2L + 1. */
56
+ resolveGlass(encoder: GPUCommandEncoder, layer: number, face: number, far: number, near: number): void;
57
+ /** The array, as the shader samples it. Replaced once, when glass first casts. */
58
+ get view(): GPUTextureView;
59
+ get hasGlass(): boolean;
60
+ /** Physical layers a light: 1, or 2 once glass has interleaved the array. */
61
+ get stride(): number;
62
+ /** The lights' glass tint, once glass has cast. */
63
+ get glassTint(): GpuPointGlassTint | null;
64
+ /**
65
+ * Interleave the array for glass, on `encoder`: light L's depth moves to 2L and its glass takes
66
+ * 2L + 1, every glass layer born at the far plane, and the tint made. The reasoning, and why no
67
+ * map re-bakes, is `PointShadowArray.growForGlass`'s.
68
+ *
69
+ * Returns the texture it replaced, which the caller destroys once `encoder` is submitted — the
70
+ * copies out of it are recorded there — or null when the array had already grown.
71
+ */
72
+ growForGlass(encoder: GPUCommandEncoder, tintEdge: number, pipelines: MipPipelines): GPUTexture | null;
73
+ /** The scratch into physical layer `physical`'s region for `face`. */
74
+ private resolveInto;
49
75
  /** Start a frame's bakes. See the ring: slots are reused and nothing is freed. */
50
76
  beginFrame(): void;
51
77
  /** Upload every slot this frame's resolves took, in one write, before the encoder is submitted. */
@@ -54,8 +80,11 @@ export declare class GpuPointShadowArray {
54
80
  }
55
81
  /** What a face's pass needs from the caller: somewhere to record, and the casters to record. */
56
82
  export type PointShadowFacePass = (view: GPUTextureView, viewProj: mat4) => void;
57
- /** And what turns that face into its region of the light's octahedral layer. */
58
- export type PointShadowResolve = (layer: number, face: number, far: number, near: number) => void;
83
+ /**
84
+ * And what turns that face into its region of the light's octahedral layer — and, where the face
85
+ * offered glass, draws and resolves that too, lit from the bake origin `x`, `y`, `z`.
86
+ */
87
+ export type PointShadowResolve = (layer: number, face: number, far: number, near: number, x: number, y: number, z: number) => void;
59
88
  export declare class GpuPointShadowMap implements PointShadowSource {
60
89
  readonly size: number;
61
90
  /** Which layer of the shared array this map's image lives in. See `pointShadowMap.ts`. */
@@ -4,6 +4,7 @@ import { OCTAHEDRAL_EDGE } from '../../pointShadowArray.js';
4
4
  import { createFaceRange, DEFAULT_SOURCE_RADIUS, FACE_COUNT, POINT_SHADOW_NEAR, PointShadowImage, pointShadowFaceRotation, pointShadowFaceViewProj, } from '../../pointShadowImage.js';
5
5
  import { OCTAHEDRAL_RESOLVE_FRAG_WGSL, OCTAHEDRAL_RESOLVE_VERT_WGSL, } from '../../shaders/generated/octahedralResolve.wgsl.js';
6
6
  import { SHADOW_FORMAT } from './depthPass.js';
7
+ import { GpuPointGlassTint } from './pointGlassTintPass.js';
7
8
  import { UniformRing } from './uniformRing.js';
8
9
  /**
9
10
  * A point light's shadow on this device: one octahedral layer, filled a face at a time.
@@ -30,6 +31,9 @@ const VISIBILITY_FRAGMENT = 0x2;
30
31
  * silently not landing in its layer.
31
32
  */
32
33
  const RESOLVE_SLOTS = (POINT_SHADOW_POOL + LIVE_POINT_SHADOW_MAPS) * FACE_COUNT;
34
+ /** Twice once glass arrives: a face resolves its opaque depth and then its glass. */
35
+ const DEPTH_RESOLVE_SLOTS = 2 * RESOLVE_SLOTS;
36
+ const USAGE_COPY = 0x01 | 0x02; // COPY_SRC | COPY_DST
33
37
  /** `mat3x3<f32>` then four scalars, at std140's sixteen-byte columns: see the generated struct. */
34
38
  const RESOLVE_UNIFORM_SIZE = 64;
35
39
  /** Filled per resolved face, at module scope, because a bake runs inside the frame's budget. */
@@ -46,12 +50,16 @@ const rotationColumn = new Float32Array(3);
46
50
  * both say the resolve reads the scratch.
47
51
  */
48
52
  export class GpuPointShadowArray {
49
- /** The array, as the shader samples it. */
50
- view;
53
+ /** Lights this array holds; the storage doubles under it once glass arrives. */
51
54
  layers;
52
55
  /** Where a face is rendered before it is resolved. One, shared by every light. */
53
56
  scratchView;
57
+ /** Replaced once, when glass first casts: see `growForGlass`. */
54
58
  texture;
59
+ arrayView;
60
+ tint = null;
61
+ device;
62
+ faceSize;
55
63
  scratch;
56
64
  layerViews = [];
57
65
  pipeline;
@@ -76,21 +84,11 @@ export class GpuPointShadowArray {
76
84
  extraLayers = 0) {
77
85
  this.layers =
78
86
  Math.min(lightCount, POINT_SHADOW_POOL) + LIVE_POINT_SHADOW_MAPS + Math.max(0, extraLayers);
79
- this.texture = device.createTexture({
80
- label: 'pointShadow.array',
81
- size: [OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE, this.layers],
82
- format: SHADOW_FORMAT,
83
- usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING,
84
- });
85
- this.view = this.texture.createView({ dimension: '2d-array' });
86
- for (let layer = 0; layer < this.layers; layer++) {
87
- this.layerViews.push(this.texture.createView({
88
- label: `pointShadow.layer${layer}`,
89
- dimension: '2d',
90
- baseArrayLayer: layer,
91
- arrayLayerCount: 1,
92
- }));
93
- }
87
+ this.device = device;
88
+ this.faceSize = faceSize;
89
+ this.texture = depthArray(device, this.layers);
90
+ this.arrayView = this.texture.createView({ dimension: '2d-array' });
91
+ this.layerViews = layerViewsOf(this.texture, this.layers);
94
92
  this.scratch = device.createTexture({
95
93
  label: 'pointShadow.scratch',
96
94
  size: [faceSize, faceSize],
@@ -98,7 +96,7 @@ export class GpuPointShadowArray {
98
96
  usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING,
99
97
  });
100
98
  this.scratchView = this.scratch.createView();
101
- this.ring = new UniformRing(device, RESOLVE_UNIFORM_SIZE, RESOLVE_SLOTS, USAGE_UNIFORM_DST, 'pointShadow.resolve.uniforms');
99
+ this.ring = new UniformRing(device, RESOLVE_UNIFORM_SIZE, DEPTH_RESOLVE_SLOTS, USAGE_UNIFORM_DST, 'pointShadow.resolve.uniforms');
102
100
  /*
103
101
  * `non-filtering` and `unfilterable-float`, matching `flatPass.ts`: the scratch is a depth
104
102
  * format, whose supported sample types are UnfilterableFloat and Depth and never plain
@@ -162,7 +160,69 @@ export class GpuPointShadowArray {
162
160
  * keeps this face to its own region.
163
161
  */
164
162
  resolve(encoder, layer, face, far, near) {
165
- const view = this.layerViews[layer];
163
+ this.resolveInto(encoder, layer * this.stride, face, far, near);
164
+ }
165
+ /** The face's glass depth into light `layer`'s glass layer, 2L + 1. */
166
+ resolveGlass(encoder, layer, face, far, near) {
167
+ if (this.tint === null)
168
+ return;
169
+ this.resolveInto(encoder, 2 * layer + 1, face, far, near);
170
+ }
171
+ /** The array, as the shader samples it. Replaced once, when glass first casts. */
172
+ get view() {
173
+ return this.arrayView;
174
+ }
175
+ get hasGlass() {
176
+ return this.tint !== null;
177
+ }
178
+ /** Physical layers a light: 1, or 2 once glass has interleaved the array. */
179
+ get stride() {
180
+ return this.tint === null ? 1 : 2;
181
+ }
182
+ /** The lights' glass tint, once glass has cast. */
183
+ get glassTint() {
184
+ return this.tint;
185
+ }
186
+ /**
187
+ * Interleave the array for glass, on `encoder`: light L's depth moves to 2L and its glass takes
188
+ * 2L + 1, every glass layer born at the far plane, and the tint made. The reasoning, and why no
189
+ * map re-bakes, is `PointShadowArray.growForGlass`'s.
190
+ *
191
+ * Returns the texture it replaced, which the caller destroys once `encoder` is submitted — the
192
+ * copies out of it are recorded there — or null when the array had already grown.
193
+ */
194
+ growForGlass(encoder, tintEdge, pipelines) {
195
+ if (this.tint !== null)
196
+ return null;
197
+ const old = this.texture;
198
+ const texture = depthArray(this.device, this.layers * 2);
199
+ for (let layer = 0; layer < this.layers; layer++) {
200
+ encoder.copyTextureToTexture({ texture: old, origin: { x: 0, y: 0, z: layer } }, { texture, origin: { x: 0, y: 0, z: 2 * layer } }, [OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE, 1]);
201
+ }
202
+ this.texture = texture;
203
+ this.arrayView = texture.createView({ dimension: '2d-array' });
204
+ this.layerViews = layerViewsOf(texture, this.layers * 2);
205
+ /* Nothing is nearer a lamp than a pane that has not been drawn. */
206
+ for (let layer = 0; layer < this.layers; layer++) {
207
+ encoder
208
+ .beginRenderPass({
209
+ label: 'pointShadow.glass.clear',
210
+ colorAttachments: [],
211
+ depthStencilAttachment: {
212
+ view: this.layerViews[2 * layer + 1],
213
+ depthClearValue: 1,
214
+ depthLoadOp: 'clear',
215
+ depthStoreOp: 'store',
216
+ },
217
+ })
218
+ .end();
219
+ }
220
+ this.tint = new GpuPointGlassTint(this.device, pipelines, this.faceSize, tintEdge, this.layers, RESOLVE_SLOTS, encoder);
221
+ return old;
222
+ }
223
+ /** The scratch into physical layer `physical`'s region for `face`. */
224
+ resolveInto(encoder, physical, face, far, near) {
225
+ const view = this.layerViews[physical];
166
226
  if (view === undefined)
167
227
  return;
168
228
  const slot = this.ring.allocate();
@@ -197,15 +257,18 @@ export class GpuPointShadowArray {
197
257
  /** Start a frame's bakes. See the ring: slots are reused and nothing is freed. */
198
258
  beginFrame() {
199
259
  this.ring.reset();
260
+ this.tint?.beginFrame();
200
261
  }
201
262
  /** Upload every slot this frame's resolves took, in one write, before the encoder is submitted. */
202
263
  flush() {
203
264
  this.ring.flush();
265
+ this.tint?.flush();
204
266
  }
205
267
  dispose() {
206
268
  this.texture.destroy();
207
269
  this.scratch.destroy();
208
270
  this.ring.dispose();
271
+ this.tint?.dispose();
209
272
  }
210
273
  }
211
274
  export class GpuPointShadowMap {
@@ -280,7 +343,7 @@ export class GpuPointShadowMap {
280
343
  return 0;
281
344
  for (let face = first; face < last; face++) {
282
345
  renderFace(array.scratchView, pointShadowFaceViewProj(face, plan.x, plan.y, plan.z, plan.near, plan.range, scratch));
283
- resolveFace(this.layer, face, plan.range, plan.near);
346
+ resolveFace(this.layer, face, plan.range, plan.near, plan.x, plan.y, plan.z);
284
347
  }
285
348
  this.image.completeBake(last, plan.x, plan.y, plan.z, plan.range, plan.near, plan.sourceRadius);
286
349
  return last - first;
@@ -288,3 +351,25 @@ export class GpuPointShadowMap {
288
351
  /** Nothing to free: every GPU object belongs to `GpuPointShadowArray` now. */
289
352
  dispose() { }
290
353
  }
354
+ /** The depth array, copyable so glass can interleave it without a re-bake. */
355
+ function depthArray(device, layers) {
356
+ return device.createTexture({
357
+ label: 'pointShadow.array',
358
+ size: [OCTAHEDRAL_EDGE, OCTAHEDRAL_EDGE, layers],
359
+ format: SHADOW_FORMAT,
360
+ usage: USAGE_RENDER_ATTACHMENT | USAGE_TEXTURE_BINDING | USAGE_COPY,
361
+ });
362
+ }
363
+ /** One single-layer view per physical layer: a depth attachment takes exactly one. */
364
+ function layerViewsOf(texture, layers) {
365
+ const views = [];
366
+ for (let layer = 0; layer < layers; layer++) {
367
+ views.push(texture.createView({
368
+ label: `pointShadow.layer${layer}`,
369
+ dimension: '2d',
370
+ baseArrayLayer: layer,
371
+ arrayLayerCount: 1,
372
+ }));
373
+ }
374
+ return views;
375
+ }
@@ -26,7 +26,7 @@ import type { PipelineCache } from './pipelineCache.ts';
26
26
  * float target the generated shaders can sample as an ordinary texture.
27
27
  */
28
28
  export declare const RUSH_FRAG_FIELDS: UniformFields;
29
- export declare const RUSH_FRAG_SIZE: 192;
29
+ export declare const RUSH_FRAG_SIZE: 208;
30
30
  declare const RUSH_UNIFORMS: 1;
31
31
  declare const RUSH_TEXTURES: {
32
32
  readonly uScene: {
@@ -305,20 +305,10 @@ export declare const MEDIUM_TEXTURES: {
305
305
  readonly sampler: 33;
306
306
  readonly type: "sampler2D";
307
307
  };
308
- readonly uStaticShadowMap: {
308
+ readonly uSunShadows: {
309
309
  readonly texture: 34;
310
310
  readonly sampler: 35;
311
- readonly type: "sampler2D";
312
- };
313
- readonly uPeeledShadowMap: {
314
- readonly texture: 36;
315
- readonly sampler: 37;
316
- readonly type: "sampler2D";
317
- };
318
- readonly uDynamicShadowMap: {
319
- readonly texture: 38;
320
- readonly sampler: 39;
321
- readonly type: "sampler2D";
311
+ readonly type: "sampler2DArray";
322
312
  };
323
313
  };
324
314
  export declare const MEDIUM_UPSAMPLE_UNIFORMS: 1;