@meimu/mutracer 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -5,13 +5,13 @@ import { glsl } from '../../shader.js';
5
5
  export default glsl `
6
6
  uvec4 s0;
7
7
 
8
- void gW(vec2 p, int frame) {
8
+ void fA(vec2 p, int frame) {
9
9
 
10
10
  s0 = uvec4(p, uint(frame), uint(p.x) + uint(p.y));
11
11
  }
12
12
 
13
13
 
14
- void xd(inout uvec4 v) {
14
+ void zF(inout uvec4 v) {
15
15
  v = v * 1664525u + 1013904223u;
16
16
  v.x += v.y*v.w; v.y += v.z*v.x; v.z += v.x*v.y; v.w += v.y*v.z;
17
17
  v = v ^ (v>>16u);
@@ -19,7 +19,7 @@ v.x += v.y*v.w; v.y += v.z*v.x; v.z += v.x*v.y; v.w += v.y*v.z;
19
19
  }
20
20
 
21
21
  float rand() {
22
- xd(s0); return float(s0.x)/float(0xffffffffu);
22
+ zF(s0); return float(s0.x)/float(0xffffffffu);
23
23
  }
24
24
 
25
25
  `;
@@ -10,15 +10,15 @@ export default createShaderMixin({
10
10
 
11
11
  ${sobol}
12
12
 
13
- void rG() {
14
- aZ = uvec2(v_Texcoord / pixelSize);
15
- aQ = uint(sampleCount);
16
- bT = 0u; cP = 0u;
13
+ void sP() {
14
+ aJ = uvec2(v_Texcoord / pixelSize);
15
+ aC = uint(sampleCount);
16
+ samplingBounce = 0u; hashedCounter = 0u;
17
17
  }
18
18
 
19
- vec2 tg() {
19
+ vec2 uH() {
20
20
  if (samplingPattern == 0 || samplingPattern == 1) {
21
- return (dZ(CAMERA_PIXEL) - 0.5) * pixelSize;
21
+ return (sample2D(CAMERA_PIXEL) - 0.5) * pixelSize;
22
22
  }
23
23
  return jitter;
24
24
  }
@@ -1,2 +1,3 @@
1
+ export declare function createRayTraceCoreGlsl(fragments?: Readonly<Record<string, string>>): import("../../shader.js").ShaderMixin;
1
2
  declare const _default: import("../../shader.js").ShaderMixin;
2
3
  export default _default;
@@ -4,26 +4,27 @@
4
4
  import { createShaderMixin, glsl, Shader } from '../../shader.js';
5
5
  import { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';
6
6
  import { CONSTANT_SPOT_LIGHT } from '../../lightConstants.js';
7
- export default createShaderMixin({
8
- uniforms: {
9
- lightsTex: Shader.uniform('sampler2D'),
10
- iesProfileData: Shader.uniform('sampler2D'),
11
- iesProfileColumns: Shader.uniform('int', 1),
12
- pixelSize: Shader.uniform('vec2'),
13
- jitter: Shader.uniform('vec2'),
14
- sampleCount: Shader.uniform('int'),
15
- envLightSelectionPmf: Shader.uniform('float', 0)
16
- },
17
- defines: {
18
- STANDARD: 0,
19
- UNLIT: UnlitMaterial,
20
- SHADOW_CATCHER: ShadowCatcherMaterial,
21
- SPOT_LIGHT: CONSTANT_SPOT_LIGHT
22
- },
23
- main: glsl `
7
+ export function createRayTraceCoreGlsl(fragments = {}) {
8
+ return createShaderMixin({
9
+ uniforms: {
10
+ lightsTex: Shader.uniform('sampler2D'),
11
+ iesProfileData: Shader.uniform('sampler2D'),
12
+ iesProfileColumns: Shader.uniform('int', 1),
13
+ pixelSize: Shader.uniform('vec2'),
14
+ jitter: Shader.uniform('vec2'),
15
+ sampleCount: Shader.uniform('int'),
16
+ envLightSelectionPmf: Shader.uniform('float', 0)
17
+ },
18
+ defines: {
19
+ STANDARD: 0,
20
+ UNLIT: UnlitMaterial,
21
+ SHADOW_CATCHER: ShadowCatcherMaterial,
22
+ SPOT_LIGHT: CONSTANT_SPOT_LIGHT
23
+ },
24
+ main: glsl `
24
25
 
25
26
  const vec3 luminance = vec3(0.2126, 0.7152, 0.0722);
26
- const int xk = 8;
27
+ const int zL = 8;
27
28
 
28
29
  #define RAY_MAX_DISTANCE 9999.0
29
30
 
@@ -81,7 +82,7 @@ float mediumAnisotropy;
81
82
  struct OpenPbrResolvedMaterial {
82
83
  int materialType;
83
84
 
84
- float specularRoughness;
85
+ float specularRoughness;${fragments['core0'] ?? ''}
85
86
  float baseMetalness;
86
87
  vec3 baseColor;
87
88
  float specularIor;
@@ -157,29 +158,31 @@ float selectionCdf;
157
158
  vec3 iesReference;
158
159
  };
159
160
 
160
- void gC(inout Ray ray, vec3 origin, vec3 direction) {
161
+ void initRay(inout Ray ray, vec3 origin, vec3 direction) {
161
162
  ray.o = origin;
162
163
  ray.d = direction;
163
164
  ray.tMax = RAY_MAX_DISTANCE;
164
165
  }
165
166
 
166
167
 
167
- ivec2 hd(int i, int jY) {
168
+ ivec2 uO(int i, int ki) {
168
169
  ivec2 u;
169
- u.y = i >> jY;
170
- u.x = i - (u.y << jY);
170
+ u.y = i >> ki;
171
+ u.x = i - (u.y << ki);
171
172
  return u;
172
173
  }
173
174
 
174
- vec4 lm(sampler2D s, int i, int jY) {
175
- return texelFetch(s, hd(i, jY), 0);
175
+ vec4 fetchData(sampler2D s, int i, int ki) {
176
+ return texelFetch(s, uO(i, ki), 0);
176
177
  }
177
178
 
178
- ivec4 lm(highp isampler2D s, int i, int jY) {
179
- return texelFetch(s, hd(i, jY), 0);
179
+ ivec4 fetchData(highp isampler2D s, int i, int ki) {
180
+ return texelFetch(s, uO(i, ki), 0);
180
181
  }
181
182
 
182
183
  struct Path {
184
+
185
+ bool scatteringMediumEntered;
183
186
  Ray ray;
184
187
  vec3 li;
185
188
  float alpha;
@@ -188,7 +191,7 @@ bool fromEye;
188
191
  bool abort;
189
192
  float scatteringPdf;
190
193
  bool scatteringIsDelta;
191
- bool isNextRefraction;
194
+ bool isNextRefraction;${fragments['core1'] ?? ''}
192
195
  };
193
196
 
194
197
  struct LightSampleRec {
@@ -198,27 +201,29 @@ vec3 direction;
198
201
  float dist;
199
202
  float pdf;
200
203
  bool isDelta;
204
+ int sourceType;
205
+ int sourceIndex;
201
206
  };
202
207
 
203
208
 
204
- Light rB(int i) {
209
+ Light fetchLight(int i) {
205
210
  int firstTexel = i * 6;
206
- vec4 qD = texelFetch(
211
+ vec4 positionAndPmf = texelFetch(
207
212
  lightsTex,
208
213
  ivec2(firstTexel, 0),
209
214
  0
210
215
  );
211
- vec4 ql = texelFetch(
216
+ vec4 emissionAndCdf = texelFetch(
212
217
  lightsTex,
213
218
  ivec2(firstTexel + 1, 0),
214
219
  0
215
220
  );
216
- vec4 oL = texelFetch(
221
+ vec4 pG = texelFetch(
217
222
  lightsTex,
218
223
  ivec2(firstTexel + 2, 0),
219
224
  0
220
225
  );
221
- vec4 my = texelFetch(
226
+ vec4 mW = texelFetch(
222
227
  lightsTex,
223
228
  ivec2(firstTexel + 3, 0),
224
229
  0
@@ -229,33 +234,33 @@ ivec2(firstTexel + 4, 0),
229
234
  0
230
235
  );
231
236
  return Light(
232
- qD.xyz,
233
- ql.xyz,
234
- oL.xyz,
235
- my.xyz,
237
+ positionAndPmf.xyz,
238
+ emissionAndCdf.xyz,
239
+ pG.xyz,
240
+ mW.xyz,
236
241
  shape.x,
237
242
  shape.y,
238
243
  shape.z,
239
- int(my.w),
240
- oL.w,
241
- qD.w,
242
- ql.w,
244
+ int(mW.w),
245
+ pG.w,
246
+ positionAndPmf.w,
247
+ emissionAndCdf.w,
243
248
  texelFetch(lightsTex, ivec2(firstTexel + 5, 0), 0).xyz
244
249
  );
245
250
  }
246
251
 
247
- float cS(int el, int mc) {
248
- int iK = el + mc / 4;
252
+ float cI(int ec, int mC) {
253
+ int iR = ec + mC / 4;
249
254
  vec4 packed = texelFetch(
250
255
  iesProfileData,
251
- ivec2(iK % iesProfileColumns, iK / iesProfileColumns),
256
+ ivec2(iR % iesProfileColumns, iR / iesProfileColumns),
252
257
  0
253
258
  );
254
- return packed[mc % 4];
259
+ return packed[mC % 4];
255
260
  }
256
261
 
257
- float lB(int el, vec2 uv) {
258
- if (el < 0) return 1.0;
262
+ float lW(int ec, vec2 uv) {
263
+ if (ec < 0) return 1.0;
259
264
  vec2 pixel = fract(uv) * 128.0 - 0.5;
260
265
  ivec2 p0 = ivec2(floor(pixel));
261
266
  vec2 f = fract(pixel);
@@ -263,26 +268,28 @@ int xa = p0.x < 0 ? 127 : p0.x;
263
268
  int xb = p0.x >= 127 ? 0 : p0.x + 1;
264
269
  int ya = p0.y < 0 ? 127 : p0.y;
265
270
  int yb = p0.y >= 127 ? 0 : p0.y + 1;
266
- float a = cS(el, ya * 128 + xa);
267
- float b = cS(el, ya * 128 + xb);
268
- float c = cS(el, yb * 128 + xa);
269
- float d = cS(el, yb * 128 + xb);
271
+ float a = cI(ec, ya * 128 + xa);
272
+ float b = cI(ec, ya * 128 + xb);
273
+ float c = cI(ec, yb * 128 + xa);
274
+ float d = cI(ec, yb * 128 + xb);
270
275
  return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);
271
276
  }
272
277
 
273
- float bP(Light light, vec3 dV) {
278
+ float evaluateSpotEmissionMultiplier(Light light, vec3 dL) {
274
279
  vec3 axis = normalize(light.u);
275
- float ci = dot(axis, dV);
276
- float vm = light.v.y > light.v.x + 1e-6
277
- ? smoothstep(light.v.x, light.v.y, ci)
278
- : step(light.v.x, ci);
279
- if (vm <= 0.0 || light.textureIndex < 0) return vm;
280
- vec3 vK = light.iesReference;
281
- vec3 xj = cross(axis, vK);
282
- float vertical = acos(clamp(ci, -1.0, 1.0));
283
- float horizontal = atan(dot(dV, xj), dot(dV, vK));
284
- return vm * lB(light.textureIndex, vec2(vertical / PI, horizontal / TWOPI + 0.5));
280
+ float cv = dot(axis, dL);
281
+ float xm = light.v.y > light.v.x + 1e-6
282
+ ? smoothstep(light.v.x, light.v.y, cv)
283
+ : step(light.v.x, cv);
284
+ if (xm <= 0.0 || light.textureIndex < 0) return xm;
285
+ vec3 xT = light.iesReference;
286
+ vec3 zK = cross(axis, xT);
287
+ float vertical = acos(clamp(cv, -1.0, 1.0));
288
+ float horizontal = atan(dot(dL, zK), dot(dL, xT));
289
+ return xm * lW(light.textureIndex, vec2(vertical / PI, horizontal / TWOPI + 0.5));
285
290
  }
286
291
  `
287
- });
292
+ });
293
+ }
294
+ export default createRayTraceCoreGlsl();
288
295
  //# sourceMappingURL=rayTraceCore.glsl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rayTraceCore.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/rayTraceCore.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACtC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC3C,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3C,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;QAClC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KACjD;IACD,OAAO,EAAE;QACP,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,aAAa;QACpB,cAAc,EAAE,qBAAqB;QACrC,UAAU,EAAE,mBAAmB;KAChC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuQX;CACA,CAAC,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';\nimport { CONSTANT_SPOT_LIGHT } from '../../lightConstants.js';\n\nexport default createShaderMixin({\n uniforms: {\n lightsTex: Shader.uniform('sampler2D'),\n iesProfileData: Shader.uniform('sampler2D'),\n iesProfileColumns: Shader.uniform('int', 1),\n pixelSize: Shader.uniform('vec2'),\n jitter: Shader.uniform('vec2'),\n sampleCount: Shader.uniform('int'),\n envLightSelectionPmf: Shader.uniform('float', 0)\n },\n defines: {\n STANDARD: 0,\n UNLIT: UnlitMaterial,\n SHADOW_CATCHER: ShadowCatcherMaterial,\n SPOT_LIGHT: CONSTANT_SPOT_LIGHT\n },\n main: glsl`\n// https://www.w3.org/WAI/GL/wiki/Relative_luminance\nconst vec3 luminance = vec3(0.2126, 0.7152, 0.0722);\nconst int bounceSamples = 8;\n\n#define RAY_MAX_DISTANCE 9999.0\n\n#define NO_UNROLL(X) (X + min(0, sampleCount))\n#define NO_UNROLLU(X) (X + uint(min(0, sampleCount)))\n\nstruct Ray {\n vec3 o;\n vec3 d;\n float tMax;\n};\n\nstruct SurfaceInteraction {\n bool hit;\n vec3 position;\n vec3 normal; // material shading normal\n#ifdef USE_COAT_NORMAL_FRAMES\n vec3 coatNormal;\n#endif\n vec3 vertexNormal; // interpolated mesh normal before normal mapping\n vec3 shadowOffset; // smooth-surface offset used by direct-light shadow rays\n \n vec2 uv;\n vec2 uv1;\n vec3 vertexColor;\n\n#ifdef USE_TANGENT\n vec3 tangent;\n#endif\n vec3 directionTangent;\n vec3 directionBitangent;\n vec3 geometryTangent;\n vec3 geometryBitangent;\n vec3 faceNormal; // normal of the triangle\n\n bool isTransparency;\n // For perfect specular or transmission surface\n // We use the albedo and normal of first diffuse or glossy surface hit instead for denoising\n // See albedo section in https://www.openimagedenoise.org/documentation.html\n bool albedoSampled;\n\n int triangleIndex;\n int instanceIndex;\n int materialIndex;\n\n int mediumType;\n vec3 mediumExtinction;\n vec3 mediumScattering;\n float mediumAnisotropy;\n};\n\n// Texture-resolved OpenPBR inputs used by the surface integrator. The storage\n// buffer keeps its compact legacy layout; getMaterial() is the compatibility\n// boundary that maps it to these canonical names.\nstruct OpenPbrResolvedMaterial {\n int materialType;\n\n float specularRoughness;\n float baseMetalness;\n vec3 baseColor;\n float specularIor;\n vec3 emission;\n float transmissionWeight;\n bool thinWalled;\n float specularAnisotropy;\n float alpha;\n\n float transmissionDispersionScale;\n float dispersionAbbeNumber;\n float thinFilmThickness;\n float thinFilmIor;\n float thinFilmWeight;\n\n // Medium\n int mediumType;\n vec3 mediumExtinction;\n vec3 mediumScattering;\n float mediumAnisotropy;\n\n float baseWeight;\n float diffuseRoughness;\n float specularWeight;\n vec3 specularColor;\n float subsurfaceWeight;\n vec3 subsurfaceColor;\n vec3 transmissionColor;\n float fuzzWeight;\n vec3 fuzzColor;\n float fuzzRoughness;\n float coatWeight;\n vec3 coatColor;\n float coatRoughness;\n float coatAnisotropy;\n vec2 anisotropyDirection;\n bool anisotropyDirectionEnabled;\n float coatAnisotropyRotation;\n vec3 directionTangent;\n vec3 directionBitangent;\n vec3 geometryTangent;\n vec3 geometryBitangent;\n#ifdef USE_COAT_NORMAL_FRAMES\n vec3 coatNormal;\n bool coatNormalEnabled;\n vec3 geometricNormal;\n#endif\n float coatIor;\n float coatDarkening;\n\n float bevel;\n\n // Calculated\n float relativeIor;\n bool inside;\n float alphaX;\n float alphaY;\n};\n\n\nstruct Light {\n vec3 position;\n vec3 emission;\n vec3 u;\n vec3 v;\n float radius;\n float area;\n float type;\n int textureIndex;\n float spread;\n float selectionPmf;\n float selectionCdf;\n vec3 iesReference;\n};\n\nvoid initRay(inout Ray ray, vec3 origin, vec3 direction) {\n ray.o = origin;\n ray.d = direction;\n ray.tMax = RAY_MAX_DISTANCE;\n}\n\n// given the index from a 1D array, retrieve corresponding position from packed 2D texture\nivec2 unpackTexel(int i, int columnsLog2) {\n ivec2 u;\n u.y = i >> columnsLog2; // equivalent to (i / 2^columnsLog2)\n u.x = i - (u.y << columnsLog2); // equivalent to (i % 2^columnsLog2)\n return u;\n}\n\nvec4 fetchData(sampler2D s, int i, int columnsLog2) {\n return texelFetch(s, unpackTexel(i, columnsLog2), 0);\n}\n\nivec4 fetchData(highp isampler2D s, int i, int columnsLog2) {\n return texelFetch(s, unpackTexel(i, columnsLog2), 0);\n}\n\nstruct Path {\n Ray ray;\n vec3 li;\n float alpha;\n vec3 beta;\n bool fromEye;\n bool abort;\n float scatteringPdf;\n bool scatteringIsDelta;\n bool isNextRefraction;\n};\n\nstruct LightSampleRec {\n vec3 normal;\n vec3 emission;\n vec3 direction;\n float dist;\n float pdf;\n bool isDelta;\n};\n\n\nLight fetchLight(int i) {\n int firstTexel = i * 6;\n vec4 positionAndPmf = texelFetch(\n lightsTex,\n ivec2(firstTexel, 0),\n 0\n );\n vec4 emissionAndCdf = texelFetch(\n lightsTex,\n ivec2(firstTexel + 1, 0),\n 0\n );\n vec4 tangentAndSpread = texelFetch(\n lightsTex,\n ivec2(firstTexel + 2, 0),\n 0\n );\n vec4 bitangentAndTexture = texelFetch(\n lightsTex,\n ivec2(firstTexel + 3, 0),\n 0\n );\n vec4 shape = texelFetch(\n lightsTex,\n ivec2(firstTexel + 4, 0),\n 0\n );\n return Light(\n positionAndPmf.xyz,\n emissionAndCdf.xyz,\n tangentAndSpread.xyz,\n bitangentAndTexture.xyz,\n shape.x,\n shape.y,\n shape.z,\n int(bitangentAndTexture.w),\n tangentAndSpread.w,\n positionAndPmf.w,\n emissionAndCdf.w,\n texelFetch(lightsTex, ivec2(firstTexel + 5, 0), 0).xyz\n );\n}\n\nfloat iesProfileScalar(int baseTexel, int scalarIndex) {\n int texelIndex = baseTexel + scalarIndex / 4;\n vec4 packed = texelFetch(\n iesProfileData,\n ivec2(texelIndex % iesProfileColumns, texelIndex / iesProfileColumns),\n 0\n );\n return packed[scalarIndex % 4];\n}\n\nfloat sampleIESProfile(int baseTexel, vec2 uv) {\n if (baseTexel < 0) return 1.0;\n vec2 pixel = fract(uv) * 128.0 - 0.5;\n ivec2 p0 = ivec2(floor(pixel));\n vec2 f = fract(pixel);\n int xa = p0.x < 0 ? 127 : p0.x;\n int xb = p0.x >= 127 ? 0 : p0.x + 1;\n int ya = p0.y < 0 ? 127 : p0.y;\n int yb = p0.y >= 127 ? 0 : p0.y + 1;\n float a = iesProfileScalar(baseTexel, ya * 128 + xa);\n float b = iesProfileScalar(baseTexel, ya * 128 + xb);\n float c = iesProfileScalar(baseTexel, yb * 128 + xa);\n float d = iesProfileScalar(baseTexel, yb * 128 + xb);\n return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nfloat evaluateSpotEmissionMultiplier(Light light, vec3 lightToSurface) {\n vec3 axis = normalize(light.u);\n float cosTheta = dot(axis, lightToSurface);\n float cone = light.v.y > light.v.x + 1e-6\n ? smoothstep(light.v.x, light.v.y, cosTheta)\n : step(light.v.x, cosTheta);\n if (cone <= 0.0 || light.textureIndex < 0) return cone;\n vec3 xAxis = light.iesReference;\n vec3 yAxis = cross(axis, xAxis);\n float vertical = acos(clamp(cosTheta, -1.0, 1.0));\n float horizontal = atan(dot(lightToSurface, yAxis), dot(lightToSurface, xAxis));\n return cone * sampleIESProfile(light.textureIndex, vec2(vertical / PI, horizontal / TWOPI + 0.5));\n}\n`\n});\n"]}
1
+ {"version":3,"file":"rayTraceCore.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/rayTraceCore.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAE9D,MAAM,UAAU,sBAAsB,CAAC,YAA8C,EAAE;IAAI,OAAO,iBAAiB,CAAC;QAClH,QAAQ,EAAE;YACR,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YACtC,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3C,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC3C,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YACjC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAC9B,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAClC,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;SACjD;QACD,OAAO,EAAE;YACP,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,aAAa;YACpB,cAAc,EAAE,qBAAqB;YACrC,UAAU,EAAE,mBAAmB;SAChC;QACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA6DgB,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6G1B,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiGjD;KACA,CAAC,CAAC;AACH,CAAC;AACD,eAAe,sBAAsB,EAAE,CAAC","sourcesContent":["// Portions adapted from ray-tracing-renderer@0.10.15\n// (https://github.com/hoverinc/ray-tracing-renderer).\n// Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\nimport { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';\nimport { CONSTANT_SPOT_LIGHT } from '../../lightConstants.js';\n\nexport function createRayTraceCoreGlsl(fragments: Readonly<Record<string, string>> = {}) { return createShaderMixin({\n uniforms: {\n lightsTex: Shader.uniform('sampler2D'),\n iesProfileData: Shader.uniform('sampler2D'),\n iesProfileColumns: Shader.uniform('int', 1),\n pixelSize: Shader.uniform('vec2'),\n jitter: Shader.uniform('vec2'),\n sampleCount: Shader.uniform('int'),\n envLightSelectionPmf: Shader.uniform('float', 0)\n },\n defines: {\n STANDARD: 0,\n UNLIT: UnlitMaterial,\n SHADOW_CATCHER: ShadowCatcherMaterial,\n SPOT_LIGHT: CONSTANT_SPOT_LIGHT\n },\n main: glsl`\n// https://www.w3.org/WAI/GL/wiki/Relative_luminance\nconst vec3 luminance = vec3(0.2126, 0.7152, 0.0722);\nconst int bounceSamples = 8;\n\n#define RAY_MAX_DISTANCE 9999.0\n\n#define NO_UNROLL(X) (X + min(0, sampleCount))\n#define NO_UNROLLU(X) (X + uint(min(0, sampleCount)))\n\nstruct Ray {\n vec3 o;\n vec3 d;\n float tMax;\n};\n\nstruct SurfaceInteraction {\n bool hit;\n vec3 position;\n vec3 normal; // material shading normal\n#ifdef USE_COAT_NORMAL_FRAMES\n vec3 coatNormal;\n#endif\n vec3 vertexNormal; // interpolated mesh normal before normal mapping\n vec3 shadowOffset; // smooth-surface offset used by direct-light shadow rays\n \n vec2 uv;\n vec2 uv1;\n vec3 vertexColor;\n\n#ifdef USE_TANGENT\n vec3 tangent;\n#endif\n vec3 directionTangent;\n vec3 directionBitangent;\n vec3 geometryTangent;\n vec3 geometryBitangent;\n vec3 faceNormal; // normal of the triangle\n\n bool isTransparency;\n // For perfect specular or transmission surface\n // We use the albedo and normal of first diffuse or glossy surface hit instead for denoising\n // See albedo section in https://www.openimagedenoise.org/documentation.html\n bool albedoSampled;\n\n int triangleIndex;\n int instanceIndex;\n int materialIndex;\n\n int mediumType;\n vec3 mediumExtinction;\n vec3 mediumScattering;\n float mediumAnisotropy;\n};\n\n// Texture-resolved OpenPBR inputs used by the surface integrator. The storage\n// buffer keeps its compact legacy layout; getMaterial() is the compatibility\n// boundary that maps it to these canonical names.\nstruct OpenPbrResolvedMaterial {\n int materialType;\n\n float specularRoughness;${fragments['core0'] ?? ''}\n float baseMetalness;\n vec3 baseColor;\n float specularIor;\n vec3 emission;\n float transmissionWeight;\n bool thinWalled;\n float specularAnisotropy;\n float alpha;\n\n float transmissionDispersionScale;\n float dispersionAbbeNumber;\n float thinFilmThickness;\n float thinFilmIor;\n float thinFilmWeight;\n\n // Medium\n int mediumType;\n vec3 mediumExtinction;\n vec3 mediumScattering;\n float mediumAnisotropy;\n\n float baseWeight;\n float diffuseRoughness;\n float specularWeight;\n vec3 specularColor;\n float subsurfaceWeight;\n vec3 subsurfaceColor;\n vec3 transmissionColor;\n float fuzzWeight;\n vec3 fuzzColor;\n float fuzzRoughness;\n float coatWeight;\n vec3 coatColor;\n float coatRoughness;\n float coatAnisotropy;\n vec2 anisotropyDirection;\n bool anisotropyDirectionEnabled;\n float coatAnisotropyRotation;\n vec3 directionTangent;\n vec3 directionBitangent;\n vec3 geometryTangent;\n vec3 geometryBitangent;\n#ifdef USE_COAT_NORMAL_FRAMES\n vec3 coatNormal;\n bool coatNormalEnabled;\n vec3 geometricNormal;\n#endif\n float coatIor;\n float coatDarkening;\n\n float bevel;\n\n // Calculated\n float relativeIor;\n bool inside;\n float alphaX;\n float alphaY;\n};\n\n\nstruct Light {\n vec3 position;\n vec3 emission;\n vec3 u;\n vec3 v;\n float radius;\n float area;\n float type;\n int textureIndex;\n float spread;\n float selectionPmf;\n float selectionCdf;\n vec3 iesReference;\n};\n\nvoid initRay(inout Ray ray, vec3 origin, vec3 direction) {\n ray.o = origin;\n ray.d = direction;\n ray.tMax = RAY_MAX_DISTANCE;\n}\n\n// given the index from a 1D array, retrieve corresponding position from packed 2D texture\nivec2 unpackTexel(int i, int columnsLog2) {\n ivec2 u;\n u.y = i >> columnsLog2; // equivalent to (i / 2^columnsLog2)\n u.x = i - (u.y << columnsLog2); // equivalent to (i % 2^columnsLog2)\n return u;\n}\n\nvec4 fetchData(sampler2D s, int i, int columnsLog2) {\n return texelFetch(s, unpackTexel(i, columnsLog2), 0);\n}\n\nivec4 fetchData(highp isampler2D s, int i, int columnsLog2) {\n return texelFetch(s, unpackTexel(i, columnsLog2), 0);\n}\n\nstruct Path {\n // Retain deferred roulette after an SSS walk reaches its boundary.\n bool scatteringMediumEntered;\n Ray ray;\n vec3 li;\n float alpha;\n vec3 beta;\n bool fromEye;\n bool abort;\n float scatteringPdf;\n bool scatteringIsDelta;\n bool isNextRefraction;${fragments['core1'] ?? ''}\n};\n\nstruct LightSampleRec {\n vec3 normal;\n vec3 emission;\n vec3 direction;\n float dist;\n float pdf;\n bool isDelta;\n int sourceType;\n int sourceIndex;\n};\n\n\nLight fetchLight(int i) {\n int firstTexel = i * 6;\n vec4 positionAndPmf = texelFetch(\n lightsTex,\n ivec2(firstTexel, 0),\n 0\n );\n vec4 emissionAndCdf = texelFetch(\n lightsTex,\n ivec2(firstTexel + 1, 0),\n 0\n );\n vec4 tangentAndSpread = texelFetch(\n lightsTex,\n ivec2(firstTexel + 2, 0),\n 0\n );\n vec4 bitangentAndTexture = texelFetch(\n lightsTex,\n ivec2(firstTexel + 3, 0),\n 0\n );\n vec4 shape = texelFetch(\n lightsTex,\n ivec2(firstTexel + 4, 0),\n 0\n );\n return Light(\n positionAndPmf.xyz,\n emissionAndCdf.xyz,\n tangentAndSpread.xyz,\n bitangentAndTexture.xyz,\n shape.x,\n shape.y,\n shape.z,\n int(bitangentAndTexture.w),\n tangentAndSpread.w,\n positionAndPmf.w,\n emissionAndCdf.w,\n texelFetch(lightsTex, ivec2(firstTexel + 5, 0), 0).xyz\n );\n}\n\nfloat iesProfileScalar(int baseTexel, int scalarIndex) {\n int texelIndex = baseTexel + scalarIndex / 4;\n vec4 packed = texelFetch(\n iesProfileData,\n ivec2(texelIndex % iesProfileColumns, texelIndex / iesProfileColumns),\n 0\n );\n return packed[scalarIndex % 4];\n}\n\nfloat sampleIESProfile(int baseTexel, vec2 uv) {\n if (baseTexel < 0) return 1.0;\n vec2 pixel = fract(uv) * 128.0 - 0.5;\n ivec2 p0 = ivec2(floor(pixel));\n vec2 f = fract(pixel);\n int xa = p0.x < 0 ? 127 : p0.x;\n int xb = p0.x >= 127 ? 0 : p0.x + 1;\n int ya = p0.y < 0 ? 127 : p0.y;\n int yb = p0.y >= 127 ? 0 : p0.y + 1;\n float a = iesProfileScalar(baseTexel, ya * 128 + xa);\n float b = iesProfileScalar(baseTexel, ya * 128 + xb);\n float c = iesProfileScalar(baseTexel, yb * 128 + xa);\n float d = iesProfileScalar(baseTexel, yb * 128 + xb);\n return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\nfloat evaluateSpotEmissionMultiplier(Light light, vec3 lightToSurface) {\n vec3 axis = normalize(light.u);\n float cosTheta = dot(axis, lightToSurface);\n float cone = light.v.y > light.v.x + 1e-6\n ? smoothstep(light.v.x, light.v.y, cosTheta)\n : step(light.v.x, cosTheta);\n if (cone <= 0.0 || light.textureIndex < 0) return cone;\n vec3 xAxis = light.iesReference;\n vec3 yAxis = cross(axis, xAxis);\n float vertical = acos(clamp(cosTheta, -1.0, 1.0));\n float horizontal = atan(dot(lightToSurface, yAxis), dot(lightToSurface, xAxis));\n return cone * sampleIESProfile(light.textureIndex, vec2(vertical / PI, horizontal / TWOPI + 0.5));\n}\n`\n});\n}\nexport default createRayTraceCoreGlsl();\n"]}
@@ -1,16 +1,17 @@
1
+ import emissive from './emissiveLight.glsl.js';
1
2
  import { glsl } from '../../shader.js';
2
3
  export default glsl `
3
4
  #ifdef NUM_LIGHTS
4
- void eY(
5
+ void eR(
5
6
  in Light light,
6
7
  in vec3 shadingPoint,
7
8
  in vec2 samplePoint,
8
9
  inout LightSampleRec result
9
10
  ) {
10
- vec3 oN = light.position - shadingPoint;
11
- float ak = length(oN);
11
+ vec3 pH = light.position - shadingPoint;
12
+ float ao = length(pH);
12
13
  if (light.radius <= 0.0) {
13
- if (ak <= 1e-6) {
14
+ if (ao <= 1e-6) {
14
15
  result.direction = vec3(0.0, 0.0, 1.0);
15
16
  result.normal = vec3(0.0, 0.0, -1.0);
16
17
  result.dist = 0.0;
@@ -19,11 +20,11 @@ result.emission = vec3(0.0);
19
20
  result.isDelta = true;
20
21
  return;
21
22
  }
22
- result.direction = oN / ak;
23
+ result.direction = pH / ao;
23
24
  result.normal = -result.direction;
24
- result.dist = ak;
25
+ result.dist = ao;
25
26
  result.pdf = 1.0;
26
- result.emission = light.emission / max(ak * ak, 1e-8);
27
+ result.emission = light.emission / max(ao * ao, 1e-8);
27
28
  result.isDelta = true;
28
29
  return;
29
30
  }
@@ -31,46 +32,50 @@ float radius = max(light.radius, 1e-6);
31
32
  result.isDelta = false;
32
33
  vec3 direction;
33
34
 
34
- if (ak <= radius) {
35
+ if (ao <= radius) {
35
36
  float z = 1.0 - 2.0 * samplePoint.x;
36
- float ex = sqrt(max(0.0, 1.0 - z * z));
37
+ float dw = sqrt(max(0.0, 1.0 - z * z));
37
38
  float azimuth = TWOPI * samplePoint.y;
38
- direction = vec3(ex * cos(azimuth), ex * sin(azimuth), z);
39
+ direction = vec3(dw * cos(azimuth), dw * sin(azimuth), z);
39
40
  result.pdf = INV4PI;
40
41
  }
41
42
  else {
42
- vec3 axis = oN / ak;
43
- float sX = min(
43
+ vec3 axis = pH / ao;
44
+ float pv = min(
44
45
  1.0,
45
- radius * radius / (ak * ak)
46
+ radius * radius / (ao * ao)
46
47
  );
47
- float tc = sqrt(max(0.0, 1.0 - sX));
48
- float cosine = mix(1.0, tc, samplePoint.x);
49
- float vF = sqrt(max(0.0, 1.0 - cosine * cosine));
48
+ float xn = sqrt(max(0.0, 1.0 - pv));
49
+
50
+
51
+ float mX = pv / (1.0 + xn);
52
+ float oe = samplePoint.x * mX;
53
+ float cosine = 1.0 - oe;
54
+ float wk = sqrt(max(0.0, oe * (2.0 - oe)));
50
55
  float azimuth = TWOPI * samplePoint.y;
51
56
  vec3 tangent;
52
57
  vec3 bitangent;
53
- aP(axis, tangent, bitangent);
58
+ sampling_orthonormal_basis(axis, tangent, bitangent);
54
59
  direction = axis * cosine
55
- + tangent * (vF * cos(azimuth))
56
- + bitangent * (vF * sin(azimuth));
57
- result.pdf = 1.0 / max(TWOPI * (1.0 - tc), 1e-8);
60
+ + tangent * (wk * cos(azimuth))
61
+ + bitangent * (wk * sin(azimuth));
62
+ result.pdf = 1.0 / max(TWOPI * mX, 1e-8);
58
63
  }
59
64
 
60
- float jC = dot(direction, oN);
61
- float br = jC * jC
62
- - dot(oN, oN) + radius * radius;
63
- float yn = sqrt(max(0.0, br));
64
- float cV = jC - yn;
65
- float cM = jC + yn;
66
- result.dist = cV > 1e-6 ? cV : cM;
65
+ float jM = dot(direction, pH);
66
+ float bk = jM * jM
67
+ - dot(pH, pH) + radius * radius;
68
+ float root = sqrt(max(0.0, bk));
69
+ float cK = jM - root;
70
+ float cB = jM + root;
71
+ result.dist = cK > 1e-6 ? cK : cB;
67
72
  result.direction = direction;
68
73
  vec3 surfacePoint = shadingPoint + direction * result.dist;
69
74
  result.normal = normalize(surfacePoint - light.position);
70
75
  result.emission = light.emission;
71
76
  }
72
77
 
73
- void dn(
78
+ void bD(
74
79
  in Light light,
75
80
  in vec3 surfacePoint,
76
81
  in vec3 lowerLeft,
@@ -80,17 +85,17 @@ inout LightSampleRec result
80
85
  if (light.textureIndex >= 0) {
81
86
  float width = length(light.u);
82
87
  float height = length(light.v);
83
- vec3 ek = surfacePoint - lowerLeft;
88
+ vec3 ea = surfacePoint - lowerLeft;
84
89
  vec2 uv = vec2(
85
- dot(ek, light.u / width) / width,
86
- dot(ek, light.v / height) / height
90
+ dot(ea, light.u / width) / width,
91
+ dot(ea, light.v / height) / height
87
92
  );
88
93
  result.emission *= sampleMap(light.textureIndex, uv).rgb;
89
94
  }
90
95
  #endif
91
96
  }
92
97
 
93
- void kw(
98
+ void kF(
94
99
  in Light light,
95
100
  in vec3 shadingPoint,
96
101
  in vec2 samplePoint,
@@ -101,28 +106,28 @@ vec3 lowerLeft = light.position - 0.5 * (light.u + light.v);
101
106
  float spread = clamp(light.spread, 0.0, 1.0);
102
107
 
103
108
  if (spread <= 0.001) {
104
- float gw = dot(normal, shadingPoint - light.position);
105
- vec3 surfacePoint = shadingPoint - normal * gw;
106
- vec3 ek = surfacePoint - lowerLeft;
109
+ float gy = dot(normal, shadingPoint - light.position);
110
+ vec3 surfacePoint = shadingPoint - normal * gy;
111
+ vec3 ea = surfacePoint - lowerLeft;
107
112
  float width = length(light.u);
108
113
  float height = length(light.v);
109
114
  vec2 uv = vec2(
110
- dot(ek, light.u / width) / width,
111
- dot(ek, light.v / height) / height
115
+ dot(ea, light.u / width) / width,
116
+ dot(ea, light.v / height) / height
112
117
  );
113
- if (gw <= 0.0 || any(lessThan(uv, vec2(0.0)))
118
+ if (gy <= 0.0 || any(lessThan(uv, vec2(0.0)))
114
119
  || any(greaterThan(uv, vec2(1.0)))) {
115
120
  result.emission = vec3(0.0);
116
121
  result.pdf = 0.0;
117
122
  return;
118
123
  }
119
124
  result.direction = -normal;
120
- result.dist = gw;
125
+ result.dist = gy;
121
126
  result.normal = normal;
122
127
  result.emission = light.emission;
123
128
  result.pdf = 1.0;
124
129
  result.isDelta = true;
125
- dn(light, surfacePoint, lowerLeft, result);
130
+ bD(light, surfacePoint, lowerLeft, result);
126
131
  return;
127
132
  }
128
133
 
@@ -130,20 +135,20 @@ vec3 surfacePoint = lowerLeft
130
135
  + light.u * samplePoint.x
131
136
  + light.v * samplePoint.y;
132
137
  vec3 offset = surfacePoint - shadingPoint;
133
- float hE = dot(offset, offset);
134
- result.dist = sqrt(hE);
138
+ float bG = dot(offset, offset);
139
+ result.dist = sqrt(bG);
135
140
  result.direction = offset / result.dist;
136
141
  result.normal = normal;
137
- float gn = dot(-result.direction, normal);
138
- float pK = cos(0.5 * PI * spread);
139
- if (gn <= 0.0 || gn < pK) {
142
+ float gq = dot(-result.direction, normal);
143
+ float qB = cos(0.5 * PI * spread);
144
+ if (gq <= 0.0 || gq < qB) {
140
145
  result.emission = vec3(0.0);
141
146
  result.pdf = 0.0;
142
147
  return;
143
148
  }
144
149
  result.emission = light.emission;
145
- result.pdf = hE / max(light.area * gn, 1e-8);
146
- dn(light, surfacePoint, lowerLeft, result);
150
+ result.pdf = bG / max(light.area * gq, 1e-8);
151
+ bD(light, surfacePoint, lowerLeft, result);
147
152
  }
148
153
 
149
154
  void gs(
@@ -159,94 +164,103 @@ result.pdf = 1.0;
159
164
  result.isDelta = true;
160
165
  }
161
166
 
162
- void kx(
167
+ void kG(
163
168
  in Light light,
164
169
  in vec3 shadingPoint,
165
170
  in vec2 samplePoint,
166
171
  inout LightSampleRec result
167
172
  ) {
168
- eY(light, shadingPoint, samplePoint, result);
173
+ eR(light, shadingPoint, samplePoint, result);
169
174
  vec3 surfacePoint = shadingPoint + result.direction * result.dist;
170
- result.emission *= bP(
175
+ result.emission *= evaluateSpotEmissionMultiplier(
171
176
  light,
172
177
  normalize(shadingPoint - surfacePoint)
173
178
  );
174
179
  }
175
180
 
176
- void jg(
181
+ void sampleAnalyticLight(
177
182
  in Light light,
178
183
  in vec3 shadingPoint,
179
184
  in vec2 samplePoint,
180
185
  inout LightSampleRec result
181
186
  ) {
182
- int ec = int(light.type);
187
+ int dU = int(light.type);
183
188
  #ifdef HAS_RECT_LIGHTS
184
- if (ec == RECT_LIGHT) {
185
- kw(light, shadingPoint, samplePoint, result);
189
+ if (dU == RECT_LIGHT) {
190
+ kF(light, shadingPoint, samplePoint, result);
186
191
  return;
187
192
  }
188
193
  #endif
189
194
  #ifdef HAS_SPHERE_LIGHTS
190
- if (ec == SPHERE_LIGHT) {
191
- eY(light, shadingPoint, samplePoint, result);
195
+ if (dU == SPHERE_LIGHT) {
196
+ eR(light, shadingPoint, samplePoint, result);
192
197
  return;
193
198
  }
194
199
  #endif
195
200
  #ifdef HAS_SPOT_LIGHTS
196
- if (ec == SPOT_LIGHT) {
197
- kx(light, shadingPoint, samplePoint, result);
201
+ if (dU == SPOT_LIGHT) {
202
+ kG(light, shadingPoint, samplePoint, result);
198
203
  return;
199
204
  }
200
205
  #endif
201
206
  #ifdef HAS_DIRECTIONAL_LIGHTS
202
- if (ec == DIRECTIONAL_LIGHT) {
207
+ if (dU == DIRECTIONAL_LIGHT) {
203
208
  gs(light, shadingPoint, result);
204
209
  }
205
210
  #endif
206
211
  }
207
212
  #endif
208
213
 
209
- void nD(in vec2 samplePoint, inout LightSampleRec result) {
214
+ void iM(in vec2 samplePoint, inout LightSampleRec result) {
210
215
  vec2 uv;
211
- result.direction = pI(samplePoint, uv, result.pdf);
216
+ result.direction = qx(samplePoint, uv, result.pdf);
212
217
  result.emission = textureLinear(envMap, uv).rgb;
213
218
  result.dist = INF;
214
219
  }
215
220
 
221
+ #ifdef HAS_EMISSIVE_LIGHTS
222
+ ${emissive}
223
+ #endif
224
+
216
225
  void sampleLight(
217
226
  in vec3 shadingPoint,
218
227
  in vec3 randomSampleValue,
219
228
  inout LightSampleRec result,
220
- bool tk
229
+ bool uP
221
230
  ) {
231
+ #ifdef HAS_EMISSIVE_LIGHTS
232
+ pc(shadingPoint,randomSampleValue,result);return;
233
+ #endif
234
+ result.sourceType=0;result.sourceIndex=-1;
222
235
  result.isDelta = false;
223
- float vE = randomSampleValue.z;
224
- bool le = false;
236
+ float xJ = randomSampleValue.z;
237
+ bool lG = false;
225
238
  #ifdef USE_ENVMAP
226
- le = vE < envLightSelectionPmf;
227
- if (le) {
228
- nD(randomSampleValue.xy, result);
239
+ lG = xJ < envLightSelectionPmf;
240
+ if (lG) {
241
+ iM(randomSampleValue.xy, result);
229
242
  result.pdf *= envLightSelectionPmf;
230
243
  }
231
244
  #endif
232
245
 
233
246
  #ifdef NUM_LIGHTS
234
- if (!le) {
235
- int lM = NUM_LIGHTS - 1;
247
+ if (!lG) {
248
+ int jG = NUM_LIGHTS - 1;
236
249
  for (int index = 0; index < NUM_LIGHTS; index++) {
237
- if (vE < rB(index).selectionCdf) {
238
- lM = index;
250
+ if (xJ < fetchLight(index).selectionCdf) {
251
+ jG = index;
239
252
  break;
240
253
  }
241
254
  }
242
- Light rp = rB(lM);
243
- jg(
244
- rp,
255
+ result.sourceType=2;result.sourceIndex=jG;
256
+ Light sz = fetchLight(jG);
257
+ sampleAnalyticLight(
258
+ sz,
245
259
  shadingPoint,
246
260
  randomSampleValue.xy,
247
261
  result
248
262
  );
249
- result.pdf *= rp.selectionPmf;
263
+ result.pdf *= sz.selectionPmf;
250
264
  }
251
265
  #endif
252
266
  }