@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
@@ -1,9 +1,14 @@
1
+ import { instancesBox } from '../../instanceCull.ts';
1
2
  import { INSTANCE_FLOATS, INSTANCE_STRIDE, packInstances } from '../../instances.ts';
3
+ import { destroySlot } from './instanceCullPass.ts';
4
+ import type { CullSlot } from './instanceCullPass.ts';
2
5
  import type { MeshInstances } from '../../instances.ts';
3
6
  import type { GpuMesh } from './buffers.ts';
4
7
 
5
8
  /** VERTEX | COPY_DST, spelled the way every other pass here spells it. */
6
9
  const USAGE_VERTEX = 0x0020 | 0x0008;
10
+ /** A culling batch's source is read by the cull as storage too. */
11
+ const USAGE_STORAGE = 0x0080;
7
12
 
8
13
  /**
9
14
  * One mesh's per-instance buffer on the device.
@@ -21,9 +26,20 @@ export class GpuInstancedBatch {
21
26
  readonly capacity: number;
22
27
  private readonly staging: Float32Array;
23
28
 
24
- constructor(device: GPUDevice, mesh: GpuMesh, capacity: number, label: string) {
29
+ /** Whether the camera draw culls this batch. See `InstancedOptions.cull`. */
30
+ readonly cull: boolean;
31
+ /** The world box around every live instance, fitted at upload. See `instancesBox`. */
32
+ readonly box = new Float32Array([1, 1, 1, -1, -1, -1]);
33
+ /** One set of survivors per view drawn this frame. See `InstanceCullPass`. */
34
+ readonly slots: CullSlot[] = [];
35
+ /** The frame the slots were last taken in, and how many were taken. */
36
+ slotFrame = -1;
37
+ slotsTaken = 0;
38
+
39
+ constructor(device: GPUDevice, mesh: GpuMesh, capacity: number, label: string, cull = false) {
25
40
  this.mesh = mesh;
26
41
  this.capacity = capacity;
42
+ this.cull = cull;
27
43
  this.staging = new Float32Array(capacity * INSTANCE_FLOATS);
28
44
  this.buffer = device.createBuffer({
29
45
  /*
@@ -31,25 +47,47 @@ export class GpuInstancedBatch {
31
47
  * naming the resource it was about, and an unlabelled buffer names nothing.
32
48
  */
33
49
  label,
34
- size: capacity * INSTANCE_STRIDE,
35
- usage: USAGE_VERTEX,
50
+ size: Math.max(1, capacity) * INSTANCE_STRIDE,
51
+ usage: USAGE_VERTEX | (cull ? USAGE_STORAGE : 0),
36
52
  });
37
53
  }
38
54
 
55
+ /** Last frame's packed slots, for a reconstruction; made on first use by the renderer. */
56
+ previousBuffer: GPUBuffer | null = null;
57
+ /** How many slots the upload before the last one held, and how many the last one holds. */
58
+ previousCount = 0;
59
+ liveCount = 0;
60
+ /** The frame of the last upload. See `changeFrames.ts`. */
61
+ changed = -1;
62
+
39
63
  /**
40
64
  * Pack and push `data.count` instances, in one write.
41
65
  *
42
66
  * Only the live prefix, for the reason `uploadScatter` gives: the rest is not drawn and
43
67
  * uploading it would be per-frame waste with nothing reading it.
68
+ *
69
+ * **Given `previous`, the placement still in the staging array — the last upload, which is last
70
+ * frame's — is written there first**, so a reconstruction can pair each slot with where it was.
71
+ * `writeBuffer` copies at the call, so packing afterwards cannot reach that copy.
44
72
  */
45
- upload(queue: GPUQueue, data: MeshInstances): void {
73
+ upload(queue: GPUQueue, data: MeshInstances, previous: GPUBuffer | null = null): void {
74
+ if (this.cull) instancesBox(data, this.mesh.bounds, this.box);
46
75
  const count = Math.min(data.count, this.capacity);
76
+ if (previous !== null) {
77
+ if (this.liveCount > 0) {
78
+ queue.writeBuffer(previous, 0, this.staging, 0, this.liveCount * INSTANCE_FLOATS);
79
+ }
80
+ this.previousCount = this.liveCount;
81
+ }
82
+ this.liveCount = count;
47
83
  if (count === 0) return;
48
84
  packInstances(data, this.staging);
49
85
  queue.writeBuffer(this.buffer, 0, this.staging, 0, count * INSTANCE_FLOATS);
50
86
  }
51
87
 
52
88
  dispose(): void {
89
+ this.previousBuffer?.destroy();
53
90
  this.buffer.destroy();
91
+ for (const slot of this.slots) destroySlot(slot);
54
92
  }
55
93
  }
@@ -0,0 +1,161 @@
1
+ /**
2
+ * What a reconstructing frame draws after the upscale: its blended draws, at the output size.
3
+ *
4
+ * **Why late.** A blended surface writes no depth the motion pass could test against and has no
5
+ * single motion per pixel — a caption over a wall is two surfaces moving two ways — so a
6
+ * reconstruction can only smear it. Drawn after the resolve, at output resolution and unjittered,
7
+ * it is as sharp as a native frame and has no history to ghost.
8
+ *
9
+ * **What it holds**: a command pool of its own, because the frame graph's pool is spent at every
10
+ * scene flush and these must survive until the reconstruction has run; an output-size depth
11
+ * target; and the pass that fills it from the render's depth. Cost: translucent pixels are shaded
12
+ * at output resolution — 2.25x as many at ratio 1.5, only where translucency is — plus one
13
+ * full-screen depth pass.
14
+ */
15
+ import { DEPTH_CLEAR, DEPTH_FORMAT } from '../../depthConvention.ts';
16
+ import { LATE_DEPTH_WGSL } from '../../shaders/recon/lateDepth.wgsl.ts';
17
+ import type { CommandPool, DrawCommand } from './drawCommand.ts';
18
+ import { createCommandPool, resetPool, takeCommand } from './drawCommand.ts';
19
+
20
+ export class LatePass {
21
+ private readonly device: GPUDevice;
22
+ private readonly commands: CommandPool = createCommandPool(64);
23
+ private depth: GPUTexture | null = null;
24
+ private depthTextureView: GPUTextureView | null = null;
25
+ private readonly layout: GPUBindGroupLayout;
26
+ private readonly pipeline: GPURenderPipeline;
27
+ private readonly sizes: GPUBuffer;
28
+ /** The render size and the output size, then the frame's jitter in render texels. */
29
+ private readonly sizeStaging = new Float32Array(8);
30
+ private group: GPUBindGroup | null = null;
31
+ private groupSource: GPUTextureView | null = null;
32
+
33
+ constructor(device: GPUDevice) {
34
+ this.device = device;
35
+ this.layout = device.createBindGroupLayout({
36
+ label: 'recon.lateDepth.layout',
37
+ entries: [
38
+ { binding: 0, visibility: 0x2, texture: { sampleType: 'depth' } },
39
+ { binding: 1, visibility: 0x2, buffer: { type: 'uniform' } },
40
+ ],
41
+ });
42
+ const module = device.createShaderModule({ label: 'recon.lateDepth', code: LATE_DEPTH_WGSL });
43
+ this.pipeline = device.createRenderPipeline({
44
+ label: 'recon.lateDepth',
45
+ layout: device.createPipelineLayout({ bindGroupLayouts: [this.layout] }),
46
+ vertex: { module, entryPoint: 'lateDepthVert' },
47
+ fragment: { module, entryPoint: 'lateDepthFrag', targets: [] },
48
+ primitive: { topology: 'triangle-list' },
49
+ depthStencil: { format: DEPTH_FORMAT, depthWriteEnabled: true, depthCompare: 'always' },
50
+ });
51
+ this.sizes = device.createBuffer({
52
+ label: 'recon.lateDepth.sizes',
53
+ size: 32,
54
+ usage: 0x40 | 0x8, // UNIFORM | COPY_DST
55
+ });
56
+ }
57
+
58
+ /** The output-size depth, (re)made when the output changes size. */
59
+ depthView(width: number, height: number): GPUTextureView {
60
+ if (this.depth === null || this.depth.width !== width || this.depth.height !== height) {
61
+ this.depth?.destroy();
62
+ this.depth = this.device.createTexture({
63
+ label: 'recon.lateDepth',
64
+ size: [width, height],
65
+ format: DEPTH_FORMAT,
66
+ usage: 0x10, // RENDER_ATTACHMENT
67
+ });
68
+ this.depthTextureView = this.depth.createView();
69
+ }
70
+ return this.depthTextureView as GPUTextureView;
71
+ }
72
+
73
+ /**
74
+ * Fill the output-size depth from `source`, the render's single-sample depth, drawn jittered by
75
+ * (`jitterX`, `jitterY`) render texels — which the fill takes back out (`recon/lateDepth.ts`).
76
+ */
77
+ upscale(
78
+ encoder: GPUCommandEncoder,
79
+ source: GPUTextureView,
80
+ renderWidth: number,
81
+ renderHeight: number,
82
+ outputWidth: number,
83
+ outputHeight: number,
84
+ jitterX: number,
85
+ jitterY: number,
86
+ ): void {
87
+ const target = this.depthView(outputWidth, outputHeight);
88
+ this.sizeStaging[0] = renderWidth;
89
+ this.sizeStaging[1] = renderHeight;
90
+ this.sizeStaging[2] = outputWidth;
91
+ this.sizeStaging[3] = outputHeight;
92
+ this.sizeStaging[4] = jitterX;
93
+ this.sizeStaging[5] = jitterY;
94
+ this.device.queue.writeBuffer(this.sizes, 0, this.sizeStaging);
95
+ if (this.group === null || this.groupSource !== source) {
96
+ this.group = this.device.createBindGroup({
97
+ label: 'recon.lateDepth.group',
98
+ layout: this.layout,
99
+ entries: [
100
+ { binding: 0, resource: source },
101
+ { binding: 1, resource: { buffer: this.sizes } },
102
+ ],
103
+ });
104
+ this.groupSource = source;
105
+ }
106
+ const pass = encoder.beginRenderPass({
107
+ label: 'recon.lateDepth',
108
+ colorAttachments: [],
109
+ depthStencilAttachment: {
110
+ view: target,
111
+ depthClearValue: DEPTH_CLEAR,
112
+ depthLoadOp: 'clear',
113
+ depthStoreOp: 'store',
114
+ },
115
+ });
116
+ pass.setPipeline(this.pipeline);
117
+ pass.setBindGroup(0, this.group);
118
+ pass.draw(3);
119
+ pass.end();
120
+ }
121
+
122
+ /** A command slot for one late draw. Every field a caller uses it fills; see `takeCommand`. */
123
+ take(): DrawCommand {
124
+ const at = takeCommand(this.commands);
125
+ const command = this.commands.commands[at] as DrawCommand;
126
+ command.offsetCount = 0;
127
+ command.vertexCount = 0;
128
+ command.indexBuffer = null;
129
+ command.indexed = false;
130
+ command.instances = 1;
131
+ command.indirect = null;
132
+ return command;
133
+ }
134
+
135
+ /** Late draws recorded this frame. */
136
+ get pending(): number {
137
+ return this.commands.taken;
138
+ }
139
+
140
+ /** Every late draw, in the order it was recorded, through the renderer's own issue. */
141
+ replay(
142
+ pass: GPURenderPassEncoder,
143
+ issue: (pass: GPURenderPassEncoder, command: DrawCommand) => void,
144
+ ): void {
145
+ for (let i = 0; i < this.commands.taken; i += 1) {
146
+ const command = this.commands.commands[i];
147
+ if (command !== undefined) issue(pass, command);
148
+ }
149
+ }
150
+
151
+ reset(): void {
152
+ resetPool(this.commands);
153
+ }
154
+
155
+ dispose(): void {
156
+ this.depth?.destroy();
157
+ this.depth = null;
158
+ this.depthTextureView = null;
159
+ this.sizes.destroy();
160
+ }
161
+ }
@@ -87,7 +87,11 @@ export function createLightVolumeBindGroupLayout(
87
87
  entries.push({
88
88
  binding: texture.texture,
89
89
  visibility: VISIBILITY_FRAGMENT,
90
- texture: { sampleType: 'unfilterable-float' },
90
+ texture: {
91
+ sampleType: 'unfilterable-float',
92
+ /* The sun's maps are one array since 4.5.0; see `shadowMap.ts`. */
93
+ ...(texture.type === 'sampler2DArray' ? { viewDimension: '2d-array' as const } : {}),
94
+ },
91
95
  });
92
96
  entries.push({
93
97
  binding: texture.sampler,