@meimu/mutracer 0.1.5 → 0.3.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 (590) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +10 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +12316 -9228
  6. package/docs/api.md +232 -21
  7. package/docs/caustics.md +80 -0
  8. package/docs/denoising.md +30 -15
  9. package/docs/materials.md +6 -5
  10. package/docs/performance.md +5 -2
  11. package/docs/progressive-rendering.md +73 -1
  12. package/docs/technical/continuous-spectrum.md +93 -0
  13. package/docs/threejs.md +14 -5
  14. package/docs/updates.md +46 -2
  15. package/docs/viewer-checklist.md +65 -0
  16. package/docs/viewer.md +15 -8
  17. package/lib/Display.d.ts +13 -2
  18. package/lib/Display.js +28 -7
  19. package/lib/Display.js.map +1 -1
  20. package/lib/Engine.d.ts +4 -0
  21. package/lib/Engine.js +99 -37
  22. package/lib/Engine.js.map +1 -1
  23. package/lib/Render.d.ts +98 -15
  24. package/lib/Render.js +275 -27
  25. package/lib/Render.js.map +1 -1
  26. package/lib/RenderLoop.d.ts +11 -1
  27. package/lib/RenderLoop.js +120 -15
  28. package/lib/RenderLoop.js.map +1 -1
  29. package/lib/main.d.ts +6 -3
  30. package/lib/main.js +1 -0
  31. package/lib/main.js.map +1 -1
  32. package/lib/math/access.d.ts +4 -0
  33. package/lib/math/access.js +10 -0
  34. package/lib/math/access.js.map +1 -0
  35. package/lib/math/mat3.d.ts +4 -0
  36. package/lib/math/mat3.js +54 -0
  37. package/lib/math/mat3.js.map +1 -0
  38. package/lib/math/mat4.d.ts +19 -0
  39. package/lib/math/mat4.js +413 -0
  40. package/lib/math/mat4.js.map +1 -0
  41. package/lib/math/storage.d.ts +6 -0
  42. package/lib/math/storage.js +22 -0
  43. package/lib/math/storage.js.map +1 -0
  44. package/lib/math/types.d.ts +3 -0
  45. package/lib/math/types.js +2 -0
  46. package/lib/math/types.js.map +1 -0
  47. package/lib/math/vec2.d.ts +13 -0
  48. package/lib/math/vec2.js +52 -0
  49. package/lib/math/vec2.js.map +1 -0
  50. package/lib/math/vec3.d.ts +23 -0
  51. package/lib/math/vec3.js +139 -0
  52. package/lib/math/vec3.js.map +1 -0
  53. package/lib/math.d.ts +5 -17
  54. package/lib/math.js +5 -55
  55. package/lib/math.js.map +1 -1
  56. package/lib/oidn.d.ts +1 -1
  57. package/lib/oidn.js +4 -2
  58. package/lib/oidn.js.map +1 -1
  59. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  60. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  61. package/lib/renderer/AovPrimitiveCache.js +48 -0
  62. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  63. package/lib/renderer/Box3.d.ts +5 -0
  64. package/lib/renderer/Box3.js +9 -0
  65. package/lib/renderer/Box3.js.map +1 -0
  66. package/lib/renderer/GPUTraceQueue.d.ts +11 -0
  67. package/lib/renderer/GPUTraceQueue.js +33 -0
  68. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  69. package/lib/renderer/MaterialData.d.ts +15 -0
  70. package/lib/renderer/MaterialData.js +61 -0
  71. package/lib/renderer/MaterialData.js.map +1 -0
  72. package/lib/renderer/MaterialTable.d.ts +11 -98
  73. package/lib/renderer/MaterialTable.js +34 -412
  74. package/lib/renderer/MaterialTable.js.map +1 -1
  75. package/lib/renderer/RenderingPipeline.d.ts +36 -13
  76. package/lib/renderer/RenderingPipeline.js +1 -17
  77. package/lib/renderer/RenderingPipeline.js.map +1 -1
  78. package/lib/renderer/TileRender.d.ts +0 -1
  79. package/lib/renderer/TileRender.js +14 -1
  80. package/lib/renderer/TileRender.js.map +1 -1
  81. package/lib/renderer/WGPUAov.d.ts +39 -0
  82. package/lib/renderer/WGPUAov.js +239 -0
  83. package/lib/renderer/WGPUAov.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  85. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  86. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  87. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  88. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  89. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  90. package/lib/renderer/WGPUBloomPass.js +17 -97
  91. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  92. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  93. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  94. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  95. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  96. package/lib/renderer/WGPUComputePass.js.map +1 -1
  97. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  98. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  99. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  100. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  101. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  102. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  103. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  104. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  105. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  106. package/lib/renderer/WGPUPhotonMap.js +191 -0
  107. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  108. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  109. package/lib/renderer/WGPURayTraceOutput.js +132 -29
  110. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  111. package/lib/renderer/WGPURayTracePass.d.ts +83 -56
  112. package/lib/renderer/WGPURayTracePass.js +884 -837
  113. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  114. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  115. package/lib/renderer/WGPURenderingPipeline.js +297 -82
  116. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  117. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  118. package/lib/renderer/WGPUShaderCache.js +10 -5
  119. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  120. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  121. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  122. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  123. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  124. package/lib/renderer/WGPUSkyBaker.js +85 -0
  125. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  126. package/lib/renderer/WebGLAov.d.ts +41 -0
  127. package/lib/renderer/WebGLAov.js +106 -0
  128. package/lib/renderer/WebGLAov.js.map +1 -0
  129. package/lib/renderer/WebGLFullQuadPass.d.ts +7 -4
  130. package/lib/renderer/WebGLFullQuadPass.js +22 -2
  131. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  132. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  133. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  134. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  135. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  136. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  137. package/lib/renderer/WebGLRayTracePass.d.ts +18 -3
  138. package/lib/renderer/WebGLRayTracePass.js +121 -9
  139. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  140. package/lib/renderer/WebGLRenderingPipeline.js +126 -22
  141. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  142. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  143. package/lib/renderer/WebGLSkyBaker.js +422 -0
  144. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  145. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  146. package/lib/renderer/WebGLSkySource.js +28 -0
  147. package/lib/renderer/WebGLSkySource.js.map +1 -0
  148. package/lib/renderer/accumulationTarget.d.ts +6 -0
  149. package/lib/renderer/accumulationTarget.js.map +1 -1
  150. package/lib/renderer/aov.d.ts +42 -0
  151. package/lib/renderer/aov.js +50 -0
  152. package/lib/renderer/aov.js.map +1 -0
  153. package/lib/renderer/aovDisplay.d.ts +14 -0
  154. package/lib/renderer/aovDisplay.js +32 -0
  155. package/lib/renderer/aovDisplay.js.map +1 -0
  156. package/lib/renderer/aovScene.d.ts +21 -0
  157. package/lib/renderer/aovScene.js +139 -0
  158. package/lib/renderer/aovScene.js.map +1 -0
  159. package/lib/renderer/binnedSahBvh.js +2 -1
  160. package/lib/renderer/binnedSahBvh.js.map +1 -1
  161. package/lib/renderer/bvhAccel.d.ts +20 -10
  162. package/lib/renderer/bvhAccel.js +168 -58
  163. package/lib/renderer/bvhAccel.js.map +1 -1
  164. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  165. package/lib/renderer/cameraSnapshot.js +2 -1
  166. package/lib/renderer/cameraSnapshot.js.map +1 -1
  167. package/lib/renderer/cameraUniform.d.ts +2 -0
  168. package/lib/renderer/cameraUniform.js +12 -0
  169. package/lib/renderer/cameraUniform.js.map +1 -0
  170. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  171. package/lib/renderer/causticDiagnostics.js +5 -0
  172. package/lib/renderer/causticDiagnostics.js.map +1 -0
  173. package/lib/renderer/causticEmission.d.ts +10 -0
  174. package/lib/renderer/causticEmission.js +40 -0
  175. package/lib/renderer/causticEmission.js.map +1 -0
  176. package/lib/renderer/causticUniform.d.ts +12 -0
  177. package/lib/renderer/causticUniform.js +22 -0
  178. package/lib/renderer/causticUniform.js.map +1 -0
  179. package/lib/renderer/caustics.d.ts +16 -0
  180. package/lib/renderer/caustics.js +93 -0
  181. package/lib/renderer/caustics.js.map +1 -0
  182. package/lib/renderer/committedScene.js +4 -0
  183. package/lib/renderer/committedScene.js.map +1 -1
  184. package/lib/renderer/denoiser.d.ts +3 -11
  185. package/lib/renderer/denoiser.js.map +1 -1
  186. package/lib/renderer/depthQuery.js +4 -1
  187. package/lib/renderer/depthQuery.js.map +1 -1
  188. package/lib/renderer/displacementPreparation.d.ts +11 -0
  189. package/lib/renderer/displacementPreparation.js +351 -0
  190. package/lib/renderer/displacementPreparation.js.map +1 -0
  191. package/lib/renderer/displacementRange.d.ts +1 -0
  192. package/lib/renderer/displacementRange.js +9 -0
  193. package/lib/renderer/displacementRange.js.map +1 -0
  194. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  195. package/lib/renderer/displayParityDiagnostics.js +2 -0
  196. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  197. package/lib/renderer/envMapCreation.d.ts +9 -8
  198. package/lib/renderer/envMapCreation.js +36 -12
  199. package/lib/renderer/envMapCreation.js.map +1 -1
  200. package/lib/renderer/envMapDistribution.d.ts +12 -2
  201. package/lib/renderer/envMapDistribution.js +43 -34
  202. package/lib/renderer/envMapDistribution.js.map +1 -1
  203. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  204. package/lib/renderer/geometryBvhBounds.js +82 -0
  205. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  206. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  207. package/lib/renderer/geometryUpdateState.js +2 -0
  208. package/lib/renderer/geometryUpdateState.js.map +1 -0
  209. package/lib/renderer/geometryUpdates.d.ts +17 -9
  210. package/lib/renderer/geometryUpdates.js +92 -33
  211. package/lib/renderer/geometryUpdates.js.map +1 -1
  212. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  213. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  214. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  215. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  216. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  217. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  218. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  219. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  220. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  221. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  222. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  223. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  224. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  225. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  226. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  227. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  228. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -67
  229. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  230. package/lib/renderer/glsl/chunks/intersect.glsl.js +432 -434
  231. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  232. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  233. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +160 -157
  234. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  235. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +802 -802
  236. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  237. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  238. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  239. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +72 -67
  240. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  241. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  242. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  243. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  244. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +143 -120
  245. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  246. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +21 -18
  247. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  248. package/lib/renderer/glsl/chunks/sampling.glsl.js +91 -94
  249. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  250. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  251. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  252. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  253. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  254. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  255. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  256. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  257. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  258. package/lib/renderer/glsl/rayTrace.frag.js +271 -248
  259. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  260. package/lib/renderer/glsl/shadowCatcher.frag.js +37 -32
  261. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  262. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  263. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  264. package/lib/renderer/lightConstants.d.ts +10 -0
  265. package/lib/renderer/lightConstants.js +11 -0
  266. package/lib/renderer/lightConstants.js.map +1 -0
  267. package/lib/renderer/lightCore.d.ts +12 -0
  268. package/lib/renderer/lightCore.js +13 -0
  269. package/lib/renderer/lightCore.js.map +1 -0
  270. package/lib/renderer/lightSampling.d.ts +22 -18
  271. package/lib/renderer/lightSampling.js +135 -62
  272. package/lib/renderer/lightSampling.js.map +1 -1
  273. package/lib/renderer/lightsData.d.ts +21 -0
  274. package/lib/renderer/lightsData.js +192 -0
  275. package/lib/renderer/lightsData.js.map +1 -0
  276. package/lib/renderer/lightsUtil.d.ts +3 -26
  277. package/lib/renderer/lightsUtil.js +3 -153
  278. package/lib/renderer/lightsUtil.js.map +1 -1
  279. package/lib/renderer/materialBufferData.d.ts +70 -0
  280. package/lib/renderer/materialBufferData.js +2 -0
  281. package/lib/renderer/materialBufferData.js.map +1 -0
  282. package/lib/renderer/materialConstants.d.ts +11 -0
  283. package/lib/renderer/materialConstants.js +11 -0
  284. package/lib/renderer/materialConstants.js.map +1 -1
  285. package/lib/renderer/materialCore.d.ts +8 -0
  286. package/lib/renderer/materialCore.js +9 -0
  287. package/lib/renderer/materialCore.js.map +1 -0
  288. package/lib/renderer/materialEmission.d.ts +2 -2
  289. package/lib/renderer/materialEmission.js +3 -3
  290. package/lib/renderer/materialEmission.js.map +1 -1
  291. package/lib/renderer/materialLayout.d.ts +2 -101
  292. package/lib/renderer/materialLayout.js +110 -172
  293. package/lib/renderer/materialLayout.js.map +1 -1
  294. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  295. package/lib/renderer/materialLayoutSchema.js +172 -0
  296. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  297. package/lib/renderer/materialParams.d.ts +69 -0
  298. package/lib/renderer/materialParams.js +272 -0
  299. package/lib/renderer/materialParams.js.map +1 -0
  300. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  301. package/lib/renderer/materialTextureSlots.js +21 -8
  302. package/lib/renderer/materialTextureSlots.js.map +1 -1
  303. package/lib/renderer/materialTextures.d.ts +6 -0
  304. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  305. package/lib/renderer/materialTextures.js.map +1 -0
  306. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  307. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  308. package/lib/renderer/meshInstances.d.ts +4 -21
  309. package/lib/renderer/meshInstances.js +10 -56
  310. package/lib/renderer/meshInstances.js.map +1 -1
  311. package/lib/renderer/oidnNetwork.d.ts +2 -2
  312. package/lib/renderer/oidnNetwork.js +1 -1
  313. package/lib/renderer/oidnNetwork.js.map +1 -1
  314. package/lib/renderer/openPbrEnergyLut.js +850 -846
  315. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  316. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  317. package/lib/renderer/ownedDenoiser.js +2 -0
  318. package/lib/renderer/ownedDenoiser.js.map +1 -0
  319. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  320. package/lib/renderer/packedMeshInstances.js +80 -0
  321. package/lib/renderer/packedMeshInstances.js.map +1 -0
  322. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  323. package/lib/renderer/prepareMeshBVH.js +21 -642
  324. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  325. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  326. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  327. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  328. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  329. package/lib/renderer/progressiveScheduler.js +7 -3
  330. package/lib/renderer/progressiveScheduler.js.map +1 -1
  331. package/lib/renderer/renderPipeline.d.ts +4 -1
  332. package/lib/renderer/renderPipeline.js.map +1 -1
  333. package/lib/renderer/renderingLimits.d.ts +9 -0
  334. package/lib/renderer/renderingLimits.js +18 -0
  335. package/lib/renderer/renderingLimits.js.map +1 -0
  336. package/lib/renderer/researchTransport.d.ts +31 -0
  337. package/lib/renderer/researchTransport.js +5 -0
  338. package/lib/renderer/researchTransport.js.map +1 -0
  339. package/lib/renderer/sceneAssembly.d.ts +73 -0
  340. package/lib/renderer/sceneAssembly.js +109 -0
  341. package/lib/renderer/sceneAssembly.js.map +1 -0
  342. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  343. package/lib/renderer/sceneChangeCore.js +307 -0
  344. package/lib/renderer/sceneChangeCore.js.map +1 -0
  345. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  346. package/lib/renderer/sceneChangeDetector.js +24 -150
  347. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  348. package/lib/renderer/sceneLayoutSchema.d.ts +119 -0
  349. package/lib/renderer/sceneLayoutSchema.js +111 -0
  350. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  351. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  352. package/lib/renderer/sceneLightChanges.js.map +1 -1
  353. package/lib/renderer/scenePreparation.d.ts +55 -0
  354. package/lib/renderer/scenePreparation.js +360 -0
  355. package/lib/renderer/scenePreparation.js.map +1 -0
  356. package/lib/renderer/scratchSampling.js +18 -18
  357. package/lib/renderer/scratchSampling.js.map +1 -1
  358. package/lib/renderer/shader.d.ts +2 -0
  359. package/lib/renderer/shader.js +2 -0
  360. package/lib/renderer/shader.js.map +1 -1
  361. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  362. package/lib/renderer/shaderCapabilities.js +55 -0
  363. package/lib/renderer/shaderCapabilities.js.map +1 -0
  364. package/lib/renderer/shaderCapacity.d.ts +2 -0
  365. package/lib/renderer/shaderCapacity.js +5 -0
  366. package/lib/renderer/shaderCapacity.js.map +1 -0
  367. package/lib/renderer/skyModel.d.ts +9 -0
  368. package/lib/renderer/skyModel.js +10 -0
  369. package/lib/renderer/skyModel.js.map +1 -0
  370. package/lib/renderer/spectrum.d.ts +21 -0
  371. package/lib/renderer/spectrum.js +154 -0
  372. package/lib/renderer/spectrum.js.map +1 -0
  373. package/lib/renderer/textureAtlas.d.ts +60 -0
  374. package/lib/renderer/textureAtlas.js +145 -0
  375. package/lib/renderer/textureAtlas.js.map +1 -0
  376. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  377. package/lib/renderer/textureAtlasPixels.js +68 -0
  378. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  379. package/lib/renderer/util.d.ts +1 -1
  380. package/lib/renderer/util.js.map +1 -1
  381. package/lib/renderer/webgl.d.ts +9 -2
  382. package/lib/renderer/webgl.js +54 -9
  383. package/lib/renderer/webgl.js.map +1 -1
  384. package/lib/renderer/webglLightSampling.d.ts +39 -0
  385. package/lib/renderer/webglLightSampling.js +15 -0
  386. package/lib/renderer/webglLightSampling.js.map +1 -0
  387. package/lib/renderer/wgpuBindless.d.ts +26 -0
  388. package/lib/renderer/wgpuBindless.js +95 -0
  389. package/lib/renderer/wgpuBindless.js.map +1 -0
  390. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  391. package/lib/renderer/wgpuBindlessSource.js +51 -0
  392. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  393. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  394. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  395. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  396. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  397. package/lib/renderer/wgpuSceneUniform.js +125 -0
  398. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  399. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  400. package/lib/renderer/wgpuShaderSource.js +33 -0
  401. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  402. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  403. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  404. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  405. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  406. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  407. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  408. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  409. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  410. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  411. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  412. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  413. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  414. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  415. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  416. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  417. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  418. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  419. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  420. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  421. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  422. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  423. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  424. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  425. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  426. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  427. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  428. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  429. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  430. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  431. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  432. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  433. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  434. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  435. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  436. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  437. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  438. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  439. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  440. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +41 -35
  441. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  442. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  443. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +747 -704
  444. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  445. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  446. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  447. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +4 -1
  448. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +83 -79
  449. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  450. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  451. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  452. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +137 -137
  453. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  454. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +3 -1
  455. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +52 -32
  456. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  457. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  458. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -144
  459. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  460. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  461. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +269 -245
  462. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  463. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  464. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +27 -14
  465. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  466. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  467. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -95
  468. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  469. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  470. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  471. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  472. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  473. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  474. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  475. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  476. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  477. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  478. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  479. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  480. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  481. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  482. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  483. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  484. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  485. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  486. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  487. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  488. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  489. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  490. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  491. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  492. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  493. package/lib/renderer/wgsl/rayTrace.compute.d.ts +25 -1
  494. package/lib/renderer/wgsl/rayTrace.compute.js +645 -500
  495. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  496. package/lib/scene/Camera.js +7 -3
  497. package/lib/scene/Camera.js.map +1 -1
  498. package/lib/scene/EnvironmentLight.d.ts +5 -9
  499. package/lib/scene/EnvironmentLight.js +4 -14
  500. package/lib/scene/EnvironmentLight.js.map +1 -1
  501. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  502. package/lib/scene/EnvironmentLightState.js +19 -0
  503. package/lib/scene/EnvironmentLightState.js.map +1 -0
  504. package/lib/scene/Geometry.d.ts +12 -6
  505. package/lib/scene/Geometry.js +37 -13
  506. package/lib/scene/Geometry.js.map +1 -1
  507. package/lib/scene/InstanceState.d.ts +39 -0
  508. package/lib/scene/InstanceState.js +77 -0
  509. package/lib/scene/InstanceState.js.map +1 -0
  510. package/lib/scene/InstancedMesh.d.ts +1 -1
  511. package/lib/scene/InstancedMesh.js +3 -0
  512. package/lib/scene/InstancedMesh.js.map +1 -1
  513. package/lib/scene/MaterialState.d.ts +209 -0
  514. package/lib/scene/MaterialState.js +231 -0
  515. package/lib/scene/MaterialState.js.map +1 -0
  516. package/lib/scene/Mesh.d.ts +4 -6
  517. package/lib/scene/Mesh.js +3 -11
  518. package/lib/scene/Mesh.js.map +1 -1
  519. package/lib/scene/MeshState.d.ts +20 -0
  520. package/lib/scene/MeshState.js +35 -0
  521. package/lib/scene/MeshState.js.map +1 -0
  522. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  523. package/lib/scene/OpenPBRMaterial.js +5 -223
  524. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  525. package/lib/scene/PixelTexture.d.ts +6 -0
  526. package/lib/scene/PixelTexture.js +10 -0
  527. package/lib/scene/PixelTexture.js.map +1 -0
  528. package/lib/scene/ProceduralSky.d.ts +24 -0
  529. package/lib/scene/ProceduralSky.js +40 -0
  530. package/lib/scene/ProceduralSky.js.map +1 -0
  531. package/lib/scene/RectLight.d.ts +2 -13
  532. package/lib/scene/RectLight.js +3 -21
  533. package/lib/scene/RectLight.js.map +1 -1
  534. package/lib/scene/RectLightState.d.ts +31 -0
  535. package/lib/scene/RectLightState.js +26 -0
  536. package/lib/scene/RectLightState.js.map +1 -0
  537. package/lib/scene/Scene.d.ts +15 -4
  538. package/lib/scene/Scene.js.map +1 -1
  539. package/lib/scene/SceneNode.js +7 -6
  540. package/lib/scene/SceneNode.js.map +1 -1
  541. package/lib/scene/Texture.d.ts +10 -41
  542. package/lib/scene/Texture.js +4 -33
  543. package/lib/scene/Texture.js.map +1 -1
  544. package/lib/scene/TextureState.d.ts +35 -0
  545. package/lib/scene/TextureState.js +35 -0
  546. package/lib/scene/TextureState.js.map +1 -0
  547. package/lib/scene/attributeData.d.ts +4 -0
  548. package/lib/scene/attributeData.js +10 -0
  549. package/lib/scene/attributeData.js.map +1 -0
  550. package/lib/scene/lightState.d.ts +8 -0
  551. package/lib/scene/lightState.js +2 -0
  552. package/lib/scene/lightState.js.map +1 -0
  553. package/lib/scene/openPbrSchema.d.ts +7 -12
  554. package/lib/scene/openPbrSchema.js +273 -28
  555. package/lib/scene/openPbrSchema.js.map +1 -1
  556. package/lib/scene/skyParameters.d.ts +20 -0
  557. package/lib/scene/skyParameters.js +28 -0
  558. package/lib/scene/skyParameters.js.map +1 -0
  559. package/lib/scene/textureData.d.ts +9 -0
  560. package/lib/scene/textureData.js +2 -0
  561. package/lib/scene/textureData.js.map +1 -0
  562. package/lib/scene/texturePixels.d.ts +6 -0
  563. package/lib/scene/texturePixels.js +10 -0
  564. package/lib/scene/texturePixels.js.map +1 -0
  565. package/lib/settings/display.d.ts +33 -0
  566. package/lib/settings/display.js +7 -0
  567. package/lib/settings/display.js.map +1 -1
  568. package/lib/settings/render.d.ts +36 -3
  569. package/lib/settings/render.js +4 -1
  570. package/lib/settings/render.js.map +1 -1
  571. package/lib/tinybvh/tinybvh.wasm +0 -0
  572. package/lib/util/commonGeometry.js +7 -7
  573. package/lib/util/commonGeometry.js.map +1 -1
  574. package/lib/util/fromTHREE.d.ts +4 -1
  575. package/lib/util/fromTHREE.js +20 -7
  576. package/lib/util/fromTHREE.js.map +1 -1
  577. package/lib/util/geometry.js +42 -29
  578. package/lib/util/geometry.js.map +1 -1
  579. package/lib/util/loadRGBE.js +3 -4
  580. package/lib/util/loadRGBE.js.map +1 -1
  581. package/lib/util/studioLighting.d.ts +18 -0
  582. package/lib/util/studioLighting.js +36 -0
  583. package/lib/util/studioLighting.js.map +1 -0
  584. package/lib/version.d.ts +1 -1
  585. package/lib/version.js +1 -1
  586. package/lib/version.js.map +1 -1
  587. package/llms.txt +5 -0
  588. package/package.json +33 -7
  589. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  590. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -15,6 +15,7 @@
15
15
  * rough-diffuse/specular coupling; fuzz still uses an analytic approximation.
16
16
  */
17
17
  import { OPENPBR_METAL_ENERGY_LUT_ROW, OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW, OPENPBR_DIELECTRIC_ENERGY_LUT_ROW, OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW, OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW } from '../../openPbrEnergyLut.js';
18
+ const LOBE_INDICES = [0, 1, 2, 3, 4, 5, 6];
18
19
  export function createOpenPbrBsdfWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
19
20
  return /* wgsl */ `
20
21
  const OPENPBR_LOBE_FUZZ: i32 = 0;
@@ -24,19 +25,22 @@ const OPENPBR_LOBE_SPECULAR: i32 = 3;
24
25
  const OPENPBR_LOBE_TRANSMISSION: i32 = 4;
25
26
  const OPENPBR_LOBE_DIFFUSE: i32 = 5;
26
27
  const OPENPBR_LOBE_SUBSURFACE: i32 = 6;
27
- const OPENPBR_LOBE_COUNT: i32 = 7;
28
+ const OPENPBR_LOBE_COUNT: i32 = ${LOBE_INDICES.length};
28
29
 
29
- struct bj {
30
+
31
+
32
+
33
+ struct OpenPbrBasis {
30
34
  tangent: vec3f,
31
35
  bitangent: vec3f,
32
36
  normal: vec3f,
33
37
  };
34
38
 
35
- struct ag {
36
- material: J,
37
- basis: bj,
39
+ struct OpenPbrPreparedBsdf {
40
+ material: OpenPbrResolvedMaterial,
41
+ basis: OpenPbrBasis,
38
42
  ${hasAnisotropyDirections ? /* wgsl */ `
39
- coatBasis: bj,
43
+ coatBasis: OpenPbrBasis,
40
44
  directionFrames: bool,
41
45
  ` : /* wgsl */ ``}
42
46
  ${hasCoatNormals ? /* wgsl */ ` coatViewLocal: vec3f,` : ''}
@@ -64,208 +68,208 @@ weights: array<f32, OPENPBR_LOBE_COUNT>,
64
68
  probabilities: array<f32, OPENPBR_LOBE_COUNT>,
65
69
  };
66
70
 
67
- fn aw(color: vec3f) -> f32 {
71
+ fn aB(color: vec3f) -> f32 {
68
72
  return dot(color, vec3f(0.212671, 0.715160, 0.072169));
69
73
  }
70
74
 
71
- fn cV(bu: f32) -> f32 {
72
- let value = (bu - 1.0) / (bu + 1.0);
75
+ fn cO(bq: f32) -> f32 {
76
+ let value = (bq - 1.0) / (bq + 1.0);
73
77
  return value * value;
74
78
  }
75
79
 
76
- fn aY(
77
- bu: f32,
80
+ fn bb(
81
+ bq: f32,
78
82
  specularWeight: f32
79
83
  ) -> f32 {
80
- let sR = min(
81
- cV(bu) * specularWeight,
84
+ let uj = min(
85
+ cO(bq) * specularWeight,
82
86
  0.9999
83
87
  );
84
- let sT = sqrt(sR);
85
- let lh = (1.0 + sT) / (1.0 - sT);
86
- return select(lh, 1.0 / lh, bu < 1.0);
88
+ let ul = sqrt(uj);
89
+ let lC = (1.0 + ul) / (1.0 - ul);
90
+ return select(lC, 1.0 / lC, bq < 1.0);
87
91
  }
88
92
 
89
- fn af(cc: f32, relativeIor: f32) -> f32 {
93
+ fn ae(ct: f32, relativeIor: f32) -> f32 {
90
94
  if (abs(relativeIor - 1.0) < 1e-6) {
91
95
  return 0.0;
92
96
  }
93
- return cu(cc, relativeIor);
97
+ return sampling_dielectric_fresnel(ct, relativeIor);
94
98
  }
95
99
 
96
- fn aC(ior: f32) -> f32 {
100
+ fn aE(ior: f32) -> f32 {
97
101
  if (ior < 1.0) {
98
102
  return 15.0 - ((1.0 / ior - 1.0) / 1.5) * 15.0;
99
103
  }
100
104
  return 16.0 + ((ior - 1.0) / 1.5) * 15.0;
101
105
  }
102
106
 
103
- fn F(sl: i32, row: i32) -> f32 {
104
- return textureLoad(openPbrEnergyLut, vec2i(sl, row), 0).r;
107
+ fn F(tC: i32, row: i32) -> f32 {
108
+ return textureLoad(openPbrEnergyLut, vec2i(tC, row), 0).r;
105
109
  }
106
110
 
107
- fn ge(
108
- dJ: f32,
109
- bR: f32,
110
- hR: f32
111
+ fn gd(
112
+ dH: f32,
113
+ bM: f32,
114
+ hN: f32
111
115
  ) -> f32 {
112
- let bA = clamp(dJ, 0.0, 31.0);
113
- let aH = clamp(bR, 0.0, 31.0);
114
- let bt = clamp(hR, 0.0, 31.0);
115
- let dQ = i32(floor(bA));
116
- let aN = i32(floor(aH));
117
- let cI = i32(floor(bt));
118
- let hE = min(dQ + 1, 31);
119
- let cp = min(aN + 1, 31);
120
- let eR = min(cI + 1, 31);
121
- let cq = bA - f32(dQ);
122
- let cz = aH - f32(aN);
123
- let kE = bt - f32(cI);
124
-
125
- let uA = F(cI, dQ * 32 + aN);
126
- let uB = F(eR, dQ * 32 + aN);
127
- let uC = F(cI, dQ * 32 + cp);
128
- let uD = F(eR, dQ * 32 + cp);
129
- let uE = F(cI, hE * 32 + aN);
130
- let uF = F(eR, hE * 32 + aN);
131
- let uG = F(cI, hE * 32 + cp);
132
- let uH = F(eR, hE * 32 + cp);
133
- let v00 = mix(uA, uE, cq);
134
- let v01 = mix(uB, uF, cq);
135
- let v10 = mix(uC, uG, cq);
136
- let v11 = mix(uD, uH, cq);
116
+ let br = clamp(dH, 0.0, 31.0);
117
+ let aK = clamp(bM, 0.0, 31.0);
118
+ let bp = clamp(hN, 0.0, 31.0);
119
+ let dP = i32(floor(br));
120
+ let aP = i32(floor(aK));
121
+ let cD = i32(floor(bp));
122
+ let hB = min(dP + 1, 31);
123
+ let ch = min(aP + 1, 31);
124
+ let eK = min(cD + 1, 31);
125
+ let ci = br - f32(dP);
126
+ let cq = aK - f32(aP);
127
+ let kR = bp - f32(cD);
128
+
129
+ let wv = F(cD, dP * 32 + aP);
130
+ let ww = F(eK, dP * 32 + aP);
131
+ let wx = F(cD, dP * 32 + ch);
132
+ let wy = F(eK, dP * 32 + ch);
133
+ let wB = F(cD, hB * 32 + aP);
134
+ let wC = F(eK, hB * 32 + aP);
135
+ let wE = F(cD, hB * 32 + ch);
136
+ let wF = F(eK, hB * 32 + ch);
137
+ let v00 = mix(wv, wB, ci);
138
+ let v01 = mix(ww, wC, ci);
139
+ let v10 = mix(wx, wE, ci);
140
+ let v11 = mix(wy, wF, ci);
137
141
  return mix(
138
- mix(v00, v10, cz),
139
- mix(v01, v11, cz),
140
- kE
142
+ mix(v00, v10, cq),
143
+ mix(v01, v11, cq),
144
+ kR
141
145
  );
142
146
  }
143
147
 
144
- fn gG(dJ: f32, bR: f32) -> f32 {
145
- let bA = clamp(dJ, 0.0, 31.0);
146
- let aH = clamp(bR, 0.0, 31.0);
147
- let dQ = i32(floor(bA));
148
- let aN = i32(floor(aH));
149
- let hE = min(dQ + 1, 31);
150
- let cp = min(aN + 1, 31);
151
- let cq = bA - f32(dQ);
152
- let cz = aH - f32(aN);
153
- let v00 = F(aN, 1024 + dQ);
154
- let v01 = F(cp, 1024 + dQ);
155
- let v10 = F(aN, 1024 + hE);
156
- let v11 = F(cp, 1024 + hE);
148
+ fn gA(dH: f32, bM: f32) -> f32 {
149
+ let br = clamp(dH, 0.0, 31.0);
150
+ let aK = clamp(bM, 0.0, 31.0);
151
+ let dP = i32(floor(br));
152
+ let aP = i32(floor(aK));
153
+ let hB = min(dP + 1, 31);
154
+ let ch = min(aP + 1, 31);
155
+ let ci = br - f32(dP);
156
+ let cq = aK - f32(aP);
157
+ let v00 = F(aP, 1024 + dP);
158
+ let v01 = F(ch, 1024 + dP);
159
+ let v10 = F(aP, 1024 + hB);
160
+ let v11 = F(ch, 1024 + hB);
157
161
  return mix(
158
- mix(v00, v10, cq),
159
- mix(v01, v11, cq),
160
- cz
162
+ mix(v00, v10, ci),
163
+ mix(v01, v11, ci),
164
+ cq
161
165
  );
162
166
  }
163
167
 
164
168
 
165
169
 
166
- fn ef(
167
- dJ: f32,
168
- bR: f32,
169
- hR: f32
170
+ fn ee(
171
+ dH: f32,
172
+ bM: f32,
173
+ hN: f32
170
174
  ) -> f32 {
171
- let bA = clamp(dJ, 0.0, 31.0);
172
- let aH = clamp(bR, 0.0, 31.0);
173
- let bt = clamp(hR, 0.0, 31.0);
174
- let dQ = i32(floor(bA));
175
- let aN = i32(floor(aH));
176
- let cI = i32(floor(bt));
177
- let hE = min(dQ + 1, 31);
178
- let cp = min(aN + 1, 31);
179
- let eR = min(cI + 1, 31);
180
- let cq = bA - f32(dQ);
181
- let cz = aH - f32(aN);
182
- let kE = bt - f32(cI);
183
-
184
- let uA = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dQ * 32 + aN);
185
- let uB = F(eR, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dQ * 32 + aN);
186
- let uC = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dQ * 32 + cp);
187
- let uD = F(eR, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dQ * 32 + cp);
188
- let uE = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hE * 32 + aN);
189
- let uF = F(eR, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hE * 32 + aN);
190
- let uG = F(cI, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hE * 32 + cp);
191
- let uH = F(eR, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hE * 32 + cp);
192
- let v00 = mix(uA, uE, cq);
193
- let v01 = mix(uB, uF, cq);
194
- let v10 = mix(uC, uG, cq);
195
- let v11 = mix(uD, uH, cq);
175
+ let br = clamp(dH, 0.0, 31.0);
176
+ let aK = clamp(bM, 0.0, 31.0);
177
+ let bp = clamp(hN, 0.0, 31.0);
178
+ let dP = i32(floor(br));
179
+ let aP = i32(floor(aK));
180
+ let cD = i32(floor(bp));
181
+ let hB = min(dP + 1, 31);
182
+ let ch = min(aP + 1, 31);
183
+ let eK = min(cD + 1, 31);
184
+ let ci = br - f32(dP);
185
+ let cq = aK - f32(aP);
186
+ let kR = bp - f32(cD);
187
+
188
+ let wv = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aP);
189
+ let ww = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + aP);
190
+ let wx = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + ch);
191
+ let wy = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + dP * 32 + ch);
192
+ let wB = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aP);
193
+ let wC = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + aP);
194
+ let wE = F(cD, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + ch);
195
+ let wF = F(eK, ${OPENPBR_DIELECTRIC_ENERGY_LUT_ROW} + hB * 32 + ch);
196
+ let v00 = mix(wv, wB, ci);
197
+ let v01 = mix(ww, wC, ci);
198
+ let v10 = mix(wx, wE, ci);
199
+ let v11 = mix(wy, wF, ci);
196
200
  return mix(
197
- mix(v00, v10, cz),
198
- mix(v01, v11, cz),
199
- kE
201
+ mix(v00, v10, cq),
202
+ mix(v01, v11, cq),
203
+ kR
200
204
  );
201
205
  }
202
206
 
203
- fn ee(dJ: f32, bR: f32) -> f32 {
204
- let bA = clamp(dJ, 0.0, 31.0);
205
- let aH = clamp(bR, 0.0, 31.0);
206
- let dQ = i32(floor(bA));
207
- let aN = i32(floor(aH));
208
- let hE = min(dQ + 1, 31);
209
- let cp = min(aN + 1, 31);
210
- let cq = bA - f32(dQ);
211
- let cz = aH - f32(aN);
212
- let v00 = F(aN, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dQ);
213
- let v01 = F(cp, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dQ);
214
- let v10 = F(aN, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hE);
215
- let v11 = F(cp, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hE);
207
+ fn ec(dH: f32, bM: f32) -> f32 {
208
+ let br = clamp(dH, 0.0, 31.0);
209
+ let aK = clamp(bM, 0.0, 31.0);
210
+ let dP = i32(floor(br));
211
+ let aP = i32(floor(aK));
212
+ let hB = min(dP + 1, 31);
213
+ let ch = min(aP + 1, 31);
214
+ let ci = br - f32(dP);
215
+ let cq = aK - f32(aP);
216
+ let v00 = F(aP, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
217
+ let v01 = F(ch, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + dP);
218
+ let v10 = F(aP, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
219
+ let v11 = F(ch, ${OPENPBR_DIELECTRIC_ENERGY_LUT_AVERAGE_ROW} + hB);
216
220
  return mix(
217
- mix(v00, v10, cq),
218
- mix(v01, v11, cq),
219
- cz
221
+ mix(v00, v10, ci),
222
+ mix(v01, v11, ci),
223
+ cq
220
224
  );
221
225
  }
222
226
 
223
- fn eG(dJ: f32, bR: f32) -> f32 {
224
- let bA = clamp(dJ, 0.0, 31.0);
225
- let aH = clamp(bR, 0.0, 31.0);
226
- let dQ = i32(floor(bA));
227
- let aN = i32(floor(aH));
228
- let hE = min(dQ + 1, 31);
229
- let cp = min(aN + 1, 31);
230
- let cq = bA - f32(dQ);
231
- let cz = aH - f32(aN);
232
- let v00 = F(aN, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dQ);
233
- let v01 = F(cp, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dQ);
234
- let v10 = F(aN, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hE);
235
- let v11 = F(cp, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hE);
227
+ fn eC(dH: f32, bM: f32) -> f32 {
228
+ let br = clamp(dH, 0.0, 31.0);
229
+ let aK = clamp(bM, 0.0, 31.0);
230
+ let dP = i32(floor(br));
231
+ let aP = i32(floor(aK));
232
+ let hB = min(dP + 1, 31);
233
+ let ch = min(aP + 1, 31);
234
+ let ci = br - f32(dP);
235
+ let cq = aK - f32(aP);
236
+ let v00 = F(aP, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
237
+ let v01 = F(ch, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + dP);
238
+ let v10 = F(aP, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
239
+ let v11 = F(ch, ${OPENPBR_DIELECTRIC_REFLECTION_RATIO_LUT_ROW} + hB);
236
240
  return mix(
237
- mix(v00, v10, cq),
238
- mix(v01, v11, cq),
239
- cz
241
+ mix(v00, v10, ci),
242
+ mix(v01, v11, ci),
243
+ cq
240
244
  );
241
245
  }
242
246
 
243
- fn bO(ior: f32, alpha: f32, au: f32) -> f32 {
244
- return ef(aC(ior), sqrt(alpha) * 31.0, au * 31.0);
247
+ fn aV(ior: f32, alpha: f32, cosine: f32) -> f32 {
248
+ return ee(aE(ior), sqrt(alpha) * 31.0, cosine * 31.0);
245
249
  }
246
- fn cO(ior: f32, alpha: f32) -> f32 {
247
- return ee(aC(ior), sqrt(alpha) * 31.0);
250
+ fn aY(ior: f32, alpha: f32) -> f32 {
251
+ return ec(aE(ior), sqrt(alpha) * 31.0);
248
252
  }
249
- fn ch(ior: f32, alpha: f32) -> f32 {
250
- return eG(aC(ior), sqrt(alpha) * 31.0);
253
+ fn bU(ior: f32, alpha: f32) -> f32 {
254
+ return eC(aE(ior), sqrt(alpha) * 31.0);
251
255
  }
252
256
 
253
257
 
254
258
 
255
- fn bH(alpha: f32, au: f32) -> f32 {
259
+ fn aR(alpha: f32, cosine: f32) -> f32 {
256
260
  let ie = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
257
- let bt = clamp(au * 31.0, 0.0, 31.0);
261
+ let bp = clamp(cosine * 31.0, 0.0, 31.0);
258
262
  let r0 = i32(floor(ie));
259
- let c0 = i32(floor(bt));
263
+ let c0 = i32(floor(bp));
260
264
  let r1 = min(r0 + 1, 31);
261
265
  let c1 = min(c0 + 1, 31);
262
266
  return mix(
263
- mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bt)),
264
- mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bt)),
267
+ mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r0), fract(bp)),
268
+ mix(F(c0, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), F(c1, ${OPENPBR_METAL_ENERGY_LUT_ROW} + r1), fract(bp)),
265
269
  fract(ie));
266
270
  }
267
271
 
268
- fn cv(alpha: f32) -> f32 {
272
+ fn cl(alpha: f32) -> f32 {
269
273
  let index = clamp(sqrt(alpha) * 31.0, 0.0, 31.0);
270
274
  let i0 = i32(floor(index));
271
275
  return mix(F(i0, ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}),
@@ -273,42 +277,42 @@ F(min(i0 + 1, 31), ${OPENPBR_METAL_ENERGY_LUT_AVERAGE_ROW}), fract(index));
273
277
  }
274
278
 
275
279
  fn aX(value: f32, ior: f32) -> f32 {
276
- if (ior > 2.5 || ior < 0.4) {
277
- let tU = cV(2.5);
278
- let progress = (cV(ior) - tU) / (1.0 - tU);
280
+ if ((ior > 2.5) | (ior < 0.4)) {
281
+ let vH = cO(2.5);
282
+ let progress = (cO(ior) - vH) / (1.0 - vH);
279
283
  return (1.0 - progress) * value;
280
284
  }
281
285
  return value;
282
286
  }
283
287
 
284
- fn aJ(
288
+ fn ar(
285
289
  ior: f32,
286
290
  alpha: f32,
287
- au: f32
291
+ cosine: f32
288
292
  ) -> f32 {
289
- let value = ge(
290
- aC(ior),
293
+ let value = gd(
294
+ aE(ior),
291
295
  sqrt(alpha) * 31.0,
292
- au * 31.0
296
+ cosine * 31.0
293
297
  );
294
298
  return aX(value, ior);
295
299
  }
296
300
 
297
- fn cr(ior: f32, alpha: f32) -> f32 {
298
- let value = gG(
299
- aC(ior),
301
+ fn cj(ior: f32, alpha: f32) -> f32 {
302
+ let value = gA(
303
+ aE(ior),
300
304
  sqrt(alpha) * 31.0
301
305
  );
302
306
  return aX(value, ior);
303
307
  }
304
308
 
305
- fn openpbr_to_world(basis: bj, direction: vec3f) -> vec3f {
309
+ fn openpbr_to_world(basis: OpenPbrBasis, direction: vec3f) -> vec3f {
306
310
  return direction.x * basis.tangent
307
311
  + direction.y * basis.bitangent
308
312
  + direction.z * basis.normal;
309
313
  }
310
314
 
311
- fn openpbr_to_local(basis: bj, direction: vec3f) -> vec3f {
315
+ fn openpbr_to_local(basis: OpenPbrBasis, direction: vec3f) -> vec3f {
312
316
  return vec3f(
313
317
  dot(direction, basis.tangent),
314
318
  dot(direction, basis.bitangent),
@@ -316,17 +320,17 @@ dot(direction, basis.normal)
316
320
  );
317
321
  }
318
322
 
319
- fn fj(
320
- aT: vec3f,
323
+ fn ff(
324
+ aS: vec3f,
321
325
  normal: vec3f,
322
326
  anisotropy: f32
323
- ) -> bj {
324
- var basis: bj;
327
+ ) -> OpenPbrBasis {
328
+ var basis: OpenPbrBasis;
325
329
  basis.normal = normal;
326
- var tangent = aT;
330
+ var tangent = aS;
327
331
  var bitangent = vec3f(0.0);
328
- if (dot(tangent, tangent) < 0.001 || anisotropy <= 0.0) {
329
- aL(normal, &tangent, &bitangent);
332
+ if ((dot(tangent, tangent) < 0.001) | (anisotropy <= 0.0)) {
333
+ sampling_orthonormal_basis(normal, &tangent, &bitangent);
330
334
  }
331
335
  else {
332
336
  bitangent = normalize(cross(normal, tangent));
@@ -337,198 +341,198 @@ basis.bitangent = bitangent;
337
341
  return basis;
338
342
  }
339
343
 
340
- fn ka(
344
+ fn ki(
341
345
  av: f32,
342
- ak: f32,
343
- L: f32,
344
- S: f32
346
+ ai: f32,
347
+ J: f32,
348
+ ad: f32
345
349
  ) -> f32 {
346
- return (av * L - ak * S)
347
- / (av * L + ak * S);
350
+ return (av * J - ai * ad)
351
+ / (av * J + ai * ad);
348
352
  }
349
353
 
350
- fn jZ(
354
+ fn kh(
351
355
  av: f32,
352
- ak: f32,
353
- L: f32,
354
- S: f32
356
+ ai: f32,
357
+ J: f32,
358
+ ad: f32
355
359
  ) -> f32 {
356
- return (ak * L - av * S)
357
- / (av * S + ak * L);
360
+ return (ai * J - av * ad)
361
+ / (av * ad + ai * J);
358
362
  }
359
363
 
360
- fn hd(
364
+ fn gZ(
361
365
  av: f32,
362
- ak: f32,
363
- L: f32,
364
- S: f32
366
+ ai: f32,
367
+ J: f32,
368
+ ad: f32
365
369
  ) -> f32 {
366
- return 2.0 * av * L
367
- / (av * L + ak * S);
370
+ return 2.0 * av * J
371
+ / (av * J + ai * ad);
368
372
  }
369
373
 
370
- fn hc(
374
+ fn gY(
371
375
  av: f32,
372
- ak: f32,
373
- L: f32,
374
- S: f32
376
+ ai: f32,
377
+ J: f32,
378
+ ad: f32
375
379
  ) -> f32 {
376
- return 2.0 * av * L
377
- / (av * S + ak * L);
380
+ return 2.0 * av * J
381
+ / (av * ad + ai * J);
378
382
  }
379
383
 
380
- fn aU(a: vec2f, b: vec2f) -> vec2f {
384
+ fn aT(a: vec2f, b: vec2f) -> vec2f {
381
385
  return vec2f(a.x * b.x - a.y * b.y, a.x * b.y + a.y * b.x);
382
386
  }
383
387
 
384
- fn aZ(a: vec2f, b: vec2f) -> vec2f {
385
- let ap = max(dot(b, b), 1e-9);
388
+ fn bc(a: vec2f, b: vec2f) -> vec2f {
389
+ let ah = max(dot(b, b), 1e-9);
386
390
  return vec2f(
387
- (a.x * b.x + a.y * b.y) / ap,
388
- (a.y * b.x - a.x * b.y) / ap
391
+ (a.x * b.x + a.y * b.y) / ah,
392
+ (a.y * b.x - a.x * b.y) / ah
389
393
  );
390
394
  }
391
395
 
392
- fn hX(value: vec2f) -> vec2f {
393
- let nJ = length(value);
394
- let sP = sqrt(max(0.0, 0.5 * (nJ + value.x)));
395
- let ff = sqrt(max(0.0, 0.5 * (nJ - value.x)));
396
- return vec2f(sP, select(-ff, ff, value.y >= 0.0));
396
+ fn hV(value: vec2f) -> vec2f {
397
+ let gz = length(value);
398
+ let ui = sqrt(max(0.0, 0.5 * (gz + value.x)));
399
+ let fc = sqrt(max(0.0, 0.5 * (gz - value.x)));
400
+ return vec2f(ui, select(-fc, fc, value.y >= 0.0));
397
401
  }
398
402
 
399
- fn bX(
400
- L: f32,
403
+ fn bR(
404
+ J: f32,
401
405
  av: f32,
402
- ak: vec2f,
403
- qG: bool
406
+ ai: vec2f,
407
+ rH: bool
404
408
  ) -> vec2f {
405
- let oq = sqrt(max(0.0, 1.0 - L * L));
406
- let sA = aZ(vec2f(av, 0.0), ak);
407
- let hA = sA * oq;
408
- var S = hX(
409
- vec2f(1.0, 0.0) - aU(hA, hA)
409
+ let oV = sqrt(max(0.0, 1.0 - J * J));
410
+ let tR = bc(vec2f(av, 0.0), ai);
411
+ let hx = tR * oV;
412
+ var ad = hV(
413
+ vec2f(1.0, 0.0) - aT(hx, hx)
410
414
  );
411
- if (aU(ak, S).y < 0.0) {
412
- S = -S;
413
- }
414
-
415
- let fL = vec2f(av * L, 0.0);
416
- let eB = aU(ak, S);
417
- if (qG) {
418
- let ci = ak * L;
419
- let ce = S * av;
420
- return aZ(
421
- ci - ce,
422
- ci + ce
415
+ if (aT(ai, ad).y < 0.0) {
416
+ ad = -ad;
417
+ }
418
+
419
+ let fL = vec2f(av * J, 0.0);
420
+ let eu = aT(ai, ad);
421
+ if (rH) {
422
+ let bW = ai * J;
423
+ let bT = ad * av;
424
+ return bc(
425
+ bW - bT,
426
+ bW + bT
423
427
  );
424
428
  }
425
- return aZ(
426
- fL - eB,
427
- fL + eB
429
+ return bc(
430
+ fL - eu,
431
+ fL + eu
428
432
  );
429
433
  }
430
434
 
431
- fn eq(
432
- iH: f32,
433
- gN: f32,
434
- oG: f32,
435
- mM: f32,
436
- kf: vec2f,
435
+ fn em(
436
+ iI: f32,
437
+ gJ: f32,
438
+ pk: f32,
439
+ nA: f32,
440
+ ko: vec2f,
437
441
  phase: f32
438
442
  ) -> f32 {
439
- let nq = vec2f(cos(phase), sin(phase));
440
- let ia = aU(kf, nq);
441
- let kO = ia * (gN * mM);
442
- let ap = vec2f(1.0, 0.0) - ia * oG;
443
- let hz = vec2f(iH, 0.0)
444
- + aZ(kO, ap);
445
- return dot(hz, hz);
443
+ let nZ = vec2f(cos(phase), sin(phase));
444
+ let hY = aT(ko, nZ);
445
+ let iF = hY * (gJ * nA);
446
+ let ah = vec2f(1.0, 0.0) - hY * pk;
447
+ let hw = vec2f(iI, 0.0)
448
+ + bc(iF, ah);
449
+ return dot(hw, hw);
446
450
  }
447
451
 
448
- fn ar(
449
- L: f32,
452
+ fn ap(
453
+ J: f32,
450
454
  wavelength: f32,
451
- cn: f32,
452
- aM: f32,
453
- ck: f32,
454
- eu: vec2f
455
+ cf: f32,
456
+ aN: f32,
457
+ bY: f32,
458
+ ep: vec2f
455
459
  ) -> f32 {
456
- let dm = clamp(abs(L), 1e-5, 1.0);
457
- let hu = pow(aM / ck, 2.0)
458
- * (1.0 - dm * dm);
459
- if (hu >= 1.0) {
460
+ let dd = clamp(abs(J), 1e-5, 1.0);
461
+ let hp = pow(aN / bY, 2.0)
462
+ * (1.0 - dd * dd);
463
+ if (hp >= 1.0) {
460
464
  return 1.0;
461
465
  }
462
- let cU = sqrt(1.0 - hu);
463
- let lb = ka(
464
- aM, ck, dm, cU
466
+ let cN = sqrt(1.0 - hp);
467
+ let lq = ki(
468
+ aN, bY, dd, cN
465
469
  );
466
- let la = jZ(
467
- aM, ck, dm, cU
470
+ let lp = kh(
471
+ aN, bY, dd, cN
468
472
  );
469
- let jj = hd(
470
- aM, ck, dm, cU
473
+ let jm = gZ(
474
+ aN, bY, dd, cN
471
475
  );
472
- let ji = hc(
473
- aM, ck, dm, cU
476
+ let jl = gY(
477
+ aN, bY, dd, cN
474
478
  );
475
- let gr = ck * cU
476
- / max(aM * dm, 1e-9);
477
- let phase = 2.0 * PI * (2.0 * ck * cn * cU) / wavelength;
478
- var sb = 0.0;
479
+ let gp = bY * cN
480
+ / max(aN * dd, 1e-9);
481
+ let phase = 2.0 * PI * (2.0 * bY * cf * cN) / wavelength;
482
+ var reflectance = 0.0;
479
483
 
480
- for (var ke = 0u; ke < (rtUniform.loopUnrollGuard >> 1u); ke++) {
481
- let iH = select(lb, la, ke == 1u);
482
- let gN = select(jj, ji, ke == 1u);
483
- let kf = bX(
484
- cU, ck, eu, ke == 1u);
485
- sb += eq(iH, gN,
486
- -iH, gN * gr, kf, phase);
484
+ for (var kn = 0u; kn < (rtUniform.loopUnrollGuard >> 1u); kn++) {
485
+ let iI = select(lq, lp, kn == 1u);
486
+ let gJ = select(jm, jl, kn == 1u);
487
+ let ko = bR(
488
+ cN, bY, ep, kn == 1u);
489
+ reflectance += em(iI, gJ,
490
+ -iI, gJ * gp, ko, phase);
487
491
  }
488
- return clamp(0.5 * sb, 0.0, 1.0);
492
+ return clamp(0.5 * reflectance, 0.0, 1.0);
489
493
  }
490
494
 
491
495
 
492
496
 
493
497
 
494
- fn dU(au: f32, f0: vec3f, tint: vec3f) -> vec3f {
495
- let rk = mix(f0, vec3f(1.0), aE(au));
496
- if (all(tint == vec3f(1.0))) { return rk; }
497
- let dk = 1.0 / 7.0;
498
- let mk = 1.0 - dk;
499
- let fJ = mix(f0, vec3f(1.0), aE(dk));
500
- let di = 1.0 - au;
501
- let qt = au * aE(au) * di
502
- / (dk * pow(mk, 6.0));
503
- return clamp(rk - qt * (fJ - tint * fJ), vec3f(0.0), vec3f(1.0));
498
+ fn openpbr_metal_fresnel(cosine: f32, f0: vec3f, tint: vec3f) -> vec3f {
499
+ let sl = mix(f0, vec3f(1.0), aH(cosine));
500
+ if (all(tint == vec3f(1.0))) { return sl; }
501
+ let da = 1.0 / 7.0;
502
+ let mK = 1.0 - da;
503
+ let fJ = mix(f0, vec3f(1.0), aH(da));
504
+ let cY = 1.0 - cosine;
505
+ let rp = cosine * aH(cosine) * cY
506
+ / (da * pow(mK, 6.0));
507
+ return clamp(sl - rp * (fJ - tint * fJ), vec3f(0.0), vec3f(1.0));
504
508
  }
505
509
 
506
- fn cQ(f0: f32, tp: f32) -> vec2f {
507
- let dN = clamp(f0, 0.0, 0.99);
508
- let gM = sqrt(dN);
509
- let qF = (1.0 - dN) / (1.0 + dN);
510
- let qD = (1.0 + gM) / max(1.0 - gM, 1e-9);
511
- let ior = mix(qD, qF, clamp(tp, 0.0, 1.0));
512
- let jO = (
513
- (ior + 1.0) * (ior + 1.0) * dN
510
+ fn cJ(f0: f32, uS: f32) -> vec2f {
511
+ let dL = clamp(f0, 0.0, 0.99);
512
+ let gI = sqrt(dL);
513
+ let rF = (1.0 - dL) / (1.0 + dL);
514
+ let rC = (1.0 + gI) / max(1.0 - gI, 1e-9);
515
+ let ior = mix(rC, rF, clamp(uS, 0.0, 1.0));
516
+ let jT = (
517
+ (ior + 1.0) * (ior + 1.0) * dL
514
518
  - (ior - 1.0) * (ior - 1.0)
515
- ) / max(1.0 - dN, 1e-9);
516
- return vec2f(ior, sqrt(max(jO, 0.0)));
519
+ ) / max(1.0 - dL, 1e-9);
520
+ return vec2f(ior, sqrt(max(jT, 0.0)));
517
521
  }
518
522
 
519
523
 
520
- fn bN(cn: f32, weight: f32) -> f32 {
521
- return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, cn);
524
+ fn bJ(cf: f32, weight: f32) -> f32 {
525
+ return clamp(weight, 0.0, 1.0) * smoothstep(1e-9, 30.0, cf);
522
526
  }
523
527
 
524
528
 
525
529
 
526
- fn cE(
527
- material: J,
530
+ fn bw(
531
+ material: OpenPbrResolvedMaterial,
528
532
  color: vec3f,
529
533
  viewLocal: vec3f,
530
534
  lightLocal: vec3f,
531
- fu: f32,
535
+ fl: f32,
532
536
  pdf: ptr<function, f32>
533
537
  ) -> vec3f {
534
538
  *pdf = 0.0;
@@ -537,52 +541,52 @@ return vec3f(0.0);
537
541
  }
538
542
 
539
543
  let roughness = material.diffuseRoughness;
540
- let gX = 0.5 - 2.0 / (3.0 * PI);
541
- let oi = 2.0 / 3.0 - 28.0 / (15.0 * PI);
542
- let oA = lightLocal.z;
543
- let mA = viewLocal.z;
544
- let hP = dot(lightLocal, viewLocal) - oA * mA;
545
- let gU = select(
546
- hP,
547
- hP / max(max(oA, mA), 1e-7),
548
- hP > 0.0
544
+ let gS = 0.5 - 2.0 / (3.0 * PI);
545
+ let oR = 2.0 / 3.0 - 28.0 / (15.0 * PI);
546
+ let pe = lightLocal.z;
547
+ let nd = viewLocal.z;
548
+ let directional = dot(lightLocal, viewLocal) - pe * nd;
549
+ let gP = select(
550
+ directional,
551
+ directional / max(max(pe, nd), 1e-7),
552
+ directional > 0.0
549
553
  );
550
- let il = 1.0 / (1.0 + gX * roughness);
551
- let nv = color * INVPI * il
552
- * (1.0 + roughness * gU);
553
-
554
- let dd = 1.0 - oA;
555
- let cP = 1.0 - mA;
556
- let os = dd * (
557
- 0.0571085289 + dd * (
558
- 0.491881867 + dd * (
559
- -0.332181442 + dd * 0.0714429953
554
+ let il = 1.0 / (1.0 + gS * roughness);
555
+ let oe = color * INVPI * il
556
+ * (1.0 + roughness * gP);
557
+
558
+ let cW = 1.0 - pe;
559
+ let outputComplement = 1.0 - nd;
560
+ let oW = cW * (
561
+ 0.0571085289 + cW * (
562
+ 0.491881867 + cW * (
563
+ -0.332181442 + cW * 0.0714429953
560
564
  )
561
565
  )
562
566
  );
563
- let np = cP * (
564
- 0.0571085289 + cP * (
565
- 0.491881867 + cP * (
566
- -0.332181442 + cP * 0.0714429953
567
+ let outputGOverPi = outputComplement * (
568
+ 0.0571085289 + outputComplement * (
569
+ 0.491881867 + outputComplement * (
570
+ -0.332181442 + outputComplement * 0.0714429953
567
571
  )
568
572
  )
569
573
  );
570
- let pv = (1.0 + roughness * os)
571
- / (1.0 + gX * roughness);
572
- let oC = (1.0 + roughness * np)
573
- / (1.0 + gX * roughness);
574
- let fV = il * (1.0 + oi * roughness);
575
- let hF = color * color * fV
576
- / max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - fV));
577
- let lE = hF * INVPI
578
- * max(1e-7, 1.0 - oC)
579
- * max(1e-7, 1.0 - pv)
580
- / max(1e-7, 1.0 - fV);
574
+ let qj = (1.0 + roughness * oW)
575
+ / (1.0 + gS * roughness);
576
+ let outputAlbedo = (1.0 + roughness * outputGOverPi)
577
+ / (1.0 + gS * roughness);
578
+ let fU = il * (1.0 + oR * roughness);
579
+ let hC = color * color * fU
580
+ / max(vec3f(1e-7), vec3f(1.0) - color * (1.0 - fU));
581
+ let lT = hC * INVPI
582
+ * max(1e-7, 1.0 - outputAlbedo)
583
+ * max(1e-7, 1.0 - qj)
584
+ / max(1e-7, 1.0 - fU);
581
585
  *pdf = lightLocal.z * INVPI;
582
- return (nv + lE) * fu;
586
+ return (oe + lT) * fl;
583
587
  }
584
588
 
585
- fn aO(viewCosine: f32, roughness: f32) -> f32 {
589
+ fn aQ(viewCosine: f32, roughness: f32) -> f32 {
586
590
  let x = clamp(viewCosine, 0.0, 1.0);
587
591
  let y = clamp(roughness, 0.01, 1.0);
588
592
  let scale = y * (0.0206607 + 1.58491 * y)
@@ -596,17 +600,17 @@ let gaussian = exp(-0.5 * pow((x - mean) / scale, 2.0))
596
600
  return max(gaussian + offset, 0.0);
597
601
  }
598
602
 
599
- fn jY(
600
- material: J,
603
+ fn kg(
604
+ material: OpenPbrResolvedMaterial,
601
605
  viewLocal: vec3f,
602
606
  lightLocal: vec3f,
603
607
  pdf: ptr<function, f32>
604
608
  ) -> vec3f {
605
609
  *pdf = 0.0;
606
- if (viewLocal.z <= 0.0 || lightLocal.z <= 0.0) {
610
+ if ((viewLocal.z <= 0.0) | (lightLocal.z <= 0.0)) {
607
611
  return vec3f(0.0);
608
612
  }
609
- let albedo = aO(
613
+ let albedo = aQ(
610
614
  viewLocal.z,
611
615
  material.fuzzRoughness
612
616
  );
@@ -614,12 +618,12 @@ material.fuzzRoughness
614
618
  return material.fuzzColor * albedo * INVPI;
615
619
  }
616
620
 
617
- fn am(
618
- material: J,
621
+ fn aj(
622
+ material: OpenPbrResolvedMaterial,
619
623
  viewLocal: vec3f,
620
624
  lightLocal: vec3f,
621
- V: vec3f,
622
- cK: vec3f,
625
+ aa: vec3f,
626
+ fresnel: vec3f,
623
627
  pdf: ptr<function, f32>
624
628
  ) -> vec3f {
625
629
  *pdf = 0.0;
@@ -628,24 +632,24 @@ return vec3f(0.0);
628
632
  }
629
633
 
630
634
  let alpha = vec2f(material.alphaX, material.alphaY);
631
- let distribution = gL(V, alpha);
632
- let jV = bk(viewLocal, alpha);
633
- let ea = jV
634
- * bk(lightLocal, alpha);
635
+ let distribution = sampling_ggx_ndf(aa, alpha);
636
+ let kc = aD(viewLocal, alpha);
637
+ let dY = kc
638
+ * aD(lightLocal, alpha);
635
639
 
636
- *pdf = jV * distribution / (4.0 * max(viewLocal.z, 1e-8));
637
- return cK * distribution * ea
640
+ *pdf = kc * distribution / (4.0 * max(viewLocal.z, 1e-8));
641
+ return fresnel * distribution * dY
638
642
  / (4.0 * max(lightLocal.z * viewLocal.z, 1e-8));
639
643
  }
640
644
 
641
- fn dl(
642
- material: J,
645
+ fn dc(
646
+ material: OpenPbrResolvedMaterial,
643
647
  relativeIor: f32,
644
648
  tint: vec3f,
645
649
  viewLocal: vec3f,
646
650
  lightLocal: vec3f,
647
- V: vec3f,
648
- cK: vec3f,
651
+ aa: vec3f,
652
+ fresnel: vec3f,
649
653
  pdf: ptr<function, f32>
650
654
  ) -> vec3f {
651
655
  *pdf = 0.0;
@@ -653,179 +657,179 @@ if (lightLocal.z >= 0.0) {
653
657
  return vec3f(0.0);
654
658
  }
655
659
 
656
- let kL = dot(lightLocal, V);
657
- let bQ = dot(viewLocal, V);
660
+ let lightHalf = dot(lightLocal, aa);
661
+ let viewHalf = dot(viewLocal, aa);
658
662
 
659
663
 
660
- if (bQ <= 0.0 || kL >= 0.0) {
664
+ if ((viewHalf <= 0.0) | (lightHalf >= 0.0)) {
661
665
  return vec3f(0.0);
662
666
  }
663
667
  let alpha = vec2f(material.alphaX, material.alphaY);
664
- let distribution = gL(V, alpha);
665
- let jV = bk(viewLocal, alpha);
666
- let ea = jV
667
- * bk(lightLocal, alpha);
668
- var ap = kL + bQ * relativeIor;
669
- ap *= ap;
670
- let pJ = abs(kL) / max(ap, 1e-8);
671
- let ju = relativeIor * relativeIor;
672
-
673
- *pdf = jV * max(0.0, bQ) * distribution * pJ
668
+ let distribution = sampling_ggx_ndf(aa, alpha);
669
+ let kc = aD(viewLocal, alpha);
670
+ let dY = kc
671
+ * aD(lightLocal, alpha);
672
+ var ah = lightHalf + viewHalf * relativeIor;
673
+ ah *= ah;
674
+ let qo = abs(lightHalf) / max(ah, 1e-8);
675
+ let jB = relativeIor * relativeIor;
676
+
677
+ *pdf = kc * max(0.0, viewHalf) * distribution * qo
674
678
  / max(viewLocal.z, 1e-8);
675
- return tint * (vec3f(1.0) - cK) * distribution * ea
676
- * abs(bQ) * pJ * ju
679
+ return tint * (vec3f(1.0) - fresnel) * distribution * dY
680
+ * abs(viewHalf) * qo * jB
677
681
  / max(abs(lightLocal.z * viewLocal.z), 1e-8);
678
682
  }
679
683
 
680
- fn bn(material: J) -> vec3f {
681
- if (HAS_MEDIUM && material.mediumType > 0) {
684
+ fn ba(material: OpenPbrResolvedMaterial) -> vec3f {
685
+ if (HAS_MEDIUM & (material.mediumType > 0)) {
682
686
  return vec3f(1.0);
683
687
  }
684
688
  return material.transmissionColor;
685
689
  }
686
690
 
687
- fn cS(ah: f32) -> f32 {
688
- return 2.0 * ah / (1.0 + ah);
691
+ fn cL(ag: f32) -> f32 {
692
+ return 2.0 * ag / (1.0 + ag);
689
693
  }
690
694
 
691
- fn aP(
692
- ah: vec3f,
695
+ fn aq(
696
+ ag: vec3f,
693
697
  transmissionWeight: f32
694
698
  ) -> vec3f {
695
- let gm = 2.0 * ah
696
- / (vec3f(1.0) + ah);
699
+ let gk = 2.0 * ag
700
+ / (vec3f(1.0) + ag);
697
701
  return mix(
698
- ah,
699
- gm,
702
+ ag,
703
+ gk,
700
704
  clamp(transmissionWeight, 0.0, 1.0)
701
705
  );
702
706
  }
703
707
 
704
- fn bG(
705
- material: J,
706
- L: f32,
707
- bu: f32
708
+ fn bF(
709
+ material: OpenPbrResolvedMaterial,
710
+ J: f32,
711
+ bq: f32
708
712
  ) -> vec3f {
709
- let tint = bn(material);
713
+ let tint = ba(material);
710
714
  if (!material.thinWalled) {
711
715
  return tint;
712
716
  }
713
- let iL = max(0.0, 1.0 - L * L);
714
- let dO = iL
715
- / max(bu * bu, 1e-9);
716
- if (dO >= 1.0) {
717
+ let iK = max(0.0, 1.0 - J * J);
718
+ let dM = iK
719
+ / max(bq * bq, 1e-9);
720
+ if (dM >= 1.0) {
717
721
  return vec3f(0.0);
718
722
  }
719
- let S = sqrt(1.0 - dO);
720
- return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(S, 1e-5)));
723
+ let ad = sqrt(1.0 - dM);
724
+ return pow(max(tint, vec3f(0.0)), vec3f(1.0 / max(ad, 1e-5)));
721
725
  }
722
726
 
723
- fn dM(
724
- material: J,
727
+ fn dK(
728
+ material: OpenPbrResolvedMaterial,
725
729
  viewLocal: vec3f,
726
730
  lightLocal: vec3f,
727
731
  pdf: ptr<function, f32>
728
732
  ) -> vec3f {
729
733
  *pdf = 0.0;
730
- if (viewLocal.z <= 0.0 || lightLocal.z >= 0.0) {
734
+ if ((viewLocal.z <= 0.0) | (lightLocal.z >= 0.0)) {
731
735
  return vec3f(0.0);
732
736
  }
733
- let S = -lightLocal.z;
734
- let oe = cu(
737
+ let ad = -lightLocal.z;
738
+ let oO = sampling_dielectric_fresnel(
735
739
  viewLocal.z,
736
740
  material.relativeIor
737
741
  );
738
- *pdf = S * INVPI;
739
- return vec3f(1.0 - oe) * INVPI;
742
+ *pdf = ad * INVPI;
743
+ return vec3f(1.0 - oO) * INVPI;
740
744
  }
741
745
 
742
- fn dR(prepared: ptr<function, ag>) {
746
+ fn dQ(prepared: ptr<function, OpenPbrPreparedBsdf>) {
743
747
 
744
748
 
745
- let nI = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
749
+ let sJ = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
746
750
  var total = (*prepared).probabilities[OPENPBR_LOBE_FUZZ];
747
- for (var hU = 1; hU < nI; hU++) {
748
- total += (*prepared).probabilities[hU];
751
+ for (var lobe = 1; lobe < sJ; lobe++) {
752
+ total += (*prepared).probabilities[lobe];
749
753
  }
750
754
  if (total <= 1e-8) {
751
- for (var hU = 0; hU < nI; hU++) {
752
- (*prepared).probabilities[hU] = 0.0;
755
+ for (var lobe = 0; lobe < sJ; lobe++) {
756
+ (*prepared).probabilities[lobe] = 0.0;
753
757
  }
754
758
  return;
755
759
  }
756
- let ov = 1.0 / total;
757
- for (var hU = 0; hU < nI; hU++) {
758
- (*prepared).probabilities[hU] *= ov;
760
+ let oZ = 1.0 / total;
761
+ for (var lobe = 0; lobe < sJ; lobe++) {
762
+ (*prepared).probabilities[lobe] *= oZ;
759
763
  }
760
764
  }
761
765
 
762
766
 
763
767
 
764
- fn bM(eta: f32) -> f32 {
768
+ fn bI(eta: f32) -> f32 {
765
769
  if (abs(eta - 1.0) < 1e-6) { return 0.0; }
766
770
  if (eta > 1.0) { return (eta - 1.0) / (4.08567 + 1.00071 * eta); }
767
771
  return 0.997118 + 0.1014 * eta - 0.965241 * eta * eta - 0.130607 * eta * eta * eta;
768
772
  }
769
773
 
770
- fn bP(f0: vec3f, tint: vec3f) -> vec3f {
771
- let dk = 1.0 / 7.0;
772
- let fJ = mix(f0, vec3f(1.0), aE(dk));
773
- let b = fJ * (vec3f(1.0) - tint) / (dk * pow(1.0 - dk, 6.0));
774
+ fn bL(f0: vec3f, tint: vec3f) -> vec3f {
775
+ let da = 1.0 / 7.0;
776
+ let fJ = mix(f0, vec3f(1.0), aH(da));
777
+ let b = fJ * (vec3f(1.0) - tint) / (da * pow(1.0 - da, 6.0));
774
778
  return clamp(f0 + (vec3f(1.0) - f0) / 21.0 - b / 126.0, vec3f(0.0), vec3f(1.0));
775
779
  }
776
780
 
777
781
 
778
782
 
779
- fn cD(material: J, au: f32) -> vec3f {
780
- if (au <= 0.0) { return vec3f(1.0); }
781
- let lG = sqrt(max(0.0, 1.0 - (1.0 - au * au) / (material.coatIor * material.coatIor)));
782
- let tD = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(lG, 1e-5)));
783
- return mix(vec3f(1.0), tD, material.coatWeight);
783
+ fn cA(material: OpenPbrResolvedMaterial, cosine: f32) -> vec3f {
784
+ if (cosine <= 0.0) { return vec3f(1.0); }
785
+ let lV = sqrt(max(0.0, 1.0 - (1.0 - cosine * cosine) / (material.coatIor * material.coatIor)));
786
+ let uZ = pow(max(material.coatColor, vec3f(0.0)), vec3f(0.5 / max(lV, 1e-5)));
787
+ return mix(vec3f(1.0), uZ, material.coatWeight);
784
788
  }
785
789
 
786
- fn gq(material: J, au: f32) -> f32 {
790
+ fn gn(material: OpenPbrResolvedMaterial, cosine: f32) -> f32 {
787
791
  if (material.coatRoughness <= ROUGHNESS_MIN) {
788
- return af(au, 1.0 / material.coatIor);
792
+ return ae(cosine, 1.0 / material.coatIor);
789
793
  }
790
794
 
791
795
 
792
- return clamp(1.0 - aJ(material.coatIor,
793
- material.coatRoughness * material.coatRoughness, au), 0.0, 1.0);
796
+ return clamp(1.0 - ar(material.coatIor,
797
+ material.coatRoughness * material.coatRoughness, cosine), 0.0, 1.0);
794
798
  }
795
799
 
796
- fn hb(prepared: ag) -> vec3f {
800
+ fn gX(prepared: OpenPbrPreparedBsdf) -> vec3f {
797
801
  let material = prepared.material;
798
802
  let dielectric = 1.0 - material.baseMetalness;
799
803
  let opaque = dielectric * (1.0 - material.transmissionWeight) * (1.0 - material.subsurfaceWeight);
800
804
  let sss = dielectric * (1.0 - material.transmissionWeight) * material.subsurfaceWeight;
801
- let ug = dielectric * material.transmissionWeight;
802
- let fP = bM(prepared.specularEtaTOverEtaI);
803
- let kU = bM(1.0 / prepared.transmissionReflectionIor);
804
- let pR = clamp(opaque * fP + (sss + ug) * kU + material.baseMetalness, 0.0, 1.0);
805
- let jp = mix(1.0, material.specularRoughness, pR);
806
- let ks = bM(material.coatIor);
805
+ let vU = dielectric * material.transmissionWeight;
806
+ let fP = bI(prepared.specularEtaTOverEtaI);
807
+ let lg = bI(1.0 / prepared.transmissionReflectionIor);
808
+ let qA = clamp(opaque * fP + (sss + vU) * lg + material.baseMetalness, 0.0, 1.0);
809
+ let jt = mix(1.0, material.specularRoughness, qA);
810
+ let ks = bI(material.coatIor);
807
811
  let kr = 1.0 - (1.0 - ks) / (material.coatIor * material.coatIor);
808
- let k = mix(ks, kr, jp);
809
- let eb = material.baseMetalness * material.specularWeight * bP(material.baseWeight * material.baseColor, material.specularColor)
812
+ let k = mix(ks, kr, jt);
813
+ let eb = material.baseMetalness * material.specularWeight * bL(material.baseWeight * material.baseColor, material.specularColor)
810
814
  + opaque * mix(material.baseWeight * material.baseColor, vec3f(1.0), fP)
811
- + sss * material.subsurfaceColor + vec3f(ug);
812
- let qU = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
813
- return mix(vec3f(1.0), qU, material.coatWeight * material.coatDarkening);
815
+ + sss * material.subsurfaceColor + vec3f(vU);
816
+ let rV = vec3f(1.0 - k) / max(vec3f(1.0) - eb * k, vec3f(1e-6));
817
+ return mix(vec3f(1.0), rV, material.coatWeight * material.coatDarkening);
814
818
  }
815
819
 
816
- fn ds(prepared: ag, lm: f32) -> vec3f {
820
+ fn cm(prepared: OpenPbrPreparedBsdf, lF: f32) -> vec3f {
817
821
  if (prepared.material.coatWeight <= 0.0) { return vec3f(1.0); }
818
822
  if (prepared.material.inside) {
819
823
 
820
- return cD(prepared.material, -lm);
824
+ return cA(prepared.material, -lF);
821
825
  }
822
826
 
823
- return prepared.coatBaseScale * cD(prepared.material, lm);
827
+ return prepared.coatBaseScale * cA(prepared.material, lF);
824
828
  }
825
829
 
826
830
 
827
831
  ${hasAnisotropyDirections ? /* wgsl */ `
828
- fn du(fallback: bj, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> bj {
832
+ fn dk(fallback: OpenPbrBasis, tangent: vec3f, bitangent: vec3f, direction: vec2f) -> OpenPbrBasis {
829
833
  var t = tangent - fallback.normal * dot(fallback.normal, tangent);
830
834
  if (dot(t, t) < 1e-8) { t = fallback.tangent; }
831
835
  t = normalize(t);
@@ -840,15 +844,15 @@ return basis;
840
844
  }
841
845
 
842
846
  ` : /* wgsl */ ``}
843
- fn eH(
847
+ fn bV(
844
848
  tangent: vec3f,
845
- material: J,
846
- bF: vec3f,
849
+ material: OpenPbrResolvedMaterial,
850
+ bD: vec3f,
847
851
  normal: vec3f
848
- ) -> ag {
849
- var prepared: ag;
852
+ ) -> OpenPbrPreparedBsdf {
853
+ var prepared: OpenPbrPreparedBsdf;
850
854
  prepared.material = material;
851
- prepared.basis = fj(
855
+ prepared.basis = ff(
852
856
  tangent,
853
857
  normal,
854
858
  max(material.specularAnisotropy, material.coatAnisotropy)
@@ -860,39 +864,39 @@ ${hasCoatNormals ? /* wgsl */ `
860
864
 
861
865
 
862
866
  if (material.coatNormalEnabled) {
863
- prepared.coatBasis = fj(material.geometryTangent, material.coatNormal, material.coatAnisotropy);
867
+ prepared.coatBasis = ff(material.geometryTangent, material.coatNormal, material.coatAnisotropy);
864
868
  prepared.directionFrames = true;
865
869
  }
866
870
  ` : ''}
867
- if (material.specularAnisotropy > 0.0 && material.anisotropyDirectionEnabled) {
868
- prepared.basis = du(prepared.basis, material.directionTangent, material.directionBitangent, material.anisotropyDirection);
871
+ if ((material.specularAnisotropy > 0.0) & material.anisotropyDirectionEnabled) {
872
+ prepared.basis = dk(prepared.basis, material.directionTangent, material.directionBitangent, material.anisotropyDirection);
869
873
  prepared.directionFrames = true;
870
874
  }
871
- if (material.coatAnisotropy > 0.0 && material.coatAnisotropyRotation != 0.0) {
872
- prepared.coatBasis = du(prepared.coatBasis, material.geometryTangent, material.geometryBitangent, vec2f(cos(material.coatAnisotropyRotation), sin(material.coatAnisotropyRotation)));
875
+ if ((material.coatAnisotropy > 0.0) & (material.coatAnisotropyRotation != 0.0)) {
876
+ prepared.coatBasis = dk(prepared.coatBasis, material.geometryTangent, material.geometryBitangent, vec2f(cos(material.coatAnisotropyRotation), sin(material.coatAnisotropyRotation)));
873
877
  prepared.directionFrames = true;
874
878
  }
875
879
  ` : /* wgsl */ ``}
876
- prepared.viewLocal = openpbr_to_local(prepared.basis, bF);
877
- ${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bF);` : ''}
880
+ prepared.viewLocal = openpbr_to_local(prepared.basis, bD);
881
+ ${hasCoatNormals ? /* wgsl */ ` prepared.coatViewLocal = openpbr_to_local(prepared.coatBasis, bD);` : ''}
878
882
  prepared.diffuseColor = material.baseColor;
879
883
 
880
- let cB = 1.0 - material.baseMetalness;
881
- let dL = cB
884
+ let cu = 1.0 - material.baseMetalness;
885
+ let dJ = cu
882
886
  * (1.0 - material.transmissionWeight);
883
887
  prepared.weights[OPENPBR_LOBE_FUZZ] = material.fuzzWeight;
884
888
  prepared.weights[OPENPBR_LOBE_COAT] = material.coatWeight;
885
889
  if (material.inside) { prepared.weights[OPENPBR_LOBE_COAT] = 0.0; }
886
890
  prepared.weights[OPENPBR_LOBE_METAL] = material.baseMetalness;
887
- prepared.weights[OPENPBR_LOBE_SPECULAR] = cB;
888
- prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cB
891
+ prepared.weights[OPENPBR_LOBE_SPECULAR] = cu;
892
+ prepared.weights[OPENPBR_LOBE_TRANSMISSION] = cu
889
893
  * material.transmissionWeight;
890
- prepared.weights[OPENPBR_LOBE_DIFFUSE] = dL
894
+ prepared.weights[OPENPBR_LOBE_DIFFUSE] = dJ
891
895
  * (1.0 - material.subsurfaceWeight) * material.baseWeight;
892
- prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dL
896
+ prepared.weights[OPENPBR_LOBE_SUBSURFACE] = dJ
893
897
  * material.subsurfaceWeight;
894
898
 
895
- prepared.specularEtaTOverEtaI = aY(
899
+ prepared.specularEtaTOverEtaI = bb(
896
900
  1.0 / material.relativeIor,
897
901
  material.specularWeight
898
902
  );
@@ -902,20 +906,20 @@ prepared.transmissionReflectionIor = prepared.material.relativeIor;
902
906
 
903
907
 
904
908
  if (material.coatWeight > 0.0) {
905
- var cj = 1.0;
906
- if (!material.inside) { cj = mix(1.0, material.coatIor, material.coatWeight); }
907
- let bq = cj * aY(
908
- material.specularIor / cj, material.specularWeight);
909
- var er = bq / cj;
910
- if (cj > bq && bq >= 1.0) {
911
- er = 1.0 / er;
912
- }
913
- prepared.specularEtaTOverEtaI = er;
914
- prepared.transmissionReflectionIor = 1.0 / er;
915
- prepared.refractionEtaTOverEtaI = bq;
909
+ var bX = 1.0;
910
+ if (!material.inside) { bX = mix(1.0, material.coatIor, material.coatWeight); }
911
+ let bn = bX * bb(
912
+ material.specularIor / bX, material.specularWeight);
913
+ var eo = bn / bX;
914
+ if ((bX > bn) & (bn >= 1.0)) {
915
+ eo = 1.0 / eo;
916
+ }
917
+ prepared.specularEtaTOverEtaI = eo;
918
+ prepared.transmissionReflectionIor = 1.0 / eo;
919
+ prepared.refractionEtaTOverEtaI = bn;
916
920
  if (material.inside) {
917
- prepared.refractionEtaTOverEtaI = 1.0 / bq;
918
- prepared.transmissionReflectionIor = bq;
921
+ prepared.refractionEtaTOverEtaI = 1.0 / bn;
922
+ prepared.transmissionReflectionIor = bn;
919
923
  }
920
924
  prepared.material.relativeIor = 1.0 / prepared.refractionEtaTOverEtaI;
921
925
  }
@@ -937,82 +941,82 @@ prepared.thinFilmBaseIor = prepared.refractionEtaTOverEtaI;
937
941
  prepared.specularAlpha = material.specularRoughness
938
942
  * material.specularRoughness;
939
943
  let viewCosine = abs(prepared.viewLocal.z);
940
- let ah = af(
944
+ let ag = ae(
941
945
  viewCosine,
942
946
  1.0 / prepared.specularEtaTOverEtaI
943
947
  );
944
- let fA = material.specularColor * select(
945
- ah,
948
+ let fu = material.specularColor * select(
949
+ ag,
946
950
  mix(
947
- ah,
948
- cS(ah),
951
+ ag,
952
+ cL(ag),
949
953
  material.transmissionWeight
950
954
  ),
951
955
  material.thinWalled
952
956
  );
953
- let hV = material.specularWeight * dU(
957
+ let hS = material.specularWeight * openpbr_metal_fresnel(
954
958
  viewCosine,
955
959
  material.baseWeight * material.baseColor,
956
960
  material.specularColor
957
961
  );
958
- let eO = select(
959
- af(viewCosine, prepared.transmissionReflectionIor),
960
- cS(af(viewCosine, prepared.transmissionReflectionIor)),
962
+ let eI = select(
963
+ ae(viewCosine, prepared.transmissionReflectionIor),
964
+ cL(ae(viewCosine, prepared.transmissionReflectionIor)),
961
965
  material.thinWalled
962
966
  );
963
- let gO = bG(
967
+ let gK = bF(
964
968
  material,
965
969
  viewCosine,
966
970
  prepared.refractionEtaTOverEtaI
967
971
  );
968
- let iu = aJ(
972
+ let ir = ar(
969
973
  prepared.specularEtaTOverEtaI,
970
974
  prepared.specularAlpha,
971
975
  viewCosine
972
976
  );
973
- let gs = cr(
977
+ let gq = cj(
974
978
  prepared.specularEtaTOverEtaI,
975
979
  prepared.specularAlpha
976
980
  );
977
- prepared.diffuseSpecularEnergyCompensation = iu
978
- / max(gs, 1e-12);
981
+ prepared.diffuseSpecularEnergyCompensation = ir
982
+ / max(gq, 1e-12);
979
983
 
980
984
  prepared.probabilities[OPENPBR_LOBE_FUZZ] = prepared.weights[OPENPBR_LOBE_FUZZ]
981
- * aw(material.fuzzColor)
982
- * max(aO(
985
+ * aB(material.fuzzColor)
986
+ * max(aQ(
983
987
  viewCosine,
984
988
  material.fuzzRoughness
985
989
  ), 0.02);
986
990
  prepared.probabilities[OPENPBR_LOBE_COAT] = 0.0;
987
991
  prepared.coatBaseScale = vec3f(1.0);
988
- if (material.coatWeight > 0.0 && !material.inside) {
992
+ if ((material.coatWeight > 0.0) & !material.inside) {
989
993
  ${hasCoatNormals ? /* wgsl */ `let coatViewCosine = select(viewCosine, max(prepared.coatViewLocal.z, 0.0), material.coatNormalEnabled);` : ''}
990
- let kB = gq(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
991
- prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kB;
992
- prepared.coatBaseScale = cD(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
993
- * (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kB) * hb(prepared);
994
+ let kO = gn(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'});
995
+ prepared.probabilities[OPENPBR_LOBE_COAT] = prepared.weights[OPENPBR_LOBE_COAT] * kO;
996
+ prepared.coatBaseScale = cA(material, ${hasCoatNormals ? 'coatViewCosine' : 'viewCosine'})
997
+ * (1.0 - prepared.weights[OPENPBR_LOBE_COAT] * kO) * gX(prepared);
994
998
  }
995
999
  prepared.probabilities[OPENPBR_LOBE_METAL] = prepared.weights[OPENPBR_LOBE_METAL]
996
- * aw(hV);
1000
+ * aB(hS);
997
1001
  prepared.metalMsScale = vec3f(0.0);
998
1002
  prepared.metalMsFactor = 0.0;
999
1003
  prepared.metalMsProbability = 0.0;
1000
1004
 
1001
1005
 
1002
- if (material.specularRoughness >= 0.04 && prepared.weights[OPENPBR_LOBE_METAL] > 0.0) {
1003
- let hL = bP(material.baseWeight * material.baseColor, material.specularColor);
1004
- prepared.metalMsScale = material.specularWeight * hL * hL;
1005
- let pV = bH(prepared.specularAlpha, viewCosine);
1006
- prepared.metalMsFactor = pV / max(cv(prepared.specularAlpha), 1e-12);
1007
- let fi = prepared.weights[OPENPBR_LOBE_METAL] * aw(prepared.metalMsScale) * pV;
1008
- prepared.probabilities[OPENPBR_LOBE_METAL] += fi;
1009
- prepared.metalMsProbability = fi / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1006
+ if ((material.specularRoughness >= 0.04) & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0)) {
1007
+ let hI = bL(material.baseWeight * material.baseColor, material.specularColor);
1008
+ prepared.metalMsScale = material.specularWeight * hI * hI;
1009
+ let qF = aR(prepared.specularAlpha, viewCosine);
1010
+ prepared.metalMsFactor = qF / max(cl(prepared.specularAlpha), 1e-12);
1011
+ let fe = prepared.weights[OPENPBR_LOBE_METAL] * aB(prepared.metalMsScale) * qF;
1012
+ prepared.probabilities[OPENPBR_LOBE_METAL] += fe;
1013
+ prepared.metalMsProbability = fe / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1010
1014
  }
1011
1015
  prepared.probabilities[OPENPBR_LOBE_SPECULAR] = prepared.weights[OPENPBR_LOBE_SPECULAR]
1012
- * aw(fA);
1016
+ * aB(fu);
1013
1017
  prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] = prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1014
- * (1.0 - eO)
1015
- * aw(gO);
1018
+ * (1.0 - eI)
1019
+ * aB(gK);
1016
1020
 
1017
1021
 
1018
1022
 
@@ -1024,62 +1028,62 @@ prepared.dielectricMsTransmissionScale = vec3f(0.0);
1024
1028
  prepared.dielectricMsViewLoss = 0.0;
1025
1029
  prepared.dielectricMsReflectionRatio = 0.0;
1026
1030
  prepared.dielectricMsProbability = 0.0;
1027
- if (!material.thinWalled && material.transmissionWeight > 0.0 &&
1028
- prepared.specularAlpha >= 0.0016 && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 &&
1029
- abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6) {
1030
- let lF = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
1031
- prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * lF;
1032
- prepared.dielectricMsTransmissionScale = gO * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1031
+ if (!material.thinWalled & (material.transmissionWeight > 0.0) &
1032
+ (prepared.specularAlpha >= 0.0016) & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) &
1033
+ (abs(prepared.refractionEtaTOverEtaI - 1.0) > 1e-6)) {
1034
+ let lU = prepared.weights[OPENPBR_LOBE_TRANSMISSION] + prepared.weights[OPENPBR_LOBE_SUBSURFACE];
1035
+ prepared.dielectricMsReflectionScale = select(material.specularColor, vec3f(1.0), material.inside) * lU;
1036
+ prepared.dielectricMsTransmissionScale = gK * prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1033
1037
  + vec3f(prepared.weights[OPENPBR_LOBE_SUBSURFACE]);
1034
- prepared.dielectricMsReflectionRatio = ch(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
1035
- prepared.dielectricMsViewLoss = bO(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
1036
- let nV = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
1037
- let fi = aw(nV) * prepared.dielectricMsViewLoss;
1038
- prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fi;
1039
- prepared.dielectricMsProbability = fi / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1038
+ prepared.dielectricMsReflectionRatio = bU(prepared.refractionEtaTOverEtaI, prepared.specularAlpha);
1039
+ prepared.dielectricMsViewLoss = aV(prepared.refractionEtaTOverEtaI, prepared.specularAlpha, viewCosine);
1040
+ let oG = mix(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, prepared.dielectricMsReflectionRatio);
1041
+ let fe = aB(oG) * prepared.dielectricMsViewLoss;
1042
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] += fe;
1043
+ prepared.dielectricMsProbability = fe / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1040
1044
  }
1041
1045
  prepared.probabilities[OPENPBR_LOBE_DIFFUSE] = prepared.weights[OPENPBR_LOBE_DIFFUSE]
1042
- * aw(prepared.diffuseColor)
1046
+ * aB(prepared.diffuseColor)
1043
1047
  * prepared.diffuseSpecularEnergyCompensation;
1044
1048
  prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] = prepared.weights[OPENPBR_LOBE_SUBSURFACE]
1045
- * (1.0 - eO)
1046
- * aw(material.subsurfaceColor)
1049
+ * (1.0 - eI)
1050
+ * aB(material.subsurfaceColor)
1047
1051
  * prepared.diffuseSpecularEnergyCompensation;
1048
1052
 
1049
1053
 
1050
- if (material.coatWeight > 0.0 && HAS_THIN_FILM && material.thinFilmWeight > 0.0) {
1051
- let lj = 0.02 * bN(material.thinFilmThickness, material.thinFilmWeight);
1052
- prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * lj);
1053
- prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lj);
1054
+ if ((material.coatWeight > 0.0) & HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
1055
+ let lD = 0.02 * bJ(material.thinFilmThickness, material.thinFilmWeight);
1056
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] = max(prepared.probabilities[OPENPBR_LOBE_SPECULAR], prepared.weights[OPENPBR_LOBE_SPECULAR] * lD);
1057
+ prepared.probabilities[OPENPBR_LOBE_METAL] = max(prepared.probabilities[OPENPBR_LOBE_METAL], prepared.weights[OPENPBR_LOBE_METAL] * material.specularWeight * lD);
1054
1058
  }
1055
- if (material.coatWeight > 0.0 && !material.inside) {
1056
- let gt = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
1057
- prepared.probabilities[OPENPBR_LOBE_METAL] *= gt;
1058
- prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gt;
1059
- prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gt;
1060
- prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gt;
1061
- prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gt;
1059
+ if ((material.coatWeight > 0.0) & !material.inside) {
1060
+ let gr = max(max(prepared.coatBaseScale.x, prepared.coatBaseScale.y), prepared.coatBaseScale.z);
1061
+ prepared.probabilities[OPENPBR_LOBE_METAL] *= gr;
1062
+ prepared.probabilities[OPENPBR_LOBE_SPECULAR] *= gr;
1063
+ prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] *= gr;
1064
+ prepared.probabilities[OPENPBR_LOBE_DIFFUSE] *= gr;
1065
+ prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] *= gr;
1062
1066
  }
1063
- dR(&prepared);
1067
+ dQ(&prepared);
1064
1068
  return prepared;
1065
1069
  }
1066
1070
 
1067
1071
 
1068
- fn cR(prepared: ag, au: f32, reflection: bool) -> f32 {
1072
+ fn cK(prepared: OpenPbrPreparedBsdf, cosine: f32, reflection: bool) -> f32 {
1069
1073
  if (prepared.material.coatWeight <= 0.0) {
1070
- return af(au, prepared.material.relativeIor);
1074
+ return ae(cosine, prepared.material.relativeIor);
1071
1075
  }
1072
- let kp = af(au, prepared.transmissionReflectionIor);
1073
- if (!reflection) { return kp; }
1074
- let nk = af(au, 1.0 / prepared.specularEtaTOverEtaI);
1075
- let rP = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
1076
- return mix(nk, kp, rP);
1076
+ let kA = ae(cosine, prepared.transmissionReflectionIor);
1077
+ if (!reflection) { return kA; }
1078
+ let nY = ae(cosine, 1.0 / prepared.specularEtaTOverEtaI);
1079
+ let sN = prepared.material.transmissionWeight + (1.0 - prepared.material.transmissionWeight) * prepared.material.subsurfaceWeight;
1080
+ return mix(nY, kA, sN);
1077
1081
  }
1078
1082
 
1079
- fn mD(
1080
- prepared: ag,
1083
+ fn nh(
1084
+ prepared: OpenPbrPreparedBsdf,
1081
1085
  lightDirection: vec3f,
1082
- gP: i32,
1086
+ gL: i32,
1083
1087
  pdf: ptr<function, f32>
1084
1088
  ) -> vec3f {
1085
1089
  let material = prepared.material;
@@ -1090,78 +1094,76 @@ ${hasCoatNormals ? /* wgsl */ `
1090
1094
  let independentCoat = material.coatNormalEnabled;
1091
1095
  let geometricReflection = dot(material.geometricNormal, lightDirection) > 0.0;
1092
1096
  let coatLightCosine = dot(prepared.coatBasis.normal, lightDirection);
1093
- let coatReflection = geometricReflection && prepared.coatViewLocal.z > 0.0 && coatLightCosine > 0.0;
1097
+ let coatReflection = geometricReflection & (prepared.coatViewLocal.z > 0.0) & (coatLightCosine > 0.0);
1094
1098
  ` : ''}
1095
1099
 
1096
- var V: vec3f;
1100
+ var aa: vec3f;
1097
1101
  if (reflection) {
1098
- V = normalize(lightLocal + viewLocal);
1102
+ aa = normalize(lightLocal + viewLocal);
1099
1103
  }
1100
1104
  else {
1101
- V = normalize(lightLocal + viewLocal * material.relativeIor);
1105
+ aa = normalize(lightLocal + viewLocal * material.relativeIor);
1102
1106
  }
1103
- if (V.z < 0.0) {
1104
- V = -V;
1107
+ if (aa.z < 0.0) {
1108
+ aa = -aa;
1105
1109
  }
1106
1110
 
1107
1111
  var response = vec3f(0.0);
1108
1112
  *pdf = 0.0;
1109
- var aI = 0.0;
1110
- let me = gP < 0;
1111
- let uN = me || gP == OPENPBR_LOBE_FUZZ;
1112
- let tc = me || gP == OPENPBR_LOBE_COAT;
1113
- let sg = me || gP == OPENPBR_LOBE_METAL;
1114
- let qf = me || gP == OPENPBR_LOBE_SPECULAR;
1115
- let jG = me ||
1116
- gP == OPENPBR_LOBE_TRANSMISSION;
1117
- let th = me || gP == OPENPBR_LOBE_DIFFUSE;
1118
- let oT = me ||
1119
- gP == OPENPBR_LOBE_SUBSURFACE;
1120
- let bQ = abs(dot(viewLocal, V));
1121
-
1122
-
1123
-
1124
- var df = V;
1125
- var jn = bQ;
1126
- if (!reflection && material.thinWalled) {
1127
- df = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
1128
- if (df.z < 0.0) { df = -df; }
1129
- jn = abs(dot(viewLocal, df));
1130
- }
1131
- let mo =
1132
- (reflection && prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0 && qf) ||
1133
- (!reflection && prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 && jG);
1134
- let qj = reflection && prepared.weights[OPENPBR_LOBE_METAL] > 0.0 && sg;
1135
- var nD: array<vec3f, 2>;
1136
- if (mo) {
1137
- nD[0] = vec3f(cR(prepared, jn, reflection));
1138
- }
1139
- if (qj) {
1140
- nD[1] = dU(bQ, material.baseWeight * material.baseColor, material.specularColor);
1141
- }
1142
- if (HAS_THIN_FILM && material.thinFilmWeight > 0.0) {
1143
- let wavelengths = vec3f(620.0, 540.0, 450.0);
1144
-
1145
- for (var kT = 0u; kT < (rtUniform.loopUnrollGuard >> 1u); kT++) {
1146
- if (!select(mo, qj, kT == 1u)) { continue; }
1147
- var wp = vec3f(0.0);
1148
- let L = select(jn, bQ, kT == 1u);
1113
+ var lobePdf = 0.0;
1114
+ let mA = gL < 0;
1115
+ let wP = mA | (gL == OPENPBR_LOBE_FUZZ);
1116
+ let uE = mA | (gL == OPENPBR_LOBE_COAT);
1117
+ let tn = mA | (gL == OPENPBR_LOBE_METAL);
1118
+ let qW = mA | (gL == OPENPBR_LOBE_SPECULAR);
1119
+ let jJ = mA | (gL == OPENPBR_LOBE_TRANSMISSION);
1120
+ let uJ = mA | (gL == OPENPBR_LOBE_DIFFUSE);
1121
+ let pG = mA | (gL == OPENPBR_LOBE_SUBSURFACE);
1122
+ let viewHalf = abs(dot(viewLocal, aa));
1123
+
1124
+
1125
+
1126
+ var thinWallHalf = aa;
1127
+ var dielectricViewHalf = viewHalf;
1128
+ if (!reflection & material.thinWalled) {
1129
+ thinWallHalf = normalize(vec3f(lightLocal.xy, -lightLocal.z) + viewLocal);
1130
+ if (thinWallHalf.z < 0.0) { thinWallHalf = -thinWallHalf; }
1131
+ dielectricViewHalf = abs(dot(viewLocal, thinWallHalf));
1132
+ }
1133
+ let mP =
1134
+ (reflection & (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & qW) |
1135
+ (!reflection & (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & jJ);
1136
+ let ra = reflection & (prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn;
1137
+ var oq: array<vec3f, 2>;
1138
+ if (mP) {
1139
+ oq[0] = vec3f(cK(prepared, dielectricViewHalf, reflection));
1140
+ }
1141
+ if (ra) {
1142
+ oq[1] = openpbr_metal_fresnel(viewHalf, material.baseWeight * material.baseColor, material.specularColor);
1143
+ }
1144
+ if (HAS_THIN_FILM & (material.thinFilmWeight > 0.0)) {
1145
+ let vV = vec3f(620.0, 540.0, 450.0);
1146
+
1147
+ for (var lf = 0u; lf < (rtUniform.loopUnrollGuard >> 1u); lf++) {
1148
+ if (!select(mP, ra, lf == 1u)) { continue; }
1149
+ var wY = vec3f(0.0);
1150
+ let J = select(dielectricViewHalf, viewHalf, lf == 1u);
1149
1151
  for (var channel = 0u; channel + 1u < rtUniform.loopUnrollGuard; channel++) {
1150
1152
  var ior = vec2f(prepared.thinFilmBaseIor, 0.0);
1151
- if (kT == 1u) {
1152
- ior = cQ(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
1153
+ if (lf == 1u) {
1154
+ ior = cJ(material.baseWeight * material.baseColor[channel], material.specularColor[channel]);
1153
1155
  }
1154
- wp[channel] = ar(L,
1155
- wavelengths[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
1156
+ wY[channel] = ap(J,
1157
+ vV[channel], material.thinFilmThickness, prepared.thinFilmExteriorIor, material.thinFilmIor, ior);
1156
1158
  }
1157
- nD[kT] = mix(nD[kT], wp,
1158
- bN(material.thinFilmThickness, material.thinFilmWeight));
1159
+ oq[lf] = mix(oq[lf], wY,
1160
+ bJ(material.thinFilmThickness, material.thinFilmWeight));
1159
1161
  }
1160
1162
  }
1161
- let ei = nD[0];
1163
+ let ef = oq[0];
1162
1164
  let diffuseSpecularEnergyCompensation =
1163
1165
  prepared.diffuseSpecularEnergyCompensation
1164
- * aJ(
1166
+ * ar(
1165
1167
  prepared.specularEtaTOverEtaI,
1166
1168
  prepared.specularAlpha,
1167
1169
  abs(lightLocal.z)
@@ -1169,160 +1171,159 @@ abs(lightLocal.z)
1169
1171
 
1170
1172
  ${hasCoatNormals ? /* wgsl */ `
1171
1173
 
1172
- if (!independentCoat || (lightLocal.z != 0.0 && reflection == geometricReflection)) {
1174
+ if (!independentCoat | ((lightLocal.z != 0.0) & (reflection == geometricReflection))) {
1173
1175
  ` : ''}
1174
1176
  if (reflection) {
1175
- if (prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0 && th) {
1176
- response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * cE(
1177
+ if ((prepared.weights[OPENPBR_LOBE_DIFFUSE] > 0.0) & uJ) {
1178
+ response += prepared.weights[OPENPBR_LOBE_DIFFUSE] * bw(
1177
1179
  material,
1178
1180
  prepared.diffuseColor,
1179
1181
  viewLocal,
1180
1182
  lightLocal,
1181
1183
  diffuseSpecularEnergyCompensation,
1182
- &aI
1184
+ &lobePdf
1183
1185
  );
1184
- *pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * aI;
1186
+ *pdf += prepared.probabilities[OPENPBR_LOBE_DIFFUSE] * lobePdf;
1185
1187
  }
1186
1188
 
1187
- if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 && material.thinWalled &&
1188
- oT) {
1189
- response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * cE(
1189
+ if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & material.thinWalled & pG) {
1190
+ response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE] * bw(
1190
1191
  material,
1191
1192
  material.subsurfaceColor,
1192
1193
  viewLocal,
1193
1194
  lightLocal,
1194
1195
  diffuseSpecularEnergyCompensation,
1195
- &aI
1196
+ &lobePdf
1196
1197
  );
1197
- *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * aI;
1198
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * 0.5 * lobePdf;
1198
1199
  }
1199
1200
 
1200
- if (prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0 && qf) {
1201
- var ct = ei;
1201
+ if ((prepared.weights[OPENPBR_LOBE_SPECULAR] > 0.0) & qW) {
1202
+ var ck = ef;
1202
1203
  if (material.thinWalled) {
1203
- ct = aP(
1204
- ct,
1204
+ ck = aq(
1205
+ ck,
1205
1206
  material.transmissionWeight
1206
1207
  );
1207
1208
  }
1208
- let cK = material.specularColor * ct;
1209
- response += prepared.weights[OPENPBR_LOBE_SPECULAR] * am(
1209
+ let fresnel = material.specularColor * ck;
1210
+ response += prepared.weights[OPENPBR_LOBE_SPECULAR] * aj(
1210
1211
  material,
1211
1212
  viewLocal,
1212
1213
  lightLocal,
1213
- V,
1214
- cK,
1215
- &aI
1214
+ aa,
1215
+ fresnel,
1216
+ &lobePdf
1216
1217
  );
1217
- *pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * aI;
1218
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SPECULAR] * lobePdf;
1218
1219
  }
1219
1220
 
1220
- if (prepared.weights[OPENPBR_LOBE_METAL] > 0.0 && sg) {
1221
- let cK = material.specularWeight * nD[1];
1222
- response += prepared.weights[OPENPBR_LOBE_METAL] * am(
1221
+ if ((prepared.weights[OPENPBR_LOBE_METAL] > 0.0) & tn) {
1222
+ let fresnel = material.specularWeight * oq[1];
1223
+ response += prepared.weights[OPENPBR_LOBE_METAL] * aj(
1223
1224
  material,
1224
1225
  viewLocal,
1225
1226
  lightLocal,
1226
- V,
1227
- cK,
1228
- &aI
1227
+ aa,
1228
+ fresnel,
1229
+ &lobePdf
1229
1230
  );
1230
1231
  if (prepared.metalMsFactor > 0.0) {
1231
- let dW = min(prepared.metalMsFactor * bH(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
1232
- response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * dW * INVPI;
1233
- aI = mix(aI, 0.5 * INVPI, prepared.metalMsProbability);
1232
+ let cv = min(prepared.metalMsFactor * aR(prepared.specularAlpha, lightLocal.z), 1.0 / max(lightLocal.z, 1e-8));
1233
+ response += prepared.weights[OPENPBR_LOBE_METAL] * prepared.metalMsScale * cv * INVPI;
1234
+ lobePdf = mix(lobePdf, 0.5 * INVPI, prepared.metalMsProbability);
1234
1235
  }
1235
- *pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * aI;
1236
+ *pdf += prepared.probabilities[OPENPBR_LOBE_METAL] * lobePdf;
1236
1237
  }
1237
1238
  }
1238
1239
  else {
1239
- let cK = ei;
1240
- if (prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0 && jG) {
1240
+ let fresnel = ef;
1241
+ if ((prepared.weights[OPENPBR_LOBE_TRANSMISSION] > 0.0) & jJ) {
1241
1242
  if (material.thinWalled) {
1242
- let kY = vec3f(lightLocal.xy, -lightLocal.z);
1243
- let gm = aP(
1244
- ei,
1243
+ let lm = vec3f(lightLocal.xy, -lightLocal.z);
1244
+ let gk = aq(
1245
+ ef,
1245
1246
  1.0
1246
1247
  );
1247
- let tint = bG(
1248
+ let tint = bF(
1248
1249
  material,
1249
1250
  abs(viewLocal.z),
1250
1251
  prepared.refractionEtaTOverEtaI
1251
1252
  );
1252
1253
  response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1253
- * am(
1254
+ * aj(
1254
1255
  material,
1255
1256
  viewLocal,
1256
- kY,
1257
- df,
1258
- tint * (vec3f(1.0) - gm),
1259
- &aI
1257
+ lm,
1258
+ thinWallHalf,
1259
+ tint * (vec3f(1.0) - gk),
1260
+ &lobePdf
1260
1261
  );
1261
1262
  }
1262
1263
  else {
1263
1264
  response += prepared.weights[OPENPBR_LOBE_TRANSMISSION]
1264
- * dl(
1265
+ * dc(
1265
1266
  material,
1266
1267
  material.relativeIor,
1267
- bn(material),
1268
+ ba(material),
1268
1269
  viewLocal,
1269
1270
  lightLocal,
1270
- V,
1271
- cK,
1272
- &aI
1271
+ aa,
1272
+ fresnel,
1273
+ &lobePdf
1273
1274
  );
1274
1275
  }
1275
1276
  if (prepared.dielectricMsProbability > 0.0) {
1276
- aI *= 1.0 - prepared.dielectricMsProbability;
1277
+ lobePdf *= 1.0 - prepared.dielectricMsProbability;
1277
1278
  }
1278
- *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * aI;
1279
+ *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * lobePdf;
1279
1280
  }
1280
- if (prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0 && oT) {
1281
+ if ((prepared.weights[OPENPBR_LOBE_SUBSURFACE] > 0.0) & pG) {
1281
1282
  if (material.thinWalled) {
1282
- let oh = vec3f(lightLocal.xy, -lightLocal.z);
1283
+ let oQ = vec3f(lightLocal.xy, -lightLocal.z);
1283
1284
  response += 0.5 * prepared.weights[OPENPBR_LOBE_SUBSURFACE]
1284
- * cE(
1285
+ * bw(
1285
1286
  material,
1286
1287
  material.subsurfaceColor,
1287
1288
  viewLocal,
1288
- oh,
1289
+ oQ,
1289
1290
  diffuseSpecularEnergyCompensation,
1290
- &aI
1291
+ &lobePdf
1291
1292
  );
1292
- aI *= 0.5;
1293
+ lobePdf *= 0.5;
1293
1294
  }
1294
1295
  else {
1295
- response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dM(
1296
+ response += prepared.weights[OPENPBR_LOBE_SUBSURFACE] * dK(
1296
1297
  material,
1297
1298
  viewLocal,
1298
1299
  lightLocal,
1299
- &aI
1300
+ &lobePdf
1300
1301
  );
1301
1302
  }
1302
- *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * aI;
1303
+ *pdf += prepared.probabilities[OPENPBR_LOBE_SUBSURFACE] * lobePdf;
1303
1304
  }
1304
1305
  }
1305
1306
 
1306
1307
 
1307
1308
 
1308
1309
 
1309
- if (prepared.dielectricMsProbability > 0.0 && jG) {
1310
- let au = abs(lightLocal.z);
1311
- if (au > 0.0) {
1310
+ if ((prepared.dielectricMsProbability > 0.0) & jJ) {
1311
+ let cosine = abs(lightLocal.z);
1312
+ if (cosine > 0.0) {
1312
1313
  let ior = select(1.0 / prepared.refractionEtaTOverEtaI, prepared.refractionEtaTOverEtaI, reflection);
1313
- let ja = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
1314
- let tr = prepared.dielectricMsViewLoss * bO(ior, prepared.specularAlpha, au)
1315
- / max(cO(ior, prepared.specularAlpha), 1e-12);
1316
- let dW = min(tr * ja, 1.0 / au);
1314
+ let iZ = select(1.0 - prepared.dielectricMsReflectionRatio, prepared.dielectricMsReflectionRatio, reflection);
1315
+ let oP = prepared.dielectricMsViewLoss * aV(ior, prepared.specularAlpha, cosine)
1316
+ / max(aY(ior, prepared.specularAlpha), 1e-12);
1317
+ let cv = min(oP * iZ, 1.0 / cosine);
1317
1318
  let scale = select(prepared.dielectricMsTransmissionScale, prepared.dielectricMsReflectionScale, reflection);
1318
- response += scale * dW * INVPI;
1319
- *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * ja * 0.5 * INVPI;
1319
+ response += scale * cv * INVPI;
1320
+ *pdf += prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] * prepared.dielectricMsProbability * iZ * 0.5 * INVPI;
1320
1321
  }
1321
1322
  }
1322
1323
 
1323
1324
  ${hasCoatNormals ? /* wgsl */ ` } ` : ''}
1324
1325
  if (material.coatWeight > 0.0) {
1325
- response *= ds(prepared, ${hasCoatNormals ? 'select(lightLocal.z, coatLightCosine, independentCoat)' : 'lightLocal.z'});
1326
+ response *= cm(prepared, ${hasCoatNormals ? 'select(lightLocal.z, coatLightCosine, independentCoat)' : 'lightLocal.z'});
1326
1327
  }
1327
1328
  ${hasCoatNormals ? /* wgsl */ `
1328
1329
 
@@ -1330,273 +1331,270 @@ if (independentCoat) { response *= abs(lightLocal.z); }
1330
1331
  ` : ''}
1331
1332
 
1332
1333
  ${hasAnisotropyDirections ? /* wgsl */ `
1333
- if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_COAT] > 0.0) {
1334
- var dI = viewLocal;
1335
- var kD = lightLocal;
1336
- var gw = V;
1337
- var jK = bQ;
1334
+ if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_COAT] > 0.0)) {
1335
+ var dG = viewLocal;
1336
+ var kQ = lightLocal;
1337
+ var coatHalf = aa;
1338
+ var coatViewHalf = viewHalf;
1338
1339
  if (prepared.directionFrames) {
1339
- dI = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
1340
- kD = openpbr_to_local(prepared.coatBasis, lightDirection);
1341
- gw = normalize(kD + dI);
1342
- if (gw.z < 0.0) { gw = -gw; }
1343
- jK = abs(dot(dI, gw));
1340
+ dG = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, independentCoat)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'};
1341
+ kQ = openpbr_to_local(prepared.coatBasis, lightDirection);
1342
+ coatHalf = normalize(kQ + dG);
1343
+ if (coatHalf.z < 0.0) { coatHalf = -coatHalf; }
1344
+ coatViewHalf = abs(dot(dG, coatHalf));
1344
1345
  }
1345
1346
 
1346
- let lg = vec3f(af(
1347
- jK,
1347
+ let lB = vec3f(ae(
1348
+ coatViewHalf,
1348
1349
  1.0 / material.coatIor
1349
1350
  ));
1350
- var dH = material;
1351
- let jx = aK(material.coatRoughness, material.coatAnisotropy);
1352
- dH.alphaX = jx.x;
1353
- dH.alphaY = jx.y;
1354
- if (tc) {
1355
- response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * am(
1356
- dH,
1357
- dI,
1358
- kD,
1359
- gw,
1360
- lg,
1361
- &aI
1351
+ var dF = material;
1352
+ let jD = aL(material.coatRoughness, material.coatAnisotropy);
1353
+ dF.alphaX = jD.x;
1354
+ dF.alphaY = jD.y;
1355
+ if (uE) {
1356
+ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * aj(
1357
+ dF,
1358
+ dG,
1359
+ kQ,
1360
+ coatHalf,
1361
+ lB,
1362
+ &lobePdf
1362
1363
  );
1363
- *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aI;
1364
+ *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * lobePdf;
1364
1365
  }
1365
1366
  }
1366
1367
  ` : /* wgsl */ `
1367
- if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_COAT] > 0.0) {
1368
- let lg = vec3f(af(
1369
- bQ,
1368
+ if (${hasCoatNormals ? 'select(reflection, coatReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_COAT] > 0.0)) {
1369
+ let lB = vec3f(ae(
1370
+ viewHalf,
1370
1371
  1.0 / material.coatIor
1371
1372
  ));
1372
- var dH = material;
1373
- let jx = aK(material.coatRoughness, material.coatAnisotropy);
1374
- dH.alphaX = jx.x;
1375
- dH.alphaY = jx.y;
1376
- if (tc) {
1377
- response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * am(
1378
- dH,
1373
+ var dF = material;
1374
+ let jD = aL(material.coatRoughness, material.coatAnisotropy);
1375
+ dF.alphaX = jD.x;
1376
+ dF.alphaY = jD.y;
1377
+ if (uE) {
1378
+ response += prepared.weights[OPENPBR_LOBE_COAT]${hasCoatNormals ? ' * select(1.0, max(coatLightCosine, 0.0), independentCoat)' : ''} * aj(
1379
+ dF,
1379
1380
  viewLocal,
1380
1381
  lightLocal,
1381
- V,
1382
- lg,
1383
- &aI
1382
+ aa,
1383
+ lB,
1384
+ &lobePdf
1384
1385
  );
1385
- *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * aI;
1386
+ *pdf += prepared.probabilities[OPENPBR_LOBE_COAT] * lobePdf;
1386
1387
  }
1387
1388
  }
1388
1389
  `}
1389
1390
 
1390
- if (${hasCoatNormals ? 'select(reflection, geometricReflection, independentCoat)' : 'reflection'} && prepared.weights[OPENPBR_LOBE_FUZZ] > 0.0) {
1391
- let qz = aO(
1391
+ if (${hasCoatNormals ? 'select(reflection, geometricReflection, independentCoat)' : 'reflection'} & (prepared.weights[OPENPBR_LOBE_FUZZ] > 0.0)) {
1392
+ let rt = aQ(
1392
1393
  abs(viewLocal.z),
1393
1394
  material.fuzzRoughness
1394
1395
  );
1395
1396
  response *= max(
1396
1397
  vec3f(0.0),
1397
- vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * qz)
1398
+ vec3f(1.0 - prepared.weights[OPENPBR_LOBE_FUZZ] * rt)
1398
1399
  );
1399
- if (uN) {
1400
- response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * jY(
1400
+ if (wP) {
1401
+ response += prepared.weights[OPENPBR_LOBE_FUZZ]${hasCoatNormals ? ' * select(1.0, max(lightLocal.z, 0.0), independentCoat)' : ''} * kg(
1401
1402
  material,
1402
1403
  viewLocal,
1403
1404
  lightLocal,
1404
- &aI
1405
+ &lobePdf
1405
1406
  );
1406
- *pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * aI;
1407
+ *pdf += prepared.probabilities[OPENPBR_LOBE_FUZZ] * lobePdf;
1407
1408
  }
1408
1409
  }
1409
1410
 
1410
1411
  return response * ${hasCoatNormals ? 'select(abs(lightLocal.z), 1.0, independentCoat)' : 'abs(lightLocal.z)'};
1411
1412
  }
1412
1413
 
1413
- fn bI(
1414
- prepared: ag,
1414
+ fn openpbr_eval_prepared(
1415
+ prepared: OpenPbrPreparedBsdf,
1415
1416
  lightDirection: vec3f,
1416
1417
  pdf: ptr<function, f32>
1417
1418
  ) -> vec3f {
1418
- return mD(prepared, lightDirection, -1, pdf);
1419
+ return nh(prepared, lightDirection, -1, pdf);
1419
1420
  }
1420
1421
 
1421
1422
 
1422
1423
 
1423
1424
 
1424
1425
 
1425
- fn ri(
1426
+ fn sj(
1426
1427
  tangent: vec3f,
1427
- material: J,
1428
- bF: vec3f,
1428
+ material: OpenPbrResolvedMaterial,
1429
+ bD: vec3f,
1429
1430
  normal: vec3f,
1430
1431
  lightDirection: vec3f,
1431
1432
  pdf: ptr<function, f32>
1432
1433
  ) -> vec3f {
1433
- let prepared = eH(
1434
+ let prepared = bV(
1434
1435
  tangent,
1435
1436
  material,
1436
- bF,
1437
+ bD,
1437
1438
  normal
1438
1439
  );
1439
- return bI(prepared, lightDirection, pdf);
1440
+ return openpbr_eval_prepared(prepared, lightDirection, pdf);
1440
1441
  }
1441
1442
 
1442
1443
 
1443
1444
 
1444
1445
 
1445
1446
 
1446
- fn nl(
1447
- prepared: ag, cm: vec3f,
1447
+ fn iW(
1448
+ prepared: OpenPbrPreparedBsdf, cc: vec3f,
1448
1449
  lightDirection: ptr<function, vec3f>, isTransmissionEvent: ptr<function, bool>,
1449
- aA: ptr<function, f32>, aS: ptr<function, bool>,
1450
- bE: ptr<function, bool>, aR: ptr<function, u32>
1450
+ aO: ptr<function, f32>, bk: ptr<function, bool>,
1451
+ cC: ptr<function, bool>, bh: ptr<function, u32>
1451
1452
  ) -> bool {
1452
1453
  let material = prepared.material;
1453
1454
  let viewLocal = prepared.viewLocal;
1454
- var cy = cm.x;
1455
- let fv = cm.y;
1456
- let bm = cm.z;
1455
+ var cp = cc.x;
1456
+ let fp = cc.y;
1457
+ let bl = cc.z;
1457
1458
  *isTransmissionEvent = false;
1458
- *aA = 1.0;
1459
- *aS = false;
1460
- *bE = false;
1461
- *aR = u32(OPENPBR_LOBE_DIFFUSE);
1459
+ *aO = 1.0;
1460
+ *bk = false;
1461
+ *cC = false;
1462
+ *bh = u32(OPENPBR_LOBE_DIFFUSE);
1462
1463
  *lightDirection = prepared.basis.normal;
1463
1464
 
1464
1465
  var cdf: array<f32, OPENPBR_LOBE_COUNT>;
1465
1466
  cdf[OPENPBR_LOBE_FUZZ] = prepared.probabilities[OPENPBR_LOBE_FUZZ];
1466
- let nI = min(OPENPBR_LOBE_COUNT, i32(rtUniform.loopUnrollGuard * 2u));
1467
- for (var hU = 1; hU < nI; hU++) {
1468
- cdf[hU] = cdf[hU - 1] + prepared.probabilities[hU];
1469
- }
1467
+ ${LOBE_INDICES.slice(1).map(i => /* wgsl */ `cdf[${i}] = cdf[${i - 1}] + prepared.probabilities[${i}];`).join('\n ')}
1470
1468
  if (cdf[OPENPBR_LOBE_SUBSURFACE] <= 0.0) {
1471
1469
  return false;
1472
1470
  }
1473
1471
 
1474
1472
  var lightLocal: vec3f;
1475
- if (bm < cdf[OPENPBR_LOBE_FUZZ] || (
1476
- bm >= cdf[OPENPBR_LOBE_TRANSMISSION] && bm < cdf[OPENPBR_LOBE_DIFFUSE]
1473
+ if ((bl < cdf[OPENPBR_LOBE_FUZZ]) | (
1474
+ (bl >= cdf[OPENPBR_LOBE_TRANSMISSION]) & (bl < cdf[OPENPBR_LOBE_DIFFUSE])
1477
1475
  )) {
1478
- let pQ = bm < cdf[OPENPBR_LOBE_FUZZ];
1479
- *aA = select(
1476
+ let qy = bl < cdf[OPENPBR_LOBE_FUZZ];
1477
+ *aO = select(
1480
1478
  1.0,
1481
1479
  material.fuzzRoughness,
1482
- pQ
1480
+ qy
1483
1481
  );
1484
- *bE = !pQ;
1485
- *aR = select(
1482
+ *cC = !qy;
1483
+ *bh = select(
1486
1484
  u32(OPENPBR_LOBE_DIFFUSE),
1487
1485
  u32(OPENPBR_LOBE_FUZZ),
1488
- pQ
1486
+ qy
1489
1487
  );
1490
- lightLocal = bi(vec2f(cy, fv));
1488
+ lightLocal = aM(vec2f(cp, fp));
1491
1489
  }
1492
1490
  ${hasAnisotropyDirections ? /* wgsl */ `
1493
- else if (bm < cdf[OPENPBR_LOBE_COAT]) {
1494
- *aA = material.coatRoughness;
1495
- *aS = true;
1496
- *aR = u32(OPENPBR_LOBE_COAT);
1497
- var dI = viewLocal;
1498
- if (prepared.directionFrames) { dI = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, material.coatNormalEnabled)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'}; }
1499
- var V = aQ(
1500
- dI,
1501
-
1502
- aK(material.coatRoughness, material.coatAnisotropy),
1503
- vec2f(cy, fv)
1491
+ else if (bl < cdf[OPENPBR_LOBE_COAT]) {
1492
+ *aO = material.coatRoughness;
1493
+ *bk = true;
1494
+ *bh = u32(OPENPBR_LOBE_COAT);
1495
+ var dG = viewLocal;
1496
+ if (prepared.directionFrames) { dG = ${hasCoatNormals ? 'select(openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal)), prepared.coatViewLocal, material.coatNormalEnabled)' : 'openpbr_to_local(prepared.coatBasis, openpbr_to_world(prepared.basis, viewLocal))'}; }
1497
+ var aa = aA(
1498
+ dG,
1499
+
1500
+ aL(material.coatRoughness, material.coatAnisotropy),
1501
+ vec2f(cp, fp)
1504
1502
  );
1505
- if (V.z < 0.0) {
1506
- V = -V;
1503
+ if (aa.z < 0.0) {
1504
+ aa = -aa;
1507
1505
  }
1508
- lightLocal = normalize(reflect(-dI, V));
1506
+ lightLocal = normalize(reflect(-dG, aa));
1509
1507
  ${hasCoatNormals ? /* wgsl */ `
1510
1508
  if (material.coatNormalEnabled) {
1511
1509
 
1512
1510
  *lightDirection = openpbr_to_world(prepared.coatBasis, lightLocal);
1513
- return lightLocal.z > 0.0 && dot(material.geometricNormal, *lightDirection) > 0.0;
1511
+ return (lightLocal.z > 0.0) & (dot(material.geometricNormal, *lightDirection) > 0.0);
1514
1512
  }
1515
1513
  ` : ''}
1516
1514
  if (prepared.directionFrames) { lightLocal = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.coatBasis, lightLocal)); }
1517
1515
  }
1518
1516
  ` : /* wgsl */ `
1519
- else if (bm < cdf[OPENPBR_LOBE_COAT]) {
1520
- *aA = material.coatRoughness;
1521
- *aS = true;
1522
- *aR = u32(OPENPBR_LOBE_COAT);
1523
- var V = aQ(
1517
+ else if (bl < cdf[OPENPBR_LOBE_COAT]) {
1518
+ *aO = material.coatRoughness;
1519
+ *bk = true;
1520
+ *bh = u32(OPENPBR_LOBE_COAT);
1521
+ var aa = aA(
1524
1522
  viewLocal,
1525
1523
 
1526
- aK(material.coatRoughness, material.coatAnisotropy),
1527
- vec2f(cy, fv)
1524
+ aL(material.coatRoughness, material.coatAnisotropy),
1525
+ vec2f(cp, fp)
1528
1526
  );
1529
- if (V.z < 0.0) {
1530
- V = -V;
1527
+ if (aa.z < 0.0) {
1528
+ aa = -aa;
1531
1529
  }
1532
- lightLocal = normalize(reflect(-viewLocal, V));
1530
+ lightLocal = normalize(reflect(-viewLocal, aa));
1533
1531
  }
1534
1532
  `}
1535
- else if (bm < cdf[OPENPBR_LOBE_SPECULAR]) {
1536
- *aA = material.specularRoughness;
1537
- *aS = true;
1538
- *aR = select(
1533
+ else if (bl < cdf[OPENPBR_LOBE_SPECULAR]) {
1534
+ *aO = material.specularRoughness;
1535
+ *bk = true;
1536
+ *bh = select(
1539
1537
  u32(OPENPBR_LOBE_SPECULAR),
1540
1538
  u32(OPENPBR_LOBE_METAL),
1541
- bm < cdf[OPENPBR_LOBE_METAL]
1539
+ bl < cdf[OPENPBR_LOBE_METAL]
1542
1540
  );
1543
- let tw = bm < cdf[OPENPBR_LOBE_METAL];
1544
- let rM = (bm - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1545
- if (tw && rM < prepared.metalMsProbability) {
1546
- let z = cy;
1547
- let fl = sqrt(max(0.0, 1.0 - z * z));
1548
- let br = TWOPI * fv;
1549
- lightLocal = vec3f(fl * cos(br), fl * sin(br), z);
1541
+ let uU = bl < cdf[OPENPBR_LOBE_METAL];
1542
+ let sK = (bl - cdf[OPENPBR_LOBE_COAT]) / max(prepared.probabilities[OPENPBR_LOBE_METAL], 1e-12);
1543
+ if (uU & (sK < prepared.metalMsProbability)) {
1544
+ let z = cp;
1545
+ let dr = sqrt(max(0.0, 1.0 - z * z));
1546
+ let azimuth = TWOPI * fp;
1547
+ lightLocal = vec3f(dr * cos(azimuth), dr * sin(azimuth), z);
1550
1548
  }
1551
1549
  else {
1552
- var V = aQ(
1550
+ var aa = aA(
1553
1551
  viewLocal,
1554
1552
  vec2f(material.alphaX, material.alphaY),
1555
- vec2f(cy, fv)
1553
+ vec2f(cp, fp)
1556
1554
  );
1557
- if (V.z < 0.0) {
1558
- V = -V;
1555
+ if (aa.z < 0.0) {
1556
+ aa = -aa;
1559
1557
  }
1560
- lightLocal = normalize(reflect(-viewLocal, V));
1558
+ lightLocal = normalize(reflect(-viewLocal, aa));
1561
1559
  }
1562
1560
  }
1563
- else if (bm < cdf[OPENPBR_LOBE_TRANSMISSION]) {
1564
- *aA = material.specularRoughness;
1565
- *aS = true;
1561
+ else if (bl < cdf[OPENPBR_LOBE_TRANSMISSION]) {
1562
+ *aO = material.specularRoughness;
1563
+ *bk = true;
1566
1564
  *isTransmissionEvent = true;
1567
- *aR = u32(OPENPBR_LOBE_TRANSMISSION);
1565
+ *bh = u32(OPENPBR_LOBE_TRANSMISSION);
1568
1566
 
1569
1567
 
1570
- let us = (bm - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1571
- if (prepared.dielectricMsProbability > 0.0 && us < prepared.dielectricMsProbability) {
1572
- let ja = prepared.dielectricMsReflectionRatio;
1573
- let lY = cy < ja;
1568
+ let wk = (bl - cdf[OPENPBR_LOBE_SPECULAR]) / max(prepared.probabilities[OPENPBR_LOBE_TRANSMISSION], 1e-12);
1569
+ if ((prepared.dielectricMsProbability > 0.0) & (wk < prepared.dielectricMsProbability)) {
1570
+ let iZ = prepared.dielectricMsReflectionRatio;
1571
+ let mv = cp < iZ;
1574
1572
  var z: f32;
1575
- if (lY) { z = min(cy / ja, 0.99999994); }
1576
- else { z = -min((cy - ja) / (1.0 - ja), 0.99999994); }
1577
- let fl = sqrt(max(0.0, 1.0 - z * z));
1578
- let br = TWOPI * fv;
1579
- lightLocal = vec3f(fl * cos(br), fl * sin(br), z);
1580
- *isTransmissionEvent = !lY;
1581
- *aR = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), lY);
1573
+ if (mv) { z = min(cp / iZ, 0.99999994); }
1574
+ else { z = -min((cp - iZ) / (1.0 - iZ), 0.99999994); }
1575
+ let dr = sqrt(max(0.0, 1.0 - z * z));
1576
+ let azimuth = TWOPI * fp;
1577
+ lightLocal = vec3f(dr * cos(azimuth), dr * sin(azimuth), z);
1578
+ *isTransmissionEvent = !mv;
1579
+ *bh = select(u32(OPENPBR_LOBE_TRANSMISSION), u32(OPENPBR_LOBE_SPECULAR), mv);
1582
1580
  }
1583
1581
  else {
1584
- var V = aQ(
1582
+ var aa = aA(
1585
1583
  viewLocal,
1586
1584
  vec2f(material.alphaX, material.alphaY),
1587
- vec2f(cy, fv)
1585
+ vec2f(cp, fp)
1588
1586
  );
1589
- if (V.z < 0.0) {
1590
- V = -V;
1587
+ if (aa.z < 0.0) {
1588
+ aa = -aa;
1591
1589
  }
1592
1590
  if (material.thinWalled) {
1593
- let hZ = normalize(reflect(-viewLocal, V));
1594
- lightLocal = vec3f(hZ.xy, -hZ.z);
1591
+ let hX = normalize(reflect(-viewLocal, aa));
1592
+ lightLocal = vec3f(hX.xy, -hX.z);
1595
1593
  }
1596
1594
  else {
1597
1595
  lightLocal = refract(
1598
1596
  -viewLocal,
1599
- V,
1597
+ aa,
1600
1598
  prepared.material.relativeIor
1601
1599
  );
1602
1600
  if (dot(lightLocal, lightLocal) <= 1e-8) {
@@ -1608,20 +1606,20 @@ lightLocal = normalize(lightLocal);
1608
1606
  }
1609
1607
  }
1610
1608
  else {
1611
- *aA = 1.0;
1612
- *bE = true;
1609
+ *aO = 1.0;
1610
+ *cC = true;
1613
1611
  *isTransmissionEvent = true;
1614
- *aR = u32(OPENPBR_LOBE_SUBSURFACE);
1612
+ *bh = u32(OPENPBR_LOBE_SUBSURFACE);
1615
1613
  if (material.thinWalled) {
1616
- let pT = cy >= 0.5;
1617
- if (pT) {
1618
- cy = (cy - 0.5) * 2.0;
1614
+ let qD = cp >= 0.5;
1615
+ if (qD) {
1616
+ cp = (cp - 0.5) * 2.0;
1619
1617
  }
1620
1618
  else {
1621
- cy *= 2.0;
1619
+ cp *= 2.0;
1622
1620
  }
1623
- lightLocal = bi(vec2f(cy, fv));
1624
- if (pT) {
1621
+ lightLocal = aM(vec2f(cp, fp));
1622
+ if (qD) {
1625
1623
  lightLocal.z = -lightLocal.z;
1626
1624
  }
1627
1625
  else {
@@ -1629,7 +1627,7 @@ else {
1629
1627
  }
1630
1628
  }
1631
1629
  else {
1632
- lightLocal = bi(vec2f(cy, fv));
1630
+ lightLocal = aM(vec2f(cp, fp));
1633
1631
  lightLocal.z = -lightLocal.z;
1634
1632
  }
1635
1633
  }
@@ -1638,98 +1636,98 @@ lightLocal.z = -lightLocal.z;
1638
1636
 
1639
1637
 
1640
1638
 
1641
- if (lightLocal.z == 0.0 || (lightLocal.z < 0.0) != *isTransmissionEvent) {
1639
+ if ((lightLocal.z == 0.0) | ((lightLocal.z < 0.0) != *isTransmissionEvent)) {
1642
1640
  return false;
1643
1641
  }
1644
1642
  ${hasCoatNormals ? /* wgsl */ `
1645
- if (material.coatNormalEnabled &&
1643
+ if (material.coatNormalEnabled &
1646
1644
  ((dot(material.geometricNormal, *lightDirection) <= 0.0) != *isTransmissionEvent)) { return false; }
1647
1645
  ` : ''}
1648
1646
  return true;
1649
1647
  }
1650
1648
 
1651
- fn dv(
1652
- prepared: ag,
1653
- cm: vec3f,
1649
+ fn dl(
1650
+ prepared: OpenPbrPreparedBsdf,
1651
+ cc: vec3f,
1654
1652
  lightDirection: ptr<function, vec3f>,
1655
1653
  pdf: ptr<function, f32>,
1656
1654
  isTransmissionEvent: ptr<function, bool>,
1657
- aA: ptr<function, f32>,
1658
- aS: ptr<function, bool>,
1659
- bE: ptr<function, bool>,
1660
- aR: ptr<function, u32>,
1661
- lo: ptr<function, f32>,
1662
- gY: ptr<function, vec3f>
1655
+ aO: ptr<function, f32>,
1656
+ bk: ptr<function, bool>,
1657
+ cC: ptr<function, bool>,
1658
+ bh: ptr<function, u32>,
1659
+ marginalPdf: ptr<function, f32>,
1660
+ jU: ptr<function, vec3f>
1663
1661
  ) -> vec3f {
1664
1662
  *pdf = 0.0;
1665
- *lo = 0.0;
1666
- *gY = vec3f(0.0);
1663
+ *marginalPdf = 0.0;
1664
+ *jU = vec3f(0.0);
1667
1665
 
1668
1666
 
1669
1667
 
1670
1668
 
1671
- if (!prepared.material.thinWalled &&
1672
- abs(prepared.material.relativeIor - 1.0) <= 1e-6 &&
1673
- prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6) {
1669
+ if (!prepared.material.thinWalled &
1670
+ (abs(prepared.material.relativeIor - 1.0) <= 1e-6) &
1671
+ (prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6)) {
1674
1672
  *lightDirection = openpbr_to_world(
1675
1673
  prepared.basis,
1676
1674
  -prepared.viewLocal
1677
1675
  );
1678
- let nL = bn(prepared.material)
1679
- * ds(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
1676
+ let ov = ba(prepared.material)
1677
+ * cm(prepared, ${hasCoatNormals ? 'select(-prepared.viewLocal.z, dot(prepared.coatBasis.normal, *lightDirection), prepared.material.coatNormalEnabled)' : '-prepared.viewLocal.z'});
1680
1678
  *pdf = 1.0;
1681
- *lo = 1.0;
1682
- *gY = nL;
1679
+ *marginalPdf = 1.0;
1680
+ *jU = ov;
1683
1681
  *isTransmissionEvent = true;
1684
- *aA = 0.0;
1685
- *aS = true;
1686
- *bE = false;
1687
- *aR = u32(OPENPBR_LOBE_TRANSMISSION);
1688
- return nL;
1689
- }
1690
- if (!nl(prepared, cm, lightDirection,
1691
- isTransmissionEvent, aA, aS,
1692
- bE, aR)) { return vec3f(0.0); }
1693
- let response = bI(prepared, *lightDirection, pdf);
1694
- *lo = *pdf;
1695
- *gY = response;
1682
+ *aO = 0.0;
1683
+ *bk = true;
1684
+ *cC = false;
1685
+ *bh = u32(OPENPBR_LOBE_TRANSMISSION);
1686
+ return ov;
1687
+ }
1688
+ if (!iW(prepared, cc, lightDirection,
1689
+ isTransmissionEvent, aO, bk,
1690
+ cC, bh)) { return vec3f(0.0); }
1691
+ let response = openpbr_eval_prepared(prepared, *lightDirection, pdf);
1692
+ *marginalPdf = *pdf;
1693
+ *jU = response;
1696
1694
  return response;
1697
1695
  }
1698
1696
 
1699
- fn sJ(
1697
+ fn uc(
1700
1698
  tangent: vec3f,
1701
- material: J,
1702
- cm: vec3f,
1703
- bF: vec3f,
1699
+ material: OpenPbrResolvedMaterial,
1700
+ cc: vec3f,
1701
+ bD: vec3f,
1704
1702
  normal: vec3f,
1705
1703
  lightDirection: ptr<function, vec3f>,
1706
1704
  pdf: ptr<function, f32>,
1707
1705
  isTransmissionEvent: ptr<function, bool>,
1708
- aA: ptr<function, f32>,
1709
- aS: ptr<function, bool>,
1710
- bE: ptr<function, bool>,
1711
- aR: ptr<function, u32>,
1712
- lo: ptr<function, f32>
1706
+ aO: ptr<function, f32>,
1707
+ bk: ptr<function, bool>,
1708
+ cC: ptr<function, bool>,
1709
+ bh: ptr<function, u32>,
1710
+ marginalPdf: ptr<function, f32>
1713
1711
  ) -> vec3f {
1714
- let prepared = eH(
1712
+ let prepared = bV(
1715
1713
  tangent,
1716
1714
  material,
1717
- bF,
1715
+ bD,
1718
1716
  normal
1719
1717
  );
1720
- var gY = vec3f(0.0);
1721
- return dv(
1718
+ var jU = vec3f(0.0);
1719
+ return dl(
1722
1720
  prepared,
1723
- cm,
1721
+ cc,
1724
1722
  lightDirection,
1725
1723
  pdf,
1726
1724
  isTransmissionEvent,
1727
- aA,
1728
- aS,
1729
- bE,
1730
- aR,
1731
- lo,
1732
- &gY
1725
+ aO,
1726
+ bk,
1727
+ cC,
1728
+ bh,
1729
+ marginalPdf,
1730
+ &jU
1733
1731
  );
1734
1732
  }`;
1735
1733
  }