@meimu/mutracer 0.1.4 → 0.2.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 (529) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10421 -8363
  6. package/docs/api.md +202 -11
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +18 -27
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +19 -10
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +41 -3
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -548
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +83 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +437 -435
  206. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +146 -145
  208. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  209. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +821 -821
  210. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
  211. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  212. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  213. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +51 -51
  214. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  215. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  216. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +108 -108
  217. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  218. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  219. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  220. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  221. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  222. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  223. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  224. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  225. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  226. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  227. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  228. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  229. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  230. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  231. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  232. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  233. package/lib/renderer/lightConstants.d.ts +10 -0
  234. package/lib/renderer/lightConstants.js +11 -0
  235. package/lib/renderer/lightConstants.js.map +1 -0
  236. package/lib/renderer/lightCore.d.ts +12 -0
  237. package/lib/renderer/lightCore.js +13 -0
  238. package/lib/renderer/lightCore.js.map +1 -0
  239. package/lib/renderer/lightSampling.d.ts +20 -17
  240. package/lib/renderer/lightSampling.js +123 -56
  241. package/lib/renderer/lightSampling.js.map +1 -1
  242. package/lib/renderer/lightsData.d.ts +21 -0
  243. package/lib/renderer/lightsData.js +192 -0
  244. package/lib/renderer/lightsData.js.map +1 -0
  245. package/lib/renderer/lightsUtil.d.ts +3 -26
  246. package/lib/renderer/lightsUtil.js +3 -153
  247. package/lib/renderer/lightsUtil.js.map +1 -1
  248. package/lib/renderer/materialBufferData.d.ts +70 -0
  249. package/lib/renderer/materialBufferData.js +2 -0
  250. package/lib/renderer/materialBufferData.js.map +1 -0
  251. package/lib/renderer/materialConstants.d.ts +11 -0
  252. package/lib/renderer/materialConstants.js +11 -0
  253. package/lib/renderer/materialConstants.js.map +1 -1
  254. package/lib/renderer/materialCore.d.ts +8 -0
  255. package/lib/renderer/materialCore.js +9 -0
  256. package/lib/renderer/materialCore.js.map +1 -0
  257. package/lib/renderer/materialEmission.d.ts +2 -2
  258. package/lib/renderer/materialEmission.js +3 -3
  259. package/lib/renderer/materialEmission.js.map +1 -1
  260. package/lib/renderer/materialLayout.d.ts +2 -101
  261. package/lib/renderer/materialLayout.js +110 -172
  262. package/lib/renderer/materialLayout.js.map +1 -1
  263. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  264. package/lib/renderer/materialLayoutSchema.js +172 -0
  265. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  266. package/lib/renderer/materialParams.d.ts +69 -0
  267. package/lib/renderer/materialParams.js +272 -0
  268. package/lib/renderer/materialParams.js.map +1 -0
  269. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  270. package/lib/renderer/materialTextureSlots.js +21 -8
  271. package/lib/renderer/materialTextureSlots.js.map +1 -1
  272. package/lib/renderer/materialTextures.d.ts +6 -0
  273. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  274. package/lib/renderer/materialTextures.js.map +1 -0
  275. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  276. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  277. package/lib/renderer/meshInstances.d.ts +4 -21
  278. package/lib/renderer/meshInstances.js +10 -56
  279. package/lib/renderer/meshInstances.js.map +1 -1
  280. package/lib/renderer/oidnNetwork.d.ts +2 -2
  281. package/lib/renderer/oidnNetwork.js +1 -1
  282. package/lib/renderer/oidnNetwork.js.map +1 -1
  283. package/lib/renderer/openPbrEnergyLut.js +850 -846
  284. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  285. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  286. package/lib/renderer/ownedDenoiser.js +2 -0
  287. package/lib/renderer/ownedDenoiser.js.map +1 -0
  288. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  289. package/lib/renderer/packedMeshInstances.js +80 -0
  290. package/lib/renderer/packedMeshInstances.js.map +1 -0
  291. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  292. package/lib/renderer/prepareMeshBVH.js +21 -642
  293. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  294. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  295. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  296. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  297. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  298. package/lib/renderer/progressiveScheduler.js +3 -0
  299. package/lib/renderer/progressiveScheduler.js.map +1 -1
  300. package/lib/renderer/renderPipeline.d.ts +3 -1
  301. package/lib/renderer/renderPipeline.js.map +1 -1
  302. package/lib/renderer/renderingLimits.d.ts +9 -0
  303. package/lib/renderer/renderingLimits.js +18 -0
  304. package/lib/renderer/renderingLimits.js.map +1 -0
  305. package/lib/renderer/sceneAssembly.d.ts +73 -0
  306. package/lib/renderer/sceneAssembly.js +109 -0
  307. package/lib/renderer/sceneAssembly.js.map +1 -0
  308. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  309. package/lib/renderer/sceneChangeCore.js +307 -0
  310. package/lib/renderer/sceneChangeCore.js.map +1 -0
  311. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  312. package/lib/renderer/sceneChangeDetector.js +24 -150
  313. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  314. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  315. package/lib/renderer/sceneLayoutSchema.js +111 -0
  316. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  317. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  318. package/lib/renderer/sceneLightChanges.js.map +1 -1
  319. package/lib/renderer/scenePreparation.d.ts +55 -0
  320. package/lib/renderer/scenePreparation.js +360 -0
  321. package/lib/renderer/scenePreparation.js.map +1 -0
  322. package/lib/renderer/scratchSampling.js +18 -18
  323. package/lib/renderer/scratchSampling.js.map +1 -1
  324. package/lib/renderer/shader.d.ts +2 -0
  325. package/lib/renderer/shader.js +2 -0
  326. package/lib/renderer/shader.js.map +1 -1
  327. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  328. package/lib/renderer/shaderCapabilities.js +55 -0
  329. package/lib/renderer/shaderCapabilities.js.map +1 -0
  330. package/lib/renderer/shaderCapacity.d.ts +2 -0
  331. package/lib/renderer/shaderCapacity.js +5 -0
  332. package/lib/renderer/shaderCapacity.js.map +1 -0
  333. package/lib/renderer/skyModel.d.ts +9 -0
  334. package/lib/renderer/skyModel.js +10 -0
  335. package/lib/renderer/skyModel.js.map +1 -0
  336. package/lib/renderer/textureAtlas.d.ts +60 -0
  337. package/lib/renderer/textureAtlas.js +145 -0
  338. package/lib/renderer/textureAtlas.js.map +1 -0
  339. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  340. package/lib/renderer/textureAtlasPixels.js +68 -0
  341. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  342. package/lib/renderer/util.d.ts +1 -1
  343. package/lib/renderer/util.js.map +1 -1
  344. package/lib/renderer/webgl.d.ts +9 -2
  345. package/lib/renderer/webgl.js +54 -9
  346. package/lib/renderer/webgl.js.map +1 -1
  347. package/lib/renderer/wgpuBindless.d.ts +26 -0
  348. package/lib/renderer/wgpuBindless.js +95 -0
  349. package/lib/renderer/wgpuBindless.js.map +1 -0
  350. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  351. package/lib/renderer/wgpuBindlessSource.js +51 -0
  352. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  353. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  354. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  355. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  356. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  357. package/lib/renderer/wgpuSceneUniform.js +125 -0
  358. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  359. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  360. package/lib/renderer/wgpuShaderSource.js +31 -0
  361. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  362. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  363. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  364. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  367. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  369. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  370. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  372. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  373. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  375. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  376. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  378. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  379. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  381. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  382. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  383. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  384. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  385. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  386. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  388. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +743 -706
  389. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  390. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  391. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  393. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +86 -83
  394. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  395. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  396. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  397. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  398. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  399. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  400. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  401. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  403. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  404. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  406. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  408. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  409. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  410. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  411. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  412. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  413. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  415. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  416. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  418. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  419. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  420. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  421. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  422. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  423. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  424. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  425. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  426. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  427. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  428. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  430. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  431. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  432. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  433. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  434. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  435. package/lib/scene/Camera.js +7 -3
  436. package/lib/scene/Camera.js.map +1 -1
  437. package/lib/scene/EnvironmentLight.d.ts +5 -9
  438. package/lib/scene/EnvironmentLight.js +4 -14
  439. package/lib/scene/EnvironmentLight.js.map +1 -1
  440. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  441. package/lib/scene/EnvironmentLightState.js +19 -0
  442. package/lib/scene/EnvironmentLightState.js.map +1 -0
  443. package/lib/scene/Geometry.d.ts +12 -6
  444. package/lib/scene/Geometry.js +37 -13
  445. package/lib/scene/Geometry.js.map +1 -1
  446. package/lib/scene/InstanceState.d.ts +39 -0
  447. package/lib/scene/InstanceState.js +77 -0
  448. package/lib/scene/InstanceState.js.map +1 -0
  449. package/lib/scene/InstancedMesh.d.ts +1 -1
  450. package/lib/scene/InstancedMesh.js +3 -0
  451. package/lib/scene/InstancedMesh.js.map +1 -1
  452. package/lib/scene/MaterialState.d.ts +209 -0
  453. package/lib/scene/MaterialState.js +231 -0
  454. package/lib/scene/MaterialState.js.map +1 -0
  455. package/lib/scene/Mesh.d.ts +4 -6
  456. package/lib/scene/Mesh.js +3 -11
  457. package/lib/scene/Mesh.js.map +1 -1
  458. package/lib/scene/MeshState.d.ts +20 -0
  459. package/lib/scene/MeshState.js +35 -0
  460. package/lib/scene/MeshState.js.map +1 -0
  461. package/lib/scene/OpenPBRMaterial.d.ts +7 -169
  462. package/lib/scene/OpenPBRMaterial.js +5 -223
  463. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  464. package/lib/scene/PixelTexture.d.ts +6 -0
  465. package/lib/scene/PixelTexture.js +10 -0
  466. package/lib/scene/PixelTexture.js.map +1 -0
  467. package/lib/scene/ProceduralSky.d.ts +24 -0
  468. package/lib/scene/ProceduralSky.js +40 -0
  469. package/lib/scene/ProceduralSky.js.map +1 -0
  470. package/lib/scene/RectLight.d.ts +2 -13
  471. package/lib/scene/RectLight.js +3 -21
  472. package/lib/scene/RectLight.js.map +1 -1
  473. package/lib/scene/RectLightState.d.ts +31 -0
  474. package/lib/scene/RectLightState.js +26 -0
  475. package/lib/scene/RectLightState.js.map +1 -0
  476. package/lib/scene/Scene.d.ts +15 -4
  477. package/lib/scene/Scene.js.map +1 -1
  478. package/lib/scene/SceneNode.js +7 -6
  479. package/lib/scene/SceneNode.js.map +1 -1
  480. package/lib/scene/Texture.d.ts +10 -41
  481. package/lib/scene/Texture.js +4 -33
  482. package/lib/scene/Texture.js.map +1 -1
  483. package/lib/scene/TextureState.d.ts +35 -0
  484. package/lib/scene/TextureState.js +35 -0
  485. package/lib/scene/TextureState.js.map +1 -0
  486. package/lib/scene/attributeData.d.ts +4 -0
  487. package/lib/scene/attributeData.js +10 -0
  488. package/lib/scene/attributeData.js.map +1 -0
  489. package/lib/scene/lightState.d.ts +8 -0
  490. package/lib/scene/lightState.js +2 -0
  491. package/lib/scene/lightState.js.map +1 -0
  492. package/lib/scene/openPbrSchema.d.ts +7 -12
  493. package/lib/scene/openPbrSchema.js +273 -28
  494. package/lib/scene/openPbrSchema.js.map +1 -1
  495. package/lib/scene/skyParameters.d.ts +20 -0
  496. package/lib/scene/skyParameters.js +28 -0
  497. package/lib/scene/skyParameters.js.map +1 -0
  498. package/lib/scene/textureData.d.ts +9 -0
  499. package/lib/scene/textureData.js +2 -0
  500. package/lib/scene/textureData.js.map +1 -0
  501. package/lib/scene/texturePixels.d.ts +6 -0
  502. package/lib/scene/texturePixels.js +10 -0
  503. package/lib/scene/texturePixels.js.map +1 -0
  504. package/lib/settings/display.d.ts +33 -0
  505. package/lib/settings/display.js +7 -0
  506. package/lib/settings/display.js.map +1 -1
  507. package/lib/settings/render.d.ts +25 -3
  508. package/lib/settings/render.js +3 -1
  509. package/lib/settings/render.js.map +1 -1
  510. package/lib/tinybvh/tinybvh.wasm +0 -0
  511. package/lib/util/commonGeometry.js +7 -7
  512. package/lib/util/commonGeometry.js.map +1 -1
  513. package/lib/util/fromTHREE.d.ts +4 -1
  514. package/lib/util/fromTHREE.js +18 -5
  515. package/lib/util/fromTHREE.js.map +1 -1
  516. package/lib/util/geometry.js +42 -29
  517. package/lib/util/geometry.js.map +1 -1
  518. package/lib/util/loadRGBE.js +3 -4
  519. package/lib/util/loadRGBE.js.map +1 -1
  520. package/lib/util/studioLighting.d.ts +18 -0
  521. package/lib/util/studioLighting.js +36 -0
  522. package/lib/util/studioLighting.js.map +1 -0
  523. package/lib/version.d.ts +1 -1
  524. package/lib/version.js +1 -1
  525. package/lib/version.js.map +1 -1
  526. package/llms.txt +4 -0
  527. package/package.json +31 -5
  528. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  529. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -1,11 +1,14 @@
1
1
  import { MAX_PATH_EVENTS } from '../pathLimits.js';
2
2
  import shadowCatcherAccumulationWGSL from './chunks/shadowCatcherAccumulation.wgsl.js';
3
+ import reflectanceWGSL from './aovReflectance.wgsl.js';
4
+ import aovTraceWGSL from './aovTrace.wgsl.js';
3
5
  import depthQueryWGSL from './depthQuery.wgsl.js';
4
6
  // Portions adapted from ray-tracing-renderer@0.10.15
5
7
  // (https://github.com/hoverinc/ray-tracing-renderer).
6
8
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
7
9
  import commonWgsl from './chunks/common.wgsl.js';
8
10
  import { WGPU_SCENE_FEATURE_BITS } from '../WGPUSceneFeatures.js';
11
+ import { ALL_MATERIAL_SHADER_CAPABILITIES, MATERIAL_SHADER_CAPABILITIES } from '../shaderCapabilities.js';
9
12
  import rayTraceCoreWgsl from './chunks/rayTraceCore.wgsl.js';
10
13
  import { createMaterialBufferWgsl } from './chunks/materialBuffer.wgsl.js';
11
14
  import createIntersectionWgsl from './chunks/intersect.wgsl.js';
@@ -20,73 +23,128 @@ import envMapWgsl from './chunks/envMap.wgsl.js';
20
23
  import uvProjectionWgsl from './chunks/uvProjection.wgsl.js';
21
24
  export const WORKGROUP_SIZE = 8;
22
25
  /** Generates the WebGPU megakernel path tracing compute shader. */
23
- export default function rayTraceCompute({ hasDisplacement, hasAnisotropyDirections = false, hasCoatNormals = false, hasAlpha = true, hasSceneAlpha = true, blasLayoutMask = 1 }) {
26
+ export default function rayTraceCompute({ hasDisplacement, hasAnisotropyDirections = false, hasCoatNormals = false, hasAlpha = true, hasSceneAlpha = true, blasLayoutMask = 1, spectral, sceneCapabilities, dynamicEnvironment = false, materialCapabilities = ALL_MATERIAL_SHADER_CAPABILITIES, lightCapabilities }, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
24
27
  hasAnisotropyDirections ||= hasCoatNormals;
25
28
  const deterministicPrimaryAlpha = hasAlpha;
29
+ const hasShadowCatcher = sceneCapabilities === undefined || (sceneCapabilities & WGPU_SCENE_FEATURE_BITS.HAS_SHADOW_CATCHER) !== 0;
30
+ const primaryVariables = /* wgsl */ `
31
+ var si: SurfaceInteraction;
32
+ var ma: OpenPbrResolvedMaterial;
33
+ si.albedoSampled = false;
34
+ si.mediumType = 0;
35
+ si.mediumExtinction = vec3f(0.0);
36
+ si.mediumScattering = vec3f(0.0);
37
+ si.mediumAnisotropy = 0.0;
38
+ si.barycentrics = vec2f(0.0);
39
+
40
+ `;
41
+ const primaryGuides = /* wgsl */ `${inputHooks?.primarySurface ?? ''} if (${hasShadowCatcher ? /* wgsl */ `si.hit && ma.materialType == SHADOW_CATCHER` : /* wgsl */ `false`}) {
42
+ (*outAux).isShadowCatcher = true;
43
+
44
+
45
+ (*outAux).albedo = vec3f(1.0);
46
+ (*outAux).normal = select(si.normal, -si.normal, dot(si.normal, ray.d) > 0.0);
47
+ var aa: Path;
48
+ aa.ray = ray;
49
+ aa.fromEye = true;
50
+ (*outAux).shadowCounts = sampleShadowCatcher(si, 0, &aa);
51
+
52
+
53
+ return vec4f(1.0);
54
+ }
55
+ else {
56
+ if (HAS_BEVEL && rtUniform.bevel != 0) {
57
+ if (ma.bevel > 0.0) {
58
+ si.normal = nj(si, ma.bevel);
59
+ }
60
+ }
61
+
62
+
63
+
64
+ if (si.hit && (ma.materialType == STANDARD || ma.materialType == UNLIT)) {
65
+ (*outAux).albedo = select(ma.baseColor, vec3f(1.0), ma.transmissionWeight > 0.5);
66
+ (*outAux).normal = select(
67
+ si.normal,
68
+ -si.normal,
69
+ dot(si.normal, si.position - cameraUniform.viewInv[3].xyz) > 0.0
70
+ );
71
+
72
+
73
+
74
+ si.albedoSampled = ma.transmissionWeight > 0.5;
75
+ }
76
+
77
+ (*outAux).isShadowCatcher = false;
78
+
79
+
80
+ }
81
+ `;
26
82
  const source = /* wgsl */ `
27
83
 
28
84
  ${commonWgsl}
29
85
 
30
- ${rayTraceCoreWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals })}
86
+ ${rayTraceCoreWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals, lightCapabilities })}
31
87
 
32
88
  ${uvProjectionWgsl}
33
89
 
34
- ${createMaterialBufferWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals })}
90
+ ${createMaterialBufferWgsl({ hasSceneAlpha, hasAnisotropyDirections, hasCoatNormals,
91
+ hasTransmission: (materialCapabilities & MATERIAL_SHADER_CAPABILITIES.transmission) !== 0,
92
+ hasMetalness: (materialCapabilities & MATERIAL_SHADER_CAPABILITIES.metal) !== 0 })}
35
93
 
36
- ${createIntersectionWgsl({ hasDisplacement, blasLayoutMask, hasAnisotropyDirections, hasCoatNormals })}
94
+ ${createIntersectionWgsl({ hasDisplacement, blasLayoutMask, hasAnisotropyDirections, hasCoatNormals, sceneIntersections })}
37
95
  ${randWgsl}
38
96
  ${randomWgsl}
39
97
  ${envMapWgsl}
40
98
 
41
99
  ${samplingWgsl}
42
100
  ${createOpenPbrBsdfWgsl(hasAnisotropyDirections, hasCoatNormals)}
43
- ${sampleLightWgsl}
101
+ ${sampleLightWgsl}${inputHooks?.declarations ?? ''}
44
102
 
45
103
 
46
- var<private> tL: u32 = 0u;
104
+ var<private> vg: u32 = 0u;
47
105
 
48
106
 
49
107
 
50
- fn jX() -> u32 {
108
+ fn kB() -> u32 {
51
109
  return u32(max(rtUniform.directLightCandidates, 1));
52
110
  }
53
111
 
54
112
 
55
113
 
56
114
 
57
- fn pK(wP: u32) -> f32 {
115
+ fn qx(ys: u32) -> f32 {
58
116
 
59
117
 
60
118
 
61
119
 
62
120
  if (SAMPLING_PATTERN == 2) { _ = rand(); }
63
- let kd = bc.x + bc.y * u32(rtUniform.outputSize.x);
64
- let key = aq(aq(kd, bd), rtUniform.sequenceSeed);
65
- let dimension = aq(cF, wP) ^ 0xa511e9b3u;
66
- return f32(eg(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
121
+ let kI = aZ.x + aZ.y * u32(rtUniform.outputSize.x);
122
+ let key = ar(ar(kI, aQ), rtUniform.sequenceSeed);
123
+ let dimension = ar(bT, ys) ^ 0xa511e9b3u;
124
+ return f32(dG(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
67
125
  }
68
126
 
69
127
 
70
128
 
71
- fn tC(fg: f32, scatteringPdf: f32) -> f32 {
72
- let aV = jX();
73
- if (aV <= 1u) {
74
- return aG(fg, scatteringPdf);
129
+ fn uS(fA: f32, scatteringPdf: f32) -> f32 {
130
+ let candidateCount = kB();
131
+ if (candidateCount <= 1u) {
132
+ return aK(fA, scatteringPdf);
75
133
  }
76
- let iJ = f32(aV) * fg;
77
- return iJ /
78
- max(iJ + scatteringPdf, 1e-20);
134
+ let jb = f32(candidateCount) * fA;
135
+ return jb /
136
+ max(jb + scatteringPdf, 1e-20);
79
137
  }
80
138
 
81
139
 
82
- fn fW(scatteringPdf: f32, fg: f32) -> f32 {
83
- let aV = jX();
84
- if (aV <= 1u) {
85
- return aG(scatteringPdf, fg);
140
+ fn gj(scatteringPdf: f32, fA: f32) -> f32 {
141
+ let candidateCount = kB();
142
+ if (candidateCount <= 1u) {
143
+ return aK(scatteringPdf, fA);
86
144
  }
87
- let iJ = f32(aV) * fg;
145
+ let jb = f32(candidateCount) * fA;
88
146
  return scatteringPdf /
89
- max(scatteringPdf + iJ, 1e-20);
147
+ max(scatteringPdf + jb, 1e-20);
90
148
  }
91
149
 
92
150
  ${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals)}
@@ -101,24 +159,24 @@ ${shadowCatcherAccumulationWGSL}
101
159
  @group(3) @binding(3) var<storage, read_write> outShadowCatcher: array<ShadowCatcherAccumulation>;
102
160
 
103
161
 
104
- fn hK(
105
- he: u32,
106
- vy: vec3f,
162
+ fn ie(
163
+ gv: u32,
164
+ radiance: vec3f,
107
165
  normal: vec3f
108
166
  ) {
109
167
  if (rtUniform.varianceMoments != 0) {
110
- let value = dot(vy, luminance);
111
- outNormal[he] += vec4f(value * value, 0.0, 0.0, 1.0);
168
+ let value = dot(radiance, luminance);
169
+ outNormal[gv] += vec4f(value * value, 0.0, 0.0, 1.0);
112
170
  }
113
171
  else {
114
- outNormal[he] += vec4f(normal, 1.0);
172
+ outNormal[gv] += vec4f(normal, 1.0);
115
173
  }
116
174
  }
117
175
 
118
176
 
119
177
 
120
- fn iS(he: u32, value: f32) {
121
- outShadowCatcher[he].moments += vec4f(value, value * value, 0.0, 0.0);
178
+ fn ji(gv: u32, value: f32) {
179
+ outShadowCatcher[gv].moments += vec4f(value, value * value, 0.0, 0.0);
122
180
  }
123
181
 
124
182
 
@@ -128,118 +186,125 @@ albedo: vec3f,
128
186
  isShadowCatcher: bool,
129
187
  normal: vec3f,
130
188
  isBlank: bool,
189
+
190
+ shadowCounts: vec2f,
131
191
  }
132
192
 
133
- fn dq(sN: vec3f, height: f32, radius: f32) -> f32 {
134
- let fQ = length(sN);
135
- if (fQ < 0.00001) {
193
+ fn dK(point: vec3f, height: f32, radius: f32) -> f32 {
194
+ let ge = length(point);
195
+ if (ge < 0.00001) {
136
196
  return -radius;
137
197
  }
138
198
 
139
- let iG = radius * sN.y / fQ;
140
- let iq = -1.5 * height;
141
- var ev: f32;
142
- if (iG >= 0.0) {
143
- ev = radius;
199
+ let iX = radius * point.y / ge;
200
+ let iL = -1.5 * height;
201
+ var eH: f32;
202
+ if (iX >= 0.0) {
203
+ eH = radius;
144
204
  }
145
- else if (iG < iq) {
146
- ev = -height * fQ / sN.y;
205
+ else if (iX < iL) {
206
+ eH = -height * ge / point.y;
147
207
  }
148
208
  else {
149
- let dW = 1.0
150
- - iG * iG / (3.0 * iq * iq);
151
- ev = radius * dW;
209
+ let cL = 1.0
210
+ - iX * iX / (3.0 * iL * iL);
211
+ eH = radius * cL;
152
212
  }
153
- return fQ - ev;
213
+ return ge - eH;
154
214
  }
155
215
 
156
- fn eT(origin: vec3f, direction: vec3f) -> vec3f {
216
+ fn fd(origin: vec3f, direction: vec3f) -> vec3f {
157
217
  if (!USE_GROUNDED_BACKGROUND) {
158
218
  return direction;
159
219
  }
160
220
  let params = rtUniform.groundedBackgroundParams;
161
- let bY = normalize(direction);
221
+ let cf = normalize(direction);
162
222
  let center = vec3f(
163
223
  rtUniform.groundedBackgroundCenter.x,
164
224
  params.z + params.x,
165
225
  rtUniform.groundedBackgroundCenter.y
166
226
  );
167
- let bB = origin - center;
168
- let eJ = dot(bB, bY);
169
- let ej = eJ * eJ
170
- - dot(bB, bB) + params.y * params.y;
227
+ let bI = origin - center;
228
+ let eT = dot(bI, cf);
229
+ let br = eT * eT
230
+ - dot(bI, bI) + params.y * params.y;
171
231
  if (
172
- ej <= 0.0
173
- || dq(bB, params.x, params.y) > 0.0
232
+ br <= 0.0
233
+ || dK(bI, params.x, params.y) > 0.0
174
234
  ) {
175
235
  return direction;
176
236
  }
177
237
 
178
- var cC = -eJ + sqrt(ej);
179
- if (cC <= 0.0) {
238
+ var cM = -eT + sqrt(br);
239
+ if (cM <= 0.0) {
180
240
  return direction;
181
241
  }
182
242
 
183
- let nP = bB + bY * cC;
184
- if (nP.y >= 0.0) {
185
- return normalize(nP);
243
+ let oK = bI + cf * cM;
244
+ if (oK.y >= 0.0) {
245
+ return normalize(oK);
186
246
  }
187
247
 
188
- if (bY.y < -0.00001 && params.y > 1.5 * params.x) {
189
- let hT = (-params.x - bB.y) / bY.y;
190
- let nF = bB + bY * hT;
191
- let oo = (2.0 / 3.0)
248
+ if (cf.y < -0.00001 && params.y > 1.5 * params.x) {
249
+ let ir = (-params.x - bI.y) / cf.y;
250
+ let oB = bI + cf * ir;
251
+ let pe = (2.0 / 3.0)
192
252
  * sqrt(params.y * params.y - 2.25 * params.x * params.x);
193
- if (hT > 0.0 && length(nF.xz) <= oo) {
194
- return normalize(nF);
253
+ if (ir > 0.0 && length(oB.xz) <= pe) {
254
+ return normalize(oB);
195
255
  }
196
256
  }
197
257
 
198
- var cN = 0.0;
258
+ var cV = 0.0;
199
259
  for (var i = 0; i < 14; i++) {
200
- let fh = (cN + cC) * 0.5;
201
- let pL = bB + bY * fh;
202
- if (dq(pL, params.x, params.y) > 0.0) {
203
- cC = fh;
260
+ let fB = (cV + cM) * 0.5;
261
+ let qy = bI + cf * fB;
262
+ if (dK(qy, params.x, params.y) > 0.0) {
263
+ cM = fB;
204
264
  }
205
265
  else {
206
- cN = fh;
266
+ cV = fB;
207
267
  }
208
268
  }
209
- let hit = bB + bY * ((cN + cC) * 0.5);
269
+ let hit = bI + cf * ((cV + cM) * 0.5);
210
270
  return normalize(hit);
211
271
  }
212
272
 
213
- fn hH(ray: Ray) -> vec4f {
273
+ fn hX(ray: Ray) -> vec4f {
214
274
  var bg = vec4f(0.0);
215
275
  if (USE_BACKGROUND_MAP) {
216
- let d = eT(ray.o, ray.d);
276
+ let d = fd(ray.o, ray.d);
217
277
  let t = rtUniform.backgroundMapTransform;
218
- let qb = vec3f(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
219
- let aW = textureLinear(backgroundMap, eL(qb));
220
- bg = vec4f(aW.rgb * t.z, aW.a);
278
+ let qZ = vec3f(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
279
+ let rotation = rtUniform.backgroundMapRotation;
280
+ let hn = transpose(mat3x3f(rotation[0].xyz, rotation[1].xyz, rotation[2].xyz)) * qZ;
281
+ let bc = textureLinear(backgroundMap, eV(hn));
282
+ bg = vec4f(bc.rgb * t.z, bc.a);
221
283
  }
222
284
  else if (USE_BACKGROUND) {
223
285
  bg = rtUniform.backgroundColor;
224
286
  }
225
287
  else if (USE_ENVMAP) {
226
- bg = textureLinear(envMap, cY(ray.d));
288
+ bg = textureLinear(envMap, dm(ray.d));
227
289
  }
228
290
  return bg;
229
291
  }
230
292
 
231
- fn cW(ray: Ray, wavelength: f32) -> vec4f {
232
- let bg = hH(ray);
293
+ fn di(ray: Ray, wavelength: f32) -> vec4f {
294
+ let bg = hX(ray);
233
295
  if (SPECTRAL) {
234
- return vec4f(ai(bg.rgb, wavelength), bg.a);
296
+ return vec4f(aj(bg.rgb, wavelength), bg.a);
235
297
  }
236
298
  return bg;
237
299
  }
238
300
 
239
- fn bounce(uv: vec2f, aa: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, ad>, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) {
240
- cF = u32(max(*depth, 0));
301
+
302
+
303
+ fn nY(uv: vec2f, aa: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, SurfaceInteraction>, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>, fm: ptr<function, bool>) {
304
+ *fm = false;
305
+ bT = u32(max(*depth, 0));
241
306
  let matType = (*ma).materialType;
242
- let isShadowCatcher = matType == SHADOW_CATCHER;
307
+ let isShadowCatcher = ${hasShadowCatcher ? /* wgsl */ `matType == SHADOW_CATCHER` : /* wgsl */ `false`};
243
308
  if (isShadowCatcher) {
244
309
  if ((*aa).fromEye) {
245
310
  (*si).hit = false;
@@ -252,28 +317,28 @@ if (USE_ENVMAP) {
252
317
  if ((*aa).isNextRefraction) {
253
318
 
254
319
 
255
- let bg = cW(
320
+ let bg = di(
256
321
  (*aa).ray,
257
322
  (*si).wavelength
258
323
  );
259
- let cT = select(fW((*aa).scatteringPdf,
260
- iB(cY((*aa).ray.d)) * rtUniform.envLightPmf),
324
+ let da = select(gj((*aa).scatteringPdf,
325
+ iT(dm((*aa).ray.d)) * rtUniform.envLightPmf),
261
326
  1.0, (*aa).scatteringIsDelta);
262
- (*aa).li += cT * (*aa).beta * bg.rgb * bg.a;
327
+ (*aa).li += da * (*aa).beta * bg.rgb * bg.a;
263
328
  (*aa).alpha = max((*aa).alpha, bg.a);
264
329
  }
265
330
  else {
266
- let tQ = cY((*aa).ray.d);
267
- var emission = textureLinear(envMap, tQ).rgb;
331
+ let vo = dm((*aa).ray.d);
332
+ var emission = textureLinear(envMap, vo).rgb;
268
333
  if (SPECTRAL) {
269
- emission = ai(emission, (*si).wavelength);
334
+ emission = aj(emission, (*si).wavelength);
270
335
  }
271
336
  (*aa).li += (*aa).beta * emission *
272
- fW((*aa).scatteringPdf, iB(tQ));
337
+ gj((*aa).scatteringPdf, iT(vo));
273
338
  }
274
339
  }
275
340
  else {
276
- let bg = cW(
341
+ let bg = di(
277
342
  (*aa).ray,
278
343
  (*si).wavelength
279
344
  );
@@ -287,7 +352,7 @@ if (!(*si).hit) {
287
352
 
288
353
 
289
354
 
290
- let bg = cW(
355
+ let bg = di(
291
356
  (*aa).ray,
292
357
  (*si).wavelength
293
358
  );
@@ -300,10 +365,10 @@ if ((*aa).fromEye) {
300
365
  (USE_BACKGROUND && !USE_BACKGROUND_MAP);
301
366
  }
302
367
  else {
303
- let cam = hC(uv);
304
- let mM = dot(cam.d, (*aa).ray.d) > 0.0;
368
+ let cam = fj(uv);
369
+ let nK = dot(cam.d, (*aa).ray.d) > 0.0;
305
370
  if (rtUniform.transmissiveOutputAlphaMin < 1.0) {
306
- if (mM) {
371
+ if (nK) {
307
372
  (*aa).alpha = max((*aa).alpha, bg.a);
308
373
  } else {
309
374
  (*aa).alpha = 1.0;
@@ -312,11 +377,11 @@ if (mM) {
312
377
  if (!USE_ENVMAP) {
313
378
 
314
379
 
315
- if (mM) {
380
+ if (nK) {
316
381
 
317
382
 
318
383
  (*aa).li += (*aa).beta *
319
- fW((*aa).scatteringPdf, 1.0) * bg.rgb;
384
+ gj((*aa).scatteringPdf, 1.0) * bg.rgb;
320
385
  }
321
386
  }
322
387
  }
@@ -324,26 +389,26 @@ fW((*aa).scatteringPdf, 1.0) * bg.rgb;
324
389
  return;
325
390
  }
326
391
 
327
- var cH = false;
392
+
328
393
  if ((matType == STANDARD || matType == UNLIT)) {
329
394
  let alpha = clamp((*ma).alpha, 0.0, 1.0);
330
395
 
331
396
  if (alpha < 1.0) {
332
397
 
333
398
 
334
- if (alpha <= 0.0 || eo(3u) > alpha) {
335
- cH = true;
399
+ if (alpha <= 0.0 || eC(3u) > alpha) {
400
+ (*fm) = true;
336
401
  }
337
402
  }
338
- if (!cH && rtUniform.transmissiveOutputAlphaMin < 1.0) {
403
+ if (!(*fm) && rtUniform.transmissiveOutputAlphaMin < 1.0) {
339
404
 
340
405
 
341
- let tW = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
342
- (*aa).alpha = max(tW, (*aa).alpha);
406
+ let outputAlpha = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
407
+ (*aa).alpha = max(outputAlpha, (*aa).alpha);
343
408
  }
344
- if (!cH) {
345
- tL = u32(max(*depth, 0));
346
- mc(si, ma, aa);
409
+ if (!(*fm)) {
410
+ vg = u32(max(*depth, 0));
411
+ mL(si, ma, aa);
347
412
  }
348
413
  else {
349
414
 
@@ -352,7 +417,7 @@ else {
352
417
  }
353
418
  }
354
419
 
355
- if (!(*si).albedoSampled && !cH) {
420
+ if (!(*si).albedoSampled && !(*fm)) {
356
421
 
357
422
  if ((matType == STANDARD || matType == UNLIT)) {
358
423
  if (!((*ma).transmissionWeight > 0.5 ||
@@ -377,12 +442,12 @@ if (*depth > 4) {
377
442
 
378
443
 
379
444
  if (USE_RR) {
380
- if (*depth >= RR_MAX && !cH) {
381
- let oI = (*aa).beta;
445
+ if (*depth >= RR_MAX && !(*fm)) {
446
+ let pG = (*aa).beta;
382
447
 
383
- let oz = max(max(oI.x, oI.y), oI.z);
384
- let q: f32 = max(0.0, 1.0 - oz);
385
- if (dz(cw(RUSSIAN_ROULETTE)) < q) {
448
+ let pn = max(max(pG.x, pG.y), pG.z);
449
+ let q: f32 = max(0.0, 1.0 - pn);
450
+ if (dp(cE(RUSSIAN_ROULETTE)) < q) {
386
451
 
387
452
 
388
453
  (*aa).alpha = 1.0;
@@ -397,13 +462,14 @@ if ((*aa).abort) {
397
462
  return;
398
463
  }
399
464
 
400
- cZ((*aa).ray, si, *depth, true, (*aa).isNextRefraction);
401
- eX(ma, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
402
465
 
466
+ }
467
+
468
+ fn kl(aa: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, SurfaceInteraction>, ma: ptr<function, OpenPbrResolvedMaterial>, aJ: bool) {
403
469
  if (SPECTRAL) {
404
470
 
405
471
  if ((*ma).transmissionWeight > 0.001) {
406
- (*ma).specularIor = eN(
472
+ (*ma).specularIor = ee(
407
473
  (*si).wavelength,
408
474
  (*ma).specularIor,
409
475
  (*ma).transmissionDispersionScale,
@@ -412,62 +478,62 @@ if ((*ma).transmissionWeight > 0.001) {
412
478
  }
413
479
  }
414
480
 
415
- if (cH) {
481
+ if (aJ) {
416
482
  return;
417
483
  }
418
484
 
419
485
 
420
486
  var lightSample: LightSampleRec;
421
- let hy = eo(3u) < (*ma).alpha;
487
+ let hM = eC(3u) < (*ma).alpha;
422
488
  for (var i = 0; i < rtUniform.lightsCount; i++) {
423
489
 
424
490
  let light: Light = analyticLights[i];
425
- let d = mz((*aa).ray, light, &lightSample);
491
+ let d = nr((*aa).ray, light, &lightSample);
426
492
  lightSample.pdf *= light.selectionPmf;
427
- let mD = (*si).hit && d > distance((*si).position, (*aa).ray.o);
428
- if (d != INF && !(mD && hy)) {
429
- let fa = fW((*aa).scatteringPdf, lightSample.pdf);
493
+ let lY = (*si).hit && d > distance((*si).position, (*aa).ray.o);
494
+ if (d != INF && !(lY && hM)) {
495
+ let fl = gj((*aa).scatteringPdf, lightSample.pdf);
430
496
  if (SPECTRAL) {
431
- lightSample.emission = ai(lightSample.emission, (*si).wavelength);
497
+ lightSample.emission = aj(lightSample.emission, (*si).wavelength);
432
498
  }
433
- (*aa).li += fa * (*aa).beta * lightSample.emission;
499
+ (*aa).li += fl * (*aa).beta * lightSample.emission;
434
500
  (*aa).alpha = 1.0;
435
501
  (*aa).abort = true;
436
502
  }
437
503
  }
438
504
 
439
505
  if (USE_ENVMAP) {
440
- if (!((*si).hit && hy)) {
506
+ if (!((*si).hit && hM)) {
441
507
  if ((*aa).isNextRefraction) {
442
508
 
443
509
 
444
510
 
445
- let bg = cW(
511
+ let bg = di(
446
512
  (*aa).ray,
447
513
  (*si).wavelength
448
514
  );
449
- let cT = select(fW((*aa).scatteringPdf,
450
- iB(cY((*aa).ray.d)) * rtUniform.envLightPmf),
515
+ let da = select(gj((*aa).scatteringPdf,
516
+ iT(dm((*aa).ray.d)) * rtUniform.envLightPmf),
451
517
  1.0, (*aa).scatteringIsDelta);
452
- (*aa).li += cT * (*aa).beta * bg.rgb * bg.a;
518
+ (*aa).li += da * (*aa).beta * bg.rgb * bg.a;
453
519
  (*aa).alpha = max((*aa).alpha, bg.a);
454
520
  (*aa).abort = true;
455
521
  return;
456
522
  }
457
- let _uv = cY((*aa).ray.d);
523
+ let _uv = dm((*aa).ray.d);
458
524
  var emission = textureLinear(envMap, _uv).rgb;
459
- let fa = fW(
525
+ let fl = gj(
460
526
  (*aa).scatteringPdf,
461
- iB(_uv) * rtUniform.envLightPmf
527
+ iT(_uv) * rtUniform.envLightPmf
462
528
  );
463
529
  if (SPECTRAL) {
464
- emission = ai(emission, (*si).wavelength);
530
+ emission = aj(emission, (*si).wavelength);
465
531
  }
466
532
 
467
533
  if (!USE_BACKGROUND) {
468
534
  (*aa).alpha = 1.0;
469
535
  }
470
- (*aa).li += (*aa).beta * emission * fa;
536
+ (*aa).li += (*aa).beta * emission * fl;
471
537
  (*aa).abort = true;
472
538
  }
473
539
  }
@@ -475,119 +541,119 @@ if (!USE_BACKGROUND) {
475
541
  *depth = *depth + 1;
476
542
  }
477
543
 
478
- fn hC(fG: vec2f) -> Ray {
479
- let origin = cameraUniform.viewProjectionInv * vec4f(fG * 2.0 - 1.0, -1.0, 1.0);
480
- let center = cameraUniform.viewProjectionInv * vec4f(fG * 2.0 - 1.0, 1.0, 1.0);
544
+ fn fj(coord: vec2f) -> Ray {
545
+ let origin = cameraUniform.viewProjectionInv * vec4f(coord * 2.0 - 1.0, -1.0, 1.0);
546
+ let center = cameraUniform.viewProjectionInv * vec4f(coord * 2.0 - 1.0, 1.0, 1.0);
481
547
  var cam: Ray;
482
- iC(&cam, origin.xyz / origin.w, normalize(center.xyz * origin.w - origin.xyz * center.w));
548
+ gC(&cam, origin.xyz / origin.w, normalize(center.xyz * origin.w - origin.xyz * center.w));
483
549
 
484
550
  return cam;
485
551
  }
486
552
 
487
553
 
488
- fn kz(radius: f32, xi: f32) -> vec2f {
554
+ fn ld(radius: f32, xi: f32) -> vec2f {
489
555
  var x = 0.25;
490
- for (var nH = 0; nH < 10; nH++) {
556
+ for (var oD = 0; oD < 10; oD++) {
491
557
  let x2 = x * x;
492
558
  let x3 = x2 * x;
493
- let kP = 1.0 - x;
559
+ let lw = 1.0 - x;
494
560
  let value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
495
561
  4.0 * x2 * x3 - xi;
496
- let mk = 20.0 * x * kP * kP * kP;
497
- if (abs(value) < 1e-6 || mk == 0.0) { break; }
498
- x = clamp(x - value / mk, 0.0, 1.0);
562
+ let mX = 20.0 * x * lw * lw * lw;
563
+ if (abs(value) < 1e-6 || mX == 0.0) { break; }
564
+ x = clamp(x - value / mX, 0.0, 1.0);
499
565
  }
500
- let jo = x * radius;
501
- return vec2f(jo, sqrt(max(radius * radius - jo * jo, 0.0)));
566
+ let jL = x * radius;
567
+ return vec2f(jL, sqrt(max(radius * radius - jL * jL, 0.0)));
502
568
  }
503
569
 
504
- fn iT(radius: f32, gw: f32) -> f32 {
505
- if (gw >= radius) { return 0.0; }
506
- let oh = radius - gw;
507
- return oh * oh * oh;
570
+ fn jj(radius: f32, gM: f32) -> f32 {
571
+ if (gM >= radius) { return 0.0; }
572
+ let pa = radius - gM;
573
+ return pa * pa * pa;
508
574
  }
509
575
 
510
576
 
511
- fn mu(source: ad, radius: f32) -> vec3f {
577
+ fn nj(source: SurfaceInteraction, radius: f32) -> vec3f {
512
578
  var geometricNormal = source.faceNormal;
513
579
  if (dot(geometricNormal, source.vertexNormal) < 0.0) {
514
580
  geometricNormal = -geometricNormal;
515
581
  }
516
582
  var tangent: vec3f;
517
583
  var bitangent: vec3f;
518
- aL(geometricNormal, &tangent, &bitangent);
519
- var iF = vec3f(0.0);
520
-
521
- for (var ig = 0; ig < BEVEL_SAMPLES; ig++) {
522
- let ph = fo(CAMERA_BEVEL_BASE + u32(ig));
523
- var cA = ph.x;
524
- let oG = ph.y;
525
- var dj = geometricNormal;
526
- var fH = tangent;
527
- var ek = bitangent;
528
- var ge = 0.5;
529
- var hY = 0.25;
530
- var gG = 0.25;
531
- if (cA < 0.5) {
532
- cA *= 2.0;
533
- }
534
- else if (cA < 0.75) {
535
- let mK = dj;
536
- dj = fH;
537
- fH = mK;
538
- ge = 0.25;
539
- hY = 0.5;
540
- cA = (cA - 0.5) * 4.0;
584
+ aP(geometricNormal, &tangent, &bitangent);
585
+ var iW = vec3f(0.0);
586
+
587
+ for (var iG = 0; iG < BEVEL_SAMPLES; iG++) {
588
+ let qf = dZ(CAMERA_BEVEL_BASE + u32(iG));
589
+ var cJ = qf.x;
590
+ let pv = qf.y;
591
+ var dz = geometricNormal;
592
+ var fW = tangent;
593
+ var eA = bitangent;
594
+ var gu = 0.5;
595
+ var iB = 0.25;
596
+ var gT = 0.25;
597
+ if (cJ < 0.5) {
598
+ cJ *= 2.0;
599
+ }
600
+ else if (cJ < 0.75) {
601
+ let nI = dz;
602
+ dz = fW;
603
+ fW = nI;
604
+ gu = 0.25;
605
+ iB = 0.5;
606
+ cJ = (cJ - 0.5) * 4.0;
541
607
  }
542
608
  else {
543
- let mK = dj;
544
- dj = ek;
545
- ek = mK;
546
- ge = 0.25;
547
- gG = 0.5;
548
- cA = (cA - 0.75) * 4.0;
549
- }
550
-
551
- let gU = kz(radius, oG);
552
- let phi = TWOPI * cA;
553
- let qv = gU.x *
554
- (cos(phi) * fH + sin(phi) * ek);
609
+ let nI = dz;
610
+ dz = eA;
611
+ eA = nI;
612
+ gu = 0.25;
613
+ gT = 0.5;
614
+ cJ = (cJ - 0.75) * 4.0;
615
+ }
616
+
617
+ let hj = ld(radius, pv);
618
+ let phi = TWOPI * cJ;
619
+ let rw = hj.x *
620
+ (cos(phi) * fW + sin(phi) * eA);
555
621
  var ray: Ray;
556
- iC(
622
+ gC(
557
623
  &ray,
558
- source.position + dj * gU.y + qv,
559
- -dj
624
+ source.position + dz * hj.y + rw,
625
+ -dz
560
626
  );
561
- var hit: ad;
562
- iM(
627
+ var hit: SurfaceInteraction;
628
+ intersectSceneBevel(
563
629
  ray,
564
630
  &hit,
565
631
  source.instanceIndex,
566
- max(2.0 * gU.y, EPS)
632
+ max(2.0 * hj.y, EPS)
567
633
  );
568
634
  if (!hit.hit) { continue; }
569
635
 
570
- let kQ = ge * abs(dot(dj, hit.faceNormal));
571
- let mG = hY * abs(dot(fH, hit.faceNormal));
572
- let kb = gG * abs(dot(ek, hit.faceNormal));
573
- var weight = kQ / max(
574
- kQ * kQ + mG * mG +
575
- kb * kb,
636
+ let lA = gu * abs(dot(dz, hit.faceNormal));
637
+ let nC = iB * abs(dot(fW, hit.faceNormal));
638
+ let kG = gT * abs(dot(eA, hit.faceNormal));
639
+ var weight = lA / max(
640
+ lA * lA + nC * nC +
641
+ kG * kG,
576
642
  1e-8
577
643
  );
578
- weight *= iT(radius, distance(hit.position, source.position)) /
579
- max(iT(radius, gU.x), 1e-8);
580
- iF += weight * hit.vertexNormal;
644
+ weight *= jj(radius, distance(hit.position, source.position)) /
645
+ max(jj(radius, hj.x), 1e-8);
646
+ iW += weight * hit.vertexNormal;
581
647
  }
582
648
 
583
- if (dot(iF, iF) <= 1e-12) { return source.normal; }
584
- let jH = normalize(iF);
585
- let result = source.normal + jH - source.vertexNormal;
649
+ if (dot(iW, iW) <= 1e-12) { return source.normal; }
650
+ let kg = normalize(iW);
651
+ let result = source.normal + kg - source.vertexNormal;
586
652
  if (dot(result, result) > 1e-12) { return normalize(result); }
587
653
  return source.normal;
588
654
  }
589
655
 
590
- fn bw(uv: vec2f, si: ptr<function, ad>, ray: Ray, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
656
+ fn cT(uv: vec2f, si: ptr<function, SurfaceInteraction>, ray: Ray, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>, sh: bool) -> vec4f {
591
657
  var aa: Path;
592
658
  aa.ray = ray;
593
659
  aa.li = vec3f(0.0);
@@ -599,219 +665,361 @@ aa.scatteringIsDelta = false;
599
665
  aa.isNextRefraction = false;
600
666
  aa.abort = false;
601
667
 
602
- let rJ = (*ma).transmissionWeight < 0.001 && (*ma).subsurfaceWeight < 0.001 && (*ma).alpha > 0.99;
603
668
  let bounceLimit = max(rtUniform.bounces, 0);
669
+ let ft = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
604
670
  var depth = 0;
671
+ var aJ = false;
672
+ var bQ = false;
673
+
605
674
 
606
- for (var idx: i32 = 0; idx < min(bounceLimit * 3, ${MAX_PATH_EVENTS}); idx = idx + 1) {
607
- if (rJ && idx > bounceLimit) {
608
- aa.abort = true;
675
+
676
+
677
+ for (var event = 0; event <= ft; event++) {
678
+ if ((event != 0) | sh) {
679
+ intersectScene(aa.ray, si, depth, event != 0, aa.isNextRefraction);
680
+ dg(ma, (*si).materialIndex, (*si).uv, (*si).uv1, (*si).instanceIndex, (*si).vertexColor);
609
681
  }
610
- if (aa.abort) {
611
- break;
682
+ if (event == 0) {
683
+ if (sh & (*si).hit & ((*ma).materialType == STANDARD)) {
684
+ (*outAux).albedo = select((*ma).baseColor, vec3f(1.0), (*ma).transmissionWeight > 0.5);
685
+ (*outAux).normal = select((*si).normal, -(*si).normal,
686
+ dot((*si).normal, (*si).position - cameraUniform.viewInv[3].xyz) > 0.0);
687
+ (*si).albedoSampled = (*ma).transmissionWeight > 0.5;
688
+ }
689
+ bQ = ((*ma).transmissionWeight < 0.001) & ((*ma).subsurfaceWeight < 0.001) & ((*ma).alpha > 0.99);
690
+ } else {
691
+ kl(&aa, &depth, si, ma, aJ);
612
692
  }
613
- bounce(uv, &aa, &depth, si, ma, outAux);
693
+ if (bQ & (event > bounceLimit)) { aa.abort = true; }
694
+ if (aa.abort | (event >= ft)) { break; }
695
+ nY(uv, &aa, &depth, si, ma, outAux, &aJ);
696
+ if (aa.abort) { break; }
614
697
  }
615
698
 
616
699
  return vec4f(aa.li, aa.alpha);
617
700
  }
618
701
 
619
- fn iD(uv: vec2f, si: ptr<function, ad>, ray: Ray, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
702
+ fn iU(uv: vec2f, si: ptr<function, SurfaceInteraction>, ray: Ray, ma: ptr<function, OpenPbrResolvedMaterial>, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
620
703
  ${deterministicPrimaryAlpha ? /* wgsl */ `let coverage = clamp((*ma).alpha, 0.0, 1.0);
621
- if (!(*si).hit || ((*ma).materialType != STANDARD && (*ma).materialType != UNLIT) || coverage >= 1.0) {
622
- return bw(uv, si, ray, ma, outAux);
623
- }
624
704
 
625
705
 
626
706
 
627
707
 
708
+ let split = (*si).hit & (((*ma).materialType == STANDARD) | ((*ma).materialType == UNLIT)) & (coverage < 1.0);
709
+ var sB = ray;
710
+ var tr = *si;
711
+ var tq = *ma;
712
+ var iP = *outAux;
713
+ if (split) {
714
+ sB.o = (*si).position + ray.d * (EPS * 0.02);
715
+ tr.albedoSampled = false;
716
+ }
717
+ var back: vec4f;
718
+ var ez: RayTraceAuxiliary;
628
719
 
629
- var nY = ray;
630
- nY.o = (*si).position + ray.d * (EPS * 0.02);
631
- var dE = *si;
632
- dE.albedoSampled = false;
633
- cZ(nY, &dE, 0, false, false);
634
- var rr: J;
635
- eX(&rr, dE.materialIndex, dE.uv, dE.uv1, dE.instanceIndex, dE.vertexColor);
636
- var gm = *outAux;
637
- if (dE.hit && rr.materialType == STANDARD) {
638
- gm.albedo = select(
639
- rr.baseColor,
640
- vec3f(1.0),
641
- rr.transmissionWeight > 0.5
642
- );
643
- gm.normal = select(
644
- dE.normal,
645
- -dE.normal,
646
- dot(
647
- dE.normal,
648
- dE.position - cameraUniform.viewInv[3].xyz
649
- ) > 0.0
650
- );
651
- dE.albedoSampled = rr.transmissionWeight > 0.5;
720
+
721
+ let vh = select(1u, rtUniform.loopUnrollGuard >> 1u, split & (coverage > 0.0));
722
+ for (var uI = 0u; uI < vh; uI++) {
723
+ let result = cT(uv, &tr, sB, &tq, &iP, split & (uI == 0u));
724
+ if (!split | (coverage <= 0.0)) { *outAux = iP; return result; }
725
+ if (uI == 0u) {
726
+ back = result; ez = iP;
727
+ tr = *si; tq = *ma; tq.alpha = 1.0;
728
+ sB = ray; iP = *outAux;
729
+ } else {
730
+ (*outAux).albedo = mix(ez.albedo, iP.albedo, coverage);
731
+ let dl = mix(ez.normal, iP.normal, coverage);
732
+ (*outAux).normal = select(vec3f(0.0), normalize(dl), dot(dl, dl) > 1e-12);
733
+ (*outAux).isBlank = ez.isBlank & iP.isBlank;
734
+ (*outAux).isShadowCatcher = ez.isShadowCatcher & iP.isShadowCatcher;
735
+ (*outAux).shadowCounts = mix(ez.shadowCounts, iP.shadowCounts, coverage);
736
+ return mix(back, result, coverage);
652
737
  }
653
- let back = bw(
654
- uv, &dE, nY, &rr, &gm
655
- );
656
- if (coverage <= 0.0) {
657
- *outAux = gm;
658
- return back;
659
738
  }
660
-
661
- var tu = *si;
662
- var uI = *ma;
663
- uI.alpha = 1.0;
664
- var iW = *outAux;
665
- let qY = bw(
666
- uv, &tu, ray, &uI, &iW
667
- );
668
- (*outAux).albedo = mix(gm.albedo, iW.albedo, coverage);
669
- let fV = mix(gm.normal, iW.normal, coverage);
670
- (*outAux).normal = select(
671
- vec3f(0.0),
672
- normalize(fV),
673
- dot(fV, fV) > 1e-12
674
- );
675
- (*outAux).isBlank = gm.isBlank && iW.isBlank;
676
- (*outAux).isShadowCatcher = gm.isShadowCatcher && iW.isShadowCatcher;
677
- return mix(back, qY, coverage);` : /* wgsl */ `return bw(uv, si, ray, ma, outAux);`}
739
+ return vec4f(0.0);` : /* wgsl */ `return cT(uv, si, ray, ma, outAux, false);`}
678
740
  }
679
741
 
680
742
 
681
743
 
682
- fn my(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
683
- var si: ad;
684
- var ma: J;
744
+ ${spectral === false && deterministicPrimaryAlpha ? /* wgsl */ `fn iu(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
745
+ ${primaryVariables}
746
+ var oI: SurfaceInteraction;
747
+ var oH: OpenPbrResolvedMaterial;
748
+ var ue: RayTraceAuxiliary;
749
+ var iY = false;
750
+ var query = true;
751
+ var split = false;
752
+ var coverage = 1.0;
753
+ var front = false;
754
+ var back: vec4f;
755
+ var ez: RayTraceAuxiliary;
756
+ var aa: Path; aa.ray = ray;
757
+ aa.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
758
+ aa.beta = vec3f(1.0); aa.fromEye = true;
759
+ let bounceLimit = max(rtUniform.bounces, 0);
760
+ let ft = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
761
+ var event = 0; var depth = 0; var aJ = false;
762
+ var bQ = false;
763
+
764
+
765
+ for (var step = 0; step < (${MAX_PATH_EVENTS} + 1) * 2 + 2; step++) {
766
+ if (query) {
767
+ intersectScene(aa.ray, &si, depth, event != 0, aa.isNextRefraction);
768
+ dg(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
769
+ }
770
+ query = true;
771
+ if (!iY) {
772
+ ${primaryGuides}
773
+ oI = si; oH = ma; ue = *outAux;
774
+ iY = true;
775
+ coverage = clamp(ma.alpha, 0.0, 1.0);
776
+ split = si.hit & ((ma.materialType == STANDARD) | (ma.materialType == UNLIT)) & (coverage < 1.0);
777
+ if (split) {
778
+ aa.ray.o = si.position + ray.d * (EPS * 0.02);
685
779
  si.albedoSampled = false;
686
- si.mediumType = 0;
687
- si.mediumExtinction = vec3f(0.0);
688
- si.mediumScattering = vec3f(0.0);
689
- si.mediumAnisotropy = 0.0;
690
- si.barycentrics = vec2f(0.0);
691
-
692
-
693
- cZ(ray, &si, 0, false, false);
694
- eX(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
695
-
696
- if (si.hit && ma.materialType == SHADOW_CATCHER) {
697
- (*outAux).isShadowCatcher = true;
698
-
699
-
700
- (*outAux).albedo = vec3f(1.0);
701
- (*outAux).normal = select(si.normal, -si.normal, dot(si.normal, ray.d) > 0.0);
780
+ continue;
781
+ }
782
+ } else if ((event == 0) & !front & split) {
783
+ if (si.hit & (ma.materialType == STANDARD)) {
784
+ (*outAux).albedo = select(ma.baseColor, vec3f(1.0), ma.transmissionWeight > 0.5);
785
+ (*outAux).normal = select(si.normal, -si.normal,
786
+ dot(si.normal, si.position - cameraUniform.viewInv[3].xyz) > 0.0);
787
+ si.albedoSampled = ma.transmissionWeight > 0.5;
788
+ }
789
+ }
790
+ if (event == 0) {
791
+ bQ = (ma.transmissionWeight < 0.001) & (ma.subsurfaceWeight < 0.001) & (ma.alpha > 0.99);
792
+ } else {
793
+ kl(&aa, &depth, &si, &ma, aJ);
794
+ }
795
+ if (bQ & (event > bounceLimit)) { aa.abort = true; }
796
+ if (!aa.abort & (event < ft)) {
797
+ nY(uv, &aa, &depth, &si, &ma, outAux, &aJ);
798
+ }
799
+ if (aa.abort | (event >= ft)) {
800
+ let result = vec4f(aa.li, aa.alpha);
801
+ if (!split | (coverage <= 0.0)) { return result; }
802
+ if (front) {
803
+ (*outAux).albedo = mix(ez.albedo, (*outAux).albedo, coverage);
804
+ let dl = mix(ez.normal, (*outAux).normal, coverage);
805
+ (*outAux).normal = select(vec3f(0.0), normalize(dl), dot(dl, dl) > 1e-12);
806
+ (*outAux).isBlank = ez.isBlank & (*outAux).isBlank;
807
+ (*outAux).isShadowCatcher = ez.isShadowCatcher & (*outAux).isShadowCatcher;
808
+ (*outAux).shadowCounts = mix(ez.shadowCounts, (*outAux).shadowCounts, coverage);
809
+ return mix(back, result, coverage);
810
+ }
811
+ back = result; ez = *outAux;
812
+ front = true; query = false; event = 0; depth = 0; aJ = false;
813
+ si = oI; ma = oH; ma.alpha = 1.0; *outAux = ue;
814
+ aa = Path(); aa.ray = ray; aa.beta = vec3f(1.0); aa.fromEye = true;
815
+ aa.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
816
+ } else { event++; }
817
+ }
818
+ return vec4f(0.0);
819
+ }
820
+ ` : spectral === false && !deterministicPrimaryAlpha ? /* wgsl */ `fn iu(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
821
+ ${primaryVariables}
702
822
  var aa: Path;
703
823
  aa.ray = ray;
824
+ aa.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
825
+ aa.beta = vec3f(1.0);
704
826
  aa.fromEye = true;
705
- sampleShadowCatcher(si, 0, &aa);
827
+ let bounceLimit = max(rtUniform.bounces, 0);
828
+ let ft = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
829
+ var bQ = false;
830
+ var depth = 0;
831
+ var aJ = false;
706
832
 
707
833
 
708
834
 
709
- return vec4f(vec3f(1.0), aa.alpha);
835
+ for (var event = 0; event <= ft; event++) {
836
+ intersectScene(aa.ray, &si, depth, event != 0, aa.isNextRefraction);
837
+ dg(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
838
+ if (event == 0) {
839
+ ${primaryGuides}
840
+ bQ = ma.transmissionWeight < 0.001 && ma.subsurfaceWeight < 0.001 && ma.alpha > 0.99;
841
+ } else {
842
+ kl(&aa, &depth, &si, &ma, aJ);
710
843
  }
711
- else {
712
- if (HAS_BEVEL && rtUniform.bevel != 0) {
713
- if (ma.bevel > 0.0) {
714
- si.normal = mu(si, ma.bevel);
844
+ if (bQ && event > bounceLimit) { aa.abort = true; }
845
+ if (aa.abort || event >= ft) { break; }
846
+ nY(uv, &aa, &depth, &si, &ma, outAux, &aJ);
847
+ if (aa.abort) { break; }
715
848
  }
849
+ return vec4f(aa.li, aa.alpha);
716
850
  }
717
-
718
-
719
-
720
- if (si.hit && (ma.materialType == STANDARD || ma.materialType == UNLIT)) {
721
- (*outAux).albedo = select(ma.baseColor, vec3f(1.0), ma.transmissionWeight > 0.5);
722
- (*outAux).normal = select(
723
- si.normal,
724
- -si.normal,
725
- dot(si.normal, si.position - cameraUniform.viewInv[3].xyz) > 0.0
726
- );
727
-
728
-
729
-
730
- si.albedoSampled = ma.transmissionWeight > 0.5;
851
+ ` : spectral === true && !deterministicPrimaryAlpha ? /* wgsl */ `
852
+ fn iu(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
853
+ ${primaryVariables}
854
+ var oI: SurfaceInteraction;
855
+ var oH: OpenPbrResolvedMaterial;
856
+ var iY = false;
857
+ var aa: Path; aa.ray = ray;
858
+ let bounceLimit = max(rtUniform.bounces, 0);
859
+ let ft = min(bounceLimit * 3, ${MAX_PATH_EVENTS});
860
+ var depth = 0; var event = 0; var aJ = false;
861
+ var bQ = false;
862
+ var mx = 0;
863
+ let bo = rtUniform.dispersionWavelengths == 1;
864
+ var df = false;
865
+ var eX = 0;
866
+ var hz: vec4u;
867
+ var eO = 0u;
868
+ var ba: RayTraceAuxiliary;
869
+ let wavelengths = array<f32, 3>(650.0, 510.0, 475.0);
870
+ var color = vec3f(0.0); var alpha = 0.0;
871
+ var dO = vec3f(0.0);
872
+ var dP = vec3f(0.0);
873
+ var mN = true;
874
+
875
+
876
+
877
+ let wF = min((${MAX_PATH_EVENTS} + 1) * 3, i32(rtUniform.loopUnrollGuard * ${Math.ceil((MAX_PATH_EVENTS + 1) * 3 / 4)}u));
878
+ for (var step = 0; step < wF; step++) {
879
+ if (!iY | ((event != 0) & !aa.abort)) {
880
+ intersectScene(aa.ray, &si, depth, event != 0, aa.isNextRefraction);
881
+ dg(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
882
+ }
883
+ if (event == 0) {
884
+ if (!iY) {
885
+ ${primaryGuides}
886
+ oI = si; oH = ma; iY = true;
887
+ hz = s0; eO = cP;
888
+ df = si.hit & (ma.transmissionWeight > 0.001) & (ma.transmissionDispersionScale > 0.001);
889
+ if (bo & df) {
890
+ eX = min(i32(floor(dp(CAMERA_WAVELENGTH) * 3.0)), 2);
891
+ }
892
+ }
893
+ si = oI; ma = oH; ba = *outAux;
894
+ if (!bo) {
895
+ s0 = hz; cP = eO; bT = 0u;
896
+ ba.isBlank = false; ba.isShadowCatcher = false;
731
897
  }
732
-
733
- (*outAux).isShadowCatcher = false;
734
-
898
+ si.wavelength = 0.0;
899
+ if (!bo | df) {
900
+ si.wavelength = wavelengths[select(mx, eX, bo)];
901
+ ma.specularIor = ee(si.wavelength, ma.specularIor,
902
+ ma.transmissionDispersionScale, ma.dispersionAbbeNumber);
903
+ }
904
+ aa = Path(); aa.ray = ray; aa.beta = vec3f(1.0); aa.fromEye = true;
905
+ aa.alpha = select(1.0, 0.0, rtUniform.transmissiveOutputAlphaMin < 1.0);
906
+ depth = 0; aJ = false;
907
+ bQ = (ma.transmissionWeight < 0.001) & (ma.subsurfaceWeight < 0.001) & (ma.alpha > 0.99);
908
+ } else if (!aa.abort) {
909
+ kl(&aa, &depth, &si, &ma, aJ);
910
+ }
911
+ if (bQ & (event > bounceLimit)) { aa.abort = true; }
912
+ if (!aa.abort & (event < ft)) {
913
+ nY(uv, &aa, &depth, &si, &ma, &ba, &aJ);
914
+ }
915
+ if (aa.abort | (event >= ft)) {
916
+ let result = vec4f(aa.li, aa.alpha);
917
+ if (bo) {
918
+ *outAux = ba;
919
+ let scale = select(1.0, 3.0, df);
920
+ return vec4f(result.rgb * scale, result.a);
921
+ }
922
+ color += result.rgb; alpha = max(alpha, result.a);
923
+ dO += ba.albedo;
924
+ dP += ba.normal;
925
+ mN = mN & ba.isBlank;
926
+ mx++;
927
+ if (mx >= 3) {
928
+ (*outAux).albedo = dO / 3.0;
929
+ (*outAux).normal = dP / 3.0;
930
+ (*outAux).isBlank = mN;
931
+ return vec4f(color, alpha);
932
+ }
933
+ event = 0;
934
+ } else { event++; }
935
+ }
936
+ return vec4f(0.0);
937
+ }
938
+ ` : /* wgsl */ `fn iu(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
939
+ ${primaryVariables}
940
+ intersectScene(ray, &si, 0, false, false);
941
+ dg(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
942
+ ${primaryGuides}
735
943
  if (SPECTRAL) {
736
944
 
737
945
 
738
946
 
739
947
 
740
- let sQ = array<f32, 3>(650.0, 510.0, 475.0);
741
- var tO = vec3f(0.0);
948
+ let ug = array<f32, 3>(650.0, 510.0, 475.0);
949
+ var vl = vec3f(0.0);
742
950
  var alpha = 0.0;
743
- var jE = vec3f(0.0);
744
- var jF = vec3f(0.0);
745
- var sf = true;
951
+ var dO = vec3f(0.0);
952
+ var dP = vec3f(0.0);
953
+ var mN = true;
746
954
  var si2 = si;
747
955
  var ma2 = ma;
748
- let qL = s0;
749
- let nU = em;
750
- let eh = rtUniform.dispersionWavelengths == 1;
751
- let jM = si.hit &&
956
+ let hz = s0;
957
+ let eO = cP;
958
+ let bo = rtUniform.dispersionWavelengths == 1;
959
+ let df = si.hit &&
752
960
  ma.transmissionWeight > 0.001 &&
753
961
  ma.transmissionDispersionScale > 0.001;
754
- let se = select(3, 1, eh);
755
- var lP = 0;
756
- if (eh && jM) {
962
+ let tm = select(3, 1, bo);
963
+ var eX = 0;
964
+ if (bo && df) {
757
965
 
758
966
 
759
- lP = min(i32(floor(dz(CAMERA_WAVELENGTH) * 3.0)), 2);
967
+ eX = min(i32(floor(dp(CAMERA_WAVELENGTH) * 3.0)), 2);
760
968
  }
761
- for (var i = 0; i < se; i++) {
969
+ for (var i = 0; i < tm; i++) {
762
970
 
763
971
 
764
972
 
765
- if (!eh) {
766
- s0 = qL;
767
- em = nU;
768
- cF = 0u;
973
+ if (!bo) {
974
+ s0 = hz;
975
+ cP = eO;
976
+ bT = 0u;
769
977
  }
770
978
  si.wavelength = 0.0;
771
- if (!eh || jM) {
772
- si.wavelength = sQ[select(i, lP, eh)];
773
- ma.specularIor = eN(
979
+ if (!bo || df) {
980
+ si.wavelength = ug[select(i, eX, bo)];
981
+ ma.specularIor = ee(
774
982
  si.wavelength,
775
983
  ma.specularIor,
776
984
  ma.transmissionDispersionScale,
777
985
  ma.dispersionAbbeNumber
778
986
  );
779
987
  }
780
- var dD: RayTraceAuxiliary;
781
- if (eh) {
782
- dD = *outAux;
988
+ var ba: RayTraceAuxiliary;
989
+ if (bo) {
990
+ ba = *outAux;
783
991
  } else {
784
- dD.albedo = (*outAux).albedo;
785
- dD.normal = (*outAux).normal;
786
- dD.isBlank = false;
787
- dD.isShadowCatcher = false;
788
- }
789
- let res = iD(uv, &si, ray, &ma, &dD);
790
- if (eh) {
791
- *outAux = dD;
792
- let scale = select(1.0, 3.0, jM);
992
+ ba.albedo = (*outAux).albedo;
993
+ ba.normal = (*outAux).normal;
994
+ ba.isBlank = false;
995
+ ba.isShadowCatcher = false;
996
+ }
997
+ let res = iU(uv, &si, ray, &ma, &ba);
998
+ if (bo) {
999
+ *outAux = ba;
1000
+ let scale = select(1.0, 3.0, df);
793
1001
  return vec4f(res.rgb * scale, res.a);
794
1002
  }
795
- tO += res.rgb;
1003
+ vl += res.rgb;
796
1004
  alpha = max(alpha, res.a);
797
- jE += dD.albedo;
798
- jF += dD.normal;
799
- sf = sf && dD.isBlank;
1005
+ dO += ba.albedo;
1006
+ dP += ba.normal;
1007
+ mN = mN && ba.isBlank;
800
1008
  si = si2;
801
1009
  ma = ma2;
802
1010
  }
803
- (*outAux).albedo = jE / 3.0;
804
- (*outAux).normal = jF / 3.0;
805
- (*outAux).isBlank = sf;
806
- return vec4f(tO, alpha);
1011
+ (*outAux).albedo = dO / 3.0;
1012
+ (*outAux).normal = dP / 3.0;
1013
+ (*outAux).isBlank = mN;
1014
+ return vec4f(vl, alpha);
807
1015
  }
808
1016
  else {
809
- return iD(uv, &si, ray, &ma, outAux);
810
- }
1017
+ return iU(uv, &si, ray, &ma, outAux);
811
1018
  }
812
1019
  }
1020
+ `}
813
1021
 
814
- fn oL(ip: vec2f) -> vec2f {
1022
+ fn kN(ip: vec2f) -> vec2f {
815
1023
  let p = 2.0 * ip - 1.0;
816
1024
  let greater = abs(p.x) > abs(p.y);
817
1025
  let r = select(p.y, p.x, greater);
@@ -826,17 +1034,19 @@ let outputSize = rtUniform.outputSize;
826
1034
  let scaleOffset = rtUniform.scaleOffset;
827
1035
  var jitter = rtUniform.jitter;
828
1036
 
829
- let fG = globalId.xy * vec2u(scaleOffset.xy) + vec2u(scaleOffset.zw);
830
- if (fG.x >= u32(outputSize.x) || fG.y >= u32(outputSize.y)) {
1037
+ ${pathDiagnostic ? ` if (globalId.y >= mtPathParameters.y) { return; }
1038
+ let pathId = vec2u(globalId.x, globalId.y + mtPathParameters.x);
1039
+ ` : ''} let coord = ${pathDiagnostic ? 'pathId' : 'globalId.xy'} * vec2u(scaleOffset.xy) + vec2u(scaleOffset.zw);
1040
+ if (coord.x >= u32(outputSize.x) || coord.y >= u32(outputSize.y)) {
831
1041
  return;
832
1042
  }
833
- let idx = fG.x + fG.y * u32(outputSize.x);
1043
+ let idx = coord.x + coord.y * u32(outputSize.x);
834
1044
 
835
1045
  if (
836
1046
  rtUniform.adaptiveSampling != 0 &&
837
1047
  outNormal[idx].a >= textureLoad(
838
1048
  adaptiveSampleTargets,
839
- vec2i(fG),
1049
+ vec2i(coord),
840
1050
  0
841
1051
  ).r
842
1052
  ) {
@@ -846,26 +1056,26 @@ return;
846
1056
 
847
1057
 
848
1058
 
849
- let uv = (vec2<f32>(f32(fG.x), f32(fG.y)) + vec2f(0.5)) / outputSize;
1059
+ let uv = (vec2<f32>(f32(coord.x), f32(coord.y)) + vec2f(0.5)) / outputSize;
850
1060
 
851
- bc = fG;
852
- bd = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
853
- cF = 0u; em = 0u;
854
- if (SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1) {
855
- jitter = (fo(CAMERA_PIXEL) - 0.5) / outputSize;
1061
+ aZ = coord;
1062
+ aQ = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
1063
+ bT = 0u; cP = 0u;
1064
+ if (${inputHooks?.uniformJitter ? 'false' : 'SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1'}) {
1065
+ jitter = (dZ(CAMERA_PIXEL) - 0.5) / outputSize;
856
1066
  }
857
- kh(fG, i32(bd ^ eg(rtUniform.sequenceSeed)));
858
- var cam = hC(uv + jitter);
1067
+ gW(coord, i32(aQ ^ dG(rtUniform.sequenceSeed)));
1068
+ var cam = fj(uv + jitter);
859
1069
 
860
1070
  if (cameraUniform.apertureRadius > 0.0) {
861
1071
 
862
1072
  let eye = cameraUniform.viewInv[3].xyz;
863
- let ol = -normalize(cameraUniform.viewInv[2].xyz);
864
- let qy = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, ol));
865
- let rK = cameraUniform.apertureRadius * oL(fo(CAMERA_LENS));
866
- let origin = (cameraUniform.viewInv * vec4f(rK, 0.0, 1.0)).xyz;
867
- let dir = normalize(qy - origin);
868
- iC(&cam, origin, dir);
1073
+ let forward = -normalize(cameraUniform.viewInv[2].xyz);
1074
+ let jN = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, forward));
1075
+ let sK = cameraUniform.apertureRadius * kN(dZ(CAMERA_LENS));
1076
+ let origin = (cameraUniform.viewInv * vec4f(sK, 0.0, 1.0)).xyz;
1077
+ let dir = normalize(jN - origin);
1078
+ gC(&cam, origin, dir);
869
1079
  }
870
1080
 
871
1081
  var outAux: RayTraceAuxiliary;
@@ -873,36 +1083,39 @@ outAux.albedo = vec3f(0.0);
873
1083
  outAux.normal = vec3f(0.0);
874
1084
  outAux.isBlank = false;
875
1085
  outAux.isShadowCatcher = false;
876
- var aF = my(uv + jitter, cam, &outAux);
877
-
1086
+ ${pathDiagnostic ? ' mtPathBegin(coord);\n' : ''}${inputHooks?.begin ?? ''} var aW = iu(uv + jitter, cam, &outAux);
1087
+ ${inputHooks?.unclampedColor ?? ''}
878
1088
 
879
1089
 
880
1090
  if (rtUniform.clamping > 0.0) {
881
1091
  let clamping = rtUniform.clamping;
882
- aF = vec4(clamp(aF.rgb, -vec3f(clamping), vec3f(clamping)), aF.a);
1092
+ aW = vec4(clamp(aW.rgb, -vec3f(clamping), vec3f(clamping)), aW.a);
883
1093
  }
884
- if (!(aF.x < INF && aF.x > -EPS)) {
885
- aF = vec4f(0.0, 0.0, 0.0, 1.0);
1094
+ if (!(aW.x < INF && aW.x > -EPS)) {
1095
+ aW = vec4f(0.0, 0.0, 0.0, 1.0);
886
1096
  }
887
1097
 
888
1098
  if (outAux.isShadowCatcher) {
889
1099
 
890
1100
 
891
- let aW = hH(cam);
892
- let qg = select(0.0, 1.0, aW.a >= 0.01);
893
- let jw = vec4f(aW.rgb * aW.a, aW.a);
1101
+ let bc = hX(cam);
1102
+ let rh = select(0.0, 1.0, bc.a >= 0.01);
1103
+ let jW = vec4f(bc.rgb * bc.a, bc.a);
1104
+
894
1105
 
895
1106
 
896
- outShadowCatcher[idx].mask += vec4f(1.0, aW.a, qg, aF.a);
897
- outShadowCatcher[idx].background += jw;
898
- outColor[idx] += jw;
899
- outAlbedo[idx] += vec4f(outAux.albedo, qg);
900
- hK(idx, aW.rgb, outAux.normal);
1107
+ outShadowCatcher[idx].mask += vec4f(1.0, bc.a, rh, 0.0);
1108
+ outShadowCatcher[idx].moments += vec4f(0.0, 0.0, outAux.shadowCounts);
1109
+ outShadowCatcher[idx].background += jW;
1110
+ outColor[idx] += jW;
1111
+ outAlbedo[idx] += vec4f(outAux.albedo, rh);
1112
+ ie(idx, bc.rgb, outAux.normal);
901
1113
 
902
1114
 
903
- let visibility = 1.0 - aF.a;
904
- iS(idx, visibility * select(
905
- 1.0, dot(aW.rgb, luminance), aW.a >= 0.01
1115
+ let counts = outAux.shadowCounts;
1116
+ let visibility = 1.0 - select(0.0, counts.x / counts.y, counts.y > 0.0);
1117
+ ji(idx, visibility * select(
1118
+ 1.0, dot(bc.rgb, luminance), bc.a >= 0.01
906
1119
  ));
907
1120
  }
908
1121
  else {
@@ -912,28 +1125,34 @@ if (HAS_SHADOW_CATCHER && outAux.isBlank && USE_BACKGROUND && !USE_BACKGROUND_MA
912
1125
 
913
1126
 
914
1127
 
915
- outShadowCatcher[idx].background += aF;
916
- outShadowCatcher[idx].mask.g += aF.a;
1128
+ outShadowCatcher[idx].background += aW;
1129
+ outShadowCatcher[idx].mask.g += aW.a;
917
1130
  }
918
- outColor[idx] += aF;
1131
+ outColor[idx] += aW;
919
1132
  outAlbedo[idx] += vec4f(outAux.albedo, select(1.0, 0.0, outAux.isBlank));
920
- hK(idx, aF.rgb, outAux.normal);
921
- iS(idx, dot(aF.rgb, luminance));
922
- }
1133
+ ie(idx, aW.rgb, outAux.normal);
1134
+ ji(idx, dot(aW.rgb, luminance));
923
1135
  }
1136
+ ${pathDiagnostic ? ' mtPathEnd(outAux.normal, outAux.albedo);\n' : ''}${inputHooks?.end ?? ''}}
924
1137
  `;
925
1138
  // The query entry point shares the exact BVH and material implementation.
926
1139
  // It has no effect on the beauty entry point or its bindings.
927
1140
  // Gate optional material layers on scene-level feature flags so drivers can
928
1141
  // skip the unused BSDF lobes.
929
- let specializedSource = source + depthQueryWGSL;
1142
+ let specializedSource = source + depthQueryWGSL + reflectanceWGSL + aovTraceWGSL;
930
1143
  const backgroundBits = {
931
1144
  USE_BACKGROUND: 1,
932
1145
  USE_BACKGROUND_MAP: 2,
933
1146
  USE_GROUNDED_BACKGROUND: 4
934
1147
  };
935
1148
  specializedSource = specializedSource.replace(/\b(?:USE_BACKGROUND|USE_BACKGROUND_MAP|USE_GROUNDED_BACKGROUND)\b/g, (name) => `((rtUniform.backgroundFlags & ${backgroundBits[name]}) != 0)`);
936
- specializedSource = specializedSource.replace(new RegExp(`\\b(?:${Object.keys(WGPU_SCENE_FEATURE_BITS).join('|')})\\b`, 'g'), name => `((rtUniform.sceneFeatureFlags & ${WGPU_SCENE_FEATURE_BITS[name]}u) != 0u)`);
1149
+ specializedSource = specializedSource.replace(new RegExp(`\\b(?:${Object.keys(WGPU_SCENE_FEATURE_BITS).join('|')})\\b`, 'g'),
1150
+ // Material weights and absent texture indices already disable retained
1151
+ // material capabilities. Environment presence also changes background/MIS
1152
+ // behavior, so its active flag must remain dynamic when support is retained.
1153
+ name => sceneCapabilities === undefined || dynamicEnvironment && name === 'USE_ENVMAP' && (sceneCapabilities & WGPU_SCENE_FEATURE_BITS[name]) !== 0
1154
+ ? /* wgsl */ `((rtUniform.sceneFeatureFlags & ${WGPU_SCENE_FEATURE_BITS[name]}u) != 0u)`
1155
+ : (sceneCapabilities & WGPU_SCENE_FEATURE_BITS[name]) !== 0 ? /* wgsl */ `true` : /* wgsl */ `false`);
937
1156
  return specializedSource;
938
1157
  }
939
1158
  //# sourceMappingURL=rayTrace.compute.js.map