@meimu/mutracer 0.3.0 → 0.3.1

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 (304) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -1,3 +1,4 @@
1
+ import { type SurfaceHit } from './surfaceHit.js';
1
2
  import { WebGLAov } from './WebGLAov.js';
2
3
  import { type AovKind } from './aov.js';
3
4
  import { type SamplingPattern } from './sampling.js';
@@ -37,8 +38,9 @@ declare class WebGLRayTracePass {
37
38
  private _dirtyColorMeshes;
38
39
  private _tlas?;
39
40
  private _bvhData?;
40
- private _instancesData?;
41
- private _materialIndexData?;
41
+ private _instancesOffset;
42
+ private _vertexAttributeData?;
43
+ private _vertexAttributeLayout?;
42
44
  private _meshSnapshot;
43
45
  private _snapshotByMesh;
44
46
  private _needsUpdateAnalyticLightsBuffer;
@@ -66,14 +68,8 @@ declare class WebGLRayTracePass {
66
68
  private _sequenceSeed;
67
69
  private _zLogSPP;
68
70
  private _positionBufferTex;
69
- private _normalBufferTex;
70
- private _colorBufferTex;
71
- private _tangentBufferTex;
72
- private _uvBufferTex;
73
- private _uv1BufferTex;
71
+ private _vertexAttributeTex;
74
72
  private _bvhBufferTex;
75
- private _instancesBufferTex;
76
- private _matIndexBufferTex;
77
73
  private _hasTransmission;
78
74
  private _hasAlpha;
79
75
  private _invalid;
@@ -81,6 +77,7 @@ declare class WebGLRayTracePass {
81
77
  private _mainPass;
82
78
  private _shadowCatcherPass;
83
79
  private _viewProjInv;
80
+ private _projectionInv;
84
81
  private _apertureRadius;
85
82
  private _focusDistance;
86
83
  private _aovPass;
@@ -91,6 +88,8 @@ declare class WebGLRayTracePass {
91
88
  private _depthAspect;
92
89
  private _hasShadowCatcher;
93
90
  private _spectral;
91
+ private _shareSpectralPrefix;
92
+ private _independentSpectralPaths;
94
93
  constructor(renderer: WebGLRenderer);
95
94
  preparePrograms(): boolean;
96
95
  createPass(clear: boolean, tile: {
@@ -120,6 +119,8 @@ declare class WebGLRayTracePass {
120
119
  textureAtlas: import("./textureAtlas.js").TextureAtlasStats | undefined;
121
120
  };
122
121
  private _updateMeshData;
122
+ private _uploadBVH;
123
+ private _uploadInstanceRanges;
123
124
  private _updateMaterialConstants;
124
125
  private _updateMeshMembership;
125
126
  private _updateGeometryData;
@@ -147,12 +148,15 @@ declare class WebGLRayTracePass {
147
148
  isInvalid(): boolean;
148
149
  hasShadowCatcher(): boolean;
149
150
  hasDispersion(): boolean;
151
+ hasSharedSpectralPrefix(): boolean;
150
152
  prepare(): void;
151
153
  setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed?: number): boolean;
152
154
  setSampleSequenceOffset(_offset: number): void;
153
155
  prepareAovs(state: WebGLAov, camera: Camera, width: number, height: number, kinds: readonly AovKind[]): boolean;
154
156
  renderAovs(state: WebGLAov, camera: Camera, width: number, height: number, samples: number, cap: number, kinds: readonly AovKind[], sequenceOffset?: number): boolean;
155
- readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined>;
157
+ pickSurface(x: number, y: number, aspect?: number): Promise<SurfaceHit | null | undefined>;
158
+ readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array<ArrayBufferLike> | undefined>;
159
+ private _readDepthSamples;
156
160
  dispose(): void;
157
161
  }
158
162
  export default WebGLRayTracePass;
@@ -1,12 +1,14 @@
1
+ import { materialNeedsVertexTangents } from './tangentRequirements.js';
2
+ import { resolveSurfaceHit } from './surfaceHit.js';
1
3
  import { researchTransport } from './researchTransport.js';
2
4
  import { EmissiveTriangleCache } from './lightSampling.js';
3
5
  import { prepareWebGLLightSampling } from './webglLightSampling.js';
4
6
  import { AovPrimitiveCache } from './AovPrimitiveCache.js';
5
7
  import { aovTraceFragment } from './glsl/aovTrace.frag.js';
6
8
  import { packAovScene } from './aovScene.js';
7
- import { aovMask } from './aov.js';
9
+ import { aovMask, AOV_ACCUMULATED_MASK, AOV_REFLECTANCE_MASK } from './aov.js';
8
10
  import { WebGLSkySource } from './WebGLSkySource.js';
9
- import { normalizeBounces } from './pathLimits.js';
11
+ import { normalizeBounces, MAX_PATH_EVENTS_WEBGL } from './pathLimits.js';
10
12
  import { updateMeshInstanceColors } from './prepareMeshBVH.js';
11
13
  import { updateTLASInstanceColors } from './bvhAccel.js';
12
14
  import { getMaterialHashKey } from '../scene/openPbrSchema.js';
@@ -25,7 +27,7 @@ import { MaterialChangeTracker, materialIsEmissive } from './materialChanges.js'
25
27
  import { constants, Texture2D as WebGLTexture2D } from './webgl.js';
26
28
  import { WebGLFullQuadPass } from './WebGLFullQuadPass.js';
27
29
  import { mat4 } from '../math.js';
28
- import { buildBLAS, buildTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
30
+ import { buildBLAS, buildWebTLAS, concatBLASBuffers, refitBLAS, refitTLAS, mergeRefitRanges } from './bvhAccel.js';
29
31
  import { generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform, backgroundMapRotation } from './envMapCreation.js';
30
32
  import { envMapDistribution, environmentMapSourcesMatch } from './envMapDistribution.js';
31
33
  import createRayTraceFragmentShader from './glsl/rayTrace.frag.js';
@@ -40,6 +42,7 @@ import { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged
40
42
  import { Attribute } from '../scene/Geometry.js';
41
43
  import { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';
42
44
  import { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';
45
+ import { packVertexAttributes, vertexAttributeDefines, vertexAttributeLayout } from './webglVertexAttributes.js';
43
46
  import { DEFAULT_BEVEL_SAMPLES, normalizeBevelSamples } from './RenderingPipeline.js';
44
47
  import { getOpenPbrEnergyLutData, OPENPBR_ENERGY_LUT_HEIGHT, OPENPBR_ENERGY_LUT_WIDTH } from './openPbrEnergyLut.js';
45
48
  // A defensive mixture keeps weak-but-wide lights from being starved by an
@@ -92,8 +95,9 @@ class WebGLRayTracePass {
92
95
  _dirtyColorMeshes = new Set();
93
96
  _tlas;
94
97
  _bvhData;
95
- _instancesData;
96
- _materialIndexData;
98
+ _instancesOffset = 0;
99
+ _vertexAttributeData;
100
+ _vertexAttributeLayout;
97
101
  _meshSnapshot = [];
98
102
  _snapshotByMesh = new WeakMap();
99
103
  _needsUpdateAnalyticLightsBuffer = true;
@@ -129,17 +133,8 @@ class WebGLRayTracePass {
129
133
  _sequenceSeed = 0;
130
134
  _zLogSPP = 0;
131
135
  _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);
132
- _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);
133
- _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);
134
- _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);
135
- _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);
136
- _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);
136
+ _vertexAttributeTex = new WebGLTexture2D(commonNearestFloatProps);
137
137
  _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);
138
- _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);
139
- _matIndexBufferTex = new WebGLTexture2D({
140
- ...commonNearestFloatProps
141
- // type: constants.INT
142
- });
143
138
  _hasTransmission = false;
144
139
  _hasAlpha = false;
145
140
  _invalid = false;
@@ -147,6 +142,7 @@ class WebGLRayTracePass {
147
142
  _mainPass;
148
143
  _shadowCatcherPass;
149
144
  _viewProjInv = mat4.create();
145
+ _projectionInv = mat4.create();
150
146
  _apertureRadius = 0;
151
147
  _focusDistance = 10;
152
148
  _aovPass;
@@ -157,6 +153,8 @@ class WebGLRayTracePass {
157
153
  _depthAspect = 1;
158
154
  _hasShadowCatcher = false;
159
155
  _spectral = false;
156
+ _shareSpectralPrefix = true;
157
+ _independentSpectralPaths = false;
160
158
  constructor(renderer) {
161
159
  this._renderer = renderer;
162
160
  const accumulationOutput = {
@@ -229,7 +227,7 @@ class WebGLRayTracePass {
229
227
  : this._mainPass.getOutput(label);
230
228
  }
231
229
  setBounce(bounce) {
232
- const next = normalizeBounces(bounce);
230
+ const next = normalizeBounces(bounce, MAX_PATH_EVENTS_WEBGL);
233
231
  const changed = this._bounces !== next;
234
232
  this._bounces = next;
235
233
  return changed;
@@ -440,34 +438,14 @@ class WebGLRayTracePass {
440
438
  this._needsUpdateMeshMembership = false;
441
439
  const mergedGeometry = res.geometry;
442
440
  const materials = res.materials;
443
- const tlas = buildTLAS(res.instances, res.blases);
444
- this._tlas = tlas;
445
- const tlasBuffer = new Float32Array(tlas.buffer);
446
- const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer);
447
- const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));
448
- const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);
449
- const blasOffset = tlasBuffer.length / 4;
450
- bvhBuffer.set(tlasBuffer);
451
- bvhBuffer.set(blasBuffer, blasOffset * 4);
441
+ this._tlas = buildWebTLAS(res.instances, res.blases);
442
+ this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
443
+ const layout = this._vertexAttributeLayout = vertexAttributeLayout(mergedGeometry);
444
+ let vertexAttributeColumns = 0;
452
445
  if (mergedGeometry.position.array.length > 0) {
453
446
  setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);
454
- setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);
455
- mergedGeometry.color &&
456
- setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);
457
- mergedGeometry.tangent &&
458
- setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);
459
- mergedGeometry.uv &&
460
- setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);
461
- mergedGeometry.uv1 &&
462
- setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);
463
- mergedGeometry.materialIndex &&
464
- setDataTexture(this._matIndexBufferTex,
465
- // TODO currently int texture doesn't work
466
- this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array), 4);
467
- }
468
- if (bvhBuffer.length > 0) {
469
- setDataTexture(this._bvhBufferTex, bvhBuffer, 4);
470
- setDataTexture(this._instancesBufferTex, instancesBuffer, 4);
447
+ this._vertexAttributeData = packVertexAttributes(mergedGeometry, layout, new Float32Array(mergedGeometry.vertexCount * layout.stride * 4));
448
+ vertexAttributeColumns = setDataTexture(this._vertexAttributeTex, this._vertexAttributeData, 4).columnsLog;
471
449
  }
472
450
  this._materialData?.dispose(this._renderer.gl);
473
451
  const materialData = new MaterialTable(materials, this._analyticLights, {
@@ -479,26 +457,41 @@ class WebGLRayTracePass {
479
457
  this._tracePasses.forEach((pass) => {
480
458
  pass.setUniforms({
481
459
  bvhBuffer: this._bvhBufferTex,
482
- instancesBuffer: this._instancesBufferTex,
483
460
  positionBuffer: this._positionBufferTex,
484
- normalBuffer: this._normalBufferTex,
485
- tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,
486
- colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,
487
- uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,
488
- uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,
489
- materialIndexBuffer: this._matIndexBufferTex,
490
- bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,
461
+ vertexAttributes: this._vertexAttributeTex,
491
462
  vertexColumns: textureDimensionsFromArray(Attribute.getCount(mergedGeometry.position)).columnsLog,
492
- instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)
493
- .columnsLog,
494
- blasOffset,
463
+ vertexAttributeColumns,
495
464
  isEmptyScene: +(res.instances.length === 0)
496
465
  });
497
466
  });
498
467
  this._updateMaterialConstants(materials, materialData, mergedGeometry);
499
468
  this._materialChanges.capture(materials);
500
469
  this._pendingMaterialUpdate = undefined;
501
- return bvhBuffer;
470
+ }
471
+ // One texture holds the TLAS, the BLASes and then the instance records.
472
+ _uploadBVH(blas) {
473
+ const tlas = this._tlas, instances = new Float32Array(tlas.instancesBuffer);
474
+ const tlasLength = tlas.buffer.byteLength / 4, instancesOffset = tlasLength + blas.length;
475
+ const data = this._bvhData = new Float32Array(instancesOffset + instances.length);
476
+ data.set(new Float32Array(tlas.buffer));
477
+ data.set(blas, tlasLength);
478
+ data.set(instances, instancesOffset);
479
+ this._instancesOffset = instancesOffset / 4;
480
+ if (data.length > 0)
481
+ setDataTexture(this._bvhBufferTex, data, 4);
482
+ this._tracePasses.forEach(pass => pass.setUniforms({
483
+ bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
484
+ blasOffset: tlasLength / 4,
485
+ instancesOffset: this._instancesOffset
486
+ }));
487
+ }
488
+ _uploadInstanceRanges(ranges) {
489
+ const instances = new Uint8Array(this._tlas.instancesBuffer), data = this._bvhData;
490
+ const base = this._instancesOffset * 16;
491
+ for (const { offset, size } of ranges) {
492
+ new Uint8Array(data.buffer).set(instances.subarray(offset, offset + size), base + offset);
493
+ this._bvhBufferTex.updateDataRange(this._renderer.gl, data, base + offset, size);
494
+ }
502
495
  }
503
496
  _updateMaterialConstants(materials, materialData, mergedGeometry) {
504
497
  // Avoid too much shader compilation
@@ -510,13 +503,24 @@ class WebGLRayTracePass {
510
503
  this._hasTransmission = materials.some((m) => m.transmissionWeight > 0 ||
511
504
  m.mapAlphaUsage === "transmission");
512
505
  this._hasAlpha = materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque');
513
- this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);
506
+ const spectral = materials.some((m) => m.transmissionDispersionScale > 0);
507
+ if (spectral !== !!this._spectral) {
508
+ this._spectral = spectral;
509
+ const shader = createRayTraceFragmentShader({
510
+ channelIndependentLight: spectral, shareSpectralPrefix: spectral && this._shareSpectralPrefix
511
+ });
512
+ if (!researchTransport()?.configure(this, 'webgl')?.enabled) {
513
+ shader.parallelCompile = true;
514
+ this._mainPass.setShader(shader);
515
+ }
516
+ }
514
517
  this._tracePasses.forEach(pass => {
515
518
  pass.setDefines({
516
519
  OES_texture_float_linear: true,
517
520
  STACK_SIZE,
518
521
  USE_VERTEX_COLOR: mergedGeometry.color != null,
519
- USE_TANGENT: mergedGeometry.tangent != null,
522
+ USE_TANGENT: mergedGeometry.tangent != null && materials.some(materialNeedsVertexTangents),
523
+ ...vertexAttributeDefines(vertexAttributeLayout(mergedGeometry)),
520
524
  USE_COAT_NORMAL_FRAMES: materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap)),
521
525
  HAS_TRANSMISSION: this._hasTransmission,
522
526
  HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),
@@ -531,7 +535,7 @@ class WebGLRayTracePass {
531
535
  // Multiple-scattering SSS paths need enough collisions to return to
532
536
  // the boundary before roulette; terminating at depth five produces
533
537
  // dark materials and a handful of very large surviving samples.
534
- RR_MAX: HAS_MEDIUM ? 12 : 2,
538
+ RR_MAX: 12,
535
539
  ...materialData.defines
536
540
  });
537
541
  materialData.setToPass(pass);
@@ -540,20 +544,9 @@ class WebGLRayTracePass {
540
544
  _updateMeshMembership() {
541
545
  const res = this._pendingMembershipData;
542
546
  this._preparedMeshData = res;
543
- const tlas = this._tlas = buildTLAS(res.instances, res.blases);
544
- const blas = new Float32Array(concatBLASBuffers(res.blases));
545
- const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
546
- data.set(new Float32Array(tlas.buffer));
547
- data.set(blas, tlas.buffer.byteLength / 4);
548
- this._instancesData = new Float32Array(tlas.instancesBuffer);
549
- setDataTexture(this._bvhBufferTex, data, 4);
550
- setDataTexture(this._instancesBufferTex, this._instancesData, 4);
551
- this._tracePasses.forEach(pass => pass.setUniforms({
552
- bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,
553
- instancesColumns: textureDimensionsFromArray(this._instancesData.length / 4).columnsLog,
554
- blasOffset: tlas.buffer.byteLength / 16,
555
- isEmptyScene: +(res.instances.length === 0)
556
- }));
547
+ this._tlas = buildWebTLAS(res.instances, res.blases);
548
+ this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
549
+ this._tracePasses.forEach(pass => pass.setUniform('isEmptyScene', +(res.instances.length === 0)));
557
550
  this._pendingMembershipData = undefined;
558
551
  this._needsUpdateMeshMembership = false;
559
552
  this._debugBvhData = undefined;
@@ -561,20 +554,12 @@ class WebGLRayTracePass {
561
554
  _updateGeometryData() {
562
555
  const res = this._preparedMeshData, tlas = this._tlas;
563
556
  const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);
564
- for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {
565
- for (const [attribute, texture] of [
566
- [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],
567
- [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],
568
- [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]
569
- ])
570
- if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent))
571
- texture.updateDataRange(this._renderer.gl, attribute.array, first * attribute.itemSize * 4, count * attribute.itemSize * 4);
572
- if (!topologyChanged)
573
- continue;
574
- const material = this._materialIndexData;
575
- for (let i = first * 4; i < (first + count) * 4; i++)
576
- material[i] = res.geometry.materialIndex.array[i];
577
- this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);
557
+ const layout = this._vertexAttributeLayout, attributes = this._vertexAttributeData;
558
+ for (const { first, count } of update.vertices) {
559
+ const position = res.geometry.position;
560
+ this._positionBufferTex.updateDataRange(this._renderer.gl, position.array, first * position.itemSize * 4, count * position.itemSize * 4);
561
+ packVertexAttributes(res.geometry, layout, attributes, first, count);
562
+ this._vertexAttributeTex.updateDataRange(this._renderer.gl, attributes, first * layout.stride * 16, count * layout.stride * 16);
578
563
  }
579
564
  for (const mesh of update.meshes)
580
565
  this._dirtyTransformMeshes.add(mesh);
@@ -584,12 +569,7 @@ class WebGLRayTracePass {
584
569
  if (update.resized) {
585
570
  res.instances = updateMeshInstanceTransforms(res.instanceBindings);
586
571
  refitTLAS(tlas, res.instances, res.blases);
587
- const blas = new Float32Array(concatBLASBuffers(res.blases));
588
- this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);
589
- this._bvhData.set(new Float32Array(tlas.buffer));
590
- this._bvhData.set(blas, tlas.buffer.byteLength / 4);
591
- setDataTexture(this._bvhBufferTex, this._bvhData, 4);
592
- this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData.length / 4).columnsLog));
572
+ this._uploadBVH(new Float32Array(concatBLASBuffers(res.blases)));
593
573
  }
594
574
  else {
595
575
  const ranges = [];
@@ -610,8 +590,7 @@ class WebGLRayTracePass {
610
590
  if (res && tlas) {
611
591
  const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);
612
592
  const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);
613
- for (const { offset, size } of ranges)
614
- this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
593
+ this._uploadInstanceRanges(ranges);
615
594
  }
616
595
  this._dirtyColorMeshes.clear();
617
596
  }
@@ -631,8 +610,7 @@ class WebGLRayTracePass {
631
610
  this._bvhData.set(new Float32Array(tlas.buffer));
632
611
  for (const { offset, size } of ranges.tlasRanges)
633
612
  this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData, offset, size);
634
- for (const { offset, size } of ranges.instanceRanges)
635
- this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData, offset, size);
613
+ this._uploadInstanceRanges(ranges.instanceRanges);
636
614
  this._dirtyTransformMeshes.clear();
637
615
  this._needsRefitTLAS = false;
638
616
  this._debugBvhData = undefined;
@@ -722,9 +700,11 @@ class WebGLRayTracePass {
722
700
  const viewProjectionInv = this._viewProjInv;
723
701
  this._apertureRadius = cameraApertureRadius(camera);
724
702
  this._focusDistance = camera.focusDistance;
725
- this._getViewProjInv(camera, viewProjectionInv);
703
+ mat4.invert(this._projectionInv, camera.getProjectionMatrix(this._depthAspect));
704
+ mat4.mul(viewProjectionInv, camera.transform, this._projectionInv);
726
705
  this._tracePasses.forEach((pass) => {
727
706
  pass.setUniform('viewProjectionInv', viewProjectionInv);
707
+ pass.setUniform('projectionInv', this._projectionInv);
728
708
  pass.setUniform('viewInv', camera.transform);
729
709
  // Zero for orthographic cameras, which have no depth of field.
730
710
  pass.setUniform('cameraApertureRadius', this._apertureRadius);
@@ -759,9 +739,20 @@ class WebGLRayTracePass {
759
739
  this._shadowCatcherPass.useTarget(target);
760
740
  }
761
741
  setQuality(options) {
762
- researchTransport()?.configure(this, 'webgl');
742
+ const wasIndependent = this._independentSpectralPaths;
743
+ const research = researchTransport()?.configure(this, 'webgl');
744
+ this._independentSpectralPaths = !!research?.enabled;
745
+ const share = options.dispersionWavelengths !== 1;
746
+ if (this._spectral && (share !== this._shareSpectralPrefix || wasIndependent) && !research?.enabled) {
747
+ const shader = createRayTraceFragmentShader({
748
+ channelIndependentLight: true, shareSpectralPrefix: share
749
+ });
750
+ shader.parallelCompile = true;
751
+ this._mainPass.setShader(shader);
752
+ }
753
+ this._shareSpectralPrefix = share;
763
754
  this._tracePasses.forEach(pass => {
764
- pass.setUniform('bounceLimit', normalizeBounces(options.bounces));
755
+ pass.setUniform('bounceLimit', normalizeBounces(options.bounces, MAX_PATH_EVENTS_WEBGL));
765
756
  pass.setUniform('bevelEnabled', options.bevel);
766
757
  pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);
767
758
  });
@@ -785,6 +776,10 @@ class WebGLRayTracePass {
785
776
  hasDispersion() {
786
777
  return this._spectral;
787
778
  }
779
+ hasSharedSpectralPrefix() {
780
+ // Research connections can disperse before the camera reaches a boundary.
781
+ return this._shareSpectralPrefix && !this._independentSpectralPaths;
782
+ }
788
783
  prepare() {
789
784
  if (this._needsUpdateMeshData) {
790
785
  this._updateMeshData();
@@ -885,7 +880,7 @@ class WebGLRayTracePass {
885
880
  if (!gl.getExtension('EXT_color_buffer_float'))
886
881
  throw new Error('AOV requires EXT_color_buffer_float');
887
882
  state.resize(width, height);
888
- this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & 24) !== 0 });
883
+ this._aovPass.setDefines({ AOV_REFLECTANCE: (aovMask(kinds) & AOV_REFLECTANCE_MASK) !== 0 });
889
884
  if (!state.frame) {
890
885
  const packed = packAovScene(this._preparedMeshData, this._tlas, camera, width, height, state.history, this._aovPrimitiveCache.get(this._preparedMeshData, this._tlas));
891
886
  state.frame = packed.frame;
@@ -913,7 +908,7 @@ class WebGLRayTracePass {
913
908
  state.history.accept(state.frame);
914
909
  }
915
910
  const target = Math.min(samples, cap);
916
- if ((aovMask(kinds) & 31) === 0)
911
+ if ((aovMask(kinds) & AOV_ACCUMULATED_MASK) === 0)
917
912
  state.samples = target;
918
913
  while (state.samples < target) {
919
914
  const output = state.accumulation[state.samples % 2], previous = state.accumulation[(state.samples + 1) % 2];
@@ -925,15 +920,30 @@ class WebGLRayTracePass {
925
920
  }
926
921
  return true;
927
922
  }
928
- async readDepthSamples(area, aspect) {
923
+ async pickSurface(x, y, aspect) {
924
+ const source = this._preparedMeshData, tlas = this._tlas;
925
+ if (!source || !tlas)
926
+ return;
927
+ const values = await this._readDepthSamples({ x, y, size: 0 }, aspect, true);
928
+ if (!values || source !== this._preparedMeshData || tlas !== this._tlas)
929
+ return;
930
+ return resolveSurfaceHit(source, tlas, values);
931
+ }
932
+ readDepthSamples(area, aspect) {
933
+ return this._readDepthSamples(area, aspect);
934
+ }
935
+ async _readDepthSamples(area, aspect, picking = false) {
929
936
  if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||
930
937
  !this._renderer.isAllProgramCompiled())
931
938
  return;
932
939
  this.prepare();
933
- this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));
940
+ const packed = packDepthSampleArea(area, aspect ?? this._depthAspect);
941
+ if (picking)
942
+ packed.set([-1, -1], 2);
943
+ this._depthPass.setUniform('depthArea', packed);
934
944
  this._depthPass.createPass({});
935
945
  const rgba = await readFloatPixelsAsync(this._renderer.gl, DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);
936
- return unpackDepthSamples(rgba);
946
+ return picking ? rgba.slice(0, 4) : unpackDepthSamples(rgba);
937
947
  }
938
948
  dispose() {
939
949
  researchTransport()?.dispose(this, 'webgl');
@@ -951,14 +961,8 @@ class WebGLRayTracePass {
951
961
  this._envMapDistribution,
952
962
  this._backgroundTex,
953
963
  this._positionBufferTex,
954
- this._normalBufferTex,
955
- this._colorBufferTex,
956
- this._tangentBufferTex,
957
- this._uvBufferTex,
958
- this._uv1BufferTex,
959
- this._bvhBufferTex,
960
- this._instancesBufferTex,
961
- this._matIndexBufferTex
964
+ this._vertexAttributeTex,
965
+ this._bvhBufferTex
962
966
  ].forEach((texture) => texture.dispose(gl));
963
967
  }
964
968
  }