@driftengine/core 3.63.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (428) hide show
  1. package/CHANGELOG.json +122 -0
  2. package/NOTICE +20 -0
  3. package/README.md +1 -1
  4. package/dist/core/loop.js +18 -2
  5. package/dist/core/storage.js +5 -0
  6. package/dist/geometry/meshBuilder.d.ts +1 -1
  7. package/dist/geometry/meshBuilder.js +6 -2
  8. package/dist/index.d.ts +69 -4
  9. package/dist/index.js +112 -2
  10. package/dist/input/input.js +6 -1
  11. package/dist/math/exact.d.ts +13 -3
  12. package/dist/math/exact.js +68 -3
  13. package/dist/math/frustum.d.ts +17 -2
  14. package/dist/math/frustum.js +24 -0
  15. package/dist/render/backend/api.d.ts +34 -1
  16. package/dist/render/backend/api.js +22 -1
  17. package/dist/render/backend/budget.d.ts +7 -6
  18. package/dist/render/backend/budget.js +7 -6
  19. package/dist/render/backend/createRenderer.d.ts +57 -0
  20. package/dist/render/backend/createRenderer.js +51 -2
  21. package/dist/render/backend/materialChanges.d.ts +41 -0
  22. package/dist/render/backend/materialChanges.js +38 -0
  23. package/dist/render/backend/select.js +8 -0
  24. package/dist/render/backend/webgl2/renderer.d.ts +80 -1
  25. package/dist/render/backend/webgl2/renderer.js +208 -10
  26. package/dist/render/backend/webgpu/buffers.d.ts +20 -1
  27. package/dist/render/backend/webgpu/buffers.js +116 -58
  28. package/dist/render/backend/webgpu/fieldCompose.d.ts +156 -0
  29. package/dist/render/backend/webgpu/fieldCompose.js +396 -0
  30. package/dist/render/backend/webgpu/giFieldPass.d.ts +66 -0
  31. package/dist/render/backend/webgpu/giFieldPass.js +137 -0
  32. package/dist/render/backend/webgpu/gpuDrivenPass.d.ts +728 -0
  33. package/dist/render/backend/webgpu/gpuDrivenPass.js +2473 -0
  34. package/dist/render/backend/webgpu/linePass.d.ts +4 -14
  35. package/dist/render/backend/webgpu/linePass.js +4 -33
  36. package/dist/render/backend/webgpu/probeBake.d.ts +148 -0
  37. package/dist/render/backend/webgpu/probeBake.js +493 -0
  38. package/dist/render/backend/webgpu/renderer.d.ts +379 -24
  39. package/dist/render/backend/webgpu/renderer.js +1369 -76
  40. package/dist/render/backend/webgpu/scatterPass.js +15 -1
  41. package/dist/render/backend/webgpu/surfaceTexturePass.d.ts +19 -9
  42. package/dist/render/backend/webgpu/surfaceTexturePass.js +58 -32
  43. package/dist/render/causticsRenderer.d.ts +3 -1
  44. package/dist/render/causticsRenderer.js +4 -1
  45. package/dist/render/depthConvention.d.ts +12 -0
  46. package/dist/render/depthConvention.js +14 -0
  47. package/dist/render/deviceFeatures.d.ts +32 -0
  48. package/dist/render/deviceFeatures.js +41 -0
  49. package/dist/render/fog.d.ts +79 -0
  50. package/dist/render/fog.js +138 -0
  51. package/dist/render/frame/alias.d.ts +30 -0
  52. package/dist/render/frame/alias.js +61 -0
  53. package/dist/render/frame/deps.d.ts +37 -0
  54. package/dist/render/frame/deps.js +122 -0
  55. package/dist/render/frame/flushGraph.d.ts +43 -0
  56. package/dist/render/frame/flushGraph.js +84 -0
  57. package/dist/render/frame/graphSchedule.d.ts +49 -0
  58. package/dist/render/frame/graphSchedule.js +120 -0
  59. package/dist/render/frame/index.d.ts +15 -0
  60. package/dist/render/frame/index.js +8 -0
  61. package/dist/render/frame/lifetime.d.ts +24 -0
  62. package/dist/render/frame/lifetime.js +36 -0
  63. package/dist/render/frame/passTimings.d.ts +42 -0
  64. package/dist/render/frame/passTimings.js +38 -0
  65. package/dist/render/frame/validate.d.ts +15 -0
  66. package/dist/render/frame/validate.js +22 -0
  67. package/dist/render/frame/virtual.d.ts +44 -0
  68. package/dist/render/frame/virtual.js +61 -0
  69. package/dist/render/gi/chain.d.ts +82 -0
  70. package/dist/render/gi/chain.js +135 -0
  71. package/dist/render/gi/denoise.d.ts +114 -0
  72. package/dist/render/gi/denoise.js +169 -0
  73. package/dist/render/gi/fieldScene.d.ts +125 -0
  74. package/dist/render/gi/fieldScene.js +219 -0
  75. package/dist/render/gi/globalField.d.ts +157 -0
  76. package/dist/render/gi/globalField.js +373 -0
  77. package/dist/render/gi/probeGridFit.d.ts +24 -0
  78. package/dist/render/gi/probeGridFit.js +71 -0
  79. package/dist/render/gi/probeTrace.d.ts +82 -0
  80. package/dist/render/gi/probeTrace.js +128 -0
  81. package/dist/render/gi/probeVolume.d.ts +136 -0
  82. package/dist/render/gi/probeVolume.js +191 -0
  83. package/dist/render/gi/reflection.d.ts +73 -0
  84. package/dist/render/gi/reflection.js +109 -0
  85. package/dist/render/gi/traceField.d.ts +91 -0
  86. package/dist/render/gi/traceField.js +129 -0
  87. package/dist/render/gi/traceScreen.d.ts +68 -0
  88. package/dist/render/gi/traceScreen.js +82 -0
  89. package/dist/render/gpuScene.d.ts +38 -0
  90. package/dist/render/gpuScene.js +41 -0
  91. package/dist/render/gpudriven/alphaTest.d.ts +28 -0
  92. package/dist/render/gpudriven/alphaTest.js +32 -0
  93. package/dist/render/gpudriven/clusterUpload.d.ts +59 -0
  94. package/dist/render/gpudriven/clusterUpload.js +75 -0
  95. package/dist/render/gpudriven/clusterWorld.d.ts +57 -0
  96. package/dist/render/gpudriven/clusterWorld.js +155 -0
  97. package/dist/render/gpudriven/compact.d.ts +51 -0
  98. package/dist/render/gpudriven/compact.js +68 -0
  99. package/dist/render/gpudriven/cullClusters.d.ts +129 -0
  100. package/dist/render/gpudriven/cullClusters.js +237 -0
  101. package/dist/render/gpudriven/decodeTables.d.ts +64 -0
  102. package/dist/render/gpudriven/decodeTables.js +219 -0
  103. package/dist/render/gpudriven/frustum.d.ts +25 -0
  104. package/dist/render/gpudriven/frustum.js +59 -0
  105. package/dist/render/gpudriven/geometryHarness.d.ts +15 -0
  106. package/dist/render/gpudriven/geometryHarness.js +31 -0
  107. package/dist/render/gpudriven/hzb.d.ts +60 -0
  108. package/dist/render/gpudriven/hzb.js +97 -0
  109. package/dist/render/gpudriven/ibl.d.ts +85 -0
  110. package/dist/render/gpudriven/ibl.js +129 -0
  111. package/dist/render/gpudriven/indirect.d.ts +67 -0
  112. package/dist/render/gpudriven/indirect.js +77 -0
  113. package/dist/render/gpudriven/instances.d.ts +43 -0
  114. package/dist/render/gpudriven/instances.js +172 -0
  115. package/dist/render/gpudriven/lit.d.ts +165 -0
  116. package/dist/render/gpudriven/lit.js +165 -0
  117. package/dist/render/gpudriven/lodCut.d.ts +28 -0
  118. package/dist/render/gpudriven/lodCut.js +38 -0
  119. package/dist/render/gpudriven/materialBin.d.ts +60 -0
  120. package/dist/render/gpudriven/materialBin.js +108 -0
  121. package/dist/render/gpudriven/materialTable.d.ts +88 -0
  122. package/dist/render/gpudriven/materialTable.js +115 -0
  123. package/dist/render/gpudriven/pipeline.d.ts +135 -0
  124. package/dist/render/gpudriven/pipeline.js +237 -0
  125. package/dist/render/gpudriven/rangeAlloc.d.ts +50 -0
  126. package/dist/render/gpudriven/rangeAlloc.js +112 -0
  127. package/dist/render/gpudriven/sceneUpload.d.ts +96 -0
  128. package/dist/render/gpudriven/sceneUpload.js +115 -0
  129. package/dist/render/gpudriven/shadeBins.d.ts +92 -0
  130. package/dist/render/gpudriven/shadeBins.js +182 -0
  131. package/dist/render/gpudriven/shadow.d.ts +136 -0
  132. package/dist/render/gpudriven/shadow.js +224 -0
  133. package/dist/render/gpudriven/shadowCamera.d.ts +87 -0
  134. package/dist/render/gpudriven/shadowCamera.js +345 -0
  135. package/dist/render/gpudriven/streamScene.d.ts +194 -0
  136. package/dist/render/gpudriven/streamScene.js +459 -0
  137. package/dist/render/gpudriven/surfaceFrame.d.ts +25 -0
  138. package/dist/render/gpudriven/surfaceFrame.js +51 -0
  139. package/dist/render/gpudriven/twoPhase.d.ts +122 -0
  140. package/dist/render/gpudriven/twoPhase.js +160 -0
  141. package/dist/render/gpudriven/visbuffer.d.ts +25 -0
  142. package/dist/render/gpudriven/visbuffer.js +37 -0
  143. package/dist/render/halfFloat.d.ts +10 -0
  144. package/dist/render/halfFloat.js +23 -4
  145. package/dist/render/inference/attentionTiled.d.ts +27 -0
  146. package/dist/render/inference/attentionTiled.js +117 -0
  147. package/dist/render/inference/denseKernels.d.ts +29 -0
  148. package/dist/render/inference/denseKernels.js +312 -0
  149. package/dist/render/inference/device.d.ts +21 -0
  150. package/dist/render/inference/device.js +32 -0
  151. package/dist/render/inference/deviceGraph.d.ts +34 -0
  152. package/dist/render/inference/deviceGraph.js +17 -0
  153. package/dist/render/inference/fuse.d.ts +15 -0
  154. package/dist/render/inference/fuse.js +37 -0
  155. package/dist/render/inference/kernelKit.d.ts +52 -0
  156. package/dist/render/inference/kernelKit.js +70 -0
  157. package/dist/render/inference/kernels.d.ts +3 -0
  158. package/dist/render/inference/kernels.js +11 -0
  159. package/dist/render/inference/plan.d.ts +13 -0
  160. package/dist/render/inference/plan.js +18 -0
  161. package/dist/render/inference/reuse.d.ts +39 -0
  162. package/dist/render/inference/reuse.js +65 -0
  163. package/dist/render/inference/runner.d.ts +31 -0
  164. package/dist/render/inference/runner.js +175 -0
  165. package/dist/render/inference/schedule.d.ts +39 -0
  166. package/dist/render/inference/schedule.js +59 -0
  167. package/dist/render/inference/shapeKernels.d.ts +10 -0
  168. package/dist/render/inference/shapeKernels.js +80 -0
  169. package/dist/render/inference/spatialKernels.d.ts +21 -0
  170. package/dist/render/inference/spatialKernels.js +179 -0
  171. package/dist/render/inference/splatRaster.wgsl.d.ts +75 -0
  172. package/dist/render/inference/splatRaster.wgsl.js +337 -0
  173. package/dist/render/inference/splatTiles.d.ts +79 -0
  174. package/dist/render/inference/splatTiles.js +161 -0
  175. package/dist/render/lineBatch.d.ts +2 -5
  176. package/dist/render/lineBatch.js +4 -24
  177. package/dist/render/mesh.d.ts +4 -0
  178. package/dist/render/mesh.js +45 -1
  179. package/dist/render/pass.d.ts +145 -8
  180. package/dist/render/prefilterEnvMap.d.ts +22 -0
  181. package/dist/render/prefilterEnvMap.js +31 -0
  182. package/dist/render/readback.d.ts +30 -0
  183. package/dist/render/readback.js +47 -0
  184. package/dist/render/recon/clamp.d.ts +36 -0
  185. package/dist/render/recon/clamp.js +92 -0
  186. package/dist/render/recon/disocclusion.d.ts +60 -0
  187. package/dist/render/recon/disocclusion.js +109 -0
  188. package/dist/render/recon/frameGen.d.ts +81 -0
  189. package/dist/render/recon/frameGen.js +150 -0
  190. package/dist/render/recon/frameSizes.d.ts +34 -0
  191. package/dist/render/recon/frameSizes.js +58 -0
  192. package/dist/render/recon/jitter.d.ts +60 -0
  193. package/dist/render/recon/jitter.js +118 -0
  194. package/dist/render/recon/motionVectors.d.ts +55 -0
  195. package/dist/render/recon/motionVectors.js +107 -0
  196. package/dist/render/recon/reproject.d.ts +41 -0
  197. package/dist/render/recon/reproject.js +131 -0
  198. package/dist/render/recon/resolve.d.ts +90 -0
  199. package/dist/render/recon/resolve.js +313 -0
  200. package/dist/render/recon/tier.d.ts +24 -0
  201. package/dist/render/recon/tier.js +8 -0
  202. package/dist/render/reflectionProbe.d.ts +26 -0
  203. package/dist/render/reflectionProbe.js +33 -0
  204. package/dist/render/renderQuality.d.ts +69 -0
  205. package/dist/render/renderQuality.js +22 -0
  206. package/dist/render/screenSpaceReflection.d.ts +23 -0
  207. package/dist/render/screenSpaceReflection.js +22 -3
  208. package/dist/render/sdfFont.js +2 -0
  209. package/dist/render/segmentQuads.d.ts +13 -0
  210. package/dist/render/segmentQuads.js +32 -0
  211. package/dist/render/shaders/flat/lobes.d.ts +27 -0
  212. package/dist/render/shaders/flat/lobes.js +33 -3
  213. package/dist/render/shaders/flat/preamble.d.ts +7 -0
  214. package/dist/render/shaders/flat/preamble.js +24 -1
  215. package/dist/render/shaders/flat/probeGrid.d.ts +1 -1
  216. package/dist/render/shaders/flat/probeGrid.js +71 -2
  217. package/dist/render/shaders/generated/flat.wgsl.d.ts +48 -8
  218. package/dist/render/shaders/generated/flat.wgsl.js +64 -24
  219. package/dist/render/shaders/gi/composeField.wgsl.d.ts +56 -0
  220. package/dist/render/shaders/gi/composeField.wgsl.js +231 -0
  221. package/dist/render/shaders/gi/marchField.wgsl.d.ts +30 -0
  222. package/dist/render/shaders/gi/marchField.wgsl.js +141 -0
  223. package/dist/render/shaders/gi/probeBake.wgsl.d.ts +113 -0
  224. package/dist/render/shaders/gi/probeBake.wgsl.js +635 -0
  225. package/dist/render/shaders/gi/probeTrace.wgsl.d.ts +72 -0
  226. package/dist/render/shaders/gi/probeTrace.wgsl.js +261 -0
  227. package/dist/render/shaders/gi/probeVolume.wgsl.d.ts +49 -0
  228. package/dist/render/shaders/gi/probeVolume.wgsl.js +242 -0
  229. package/dist/render/shaders/gi/sampleField.wgsl.d.ts +32 -0
  230. package/dist/render/shaders/gi/sampleField.wgsl.js +134 -0
  231. package/dist/render/shaders/gpudriven/blendRaster.wgsl.d.ts +26 -0
  232. package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +339 -0
  233. package/dist/render/shaders/gpudriven/compact.wgsl.d.ts +29 -0
  234. package/dist/render/shaders/gpudriven/compact.wgsl.js +58 -0
  235. package/dist/render/shaders/gpudriven/cull.wgsl.d.ts +90 -0
  236. package/dist/render/shaders/gpudriven/cull.wgsl.js +423 -0
  237. package/dist/render/shaders/gpudriven/decode.wgsl.d.ts +72 -0
  238. package/dist/render/shaders/gpudriven/decode.wgsl.js +349 -0
  239. package/dist/render/shaders/gpudriven/environment.wgsl.d.ts +44 -0
  240. package/dist/render/shaders/gpudriven/environment.wgsl.js +137 -0
  241. package/dist/render/shaders/gpudriven/fog.wgsl.d.ts +28 -0
  242. package/dist/render/shaders/gpudriven/fog.wgsl.js +107 -0
  243. package/dist/render/shaders/gpudriven/frameBlock.wgsl.d.ts +13 -0
  244. package/dist/render/shaders/gpudriven/frameBlock.wgsl.js +62 -0
  245. package/dist/render/shaders/gpudriven/materialBin.wgsl.d.ts +51 -0
  246. package/dist/render/shaders/gpudriven/materialBin.wgsl.js +112 -0
  247. package/dist/render/shaders/gpudriven/materialTable.wgsl.d.ts +25 -0
  248. package/dist/render/shaders/gpudriven/materialTable.wgsl.js +43 -0
  249. package/dist/render/shaders/gpudriven/meshTransform.wgsl.d.ts +18 -0
  250. package/dist/render/shaders/gpudriven/meshTransform.wgsl.js +37 -0
  251. package/dist/render/shaders/gpudriven/present.wgsl.d.ts +43 -0
  252. package/dist/render/shaders/gpudriven/present.wgsl.js +127 -0
  253. package/dist/render/shaders/gpudriven/shade.wgsl.d.ts +127 -0
  254. package/dist/render/shaders/gpudriven/shade.wgsl.js +874 -0
  255. package/dist/render/shaders/gpudriven/shadow.wgsl.d.ts +44 -0
  256. package/dist/render/shaders/gpudriven/shadow.wgsl.js +308 -0
  257. package/dist/render/shaders/gpudriven/visbufferRaster.wgsl.d.ts +28 -0
  258. package/dist/render/shaders/gpudriven/visbufferRaster.wgsl.js +245 -0
  259. package/dist/render/shaders/network.wgsl.d.ts +101 -0
  260. package/dist/render/shaders/network.wgsl.js +206 -0
  261. package/dist/render/shaders/recon/motion.wgsl.d.ts +44 -0
  262. package/dist/render/shaders/recon/motion.wgsl.js +96 -0
  263. package/dist/render/shaders/recon/resolve.wgsl.d.ts +51 -0
  264. package/dist/render/shaders/recon/resolve.wgsl.js +733 -0
  265. package/dist/render/temporalAa.js +8 -33
  266. package/dist/render/textLayout.js +12 -6
  267. package/dist/render/textRenderer.d.ts +3 -1
  268. package/dist/render/textRenderer.js +4 -1
  269. package/dist/render/translucentQueue.d.ts +6 -0
  270. package/dist/render/translucentQueue.js +11 -0
  271. package/dist/render/windStreakRenderer.d.ts +2 -1
  272. package/dist/render/windStreakRenderer.js +3 -1
  273. package/dist/world/cell.d.ts +63 -0
  274. package/dist/world/cell.js +181 -0
  275. package/dist/world/cellStream.d.ts +103 -0
  276. package/dist/world/cellStream.js +198 -0
  277. package/dist/world/freeze.d.ts +81 -0
  278. package/dist/world/freeze.js +114 -0
  279. package/dist/world/rebase.d.ts +29 -0
  280. package/dist/world/rebase.js +41 -0
  281. package/package.json +8 -3
  282. package/scripts/frames.mjs +92 -0
  283. package/scripts/gpuCompute.mjs +323 -0
  284. package/scripts/png.d.mts +16 -0
  285. package/scripts/png.mjs +25 -0
  286. package/src/core/loop.ts +19 -2
  287. package/src/core/storage.ts +5 -0
  288. package/src/geometry/meshBuilder.ts +5 -1
  289. package/src/index.ts +246 -4
  290. package/src/input/input.ts +6 -1
  291. package/src/math/exact.ts +69 -3
  292. package/src/math/frustum.ts +52 -3
  293. package/src/render/backend/api.ts +42 -1
  294. package/src/render/backend/budget.ts +7 -6
  295. package/src/render/backend/createRenderer.ts +92 -3
  296. package/src/render/backend/materialChanges.ts +54 -0
  297. package/src/render/backend/select.ts +8 -0
  298. package/src/render/backend/webgl2/renderer.ts +211 -9
  299. package/src/render/backend/webgpu/buffers.ts +182 -69
  300. package/src/render/backend/webgpu/fieldCompose.ts +482 -0
  301. package/src/render/backend/webgpu/giFieldPass.ts +200 -0
  302. package/src/render/backend/webgpu/gpuDrivenPass.ts +2993 -0
  303. package/src/render/backend/webgpu/linePass.ts +4 -39
  304. package/src/render/backend/webgpu/probeBake.ts +588 -0
  305. package/src/render/backend/webgpu/renderer.ts +1481 -76
  306. package/src/render/backend/webgpu/scatterPass.ts +15 -1
  307. package/src/render/backend/webgpu/surfaceTexturePass.ts +63 -36
  308. package/src/render/causticsRenderer.ts +5 -2
  309. package/src/render/depthConvention.ts +15 -0
  310. package/src/render/deviceFeatures.ts +77 -0
  311. package/src/render/fog.ts +185 -0
  312. package/src/render/frame/alias.ts +97 -0
  313. package/src/render/frame/deps.ts +155 -0
  314. package/src/render/frame/flushGraph.ts +135 -0
  315. package/src/render/frame/graphSchedule.ts +170 -0
  316. package/src/render/frame/index.ts +52 -0
  317. package/src/render/frame/lifetime.ts +61 -0
  318. package/src/render/frame/passTimings.ts +69 -0
  319. package/src/render/frame/validate.ts +40 -0
  320. package/src/render/frame/virtual.ts +91 -0
  321. package/src/render/gi/chain.ts +225 -0
  322. package/src/render/gi/denoise.ts +276 -0
  323. package/src/render/gi/fieldScene.ts +264 -0
  324. package/src/render/gi/globalField.ts +543 -0
  325. package/src/render/gi/probeGridFit.ts +89 -0
  326. package/src/render/gi/probeTrace.ts +143 -0
  327. package/src/render/gi/probeVolume.ts +288 -0
  328. package/src/render/gi/reflection.ts +163 -0
  329. package/src/render/gi/traceField.ts +223 -0
  330. package/src/render/gi/traceScreen.ts +106 -0
  331. package/src/render/gpuScene.ts +80 -0
  332. package/src/render/gpudriven/alphaTest.ts +33 -0
  333. package/src/render/gpudriven/clusterUpload.ts +123 -0
  334. package/src/render/gpudriven/clusterWorld.ts +239 -0
  335. package/src/render/gpudriven/compact.ts +80 -0
  336. package/src/render/gpudriven/cullClusters.ts +333 -0
  337. package/src/render/gpudriven/decodeTables.ts +332 -0
  338. package/src/render/gpudriven/frustum.ts +70 -0
  339. package/src/render/gpudriven/geometryHarness.ts +51 -0
  340. package/src/render/gpudriven/hzb.ts +113 -0
  341. package/src/render/gpudriven/ibl.ts +147 -0
  342. package/src/render/gpudriven/indirect.ts +89 -0
  343. package/src/render/gpudriven/instances.ts +234 -0
  344. package/src/render/gpudriven/lit.ts +329 -0
  345. package/src/render/gpudriven/lodCut.ts +62 -0
  346. package/src/render/gpudriven/materialBin.ts +131 -0
  347. package/src/render/gpudriven/materialTable.ts +164 -0
  348. package/src/render/gpudriven/pipeline.ts +336 -0
  349. package/src/render/gpudriven/rangeAlloc.ts +122 -0
  350. package/src/render/gpudriven/sceneUpload.ts +173 -0
  351. package/src/render/gpudriven/shadeBins.ts +222 -0
  352. package/src/render/gpudriven/shadow.ts +285 -0
  353. package/src/render/gpudriven/shadowCamera.ts +406 -0
  354. package/src/render/gpudriven/streamScene.ts +575 -0
  355. package/src/render/gpudriven/surfaceFrame.ts +68 -0
  356. package/src/render/gpudriven/twoPhase.ts +214 -0
  357. package/src/render/gpudriven/visbuffer.ts +41 -0
  358. package/src/render/halfFloat.ts +22 -4
  359. package/src/render/inference/attentionTiled.ts +132 -0
  360. package/src/render/inference/denseKernels.ts +369 -0
  361. package/src/render/inference/device.ts +44 -0
  362. package/src/render/inference/deviceGraph.ts +39 -0
  363. package/src/render/inference/fuse.ts +47 -0
  364. package/src/render/inference/kernelKit.ts +120 -0
  365. package/src/render/inference/kernels.ts +18 -0
  366. package/src/render/inference/plan.ts +26 -0
  367. package/src/render/inference/reuse.ts +79 -0
  368. package/src/render/inference/runner.ts +204 -0
  369. package/src/render/inference/schedule.ts +80 -0
  370. package/src/render/inference/shapeKernels.ts +112 -0
  371. package/src/render/inference/spatialKernels.ts +220 -0
  372. package/src/render/inference/splatRaster.wgsl.ts +348 -0
  373. package/src/render/inference/splatTiles.ts +186 -0
  374. package/src/render/lineBatch.ts +4 -24
  375. package/src/render/mesh.ts +46 -1
  376. package/src/render/pass.ts +155 -10
  377. package/src/render/prefilterEnvMap.ts +33 -0
  378. package/src/render/readback.ts +73 -0
  379. package/src/render/recon/clamp.ts +113 -0
  380. package/src/render/recon/disocclusion.ts +143 -0
  381. package/src/render/recon/frameGen.ts +191 -0
  382. package/src/render/recon/frameSizes.ts +64 -0
  383. package/src/render/recon/jitter.ts +126 -0
  384. package/src/render/recon/motionVectors.ts +138 -0
  385. package/src/render/recon/reproject.ts +179 -0
  386. package/src/render/recon/resolve.ts +444 -0
  387. package/src/render/recon/tier.ts +31 -0
  388. package/src/render/reflectionProbe.ts +34 -0
  389. package/src/render/renderQuality.ts +87 -0
  390. package/src/render/screenSpaceReflection.ts +37 -3
  391. package/src/render/sdfFont.ts +2 -0
  392. package/src/render/segmentQuads.ts +39 -0
  393. package/src/render/shaders/flat/lobes.ts +35 -3
  394. package/src/render/shaders/flat/preamble.ts +25 -1
  395. package/src/render/shaders/flat/probeGrid.ts +77 -2
  396. package/src/render/shaders/generated/flat.wgsl.ts +64 -24
  397. package/src/render/shaders/gi/composeField.wgsl.ts +239 -0
  398. package/src/render/shaders/gi/marchField.wgsl.ts +146 -0
  399. package/src/render/shaders/gi/probeBake.wgsl.ts +649 -0
  400. package/src/render/shaders/gi/probeTrace.wgsl.ts +269 -0
  401. package/src/render/shaders/gi/probeVolume.wgsl.ts +246 -0
  402. package/src/render/shaders/gi/sampleField.wgsl.ts +140 -0
  403. package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +343 -0
  404. package/src/render/shaders/gpudriven/compact.wgsl.ts +59 -0
  405. package/src/render/shaders/gpudriven/cull.wgsl.ts +433 -0
  406. package/src/render/shaders/gpudriven/decode.wgsl.ts +373 -0
  407. package/src/render/shaders/gpudriven/environment.wgsl.ts +141 -0
  408. package/src/render/shaders/gpudriven/fog.wgsl.ts +110 -0
  409. package/src/render/shaders/gpudriven/frameBlock.wgsl.ts +62 -0
  410. package/src/render/shaders/gpudriven/materialBin.wgsl.ts +116 -0
  411. package/src/render/shaders/gpudriven/materialTable.wgsl.ts +46 -0
  412. package/src/render/shaders/gpudriven/meshTransform.wgsl.ts +37 -0
  413. package/src/render/shaders/gpudriven/present.wgsl.ts +129 -0
  414. package/src/render/shaders/gpudriven/shade.wgsl.ts +884 -0
  415. package/src/render/shaders/gpudriven/shadow.wgsl.ts +322 -0
  416. package/src/render/shaders/gpudriven/visbufferRaster.wgsl.ts +251 -0
  417. package/src/render/shaders/network.wgsl.ts +238 -0
  418. package/src/render/shaders/recon/motion.wgsl.ts +101 -0
  419. package/src/render/shaders/recon/resolve.wgsl.ts +741 -0
  420. package/src/render/temporalAa.ts +9 -33
  421. package/src/render/textLayout.ts +12 -6
  422. package/src/render/textRenderer.ts +5 -2
  423. package/src/render/translucentQueue.ts +11 -0
  424. package/src/render/windStreakRenderer.ts +4 -2
  425. package/src/world/cell.ts +231 -0
  426. package/src/world/cellStream.ts +278 -0
  427. package/src/world/freeze.ts +157 -0
  428. package/src/world/rebase.ts +56 -0
@@ -209,45 +209,24 @@ export function createGpuMeshIncremental(device, data, dynamic = false) {
209
209
  const indicesPerStep = Math.max(1, Math.floor(UPLOAD_BYTES_PER_STEP / indexWidth));
210
210
  const totalSteps = Math.max(1, Math.ceil(vertexCount / verticesPerStep)) +
211
211
  Math.max(1, Math.ceil(data.indices.length / indicesPerStep));
212
- let uploaded = false;
213
- function* uploadSteps() {
214
- let taken = 0;
215
- for (let from = 0; from < vertexCount; from += verticesPerStep) {
216
- const to = Math.min(from + verticesPerStep, vertexCount);
217
- let fieldOffset = 0;
218
- for (const attribute of supplied) {
219
- const source = data[attribute.name];
220
- const width = attribute.components;
221
- for (let vertex = from; vertex < to; vertex++) {
222
- for (let component = 0; component < width; component++) {
223
- interleaved[vertex * step + fieldOffset + component] =
224
- source[vertex * width + component] ?? 0;
225
- }
226
- }
227
- fieldOffset += width;
228
- }
229
- device.queue.writeBuffer(vertices, from * stride, interleaved, from * step, (to - from) * step);
230
- taken += 1;
231
- if (taken < totalSteps)
232
- yield;
233
- }
234
- for (let from = 0; from < data.indices.length; from += indicesPerStep) {
235
- const to = Math.min(from + indicesPerStep, data.indices.length);
236
- device.queue.writeBuffer(indexBuffer, from * indexWidth, data.indices, from, to - from);
237
- taken += 1;
238
- if (taken < totalSteps)
239
- yield;
240
- }
241
- uploaded = true;
242
- }
243
- const mesh = {
244
- vertexBuffers: [vertices, constants],
212
+ /*
213
+ * **The mesh is assembled out here, by functions of its own, and that is the fix for a copy
214
+ * nobody named.** It was an object literal in this scope, and its `complete` getter shared this
215
+ * scope's context with the upload generator and the `filter` above, which both read `data` — V8
216
+ * gives every closure in a scope one context — so a getter returning a boolean held the whole
217
+ * `MeshData` and the interleaved rows for as long as the mesh lived. The voxel sandbox's forward
218
+ * path held 2,058 MB of ArrayBuffers at radius 32 against the second pipeline's 368.
219
+ * `meshRetention.test.ts` holds it: a mesh keeps its buffers, and a dynamic one its rows.
220
+ */
221
+ const progress = { uploaded: false };
222
+ const mesh = gpuMeshOf({
223
+ vertices,
224
+ constants,
245
225
  indexBuffer,
226
+ stride,
246
227
  indexCount: data.indices.length,
247
228
  bounds,
248
- get complete() {
249
- return uploaded;
250
- },
229
+ progress,
251
230
  hasTangents: data.tangents !== undefined,
252
231
  isSkinned: data.joints !== undefined,
253
232
  hasChannel: data.channel !== undefined,
@@ -256,35 +235,114 @@ export function createGpuMeshIncremental(device, data, dynamic = false) {
256
235
  : new MorphTexture(device, data.morphTargets, data.positions.length / 3, data.morphTargetCount),
257
236
  update: !dynamic
258
237
  ? null
259
- : (target, positions, normals) => {
260
- if (positions.length !== vertexCount * 3) {
261
- throw new Error(`this mesh has ${vertexCount} vertices and the update has ${positions.length / 3}. ` +
262
- "A mesh's vertex count is fixed at creation: the index buffer, the pipeline and " +
263
- 'every other attribute are sized against it.');
264
- }
265
- /* Everything that decides whether this is on screen starts from the bounds, so a cloth
266
- that blew sideways out of its original box would be culled while still visible. */
267
- boundsOfPositions(positions, bounds);
268
- for (let vertex = 0; vertex < vertexCount; vertex++) {
269
- const at = vertex * step;
270
- interleaved[at + positionField] = positions[vertex * 3] ?? 0;
271
- interleaved[at + positionField + 1] = positions[vertex * 3 + 1] ?? 0;
272
- interleaved[at + positionField + 2] = positions[vertex * 3 + 2] ?? 0;
273
- if (normals === undefined)
274
- continue;
275
- interleaved[at + normalField] = normals[vertex * 3] ?? 0;
276
- interleaved[at + normalField + 1] = normals[vertex * 3 + 1] ?? 0;
277
- interleaved[at + normalField + 2] = normals[vertex * 3 + 2] ?? 0;
238
+ : dynamicUpdate(interleaved, vertices, bounds, vertexCount, step, positionField, normalField),
239
+ });
240
+ const job = {
241
+ data,
242
+ interleaved,
243
+ device,
244
+ supplied,
245
+ vertices,
246
+ indexBuffer,
247
+ vertexCount,
248
+ step,
249
+ stride,
250
+ verticesPerStep,
251
+ indicesPerStep,
252
+ totalSteps,
253
+ progress,
254
+ };
255
+ return { mesh, upload: uploadSteps(job) };
256
+ }
257
+ function* uploadSteps(job) {
258
+ const { device, supplied, vertices, indexBuffer, vertexCount, step, stride } = job;
259
+ let taken = 0;
260
+ for (let from = 0; from < vertexCount; from += job.verticesPerStep) {
261
+ const data = job.data;
262
+ const interleaved = job.interleaved;
263
+ const to = Math.min(from + job.verticesPerStep, vertexCount);
264
+ let fieldOffset = 0;
265
+ for (const attribute of supplied) {
266
+ const source = data[attribute.name];
267
+ const width = attribute.components;
268
+ for (let vertex = from; vertex < to; vertex++) {
269
+ for (let component = 0; component < width; component++) {
270
+ interleaved[vertex * step + fieldOffset + component] =
271
+ source[vertex * width + component] ?? 0;
278
272
  }
279
- target.queue.writeBuffer(vertices, 0, interleaved);
280
- },
273
+ }
274
+ fieldOffset += width;
275
+ }
276
+ device.queue.writeBuffer(vertices, from * stride, interleaved, from * step, (to - from) * step);
277
+ taken += 1;
278
+ if (taken < job.totalSteps)
279
+ yield;
280
+ }
281
+ const indices = job.data.indices;
282
+ const indexWidth = indices.BYTES_PER_ELEMENT;
283
+ for (let from = 0; from < indices.length; from += job.indicesPerStep) {
284
+ const to = Math.min(from + job.indicesPerStep, indices.length);
285
+ device.queue.writeBuffer(indexBuffer, from * indexWidth, indices, from, to - from);
286
+ taken += 1;
287
+ if (taken < job.totalSteps)
288
+ yield;
289
+ }
290
+ job.data = null;
291
+ job.interleaved = null;
292
+ job.progress.uploaded = true;
293
+ }
294
+ /** The handle, made where it can see only what it hands out. */
295
+ function gpuMeshOf(parts) {
296
+ const { vertices, constants, indexBuffer, progress } = parts;
297
+ return {
298
+ vertexBuffers: [vertices, constants],
299
+ vertexStride: parts.stride,
300
+ indexBuffer,
301
+ indexCount: parts.indexCount,
302
+ bounds: parts.bounds,
303
+ get complete() {
304
+ return progress.uploaded;
305
+ },
306
+ hasTangents: parts.hasTangents,
307
+ isSkinned: parts.isSkinned,
308
+ hasChannel: parts.hasChannel,
309
+ morph: parts.morph,
310
+ update: parts.update,
281
311
  dispose() {
282
312
  vertices.destroy();
283
313
  constants.destroy();
284
314
  indexBuffer.destroy();
285
315
  },
286
316
  };
287
- return { mesh, upload: uploadSteps() };
317
+ }
318
+ /**
319
+ * A dynamic mesh's `update`, which keeps the interleaved rows and nothing else: it rewrites the
320
+ * positions and normals in them and uploads the whole buffer, so the other attributes it does not
321
+ * receive have to still be there.
322
+ */
323
+ function dynamicUpdate(interleaved, vertices, bounds, vertexCount, step, positionField, normalField) {
324
+ return (target, positions, normals) => {
325
+ if (positions.length !== vertexCount * 3) {
326
+ throw new Error(`this mesh has ${vertexCount} vertices and the update has ${positions.length / 3}. ` +
327
+ "A mesh's vertex count is fixed at creation: the index buffer, the pipeline and " +
328
+ 'every other attribute are sized against it.');
329
+ }
330
+ /* Everything that decides whether this is on screen starts from the bounds, so a cloth
331
+ that blew sideways out of its original box would be culled while still visible. */
332
+ boundsOfPositions(positions, bounds);
333
+ for (let vertex = 0; vertex < vertexCount; vertex++) {
334
+ const at = vertex * step;
335
+ interleaved[at + positionField] = positions[vertex * 3] ?? 0;
336
+ interleaved[at + positionField + 1] = positions[vertex * 3 + 1] ?? 0;
337
+ interleaved[at + positionField + 2] = positions[vertex * 3 + 2] ?? 0;
338
+ if (normals === undefined)
339
+ continue;
340
+ interleaved[at + normalField] = normals[vertex * 3] ?? 0;
341
+ interleaved[at + normalField + 1] = normals[vertex * 3 + 1] ?? 0;
342
+ interleaved[at + normalField + 2] = normals[vertex * 3 + 2] ?? 0;
343
+ }
344
+ target.queue.writeBuffer(vertices, 0, interleaved);
345
+ };
288
346
  }
289
347
  /**
290
348
  * The buffer layouts a pipeline is built with, matching what `createGpuMesh` uploaded.
@@ -0,0 +1,156 @@
1
+ /**
2
+ * The world's distance field, composed on the device from what the frame declared.
3
+ *
4
+ * **Extracted from `GiFieldPass` rather than written beside it**, because two copies of this
5
+ * arithmetic is exactly the hazard `composeField.wgsl.ts` opens by naming: a shader and a
6
+ * TypeScript function cannot import a struct from each other, so every restatement of the layout
7
+ * is a place the two can drift. There was already one restatement — the reference and the shader,
8
+ * which `scripts/gi-parity.mjs` holds together. A third, in a renderer that composed its own field
9
+ * while a contributed pass composed another, would be one nothing checks.
10
+ *
11
+ * **What changed from the pass is where the instances come from.** `GiFieldPass` took them in its
12
+ * constructor and uploaded them once at `init`, which is right for a rig whose scene is fixed and
13
+ * wrong for a renderer whose consumer declares its fields every frame. Here the instances arrive
14
+ * in a `DistanceFieldScene`, the instance count reaches the shader through the params, and the
15
+ * samples live in a buffer that grows to fit the scene and is never reallocated by a steady one.
16
+ *
17
+ * **The samples are uploaded only when the packing changed.** A field is megabytes and a placement
18
+ * is bytes; a composer that rewrote the samples every frame would move the whole world across the
19
+ * bus to say what it said last frame. `DistanceFieldScene.packingChanged` is what knows.
20
+ */
21
+ import type { ReadonlyMat4, ReadonlyVec3 } from 'gl-matrix';
22
+ import type { DistanceFieldScene } from '../../gi/fieldScene.ts';
23
+ import type { PassDistanceField } from '../../pass.ts';
24
+ /**
25
+ * What a composed field is, to anything that reads it.
26
+ *
27
+ * **Declared in `pass.ts` rather than here**, because it is what the seam hands a contributed pass
28
+ * and a second declaration of one shape is the drift this file's header is about. This is an alias
29
+ * so a reader of the composer does not have to leave it to learn what it produces.
30
+ */
31
+ export type ComposedField = PassDistanceField;
32
+ /**
33
+ * What the renderer composes with when a consumer only said `quality.indirectLight`.
34
+ *
35
+ * **Three cascades of 49, four metres at the innermost**, which is `demo/giFieldRig.ts`'s
36
+ * measurement and its reasoning: 49 rather than 33 puts the innermost cascade's step at 16.7 cm
37
+ * rather than 25, the difference between a 1.1 m object having six samples across it and four.
38
+ * The three together are 1.4 MB on the device, and the outermost reaches sixteen metres — beyond
39
+ * which the chain's probe level answers and never declines.
40
+ */
41
+ export declare const DEFAULT_FIELD_COMPOSE: FieldComposeOptions;
42
+ export interface FieldComposeOptions {
43
+ /** Samples a side, every cascade. */
44
+ readonly resolution: number;
45
+ readonly cascades: number;
46
+ /** The innermost cascade's half-extent in metres. Each one out reaches twice as far. */
47
+ readonly radius: number;
48
+ }
49
+ export declare class FieldComposer {
50
+ private readonly options;
51
+ private readonly samples;
52
+ /** The cascade geometry, kept on the CPU because `placeCascade` is what decides it. */
53
+ private readonly cascades;
54
+ private readonly device;
55
+ private readonly pipeline;
56
+ /** One a cascade, each binding that cascade's own params at its own aligned offset. */
57
+ private groups;
58
+ private readonly paramBuffer;
59
+ private readonly instanceBuffer;
60
+ private readonly fieldBuffer;
61
+ /** The colour of whatever won the union at each sample, three floats. */
62
+ private readonly albedoBuffer;
63
+ /**
64
+ * Where each cascade stands, as the field's readers see it: moved by a copy encoded after the
65
+ * composition, never written by the queue. See `cascadeStaged`.
66
+ */
67
+ private readonly cascadeBuffer;
68
+ /**
69
+ * **This frame's bounds, on their way to `cascadeBuffer`.** A queue write lands when it is made
70
+ * and an encoded command when its command buffer runs, and a reader of the field — the march in
71
+ * a contributed pass's `prepare` — is encoded before the composition. Written straight into the
72
+ * buffer readers bind, the bounds arrived a frame ahead of the samples they describe, and every
73
+ * frame a cascade stepped the field was read one voxel off. Staged here and copied after the
74
+ * composition's dispatches, a reader before them sees last frame's bounds with last frame's
75
+ * samples and a reader after them sees this frame's with this frame's.
76
+ */
77
+ private readonly cascadeStaged;
78
+ /**
79
+ * The declared sources' samples, grown to fit rather than allocated at the budget.
80
+ *
81
+ * **The budget is a ceiling and not a size.** `MAX_DISTANCE_FIELD_SAMPLES` is sixteen megabytes;
82
+ * a scene with two 33-cubed fields wants two hundred and eighty kilobytes, and a renderer that
83
+ * reserved the ceiling would charge every consumer for the largest one imaginable. It grows when
84
+ * a frame declares more than it holds and never shrinks, so a scene that cycles between two sets
85
+ * of fields settles rather than reallocating.
86
+ */
87
+ private sourceBuffer;
88
+ private sourceFloats;
89
+ private readonly paramScratch;
90
+ private readonly cascadeScratch;
91
+ private readonly instanceScratch;
92
+ private readonly outerBounds;
93
+ /** False until a frame has actually composed something, so a reader knows not to trace. */
94
+ private composed;
95
+ /**
96
+ * The device's own clock around the dispatch, where it has one.
97
+ *
98
+ * **Moved here from `GiFieldPass` with the dispatch it measures.** A timestamp belongs beside
99
+ * the work, and this is now the only place the world's field is composed — so the figure a rig
100
+ * reports is the figure the renderer actually pays rather than a second composition's.
101
+ */
102
+ private queries;
103
+ private queryResolve;
104
+ private queryRead;
105
+ private queryCopied;
106
+ private queryMapping;
107
+ private timed;
108
+ private composeMsValue;
109
+ constructor(device: GPUDevice, options: FieldComposeOptions);
110
+ /** One bind group a cascade. Rebuilt whenever the source buffer is replaced by a larger one. */
111
+ private rebuildGroups;
112
+ /**
113
+ * Make room for `floats` of samples, replacing the buffer and its bind groups if it is short.
114
+ *
115
+ * **Grown to exactly what is asked rather than doubled.** A doubling policy is for something
116
+ * appended to; this is rewritten whole whenever the packing changes, and the sizes involved are
117
+ * a scene's whole set of baked fields — a quantity that changes when the world does and not
118
+ * between frames of a steady one.
119
+ */
120
+ private ensureSources;
121
+ private storage;
122
+ /** The composed field, or null until a frame has composed one. */
123
+ get field(): ComposedField | null;
124
+ /**
125
+ * Compose every cascade from what the frame declared, centred on the eye.
126
+ *
127
+ * One dispatch a cascade rather than one for all of them: each has its own origin and step, and
128
+ * a single dispatch would carry them in a buffer indexed by the invocation's own cascade — a
129
+ * divide and a dependent read per thread to save a handful of dispatches.
130
+ *
131
+ * **A frame that declared nothing composes nothing and says so.** An empty instance list would
132
+ * otherwise fill every cascade with the "no surface anywhere" value, which a march reads as an
133
+ * infinite empty room — a ray that travels its whole reach and reports a miss. That is the right
134
+ * answer, but it costs a full dispatch to write it and the field it produces was already there.
135
+ */
136
+ compose(encoder: GPUCommandEncoder, scene: DistanceFieldScene, eye: ReadonlyVec3): void;
137
+ /**
138
+ * The device milliseconds the last measured composition took, or null where nothing measured it.
139
+ *
140
+ * One frame behind, because a timestamp is read back and a readback that blocked would be the
141
+ * measurement changing what it measures.
142
+ */
143
+ get composeMs(): number | null;
144
+ /** Ask for the last frame's figure, once the frame that recorded it has been submitted. */
145
+ readTimings(): void;
146
+ dispose(): void;
147
+ }
148
+ /**
149
+ * The inverse of a rigid transform with a uniform scale, written into `out` at `at`.
150
+ *
151
+ * **Not a general inverse**, because `composeGlobalField` refuses anything else: a distance is not
152
+ * preserved by a non-uniform scale and there is no factor to correct one by. Transposing the
153
+ * rotation and dividing by the scale squared is exact for what is allowed, and a general inverse
154
+ * here would be a fourth spelling of a constraint stated three times already.
155
+ */
156
+ export declare function writeInverse(m: ReadonlyMat4, out: Float32Array, at: number): void;