@meimu/mutracer 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (526) hide show
  1. package/LICENSES/Classroom-CC0.txt +121 -0
  2. package/README.md +7 -7
  3. package/THIRD_PARTY_NOTICES.md +13 -8
  4. package/dist/assets/bvh.worker.js +1 -1
  5. package/dist/mutracer.umd.js +10407 -8353
  6. package/docs/api.md +200 -10
  7. package/docs/denoising.md +30 -15
  8. package/docs/materials.md +1 -1
  9. package/docs/performance.md +5 -2
  10. package/docs/progressive-rendering.md +32 -1
  11. package/docs/threejs.md +14 -5
  12. package/docs/updates.md +44 -2
  13. package/docs/viewer.md +11 -6
  14. package/lib/Display.d.ts +13 -2
  15. package/lib/Display.js +27 -6
  16. package/lib/Display.js.map +1 -1
  17. package/lib/Engine.d.ts +2 -0
  18. package/lib/Engine.js +52 -25
  19. package/lib/Engine.js.map +1 -1
  20. package/lib/Render.d.ts +44 -9
  21. package/lib/Render.js +115 -17
  22. package/lib/Render.js.map +1 -1
  23. package/lib/RenderLoop.d.ts +7 -1
  24. package/lib/RenderLoop.js +94 -13
  25. package/lib/RenderLoop.js.map +1 -1
  26. package/lib/main.d.ts +6 -3
  27. package/lib/main.js +1 -0
  28. package/lib/main.js.map +1 -1
  29. package/lib/math/access.d.ts +4 -0
  30. package/lib/math/access.js +10 -0
  31. package/lib/math/access.js.map +1 -0
  32. package/lib/math/mat3.d.ts +4 -0
  33. package/lib/math/mat3.js +54 -0
  34. package/lib/math/mat3.js.map +1 -0
  35. package/lib/math/mat4.d.ts +19 -0
  36. package/lib/math/mat4.js +413 -0
  37. package/lib/math/mat4.js.map +1 -0
  38. package/lib/math/storage.d.ts +6 -0
  39. package/lib/math/storage.js +22 -0
  40. package/lib/math/storage.js.map +1 -0
  41. package/lib/math/types.d.ts +3 -0
  42. package/lib/math/types.js +2 -0
  43. package/lib/math/types.js.map +1 -0
  44. package/lib/math/vec2.d.ts +13 -0
  45. package/lib/math/vec2.js +52 -0
  46. package/lib/math/vec2.js.map +1 -0
  47. package/lib/math/vec3.d.ts +23 -0
  48. package/lib/math/vec3.js +139 -0
  49. package/lib/math/vec3.js.map +1 -0
  50. package/lib/math.d.ts +5 -17
  51. package/lib/math.js +5 -55
  52. package/lib/math.js.map +1 -1
  53. package/lib/oidn.d.ts +1 -1
  54. package/lib/oidn.js +4 -2
  55. package/lib/oidn.js.map +1 -1
  56. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  57. package/lib/renderer/AovPrimitiveCache.d.ts +10 -0
  58. package/lib/renderer/AovPrimitiveCache.js +48 -0
  59. package/lib/renderer/AovPrimitiveCache.js.map +1 -0
  60. package/lib/renderer/Box3.d.ts +5 -0
  61. package/lib/renderer/Box3.js +9 -0
  62. package/lib/renderer/Box3.js.map +1 -0
  63. package/lib/renderer/GPUTraceQueue.d.ts +10 -0
  64. package/lib/renderer/GPUTraceQueue.js +31 -0
  65. package/lib/renderer/GPUTraceQueue.js.map +1 -0
  66. package/lib/renderer/MaterialData.d.ts +15 -0
  67. package/lib/renderer/MaterialData.js +61 -0
  68. package/lib/renderer/MaterialData.js.map +1 -0
  69. package/lib/renderer/MaterialTable.d.ts +11 -98
  70. package/lib/renderer/MaterialTable.js +34 -412
  71. package/lib/renderer/MaterialTable.js.map +1 -1
  72. package/lib/renderer/RenderingPipeline.d.ts +32 -13
  73. package/lib/renderer/RenderingPipeline.js +1 -17
  74. package/lib/renderer/RenderingPipeline.js.map +1 -1
  75. package/lib/renderer/TileRender.d.ts +0 -1
  76. package/lib/renderer/TileRender.js +14 -1
  77. package/lib/renderer/TileRender.js.map +1 -1
  78. package/lib/renderer/WGPUAov.d.ts +39 -0
  79. package/lib/renderer/WGPUAov.js +239 -0
  80. package/lib/renderer/WGPUAov.js.map +1 -0
  81. package/lib/renderer/WGPUBindlessMaterialData.d.ts +17 -0
  82. package/lib/renderer/WGPUBindlessMaterialData.js +48 -0
  83. package/lib/renderer/WGPUBindlessMaterialData.js.map +1 -0
  84. package/lib/renderer/WGPUBindlessTextures.d.ts +47 -0
  85. package/lib/renderer/WGPUBindlessTextures.js +180 -0
  86. package/lib/renderer/WGPUBindlessTextures.js.map +1 -0
  87. package/lib/renderer/WGPUBloomPass.js +17 -97
  88. package/lib/renderer/WGPUBloomPass.js.map +1 -1
  89. package/lib/renderer/WGPUComputePass.d.ts +1 -1
  90. package/lib/renderer/WGPUComputePass.js.map +1 -1
  91. package/lib/renderer/WGPUEnvMapDistribution.d.ts +12 -0
  92. package/lib/renderer/WGPUEnvMapDistribution.js +150 -0
  93. package/lib/renderer/WGPUEnvMapDistribution.js.map +1 -0
  94. package/lib/renderer/WGPUFullQuadPass.js +10 -9
  95. package/lib/renderer/WGPUFullQuadPass.js.map +1 -1
  96. package/lib/renderer/WGPUJNLMDenoiser.d.ts +1 -20
  97. package/lib/renderer/WGPUJNLMDenoiser.js +4 -267
  98. package/lib/renderer/WGPUJNLMDenoiser.js.map +1 -1
  99. package/lib/renderer/WGPURayTraceOutput.js +26 -17
  100. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  101. package/lib/renderer/WGPURayTracePass.d.ts +36 -40
  102. package/lib/renderer/WGPURayTracePass.js +399 -550
  103. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  104. package/lib/renderer/WGPURenderingPipeline.d.ts +5 -3
  105. package/lib/renderer/WGPURenderingPipeline.js +239 -60
  106. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  107. package/lib/renderer/WGPUShaderCache.d.ts +2 -2
  108. package/lib/renderer/WGPUShaderCache.js +10 -5
  109. package/lib/renderer/WGPUShaderCache.js.map +1 -1
  110. package/lib/renderer/WGPUShaderCapabilities.d.ts +10 -0
  111. package/lib/renderer/WGPUShaderCapabilities.js +54 -0
  112. package/lib/renderer/WGPUShaderCapabilities.js.map +1 -0
  113. package/lib/renderer/WGPUSkyBaker.d.ts +13 -0
  114. package/lib/renderer/WGPUSkyBaker.js +85 -0
  115. package/lib/renderer/WGPUSkyBaker.js.map +1 -0
  116. package/lib/renderer/WebGLAov.d.ts +41 -0
  117. package/lib/renderer/WebGLAov.js +106 -0
  118. package/lib/renderer/WebGLAov.js.map +1 -0
  119. package/lib/renderer/WebGLFullQuadPass.d.ts +5 -3
  120. package/lib/renderer/WebGLFullQuadPass.js +18 -2
  121. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  122. package/lib/renderer/WebGLJNLMDenoiser.d.ts +1 -1
  123. package/lib/renderer/WebGLJNLMDenoiser.js +83 -74
  124. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  125. package/lib/renderer/WebGLRayTraceOutputPass.js +7 -4
  126. package/lib/renderer/WebGLRayTraceOutputPass.js.map +1 -1
  127. package/lib/renderer/WebGLRayTracePass.d.ts +12 -2
  128. package/lib/renderer/WebGLRayTracePass.js +82 -7
  129. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  130. package/lib/renderer/WebGLRenderingPipeline.js +116 -8
  131. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  132. package/lib/renderer/WebGLSkyBaker.d.ts +39 -0
  133. package/lib/renderer/WebGLSkyBaker.js +422 -0
  134. package/lib/renderer/WebGLSkyBaker.js.map +1 -0
  135. package/lib/renderer/WebGLSkySource.d.ts +9 -0
  136. package/lib/renderer/WebGLSkySource.js +28 -0
  137. package/lib/renderer/WebGLSkySource.js.map +1 -0
  138. package/lib/renderer/accumulationTarget.d.ts +5 -0
  139. package/lib/renderer/accumulationTarget.js.map +1 -1
  140. package/lib/renderer/aov.d.ts +42 -0
  141. package/lib/renderer/aov.js +50 -0
  142. package/lib/renderer/aov.js.map +1 -0
  143. package/lib/renderer/aovDisplay.d.ts +14 -0
  144. package/lib/renderer/aovDisplay.js +32 -0
  145. package/lib/renderer/aovDisplay.js.map +1 -0
  146. package/lib/renderer/aovScene.d.ts +21 -0
  147. package/lib/renderer/aovScene.js +139 -0
  148. package/lib/renderer/aovScene.js.map +1 -0
  149. package/lib/renderer/binnedSahBvh.js +2 -1
  150. package/lib/renderer/binnedSahBvh.js.map +1 -1
  151. package/lib/renderer/bvhAccel.d.ts +20 -10
  152. package/lib/renderer/bvhAccel.js +168 -58
  153. package/lib/renderer/bvhAccel.js.map +1 -1
  154. package/lib/renderer/bvhWorkerBuild.d.ts +1 -0
  155. package/lib/renderer/cameraSnapshot.js +2 -1
  156. package/lib/renderer/cameraSnapshot.js.map +1 -1
  157. package/lib/renderer/cameraUniform.d.ts +2 -0
  158. package/lib/renderer/cameraUniform.js +12 -0
  159. package/lib/renderer/cameraUniform.js.map +1 -0
  160. package/lib/renderer/committedScene.js +4 -0
  161. package/lib/renderer/committedScene.js.map +1 -1
  162. package/lib/renderer/denoiser.d.ts +3 -11
  163. package/lib/renderer/denoiser.js.map +1 -1
  164. package/lib/renderer/depthQuery.js +4 -1
  165. package/lib/renderer/depthQuery.js.map +1 -1
  166. package/lib/renderer/displacementPreparation.d.ts +11 -0
  167. package/lib/renderer/displacementPreparation.js +351 -0
  168. package/lib/renderer/displacementPreparation.js.map +1 -0
  169. package/lib/renderer/displacementRange.d.ts +1 -0
  170. package/lib/renderer/displacementRange.js +9 -0
  171. package/lib/renderer/displacementRange.js.map +1 -0
  172. package/lib/renderer/displayParityDiagnostics.d.ts +11 -0
  173. package/lib/renderer/displayParityDiagnostics.js +2 -0
  174. package/lib/renderer/displayParityDiagnostics.js.map +1 -0
  175. package/lib/renderer/envMapCreation.d.ts +9 -8
  176. package/lib/renderer/envMapCreation.js +36 -12
  177. package/lib/renderer/envMapCreation.js.map +1 -1
  178. package/lib/renderer/envMapDistribution.d.ts +12 -2
  179. package/lib/renderer/envMapDistribution.js +43 -34
  180. package/lib/renderer/envMapDistribution.js.map +1 -1
  181. package/lib/renderer/geometryBvhBounds.d.ts +4 -0
  182. package/lib/renderer/geometryBvhBounds.js +82 -0
  183. package/lib/renderer/geometryBvhBounds.js.map +1 -0
  184. package/lib/renderer/geometryUpdateState.d.ts +32 -0
  185. package/lib/renderer/geometryUpdateState.js +2 -0
  186. package/lib/renderer/geometryUpdateState.js.map +1 -0
  187. package/lib/renderer/geometryUpdates.d.ts +17 -9
  188. package/lib/renderer/geometryUpdates.js +92 -33
  189. package/lib/renderer/geometryUpdates.js.map +1 -1
  190. package/lib/renderer/glsl/aovDisplay.frag.d.ts +3 -0
  191. package/lib/renderer/glsl/aovDisplay.frag.js +54 -0
  192. package/lib/renderer/glsl/aovDisplay.frag.js.map +1 -0
  193. package/lib/renderer/glsl/aovReflectance.glsl.d.ts +2 -0
  194. package/lib/renderer/glsl/aovReflectance.glsl.js +87 -0
  195. package/lib/renderer/glsl/aovReflectance.glsl.js.map +1 -0
  196. package/lib/renderer/glsl/aovReflectanceSamples.glsl.d.ts +2 -0
  197. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +135 -0
  198. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js.map +1 -0
  199. package/lib/renderer/glsl/aovTrace.frag.d.ts +2 -0
  200. package/lib/renderer/glsl/aovTrace.frag.js +121 -0
  201. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -0
  202. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  203. package/lib/renderer/glsl/chunks/envMap.glsl.js +80 -74
  204. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  205. package/lib/renderer/glsl/chunks/intersect.glsl.js +429 -429
  206. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +144 -144
  207. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  208. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +801 -801
  209. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  210. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  211. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +49 -49
  212. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  213. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +80 -80
  214. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +102 -102
  215. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +20 -17
  216. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js.map +1 -1
  217. package/lib/renderer/glsl/chunks/sampling.glsl.js +93 -93
  218. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  219. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  220. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +12 -12
  221. package/lib/renderer/glsl/chunks/uvProjection.glsl.js.map +1 -1
  222. package/lib/renderer/glsl/depthQuery.frag.js +7 -7
  223. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +17 -9
  224. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js.map +1 -1
  225. package/lib/renderer/glsl/rayTrace.frag.js +191 -191
  226. package/lib/renderer/glsl/shadowCatcher.frag.js +25 -20
  227. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  228. package/lib/renderer/glsl/webglPipeline.frag.js +65 -60
  229. package/lib/renderer/glsl/webglPipeline.frag.js.map +1 -1
  230. package/lib/renderer/lightConstants.d.ts +10 -0
  231. package/lib/renderer/lightConstants.js +11 -0
  232. package/lib/renderer/lightConstants.js.map +1 -0
  233. package/lib/renderer/lightCore.d.ts +12 -0
  234. package/lib/renderer/lightCore.js +13 -0
  235. package/lib/renderer/lightCore.js.map +1 -0
  236. package/lib/renderer/lightSampling.d.ts +20 -17
  237. package/lib/renderer/lightSampling.js +123 -56
  238. package/lib/renderer/lightSampling.js.map +1 -1
  239. package/lib/renderer/lightsData.d.ts +21 -0
  240. package/lib/renderer/lightsData.js +192 -0
  241. package/lib/renderer/lightsData.js.map +1 -0
  242. package/lib/renderer/lightsUtil.d.ts +3 -26
  243. package/lib/renderer/lightsUtil.js +3 -153
  244. package/lib/renderer/lightsUtil.js.map +1 -1
  245. package/lib/renderer/materialBufferData.d.ts +70 -0
  246. package/lib/renderer/materialBufferData.js +2 -0
  247. package/lib/renderer/materialBufferData.js.map +1 -0
  248. package/lib/renderer/materialConstants.d.ts +11 -0
  249. package/lib/renderer/materialConstants.js +11 -0
  250. package/lib/renderer/materialConstants.js.map +1 -1
  251. package/lib/renderer/materialCore.d.ts +8 -0
  252. package/lib/renderer/materialCore.js +9 -0
  253. package/lib/renderer/materialCore.js.map +1 -0
  254. package/lib/renderer/materialEmission.d.ts +2 -2
  255. package/lib/renderer/materialEmission.js +3 -3
  256. package/lib/renderer/materialEmission.js.map +1 -1
  257. package/lib/renderer/materialLayout.d.ts +2 -101
  258. package/lib/renderer/materialLayout.js +110 -172
  259. package/lib/renderer/materialLayout.js.map +1 -1
  260. package/lib/renderer/materialLayoutSchema.d.ts +26 -0
  261. package/lib/renderer/materialLayoutSchema.js +172 -0
  262. package/lib/renderer/materialLayoutSchema.js.map +1 -0
  263. package/lib/renderer/materialParams.d.ts +69 -0
  264. package/lib/renderer/materialParams.js +272 -0
  265. package/lib/renderer/materialParams.js.map +1 -0
  266. package/lib/renderer/materialTextureSlots.d.ts +14 -324
  267. package/lib/renderer/materialTextureSlots.js +21 -8
  268. package/lib/renderer/materialTextureSlots.js.map +1 -1
  269. package/lib/renderer/materialTextures.d.ts +6 -0
  270. package/lib/renderer/{texturesFromMaterials.js → materialTextures.js} +1 -2
  271. package/lib/renderer/materialTextures.js.map +1 -0
  272. package/lib/renderer/mergeMeshesToGeometry.js +6 -147
  273. package/lib/renderer/mergeMeshesToGeometry.js.map +1 -1
  274. package/lib/renderer/meshInstances.d.ts +4 -21
  275. package/lib/renderer/meshInstances.js +10 -56
  276. package/lib/renderer/meshInstances.js.map +1 -1
  277. package/lib/renderer/oidnNetwork.d.ts +2 -2
  278. package/lib/renderer/oidnNetwork.js +1 -1
  279. package/lib/renderer/oidnNetwork.js.map +1 -1
  280. package/lib/renderer/openPbrEnergyLut.js +850 -846
  281. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  282. package/lib/renderer/ownedDenoiser.d.ts +9 -0
  283. package/lib/renderer/ownedDenoiser.js +2 -0
  284. package/lib/renderer/ownedDenoiser.js.map +1 -0
  285. package/lib/renderer/packedMeshInstances.d.ts +23 -0
  286. package/lib/renderer/packedMeshInstances.js +80 -0
  287. package/lib/renderer/packedMeshInstances.js.map +1 -0
  288. package/lib/renderer/prepareMeshBVH.d.ts +12 -47
  289. package/lib/renderer/prepareMeshBVH.js +21 -642
  290. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  291. package/lib/renderer/proceduralEnvironmentPower.d.ts +3 -0
  292. package/lib/renderer/proceduralEnvironmentPower.js +8 -0
  293. package/lib/renderer/proceduralEnvironmentPower.js.map +1 -0
  294. package/lib/renderer/progressiveScheduler.d.ts +1 -0
  295. package/lib/renderer/progressiveScheduler.js +3 -0
  296. package/lib/renderer/progressiveScheduler.js.map +1 -1
  297. package/lib/renderer/renderPipeline.d.ts +3 -1
  298. package/lib/renderer/renderPipeline.js.map +1 -1
  299. package/lib/renderer/renderingLimits.d.ts +9 -0
  300. package/lib/renderer/renderingLimits.js +18 -0
  301. package/lib/renderer/renderingLimits.js.map +1 -0
  302. package/lib/renderer/sceneAssembly.d.ts +73 -0
  303. package/lib/renderer/sceneAssembly.js +109 -0
  304. package/lib/renderer/sceneAssembly.js.map +1 -0
  305. package/lib/renderer/sceneChangeCore.d.ts +39 -0
  306. package/lib/renderer/sceneChangeCore.js +307 -0
  307. package/lib/renderer/sceneChangeCore.js.map +1 -0
  308. package/lib/renderer/sceneChangeDetector.d.ts +3 -6
  309. package/lib/renderer/sceneChangeDetector.js +24 -150
  310. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  311. package/lib/renderer/sceneLayoutSchema.d.ts +118 -0
  312. package/lib/renderer/sceneLayoutSchema.js +111 -0
  313. package/lib/renderer/sceneLayoutSchema.js.map +1 -0
  314. package/lib/renderer/sceneLightChanges.d.ts +3 -3
  315. package/lib/renderer/sceneLightChanges.js.map +1 -1
  316. package/lib/renderer/scenePreparation.d.ts +55 -0
  317. package/lib/renderer/scenePreparation.js +360 -0
  318. package/lib/renderer/scenePreparation.js.map +1 -0
  319. package/lib/renderer/scratchSampling.js +18 -18
  320. package/lib/renderer/scratchSampling.js.map +1 -1
  321. package/lib/renderer/shader.d.ts +2 -0
  322. package/lib/renderer/shader.js +2 -0
  323. package/lib/renderer/shader.js.map +1 -1
  324. package/lib/renderer/shaderCapabilities.d.ts +23 -0
  325. package/lib/renderer/shaderCapabilities.js +55 -0
  326. package/lib/renderer/shaderCapabilities.js.map +1 -0
  327. package/lib/renderer/shaderCapacity.d.ts +2 -0
  328. package/lib/renderer/shaderCapacity.js +5 -0
  329. package/lib/renderer/shaderCapacity.js.map +1 -0
  330. package/lib/renderer/skyModel.d.ts +9 -0
  331. package/lib/renderer/skyModel.js +10 -0
  332. package/lib/renderer/skyModel.js.map +1 -0
  333. package/lib/renderer/textureAtlas.d.ts +60 -0
  334. package/lib/renderer/textureAtlas.js +145 -0
  335. package/lib/renderer/textureAtlas.js.map +1 -0
  336. package/lib/renderer/textureAtlasPixels.d.ts +7 -0
  337. package/lib/renderer/textureAtlasPixels.js +68 -0
  338. package/lib/renderer/textureAtlasPixels.js.map +1 -0
  339. package/lib/renderer/util.d.ts +1 -1
  340. package/lib/renderer/util.js.map +1 -1
  341. package/lib/renderer/webgl.d.ts +9 -2
  342. package/lib/renderer/webgl.js +54 -9
  343. package/lib/renderer/webgl.js.map +1 -1
  344. package/lib/renderer/wgpuBindless.d.ts +26 -0
  345. package/lib/renderer/wgpuBindless.js +95 -0
  346. package/lib/renderer/wgpuBindless.js.map +1 -0
  347. package/lib/renderer/wgpuBindlessSource.d.ts +2 -0
  348. package/lib/renderer/wgpuBindlessSource.js +51 -0
  349. package/lib/renderer/wgpuBindlessSource.js.map +1 -0
  350. package/lib/renderer/wgpuMaterialConstants.d.ts +4 -0
  351. package/lib/renderer/wgpuMaterialConstants.js +52 -0
  352. package/lib/renderer/wgpuMaterialConstants.js.map +1 -0
  353. package/lib/renderer/wgpuSceneUniform.d.ts +42 -0
  354. package/lib/renderer/wgpuSceneUniform.js +125 -0
  355. package/lib/renderer/wgpuSceneUniform.js.map +1 -0
  356. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  357. package/lib/renderer/wgpuShaderSource.js +31 -0
  358. package/lib/renderer/wgpuShaderSource.js.map +1 -0
  359. package/lib/renderer/wgsl/aovDisplay.wgsl.d.ts +1 -0
  360. package/lib/renderer/wgsl/aovDisplay.wgsl.js +70 -0
  361. package/lib/renderer/wgsl/aovDisplay.wgsl.js.map +1 -0
  362. package/lib/renderer/wgsl/aovReflectance.wgsl.d.ts +2 -0
  363. package/lib/renderer/wgsl/aovReflectance.wgsl.js +98 -0
  364. package/lib/renderer/wgsl/aovReflectance.wgsl.js.map +1 -0
  365. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.d.ts +2 -0
  366. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +135 -0
  367. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js.map +1 -0
  368. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +5 -0
  369. package/lib/renderer/wgsl/aovResolve.wgsl.js +38 -0
  370. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -0
  371. package/lib/renderer/wgsl/aovSnapshot.wgsl.d.ts +4 -0
  372. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +21 -0
  373. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -0
  374. package/lib/renderer/wgsl/aovTrace.wgsl.d.ts +2 -0
  375. package/lib/renderer/wgsl/aovTrace.wgsl.js +115 -0
  376. package/lib/renderer/wgsl/aovTrace.wgsl.js.map +1 -0
  377. package/lib/renderer/wgsl/bloom.wgsl.d.ts +13 -0
  378. package/lib/renderer/wgsl/bloom.wgsl.js +92 -0
  379. package/lib/renderer/wgsl/bloom.wgsl.js.map +1 -0
  380. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  381. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  382. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +43 -37
  383. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  384. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +13 -1
  385. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +742 -705
  386. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  387. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +16 -16
  388. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  389. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  390. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +84 -82
  391. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  392. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +855 -857
  393. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js.map +1 -1
  394. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  395. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  396. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  397. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +42 -32
  398. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  399. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  400. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +152 -148
  401. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  402. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +239 -232
  403. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  404. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  405. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +26 -13
  406. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  407. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +91 -91
  408. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +1 -1
  409. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +1 -0
  410. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  411. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  412. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +12 -12
  413. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js.map +1 -1
  414. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +8 -3
  415. package/lib/renderer/wgsl/compose.frag.wgsl.js +143 -118
  416. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  417. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  418. package/lib/renderer/wgsl/depthQuery.wgsl.js +7 -7
  419. package/lib/renderer/wgsl/jnlm.compute.d.ts +25 -0
  420. package/lib/renderer/wgsl/jnlm.compute.js +315 -0
  421. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -0
  422. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  423. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.d.ts +1 -0
  424. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +17 -0
  425. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js.map +1 -0
  426. package/lib/renderer/wgsl/proceduralSky.compute.d.ts +1 -0
  427. package/lib/renderer/wgsl/proceduralSky.compute.js +198 -0
  428. package/lib/renderer/wgsl/proceduralSky.compute.js.map +1 -0
  429. package/lib/renderer/wgsl/rayTrace.compute.d.ts +17 -1
  430. package/lib/renderer/wgsl/rayTrace.compute.js +612 -393
  431. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  432. package/lib/scene/Camera.js +7 -3
  433. package/lib/scene/Camera.js.map +1 -1
  434. package/lib/scene/EnvironmentLight.d.ts +5 -9
  435. package/lib/scene/EnvironmentLight.js +4 -14
  436. package/lib/scene/EnvironmentLight.js.map +1 -1
  437. package/lib/scene/EnvironmentLightState.d.ts +18 -0
  438. package/lib/scene/EnvironmentLightState.js +19 -0
  439. package/lib/scene/EnvironmentLightState.js.map +1 -0
  440. package/lib/scene/Geometry.d.ts +12 -6
  441. package/lib/scene/Geometry.js +37 -13
  442. package/lib/scene/Geometry.js.map +1 -1
  443. package/lib/scene/InstanceState.d.ts +39 -0
  444. package/lib/scene/InstanceState.js +77 -0
  445. package/lib/scene/InstanceState.js.map +1 -0
  446. package/lib/scene/InstancedMesh.d.ts +1 -1
  447. package/lib/scene/InstancedMesh.js +3 -0
  448. package/lib/scene/InstancedMesh.js.map +1 -1
  449. package/lib/scene/MaterialState.d.ts +209 -0
  450. package/lib/scene/MaterialState.js +231 -0
  451. package/lib/scene/MaterialState.js.map +1 -0
  452. package/lib/scene/Mesh.d.ts +4 -6
  453. package/lib/scene/Mesh.js +3 -11
  454. package/lib/scene/Mesh.js.map +1 -1
  455. package/lib/scene/MeshState.d.ts +20 -0
  456. package/lib/scene/MeshState.js +35 -0
  457. package/lib/scene/MeshState.js.map +1 -0
  458. package/lib/scene/OpenPBRMaterial.d.ts +6 -168
  459. package/lib/scene/OpenPBRMaterial.js +5 -223
  460. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  461. package/lib/scene/PixelTexture.d.ts +6 -0
  462. package/lib/scene/PixelTexture.js +10 -0
  463. package/lib/scene/PixelTexture.js.map +1 -0
  464. package/lib/scene/ProceduralSky.d.ts +24 -0
  465. package/lib/scene/ProceduralSky.js +40 -0
  466. package/lib/scene/ProceduralSky.js.map +1 -0
  467. package/lib/scene/RectLight.d.ts +2 -13
  468. package/lib/scene/RectLight.js +3 -21
  469. package/lib/scene/RectLight.js.map +1 -1
  470. package/lib/scene/RectLightState.d.ts +31 -0
  471. package/lib/scene/RectLightState.js +26 -0
  472. package/lib/scene/RectLightState.js.map +1 -0
  473. package/lib/scene/Scene.d.ts +15 -4
  474. package/lib/scene/Scene.js.map +1 -1
  475. package/lib/scene/SceneNode.js +7 -6
  476. package/lib/scene/SceneNode.js.map +1 -1
  477. package/lib/scene/Texture.d.ts +10 -41
  478. package/lib/scene/Texture.js +4 -33
  479. package/lib/scene/Texture.js.map +1 -1
  480. package/lib/scene/TextureState.d.ts +35 -0
  481. package/lib/scene/TextureState.js +35 -0
  482. package/lib/scene/TextureState.js.map +1 -0
  483. package/lib/scene/attributeData.d.ts +4 -0
  484. package/lib/scene/attributeData.js +10 -0
  485. package/lib/scene/attributeData.js.map +1 -0
  486. package/lib/scene/lightState.d.ts +8 -0
  487. package/lib/scene/lightState.js +2 -0
  488. package/lib/scene/lightState.js.map +1 -0
  489. package/lib/scene/openPbrSchema.d.ts +7 -12
  490. package/lib/scene/openPbrSchema.js +273 -28
  491. package/lib/scene/openPbrSchema.js.map +1 -1
  492. package/lib/scene/skyParameters.d.ts +20 -0
  493. package/lib/scene/skyParameters.js +28 -0
  494. package/lib/scene/skyParameters.js.map +1 -0
  495. package/lib/scene/textureData.d.ts +9 -0
  496. package/lib/scene/textureData.js +2 -0
  497. package/lib/scene/textureData.js.map +1 -0
  498. package/lib/scene/texturePixels.d.ts +6 -0
  499. package/lib/scene/texturePixels.js +10 -0
  500. package/lib/scene/texturePixels.js.map +1 -0
  501. package/lib/settings/display.d.ts +33 -0
  502. package/lib/settings/display.js +7 -0
  503. package/lib/settings/display.js.map +1 -1
  504. package/lib/settings/render.d.ts +25 -3
  505. package/lib/settings/render.js +3 -1
  506. package/lib/settings/render.js.map +1 -1
  507. package/lib/tinybvh/tinybvh.wasm +0 -0
  508. package/lib/util/commonGeometry.js +7 -7
  509. package/lib/util/commonGeometry.js.map +1 -1
  510. package/lib/util/fromTHREE.d.ts +4 -1
  511. package/lib/util/fromTHREE.js +18 -5
  512. package/lib/util/fromTHREE.js.map +1 -1
  513. package/lib/util/geometry.js +42 -29
  514. package/lib/util/geometry.js.map +1 -1
  515. package/lib/util/loadRGBE.js +3 -4
  516. package/lib/util/loadRGBE.js.map +1 -1
  517. package/lib/util/studioLighting.d.ts +18 -0
  518. package/lib/util/studioLighting.js +36 -0
  519. package/lib/util/studioLighting.js.map +1 -0
  520. package/lib/version.d.ts +1 -1
  521. package/lib/version.js +1 -1
  522. package/lib/version.js.map +1 -1
  523. package/llms.txt +4 -0
  524. package/package.json +31 -5
  525. package/lib/renderer/texturesFromMaterials.d.ts +0 -6
  526. package/lib/renderer/texturesFromMaterials.js.map +0 -1
@@ -52,8 +52,9 @@ ${cameraRayGlsl}
52
52
 
53
53
 
54
54
 
55
- vec4 mx(inout Ray ray, out vec4 background) {
55
+ vec4 iu(inout Ray ray, out vec4 background, out vec2 shadowCounts) {
56
56
  background = vec4(0.0);
57
+ shadowCounts = vec2(0.0);
57
58
  Path aa;
58
59
  aa.ray = ray;
59
60
  aa.li = vec3(0);
@@ -63,9 +64,9 @@ aa.fromEye = true;
63
64
  aa.scatteringPdf = 0.0;
64
65
  aa.abort = false;
65
66
 
66
- ad si;
67
+ SurfaceInteraction si;
67
68
 
68
- cZ(aa.ray, si, false);
69
+ intersectScene(aa.ray, si, false);
69
70
  if (!si.hit) {
70
71
 
71
72
 
@@ -73,45 +74,49 @@ if (!si.hit) {
73
74
  return vec4(0.0, 0.0, 0.0, 1.0);
74
75
  }
75
76
 
76
- J mat;
77
- eX(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
77
+ OpenPbrResolvedMaterial mat;
78
+ dg(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);
78
79
  if (mat.materialType != SHADOW_CATCHER) {
79
80
 
80
81
 
81
82
  return vec4(0.0, 0.0, 0.0, 1.0);
82
83
  }
83
84
 
84
- vec4 bg = cx(ray.o, ray.d);
85
+ vec4 bg = cG(ray.o, ray.d);
85
86
  background = vec4(bg.rgb * bg.a, bg.a);
86
87
  if (!aa.abort) {
87
- sampleShadowCatcher(si, 0, aa);
88
+ shadowCounts = sampleShadowCatcher(si, 0, aa);
88
89
  }
89
- return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, aa.alpha);
90
+ return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, 0.0);
90
91
  }
91
92
 
92
93
  void main() {
93
- su();
94
- kh(v_Texcoord * viewportSize, int(uint(sampleCount) ^ eg(uint(sequenceSeed))));
94
+ rG();
95
+ gW(v_Texcoord * viewportSize, int(uint(sampleCount) ^ dG(uint(sequenceSeed))));
95
96
 
96
- if (dispersionWavelengths == 1 && wavelength > 0.0) { dz(CAMERA_WAVELENGTH); }
97
- Ray cam = nM();
97
+ if (dispersionWavelengths == 1 && wavelength > 0.0) { dp(CAMERA_WAVELENGTH); }
98
+ Ray cam = oG();
98
99
  vec4 background;
99
- vec4 aF = mx(cam, background);
100
+ vec2 shadowCounts;
101
+ vec4 aW = iu(cam, background, shadowCounts);
100
102
 
101
- if (!(aF.x < INF && aF.x > -EPS)) {
102
- aF = vec4(0, 0, 0, 1);
103
+ if (!(aW.x < INF && aW.x > -EPS)) {
104
+ aW = vec4(0.0);
105
+ shadowCounts = vec2(0.0);
103
106
  }
104
107
 
105
- out_shadowCatcher = aF;
106
- out_catcherBackground = background;
107
108
 
108
109
 
110
+ out_shadowCatcher = vec4(aW.rgb, shadowCounts.x);
111
+ out_catcherBackground = background;
112
+
109
113
 
110
- float jq = aF.a * (background.a >= 0.01
114
+ float visibility = 1.0 - (shadowCounts.y > 0.0 ? shadowCounts.x / shadowCounts.y : 0.0);
115
+ float jP = visibility * (background.a >= 0.01
111
116
  ? dot(background.rgb / background.a, vec3(0.2126, 0.7152, 0.0722))
112
117
  : 1.0);
113
- out_catcherMoments = aF.r > 0.0
114
- ? vec4(jq, jq * jq, 1.0, 0.0)
118
+ out_catcherMoments = aW.r > 0.0
119
+ ? vec4(jP, jP * jP, 1.0, shadowCounts.y)
115
120
  : vec4(0.0);
116
121
 
117
122
  }`
@@ -1 +1 @@
1
- {"version":3,"file":"shadowCatcher.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/shadowCatcher.frag.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAC3D,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AACjE,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AACvE,OAAO,WAAW,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,YAAY,MAAM,2BAA2B,CAAC;AACrD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,eAAe,IAAI,cAAc,CAAC;IAChC,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,CAAC,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IACjE,OAAO,EAAE;QACP,OAAO,EAAE,CAAC;KACX;IACD,QAAQ,EAAE;QACR,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;KACjD;IACD,QAAQ,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;IACvE,IAAI,EAAE,IAAI,CAAA;EACV,MAAM;EACN,QAAQ;EACR,MAAM,CAAC,IAAI;;EAEX,aAAa;;EAEb,YAAY,CAAC,IAAI;EACjB,gBAAgB;;EAEhB,kBAAkB,CAAC,IAAI;EACvB,SAAS,CAAC,IAAI;EACd,MAAM,CAAC,IAAI;;EAEX,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkEb;CACD,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 cameraRayGlsl from './chunks/cameraRay.glsl.js';\nimport common from './chunks/common.glsl.js';\nimport rayTraceCore from './chunks/rayTraceCore.glsl.js';\nimport textureLinear from './chunks/textureLinear.glsl.js';\nimport materialBufferGlsl from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport randGlsl from './chunks/rand.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport envMap from './chunks/envMap.glsl.js';\nimport sampleShadowCatcher from './chunks/sampleShadowCatcher.glsl.js';\nimport sampleLight from './chunks/sampleLight.glsl.js';\nimport { FragmentShader, glsl, Shader } from '../shader.js';\nimport samplingGlsl from './chunks/sampling.glsl.js';\nimport uvProjectionGlsl from './chunks/uvProjection.glsl.js';\n\nexport default new FragmentShader({\n name: 'shadowCatcher',\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n defines: {\n BOUNCES: 2\n },\n uniforms: {\n dispersionWavelengths: Shader.uniform('int', 3),\n wavelength: Shader.uniform('float', 0),\n viewportSize: Shader.uniform('vec2'),\n viewProjectionInv: Shader.uniform('mat4'),\n viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float', 0),\n cameraFocusDistance: Shader.uniform('float', 10)\n },\n includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap],\n main: glsl`\n${common}\n${randGlsl}\n${random.main}\n\n${textureLinear}\n\n${rayTraceCore.main}\n${uvProjectionGlsl}\n\n${materialBufferGlsl.main}\n${intersect.main}\n${envMap.main}\n\n${samplingGlsl}\n${sampleLight}\n${sampleShadowCatcher}\n${cameraRayGlsl}\n\n// Path tracing integrator as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Path_Tracing.html#\nvec4 integrator(inout Ray ray, out vec4 background) {\n background = vec4(0.0);\n Path path;\n path.ray = ray;\n path.li = vec3(0);\n path.alpha = 1.0;\n path.beta = vec3(1.0);\n path.fromEye = true;\n path.scatteringPdf = 0.0;\n path.abort = false;\n\n SurfaceInteraction si;\n\n intersectScene(path.ray, si, false);\n if (!si.hit) {\n // Red stores catcher coverage. Keep it zero for pixels where the primary\n // ray did not hit the catcher so denoised shadows cannot bleed onto the\n // model silhouette during composition.\n return vec4(0.0, 0.0, 0.0, 1.0);\n }\n\n OpenPbrResolvedMaterial mat;\n getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);\n if (mat.materialType != SHADOW_CATCHER) {\n // The main path tracer already renders regular geometry. Only evaluate\n // shadow opacity when the primary ray actually hits the catcher.\n return vec4(0.0, 0.0, 0.0, 1.0);\n }\n\n vec4 bg = sampleBackgroundFromRay(ray.o, ray.d);\n background = vec4(bg.rgb * bg.a, bg.a);\n if (!path.abort) {\n sampleShadowCatcher(si, 0, path);\n }\n return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, path.alpha);\n}\n\nvoid main() {\n initRandom();\n rng_initialize(v_Texcoord * viewportSize, int(uint(sampleCount) ^ sampleHash(uint(sequenceSeed))));\n // Match the beauty pass's random stream in hero-wavelength previews.\n if (dispersionWavelengths == 1 && wavelength > 0.0) { sample1D(CAMERA_WAVELENGTH); }\n Ray cam = primaryCameraRay();\n vec4 background;\n vec4 liAndAlpha = integrator(cam, background);\n\n if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {\n liAndAlpha = vec4(0, 0, 0, 1);\n }\n\n out_shadowCatcher = liAndAlpha;\n out_catcherBackground = background;\n // The composed catcher is the background darkened by the shadow (its\n // visibility in alpha). Over a transparent background the shadow is only\n // its opacity.\n float guideValue = liAndAlpha.a * (background.a >= 0.01\n ? dot(background.rgb / background.a, vec3(0.2126, 0.7152, 0.0722))\n : 1.0);\n out_catcherMoments = liAndAlpha.r > 0.0\n ? vec4(guideValue, guideValue * guideValue, 1.0, 0.0)\n : vec4(0.0);\n\n}`\n});\n"]}
1
+ {"version":3,"file":"shadowCatcher.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/shadowCatcher.frag.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,OAAO,aAAa,MAAM,4BAA4B,CAAC;AACvD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,aAAa,MAAM,gCAAgC,CAAC;AAC3D,OAAO,kBAAkB,MAAM,iCAAiC,CAAC;AACjE,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,QAAQ,MAAM,uBAAuB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,mBAAmB,MAAM,sCAAsC,CAAC;AACvE,OAAO,WAAW,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,YAAY,MAAM,2BAA2B,CAAC;AACrD,OAAO,gBAAgB,MAAM,+BAA+B,CAAC;AAE7D,eAAe,IAAI,cAAc,CAAC;IAChC,IAAI,EAAE,eAAe;IACrB,OAAO,EAAE,CAAC,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;IACjE,OAAO,EAAE;QACP,OAAO,EAAE,CAAC;KACX;IACD,QAAQ,EAAE;QACR,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC/C,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;KACjD;IACD,QAAQ,EAAE,CAAC,YAAY,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC;IACvE,IAAI,EAAE,IAAI,CAAA;EACV,MAAM;EACN,QAAQ;EACR,MAAM,CAAC,IAAI;;EAEX,aAAa;;EAEb,YAAY,CAAC,IAAI;EACjB,gBAAgB;;EAEhB,kBAAkB,CAAC,IAAI;EACvB,SAAS,CAAC,IAAI;EACd,MAAM,CAAC,IAAI;;EAEX,YAAY;EACZ,WAAW;EACX,mBAAmB;EACnB,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAuEb;CACD,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 cameraRayGlsl from './chunks/cameraRay.glsl.js';\nimport common from './chunks/common.glsl.js';\nimport rayTraceCore from './chunks/rayTraceCore.glsl.js';\nimport textureLinear from './chunks/textureLinear.glsl.js';\nimport materialBufferGlsl from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport randGlsl from './chunks/rand.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport envMap from './chunks/envMap.glsl.js';\nimport sampleShadowCatcher from './chunks/sampleShadowCatcher.glsl.js';\nimport sampleLight from './chunks/sampleLight.glsl.js';\nimport { FragmentShader, glsl, Shader } from '../shader.js';\nimport samplingGlsl from './chunks/sampling.glsl.js';\nimport uvProjectionGlsl from './chunks/uvProjection.glsl.js';\n\nexport default new FragmentShader({\n name: 'shadowCatcher',\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n defines: {\n BOUNCES: 2\n },\n uniforms: {\n dispersionWavelengths: Shader.uniform('int', 3),\n wavelength: Shader.uniform('float', 0),\n viewportSize: Shader.uniform('vec2'),\n viewProjectionInv: Shader.uniform('mat4'),\n viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float', 0),\n cameraFocusDistance: Shader.uniform('float', 10)\n },\n includes: [rayTraceCore, materialBufferGlsl, intersect, random, envMap],\n main: glsl`\n${common}\n${randGlsl}\n${random.main}\n\n${textureLinear}\n\n${rayTraceCore.main}\n${uvProjectionGlsl}\n\n${materialBufferGlsl.main}\n${intersect.main}\n${envMap.main}\n\n${samplingGlsl}\n${sampleLight}\n${sampleShadowCatcher}\n${cameraRayGlsl}\n\n// Path tracing integrator as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Path_Tracing.html#\nvec4 integrator(inout Ray ray, out vec4 background, out vec2 shadowCounts) {\n background = vec4(0.0);\n shadowCounts = vec2(0.0);\n Path path;\n path.ray = ray;\n path.li = vec3(0);\n path.alpha = 1.0;\n path.beta = vec3(1.0);\n path.fromEye = true;\n path.scatteringPdf = 0.0;\n path.abort = false;\n\n SurfaceInteraction si;\n\n intersectScene(path.ray, si, false);\n if (!si.hit) {\n // Red stores catcher coverage. Keep it zero for pixels where the primary\n // ray did not hit the catcher so denoised shadows cannot bleed onto the\n // model silhouette during composition.\n return vec4(0.0, 0.0, 0.0, 1.0);\n }\n\n OpenPbrResolvedMaterial mat;\n getMaterial(mat, si.materialIndex, si.uv, si.uv1, si.instanceIndex, si.vertexColor);\n if (mat.materialType != SHADOW_CATCHER) {\n // The main path tracer already renders regular geometry. Only evaluate\n // shadow opacity when the primary ray actually hits the catcher.\n return vec4(0.0, 0.0, 0.0, 1.0);\n }\n\n vec4 bg = sampleBackgroundFromRay(ray.o, ray.d);\n background = vec4(bg.rgb * bg.a, bg.a);\n if (!path.abort) {\n shadowCounts = sampleShadowCatcher(si, 0, path);\n }\n return vec4(1.0, bg.a, bg.a >= 0.01 ? 1.0 : 0.0, 0.0);\n}\n\nvoid main() {\n initRandom();\n rng_initialize(v_Texcoord * viewportSize, int(uint(sampleCount) ^ sampleHash(uint(sequenceSeed))));\n // Match the beauty pass's random stream in hero-wavelength previews.\n if (dispersionWavelengths == 1 && wavelength > 0.0) { sample1D(CAMERA_WAVELENGTH); }\n Ray cam = primaryCameraRay();\n vec4 background;\n vec2 shadowCounts;\n vec4 liAndAlpha = integrator(cam, background, shadowCounts);\n\n if (!(liAndAlpha.x < INF && liAndAlpha.x > -EPS)) {\n liAndAlpha = vec4(0.0);\n shadowCounts = vec2(0.0);\n }\n\n // Alpha and the moments' w sum the occluded and total light sample counts;\n // the output pass resolves their ratio into shadow visibility.\n out_shadowCatcher = vec4(liAndAlpha.rgb, shadowCounts.x);\n out_catcherBackground = background;\n // The composed catcher is the background darkened by the shadow. Over a\n // transparent background the shadow is only its opacity.\n float visibility = 1.0 - (shadowCounts.y > 0.0 ? shadowCounts.x / shadowCounts.y : 0.0);\n float guideValue = visibility * (background.a >= 0.01\n ? dot(background.rgb / background.a, vec3(0.2126, 0.7152, 0.0722))\n : 1.0);\n out_catcherMoments = liAndAlpha.r > 0.0\n ? vec4(guideValue, guideValue * guideValue, 1.0, shadowCounts.y)\n : vec4(0.0);\n\n}`\n});\n"]}
@@ -7,22 +7,22 @@ export const brightFragment = new FragmentShader({
7
7
  scale: Shader.uniform('float', 1)
8
8
  },
9
9
  main: glsl `
10
- const vec3 uQ = vec3(0.2125, 0.7154, 0.0721);
11
- vec4 sD(vec4 a, vec4 b, vec4 c) {
10
+ const vec3 wE = vec3(0.2125, 0.7154, 0.0721);
11
+ vec4 tS(vec4 a, vec4 b, vec4 c) {
12
12
  return a + b + c - min(min(a, b), c) - max(max(a, b), c);
13
13
  }
14
14
  void main() {
15
15
  vec2 d = 1.0 / vec2(colorTexRegion());
16
- vec4 eA = sample_colorTex(v_Texcoord);
16
+ vec4 dk = sample_colorTex(v_Texcoord);
17
17
  vec4 s1 = sample_colorTex(v_Texcoord - vec2(d.x, 0.0));
18
18
  vec4 s2 = sample_colorTex(v_Texcoord + vec2(d.x, 0.0));
19
19
  vec4 s3 = sample_colorTex(v_Texcoord - vec2(0.0, d.y));
20
20
  vec4 s4 = sample_colorTex(v_Texcoord + vec2(0.0, d.y));
21
- eA = sD(sD(eA, s1, s2), s3, s4);
22
- float lum = dot(eA.rgb, uQ);
23
- out_color = lum > threshold && eA.a > 0.0
24
- ? vec4(eA.rgb * scale, eA.a)
25
- : vec4(0.0, 0.0, 0.0, eA.a);
21
+ dk = tS(tS(dk, s1, s2), s3, s4);
22
+ float lum = dot(dk.rgb, wE);
23
+ out_color = lum > threshold && dk.a > 0.0
24
+ ? vec4(dk.rgb * scale, dk.a)
25
+ : vec4(0.0, 0.0, 0.0, dk.a);
26
26
  }`
27
27
  });
28
28
  export const composeFragment = new FragmentShader({
@@ -48,35 +48,40 @@ export const composeFragment = new FragmentShader({
48
48
  sRGBOutput: Shader.uniform('bool', 1)
49
49
  },
50
50
  main: glsl `
51
- vec3 jU(vec3 color) {
51
+ vec3 od(vec3 color) {
52
+ color = max(color, 0.0);
53
+ return mix(1.055 * pow(color, vec3(1.0 / 2.4)) - 0.055,
54
+ color * 12.92, lessThanEqual(color, vec3(0.0031308)));
55
+ }
56
+ vec3 ky(vec3 color) {
52
57
  return clamp(color, 0.0, 1.0);
53
58
  }
54
- vec3 iP(vec3 color) {
59
+ vec3 jf(vec3 color) {
55
60
  return clamp(color / (vec3(1.0) + color), 0.0, 1.0);
56
61
  }
57
- vec3 jJ(vec3 color) {
62
+ vec3 kj(vec3 color) {
58
63
  color = max(vec3(0.0), color - 0.004);
59
64
  return pow((color * (6.2 * color + 0.5)) /
60
65
  (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));
61
66
  }
62
- vec3 oI(vec3 value) {
63
- vec3 kO = value * (value + 0.0245786) - 0.000090537;
64
- vec3 ap = value * (0.983729 * value + 0.4329510) + 0.238081;
65
- return kO / ap;
67
+ vec3 pH(vec3 value) {
68
+ vec3 lv = value * (value + 0.0245786) - 0.000090537;
69
+ vec3 aq = value * (0.983729 * value + 0.4329510) + 0.238081;
70
+ return lv / aq;
66
71
  }
67
- vec3 lv(vec3 color) {
68
- const mat3 pw = mat3(
72
+ vec3 mh(vec3 color) {
73
+ const mat3 qs = mat3(
69
74
  vec3(0.59719, 0.07600, 0.02840),
70
75
  vec3(0.35458, 0.90834, 0.13383),
71
76
  vec3(0.04823, 0.01566, 0.83777)
72
77
  );
73
- const mat3 oD = mat3(
78
+ const mat3 outputMatrix = mat3(
74
79
  vec3(1.60475, -0.10208, -0.00327),
75
80
  vec3(-0.53108, 1.10813, -0.07276),
76
81
  vec3(-0.07367, -0.00605, 1.07602)
77
82
  );
78
- color = pw * (color / 0.6);
79
- return clamp(oD * oI(color), 0.0, 1.0);
83
+ color = qs * (color / 0.6);
84
+ return clamp(outputMatrix * pH(color), 0.0, 1.0);
80
85
  }
81
86
  const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(
82
87
  vec3(1.6605, -0.1246, -0.0182),
@@ -88,44 +93,44 @@ vec3(0.6274, 0.0691, 0.0164),
88
93
  vec3(0.3293, 0.9195, 0.0880),
89
94
  vec3(0.0433, 0.0113, 0.8956)
90
95
  );
91
- vec3 fU(vec3 value) {
92
- vec3 mN = value * value;
93
- vec3 qK = mN * mN;
94
- return 15.5 * qK * mN - 40.14 * qK * value
95
- + 31.96 * qK - 6.868 * mN * value
96
- + 0.4298 * mN + 0.1191 * value - 0.00232;
97
- }
98
- vec3 mc(vec3 color) {
99
- const mat3 pH = mat3(
96
+ vec3 gh(vec3 value) {
97
+ vec3 nM = value * value;
98
+ vec3 rR = nM * nM;
99
+ return 15.5 * rR * nM - 40.14 * rR * value
100
+ + 31.96 * rR - 6.868 * nM * value
101
+ + 0.4298 * nM + 0.1191 * value - 0.00232;
102
+ }
103
+ vec3 mM(vec3 color) {
104
+ const mat3 qu = mat3(
100
105
  vec3(0.856627153315983, 0.137318972929847, 0.11189821299995),
101
106
  vec3(0.0951212405381588, 0.761241990602591, 0.0767994186031903),
102
107
  vec3(0.0482516061458583, 0.101439036467562, 0.811302368396859)
103
108
  );
104
- const mat3 oE = mat3(
109
+ const mat3 pt = mat3(
105
110
  vec3(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),
106
111
  vec3(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),
107
112
  vec3(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)
108
113
  );
109
- color = pH * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);
114
+ color = qu * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);
110
115
  color = clamp((log2(max(color, 1e-10)) + 12.47393) / 16.5, 0.0, 1.0);
111
- color = oE * fU(color);
116
+ color = pt * gh(color);
112
117
  color = pow(max(color, 0.0), vec3(2.2));
113
118
  return clamp(LINEAR_REC2020_TO_LINEAR_SRGB * color, 0.0, 1.0);
114
119
  }
115
- vec3 cl(vec3 color) {
116
- if (toneMappingMode == 1) return lv(color);
117
- if (toneMappingMode == 2) return jJ(color);
118
- if (toneMappingMode == 3) return iP(color);
119
- if (toneMappingMode == 4) return jU(color);
120
- return mc(color);
120
+ vec3 cp(vec3 color) {
121
+ if (toneMappingMode == 1) return mh(color);
122
+ if (toneMappingMode == 2) return kj(color);
123
+ if (toneMappingMode == 3) return jf(color);
124
+ if (toneMappingMode == 4) return ky(color);
125
+ return mM(color);
121
126
  }
122
- vec3 gc(vec3 color) {
123
- vec3 tj = vec3(
127
+ vec3 gq(vec3 color) {
128
+ vec3 uH = vec3(
124
129
  1.0 + temperature * 0.16 + tint * 0.04,
125
130
  1.0 - tint * 0.12,
126
131
  1.0 - temperature * 0.16 + tint * 0.04
127
132
  );
128
- color = max(color * tj, 0.0);
133
+ color = max(color * uH, 0.0);
129
134
  color = max((color - 0.18) * contrast + 0.18, 0.0);
130
135
  float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
131
136
  return max(mix(vec3(luminance), color, saturation), 0.0);
@@ -141,12 +146,12 @@ return;
141
146
  vec4 color = sample_colorTex(uv);
142
147
  vec4 bloom = sample_bloomTex(uv) * bloomIntensity;
143
148
  color.rgb += bloom.rgb;
144
- color.rgb = gc(color.rgb * exposure);
149
+ color.rgb = gq(color.rgb * exposure);
145
150
  if (sRGBOutput) {
146
151
  float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));
147
152
  color.rgb *= 1.0 - vignette * edge;
148
- color.rgb = cl(color.rgb);
149
- color.rgb = pow(max(color.rgb, 0.0), vec3(1.0 / 2.2));
153
+ color.rgb = cp(color.rgb);
154
+ color.rgb = od(color.rgb);
150
155
  }
151
156
  color.a = max(color.a, min(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 1.0));
152
157
 
@@ -154,32 +159,32 @@ if (shadowCatcherEnabled > 0.5) {
154
159
  float coverage = clamp(shadow.r, 0.0, 1.0);
155
160
 
156
161
 
157
- float fS = clamp(
162
+ float gf = clamp(
158
163
  (1.0 - shadow.a) / max(coverage, 0.000001), 0.0, 1.0
159
164
  );
160
- fS = max(fS - (1.0 - shadowCatcherAlpha), 0.0);
165
+ gf = max(gf - (1.0 - shadowCatcherAlpha), 0.0);
161
166
  if (coverage > 0.0) {
162
167
  vec4 foreground = sample_foregroundTex(uv);
163
168
  vec4 background = sample_catcherBackgroundTex(uv);
164
- vec3 bK = gc((foreground.rgb + bloom.rgb) * exposure);
165
- vec3 backgroundColor = gc((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);
169
+ vec3 foregroundColor = gq((foreground.rgb + bloom.rgb) * exposure);
170
+ vec3 backgroundColor = gq((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);
166
171
  if (sRGBOutput) {
167
172
  float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));
168
- bK *= 1.0 - vignette * edge;
173
+ foregroundColor *= 1.0 - vignette * edge;
169
174
  backgroundColor *= 1.0 - vignette * edge;
170
- bK = pow(max(cl(bK), 0.0), vec3(1.0 / 2.2));
171
- backgroundColor = pow(max(cl(backgroundColor), 0.0), vec3(1.0 / 2.2));
175
+ foregroundColor = od(cp(foregroundColor));
176
+ backgroundColor = od(cp(backgroundColor));
172
177
  }
173
178
 
174
- float opacity = fS;
175
- fS *= coverage;
176
- float mf = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
177
- float hv = max(foreground.a, mf * (1.0 - coverage));
178
- float jd = max(background.a, mf * coverage);
179
- float alpha = hv + jd * (1.0 - opacity) + fS;
180
- vec3 premultiplied = bK * hv
181
- + backgroundColor * jd * (1.0 - opacity)
182
- + shadowCatcherColor * fS;
179
+ float opacity = gf;
180
+ gf *= coverage;
181
+ float mR = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
182
+ float hJ = max(foreground.a, mR * (1.0 - coverage));
183
+ float jz = max(background.a, mR * coverage);
184
+ float alpha = hJ + jz * (1.0 - opacity) + gf;
185
+ vec3 premultiplied = foregroundColor * hJ
186
+ + backgroundColor * jz * (1.0 - opacity)
187
+ + shadowCatcherColor * gf;
183
188
  color = vec4(premultiplied / max(alpha, 0.000001), alpha);
184
189
  }
185
190
  }
@@ -1 +1 @@
1
- {"version":3,"file":"webglPipeline.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/webglPipeline.frag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;IAC/C,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAClC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;EAiBV;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,cAAc,CAAC;IAChD,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACjD,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7C,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KACtC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyIV;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;IAC/C,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7C,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAC5C;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;EAUV;CACD,CAAC,CAAC","sourcesContent":["import { FragmentShader, Shader, glsl } from '../shader.js';\n\nexport const brightFragment = new FragmentShader({\n name: 'bloomBright',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n threshold: Shader.uniform('float', 1),\n scale: Shader.uniform('float', 1)\n },\n main: glsl`\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\nvec4 median(vec4 a, vec4 b, vec4 c) {\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main() {\n vec2 d = 1.0 / vec2(colorTexRegion());\n vec4 texel = sample_colorTex(v_Texcoord);\n vec4 s1 = sample_colorTex(v_Texcoord - vec2(d.x, 0.0));\n vec4 s2 = sample_colorTex(v_Texcoord + vec2(d.x, 0.0));\n vec4 s3 = sample_colorTex(v_Texcoord - vec2(0.0, d.y));\n vec4 s4 = sample_colorTex(v_Texcoord + vec2(0.0, d.y));\n texel = median(median(texel, s1, s2), s3, s4);\n float lum = dot(texel.rgb, lumWeight);\n out_color = lum > threshold && texel.a > 0.0\n ? vec4(texel.rgb * scale, texel.a)\n : vec4(0.0, 0.0, 0.0, texel.a);\n}`\n});\n\nexport const composeFragment = new FragmentShader({\n name: 'compose',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n foregroundTex: Shader.uniform('sampler2D'),\n catcherBackgroundTex: Shader.uniform('sampler2D'),\n shadowCatcherTex: Shader.uniform('sampler2D'),\n bloomTex: Shader.uniform('sampler2D'),\n exposure: Shader.uniform('float', 1),\n shadowCatcherColor: Shader.uniform('vec3', [0, 0, 0]),\n shadowCatcherAlpha: Shader.uniform('float', 1),\n shadowCatcherEnabled: Shader.uniform('float', 0),\n bloomIntensity: Shader.uniform('float', 0),\n toneMappingMode: Shader.uniform('int', 0),\n contrast: Shader.uniform('float', 1),\n saturation: Shader.uniform('float', 1),\n temperature: Shader.uniform('float', 0),\n tint: Shader.uniform('float', 0),\n vignette: Shader.uniform('float', 0),\n outputMode: Shader.uniform('int', 0),\n sRGBOutput: Shader.uniform('bool', 1)\n },\n main: glsl`\nvec3 linearToneMapping(vec3 color) {\n return clamp(color, 0.0, 1.0);\n}\nvec3 reinhardToneMapping(vec3 color) {\n return clamp(color / (vec3(1.0) + color), 0.0, 1.0);\n}\nvec3 cineonToneMapping(vec3 color) {\n color = max(vec3(0.0), color - 0.004);\n return pow((color * (6.2 * color + 0.5)) /\n (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));\n}\nvec3 rrtAndOdtFit(vec3 value) {\n vec3 numerator = value * (value + 0.0245786) - 0.000090537;\n vec3 denominator = value * (0.983729 * value + 0.4329510) + 0.238081;\n return numerator / denominator;\n}\nvec3 acesToneMapping(vec3 color) {\n const mat3 inputMatrix = mat3(\n vec3(0.59719, 0.07600, 0.02840),\n vec3(0.35458, 0.90834, 0.13383),\n vec3(0.04823, 0.01566, 0.83777)\n );\n const mat3 outputMatrix = mat3(\n vec3(1.60475, -0.10208, -0.00327),\n vec3(-0.53108, 1.10813, -0.07276),\n vec3(-0.07367, -0.00605, 1.07602)\n );\n color = inputMatrix * (color / 0.6);\n return clamp(outputMatrix * rrtAndOdtFit(color), 0.0, 1.0);\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n vec3(1.6605, -0.1246, -0.0182),\n vec3(-0.5876, 1.1329, -0.1006),\n vec3(-0.0728, -0.0083, 1.1187)\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n vec3(0.6274, 0.0691, 0.0164),\n vec3(0.3293, 0.9195, 0.0880),\n vec3(0.0433, 0.0113, 0.8956)\n);\nvec3 agxDefaultContrastApprox(vec3 value) {\n vec3 value2 = value * value;\n vec3 value4 = value2 * value2;\n return 15.5 * value4 * value2 - 40.14 * value4 * value\n + 31.96 * value4 - 6.868 * value2 * value\n + 0.4298 * value2 + 0.1191 * value - 0.00232;\n}\nvec3 agxToneMapping(vec3 color) {\n const mat3 insetMatrix = mat3(\n vec3(0.856627153315983, 0.137318972929847, 0.11189821299995),\n vec3(0.0951212405381588, 0.761241990602591, 0.0767994186031903),\n vec3(0.0482516061458583, 0.101439036467562, 0.811302368396859)\n );\n const mat3 outsetMatrix = mat3(\n vec3(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),\n vec3(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),\n vec3(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)\n );\n color = insetMatrix * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);\n color = clamp((log2(max(color, 1e-10)) + 12.47393) / 16.5, 0.0, 1.0);\n color = outsetMatrix * agxDefaultContrastApprox(color);\n color = pow(max(color, 0.0), vec3(2.2));\n return clamp(LINEAR_REC2020_TO_LINEAR_SRGB * color, 0.0, 1.0);\n}\nvec3 applyToneMapping(vec3 color) {\n if (toneMappingMode == 1) return acesToneMapping(color);\n if (toneMappingMode == 2) return cineonToneMapping(color);\n if (toneMappingMode == 3) return reinhardToneMapping(color);\n if (toneMappingMode == 4) return linearToneMapping(color);\n return agxToneMapping(color);\n}\nvec3 gradeColor(vec3 color) {\n vec3 balance = vec3(\n 1.0 + temperature * 0.16 + tint * 0.04,\n 1.0 - tint * 0.12,\n 1.0 - temperature * 0.16 + tint * 0.04\n );\n color = max(color * balance, 0.0);\n color = max((color - 0.18) * contrast + 0.18, 0.0);\n float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));\n return max(mix(vec3(luminance), color, saturation), 0.0);\n}\nvoid main() {\n vec2 uv = v_Texcoord;\n vec4 shadow = sample_shadowCatcherTex(uv);\n if (outputMode == 1) {\n out_color = vec4(vec3(shadow.a), 1.0);\n return;\n }\n\n vec4 color = sample_colorTex(uv);\n vec4 bloom = sample_bloomTex(uv) * bloomIntensity;\n color.rgb += bloom.rgb;\n color.rgb = gradeColor(color.rgb * exposure);\n if (sRGBOutput) {\n float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));\n color.rgb *= 1.0 - vignette * edge;\n color.rgb = applyToneMapping(color.rgb);\n color.rgb = pow(max(color.rgb, 0.0), vec3(1.0 / 2.2));\n }\n color.a = max(color.a, min(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 1.0));\n\n if (shadowCatcherEnabled > 0.5) {\n float coverage = clamp(shadow.r, 0.0, 1.0);\n // Non-catcher samples contribute visibility 1. Undo primary coverage\n // before adjusting opacity, then apply the coverage exactly once.\n float shadowAlpha = clamp(\n (1.0 - shadow.a) / max(coverage, 0.000001), 0.0, 1.0\n );\n shadowAlpha = max(shadowAlpha - (1.0 - shadowCatcherAlpha), 0.0);\n if (coverage > 0.0) {\n vec4 foreground = sample_foregroundTex(uv);\n vec4 background = sample_catcherBackgroundTex(uv);\n vec3 foregroundColor = gradeColor((foreground.rgb + bloom.rgb) * exposure);\n vec3 backgroundColor = gradeColor((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);\n if (sRGBOutput) {\n float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));\n foregroundColor *= 1.0 - vignette * edge;\n backgroundColor *= 1.0 - vignette * edge;\n foregroundColor = pow(max(applyToneMapping(foregroundColor), 0.0), vec3(1.0 / 2.2));\n backgroundColor = pow(max(applyToneMapping(backgroundColor), 0.0), vec3(1.0 / 2.2));\n }\n // The primary samples belong to disjoint layers. Never shadow the model.\n float opacity = shadowAlpha;\n shadowAlpha *= coverage;\n float bloomAlpha = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);\n float foregroundAlpha = max(foreground.a, bloomAlpha * (1.0 - coverage));\n float backgroundAlpha = max(background.a, bloomAlpha * coverage);\n float alpha = foregroundAlpha + backgroundAlpha * (1.0 - opacity) + shadowAlpha;\n vec3 premultiplied = foregroundColor * foregroundAlpha\n + backgroundColor * backgroundAlpha * (1.0 - opacity)\n + shadowCatcherColor * shadowAlpha;\n color = vec4(premultiplied / max(alpha, 0.000001), alpha);\n }\n }\n out_color = color;\n}`\n});\n\nexport const outputFragment = new FragmentShader({\n name: 'output',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n colorDenoisedTex: Shader.uniform('sampler2D'),\n denoisedPercent: Shader.uniform('float', 0)\n },\n main: glsl`\nvoid main() {\n vec2 uv = v_Texcoord;\n vec4 color = mix(\n sample_colorTex(uv),\n sample_colorDenoisedTex(uv),\n denoisedPercent\n );\n color = vec4(color.rgb * color.a, color.a);\n out_color = color;\n}`\n});\n"]}
1
+ {"version":3,"file":"webglPipeline.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/webglPipeline.frag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAE5D,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;IAC/C,IAAI,EAAE,aAAa;IACnB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrC,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAClC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;EAiBV;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,cAAc,CAAC;IAChD,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACjD,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7C,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACrD,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC9C,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1C,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACzC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACtC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACpC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;KACtC;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8IV;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC;IAC/C,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACrC,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC7C,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;KAC5C;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;EAUV;CACD,CAAC,CAAC","sourcesContent":["import { FragmentShader, Shader, glsl } from '../shader.js';\n\nexport const brightFragment = new FragmentShader({\n name: 'bloomBright',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n threshold: Shader.uniform('float', 1),\n scale: Shader.uniform('float', 1)\n },\n main: glsl`\nconst vec3 lumWeight = vec3(0.2125, 0.7154, 0.0721);\nvec4 median(vec4 a, vec4 b, vec4 c) {\n return a + b + c - min(min(a, b), c) - max(max(a, b), c);\n}\nvoid main() {\n vec2 d = 1.0 / vec2(colorTexRegion());\n vec4 texel = sample_colorTex(v_Texcoord);\n vec4 s1 = sample_colorTex(v_Texcoord - vec2(d.x, 0.0));\n vec4 s2 = sample_colorTex(v_Texcoord + vec2(d.x, 0.0));\n vec4 s3 = sample_colorTex(v_Texcoord - vec2(0.0, d.y));\n vec4 s4 = sample_colorTex(v_Texcoord + vec2(0.0, d.y));\n texel = median(median(texel, s1, s2), s3, s4);\n float lum = dot(texel.rgb, lumWeight);\n out_color = lum > threshold && texel.a > 0.0\n ? vec4(texel.rgb * scale, texel.a)\n : vec4(0.0, 0.0, 0.0, texel.a);\n}`\n});\n\nexport const composeFragment = new FragmentShader({\n name: 'compose',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n foregroundTex: Shader.uniform('sampler2D'),\n catcherBackgroundTex: Shader.uniform('sampler2D'),\n shadowCatcherTex: Shader.uniform('sampler2D'),\n bloomTex: Shader.uniform('sampler2D'),\n exposure: Shader.uniform('float', 1),\n shadowCatcherColor: Shader.uniform('vec3', [0, 0, 0]),\n shadowCatcherAlpha: Shader.uniform('float', 1),\n shadowCatcherEnabled: Shader.uniform('float', 0),\n bloomIntensity: Shader.uniform('float', 0),\n toneMappingMode: Shader.uniform('int', 0),\n contrast: Shader.uniform('float', 1),\n saturation: Shader.uniform('float', 1),\n temperature: Shader.uniform('float', 0),\n tint: Shader.uniform('float', 0),\n vignette: Shader.uniform('float', 0),\n outputMode: Shader.uniform('int', 0),\n sRGBOutput: Shader.uniform('bool', 1)\n },\n main: glsl`\nvec3 displayEncode(vec3 color) {\n color = max(color, 0.0);\n return mix(1.055 * pow(color, vec3(1.0 / 2.4)) - 0.055,\n color * 12.92, lessThanEqual(color, vec3(0.0031308)));\n}\nvec3 linearToneMapping(vec3 color) {\n return clamp(color, 0.0, 1.0);\n}\nvec3 reinhardToneMapping(vec3 color) {\n return clamp(color / (vec3(1.0) + color), 0.0, 1.0);\n}\nvec3 cineonToneMapping(vec3 color) {\n color = max(vec3(0.0), color - 0.004);\n return pow((color * (6.2 * color + 0.5)) /\n (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));\n}\nvec3 rrtAndOdtFit(vec3 value) {\n vec3 numerator = value * (value + 0.0245786) - 0.000090537;\n vec3 denominator = value * (0.983729 * value + 0.4329510) + 0.238081;\n return numerator / denominator;\n}\nvec3 acesToneMapping(vec3 color) {\n const mat3 inputMatrix = mat3(\n vec3(0.59719, 0.07600, 0.02840),\n vec3(0.35458, 0.90834, 0.13383),\n vec3(0.04823, 0.01566, 0.83777)\n );\n const mat3 outputMatrix = mat3(\n vec3(1.60475, -0.10208, -0.00327),\n vec3(-0.53108, 1.10813, -0.07276),\n vec3(-0.07367, -0.00605, 1.07602)\n );\n color = inputMatrix * (color / 0.6);\n return clamp(outputMatrix * rrtAndOdtFit(color), 0.0, 1.0);\n}\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\n vec3(1.6605, -0.1246, -0.0182),\n vec3(-0.5876, 1.1329, -0.1006),\n vec3(-0.0728, -0.0083, 1.1187)\n);\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\n vec3(0.6274, 0.0691, 0.0164),\n vec3(0.3293, 0.9195, 0.0880),\n vec3(0.0433, 0.0113, 0.8956)\n);\nvec3 agxDefaultContrastApprox(vec3 value) {\n vec3 value2 = value * value;\n vec3 value4 = value2 * value2;\n return 15.5 * value4 * value2 - 40.14 * value4 * value\n + 31.96 * value4 - 6.868 * value2 * value\n + 0.4298 * value2 + 0.1191 * value - 0.00232;\n}\nvec3 agxToneMapping(vec3 color) {\n const mat3 insetMatrix = mat3(\n vec3(0.856627153315983, 0.137318972929847, 0.11189821299995),\n vec3(0.0951212405381588, 0.761241990602591, 0.0767994186031903),\n vec3(0.0482516061458583, 0.101439036467562, 0.811302368396859)\n );\n const mat3 outsetMatrix = mat3(\n vec3(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),\n vec3(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),\n vec3(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)\n );\n color = insetMatrix * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);\n color = clamp((log2(max(color, 1e-10)) + 12.47393) / 16.5, 0.0, 1.0);\n color = outsetMatrix * agxDefaultContrastApprox(color);\n color = pow(max(color, 0.0), vec3(2.2));\n return clamp(LINEAR_REC2020_TO_LINEAR_SRGB * color, 0.0, 1.0);\n}\nvec3 applyToneMapping(vec3 color) {\n if (toneMappingMode == 1) return acesToneMapping(color);\n if (toneMappingMode == 2) return cineonToneMapping(color);\n if (toneMappingMode == 3) return reinhardToneMapping(color);\n if (toneMappingMode == 4) return linearToneMapping(color);\n return agxToneMapping(color);\n}\nvec3 gradeColor(vec3 color) {\n vec3 balance = vec3(\n 1.0 + temperature * 0.16 + tint * 0.04,\n 1.0 - tint * 0.12,\n 1.0 - temperature * 0.16 + tint * 0.04\n );\n color = max(color * balance, 0.0);\n color = max((color - 0.18) * contrast + 0.18, 0.0);\n float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));\n return max(mix(vec3(luminance), color, saturation), 0.0);\n}\nvoid main() {\n vec2 uv = v_Texcoord;\n vec4 shadow = sample_shadowCatcherTex(uv);\n if (outputMode == 1) {\n out_color = vec4(vec3(shadow.a), 1.0);\n return;\n }\n\n vec4 color = sample_colorTex(uv);\n vec4 bloom = sample_bloomTex(uv) * bloomIntensity;\n color.rgb += bloom.rgb;\n color.rgb = gradeColor(color.rgb * exposure);\n if (sRGBOutput) {\n float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));\n color.rgb *= 1.0 - vignette * edge;\n color.rgb = applyToneMapping(color.rgb);\n color.rgb = displayEncode(color.rgb);\n }\n color.a = max(color.a, min(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 1.0));\n\n if (shadowCatcherEnabled > 0.5) {\n float coverage = clamp(shadow.r, 0.0, 1.0);\n // Non-catcher samples contribute visibility 1. Undo primary coverage\n // before adjusting opacity, then apply the coverage exactly once.\n float shadowAlpha = clamp(\n (1.0 - shadow.a) / max(coverage, 0.000001), 0.0, 1.0\n );\n shadowAlpha = max(shadowAlpha - (1.0 - shadowCatcherAlpha), 0.0);\n if (coverage > 0.0) {\n vec4 foreground = sample_foregroundTex(uv);\n vec4 background = sample_catcherBackgroundTex(uv);\n vec3 foregroundColor = gradeColor((foreground.rgb + bloom.rgb) * exposure);\n vec3 backgroundColor = gradeColor((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);\n if (sRGBOutput) {\n float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));\n foregroundColor *= 1.0 - vignette * edge;\n backgroundColor *= 1.0 - vignette * edge;\n foregroundColor = displayEncode(applyToneMapping(foregroundColor));\n backgroundColor = displayEncode(applyToneMapping(backgroundColor));\n }\n // The primary samples belong to disjoint layers. Never shadow the model.\n float opacity = shadowAlpha;\n shadowAlpha *= coverage;\n float bloomAlpha = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);\n float foregroundAlpha = max(foreground.a, bloomAlpha * (1.0 - coverage));\n float backgroundAlpha = max(background.a, bloomAlpha * coverage);\n float alpha = foregroundAlpha + backgroundAlpha * (1.0 - opacity) + shadowAlpha;\n vec3 premultiplied = foregroundColor * foregroundAlpha\n + backgroundColor * backgroundAlpha * (1.0 - opacity)\n + shadowCatcherColor * shadowAlpha;\n color = vec4(premultiplied / max(alpha, 0.000001), alpha);\n }\n }\n out_color = color;\n}`\n});\n\nexport const outputFragment = new FragmentShader({\n name: 'output',\n uniforms: {\n colorTex: Shader.uniform('sampler2D'),\n colorDenoisedTex: Shader.uniform('sampler2D'),\n denoisedPercent: Shader.uniform('float', 0)\n },\n main: glsl`\nvoid main() {\n vec2 uv = v_Texcoord;\n vec4 color = mix(\n sample_colorTex(uv),\n sample_colorDenoisedTex(uv),\n denoisedPercent\n );\n color = vec4(color.rgb * color.a, color.a);\n out_color = color;\n}`\n});\n"]}
@@ -0,0 +1,10 @@
1
+ export declare const LIGHT_CHOICE_ENVIRONMENT = 1;
2
+ export declare const LIGHT_CHOICE_ANALYTIC = 2;
3
+ export declare const LIGHT_CHOICE_EMISSIVE_TRIANGLE = 3;
4
+ export declare const LIGHT_DOMAIN_ENVIRONMENT = 0;
5
+ export declare const LIGHT_DOMAIN_INFINITE = 1;
6
+ export declare const LIGHT_DOMAIN_LOCAL_AND_EMISSIVE = 2;
7
+ export declare const CONSTANT_DIRECTIONAL_LIGHT = 1;
8
+ export declare const CONSTANT_SPHERE_LIGHT = 2;
9
+ export declare const CONSTANT_RECT_LIGHT = 3;
10
+ export declare const CONSTANT_SPOT_LIGHT = 4;
@@ -0,0 +1,11 @@
1
+ export const LIGHT_CHOICE_ENVIRONMENT = 1;
2
+ export const LIGHT_CHOICE_ANALYTIC = 2;
3
+ export const LIGHT_CHOICE_EMISSIVE_TRIANGLE = 3;
4
+ export const LIGHT_DOMAIN_ENVIRONMENT = 0;
5
+ export const LIGHT_DOMAIN_INFINITE = 1;
6
+ export const LIGHT_DOMAIN_LOCAL_AND_EMISSIVE = 2;
7
+ export const CONSTANT_DIRECTIONAL_LIGHT = 1;
8
+ export const CONSTANT_SPHERE_LIGHT = 2;
9
+ export const CONSTANT_RECT_LIGHT = 3;
10
+ export const CONSTANT_SPOT_LIGHT = 4;
11
+ //# sourceMappingURL=lightConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightConstants.js","sourceRoot":"","sources":["../../src/renderer/lightConstants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAC1C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,CAAC;AACjD,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC","sourcesContent":["export const LIGHT_CHOICE_ENVIRONMENT = 1;\nexport const LIGHT_CHOICE_ANALYTIC = 2;\nexport const LIGHT_CHOICE_EMISSIVE_TRIANGLE = 3;\n\nexport const LIGHT_DOMAIN_ENVIRONMENT = 0;\nexport const LIGHT_DOMAIN_INFINITE = 1;\nexport const LIGHT_DOMAIN_LOCAL_AND_EMISSIVE = 2;\nexport const CONSTANT_DIRECTIONAL_LIGHT = 1;\nexport const CONSTANT_SPHERE_LIGHT = 2;\nexport const CONSTANT_RECT_LIGHT = 3;\nexport const CONSTANT_SPOT_LIGHT = 4;\n"]}
@@ -0,0 +1,12 @@
1
+ export { default as MeshState } from '../scene/MeshState.js';
2
+ export { default as InstanceState } from '../scene/InstanceState.js';
3
+ export { default as MaterialState } from '../scene/MaterialState.js';
4
+ export { default as TextureState } from '../scene/TextureState.js';
5
+ export { default as RectLightState } from '../scene/RectLightState.js';
6
+ export { default as EnvironmentLightState } from '../scene/EnvironmentLightState.js';
7
+ export { default as DirectionalLight } from '../scene/DirectionalLight.js';
8
+ export { default as SphereLight } from '../scene/SphereLight.js';
9
+ export { default as SpotLight } from '../scene/SpotLight.js';
10
+ export { default as AmbientLight } from '../scene/AmbientLight.js';
11
+ export * from './lightSampling.js';
12
+ export * from './lightsData.js';
@@ -0,0 +1,13 @@
1
+ export { default as MeshState } from '../scene/MeshState.js';
2
+ export { default as InstanceState } from '../scene/InstanceState.js';
3
+ export { default as MaterialState } from '../scene/MaterialState.js';
4
+ export { default as TextureState } from '../scene/TextureState.js';
5
+ export { default as RectLightState } from '../scene/RectLightState.js';
6
+ export { default as EnvironmentLightState } from '../scene/EnvironmentLightState.js';
7
+ export { default as DirectionalLight } from '../scene/DirectionalLight.js';
8
+ export { default as SphereLight } from '../scene/SphereLight.js';
9
+ export { default as SpotLight } from '../scene/SpotLight.js';
10
+ export { default as AmbientLight } from '../scene/AmbientLight.js';
11
+ export * from './lightSampling.js';
12
+ export * from './lightsData.js';
13
+ //# sourceMappingURL=lightCore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lightCore.js","sourceRoot":"","sources":["../../src/renderer/lightCore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAC,OAAO,IAAI,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAC,OAAO,IAAI,aAAa,EAAC,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAC,OAAO,IAAI,cAAc,EAAC,MAAM,4BAA4B,CAAC;AACrE,OAAO,EAAC,OAAO,IAAI,qBAAqB,EAAC,MAAM,mCAAmC,CAAC;AACnF,OAAO,EAAC,OAAO,IAAI,gBAAgB,EAAC,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAC,OAAO,IAAI,WAAW,EAAC,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAC,OAAO,IAAI,SAAS,EAAC,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAC,OAAO,IAAI,YAAY,EAAC,MAAM,0BAA0B,CAAC;AACjE,cAAc,oBAAoB,CAAC;AACnC,cAAc,iBAAiB,CAAC","sourcesContent":["export {default as MeshState} from '../scene/MeshState.js';\nexport {default as InstanceState} from '../scene/InstanceState.js';\nexport {default as MaterialState} from '../scene/MaterialState.js';\nexport {default as TextureState} from '../scene/TextureState.js';\nexport {default as RectLightState} from '../scene/RectLightState.js';\nexport {default as EnvironmentLightState} from '../scene/EnvironmentLightState.js';\nexport {default as DirectionalLight} from '../scene/DirectionalLight.js';\nexport {default as SphereLight} from '../scene/SphereLight.js';\nexport {default as SpotLight} from '../scene/SpotLight.js';\nexport {default as AmbientLight} from '../scene/AmbientLight.js';\nexport * from './lightSampling.js';\nexport * from './lightsData.js';\n"]}
@@ -1,22 +1,17 @@
1
- import { TexturePixelSource, vec3 } from '../math.js';
1
+ import { type TexturePixelSource } from '../math.js';
2
2
  import DirectionalLight from '../scene/DirectionalLight.js';
3
3
  import Geometry from '../scene/Geometry.js';
4
- import Mesh from '../scene/Mesh.js';
5
- import RectLight from '../scene/RectLight.js';
4
+ import type Mesh from '../scene/MeshState.js';
5
+ import type RectLight from '../scene/RectLightState.js';
6
6
  import SphereLight from '../scene/SphereLight.js';
7
7
  import SpotLight from '../scene/SpotLight.js';
8
- import OpenPBRMaterial from '../scene/OpenPBRMaterial.js';
9
- export declare const LIGHT_CHOICE_ENVIRONMENT = 1;
10
- export declare const LIGHT_CHOICE_ANALYTIC = 2;
11
- export declare const LIGHT_CHOICE_EMISSIVE_TRIANGLE = 3;
12
- export declare const LIGHT_DOMAIN_ENVIRONMENT = 0;
13
- export declare const LIGHT_DOMAIN_INFINITE = 1;
14
- export declare const LIGHT_DOMAIN_LOCAL_AND_EMISSIVE = 2;
8
+ import type OpenPBRMaterial from '../scene/MaterialState.js';
9
+ export * from './lightConstants.js';
15
10
  type AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;
16
11
  export interface EmissiveTriangle {
17
- p0: vec3.Vec3Array;
18
- p1: vec3.Vec3Array;
19
- p2: vec3.Vec3Array;
12
+ p0: Float32Array;
13
+ p1: Float32Array;
14
+ p2: Float32Array;
20
15
  uv0: [number, number];
21
16
  uv1: [number, number];
22
17
  uv2: [number, number];
@@ -43,7 +38,7 @@ export interface LightSamplingDistribution {
43
38
  pmfs: Float32Array;
44
39
  totalWeight: number;
45
40
  }
46
- export declare function colorLuminance(color: ArrayLike<number>): number;
41
+ export declare function colorLuminance<T extends ArrayLike<number>>(color: T): number;
47
42
  export declare function estimateAnalyticLightPower(light: AnalyticLight): number;
48
43
  export declare function sphereSolidAnglePdf(distanceToCenter: number, radius: number): number;
49
44
  /** Packs unique 128² peak-normalized IES profiles four scalar samples per texel. */
@@ -52,7 +47,7 @@ export declare function packIESProfiles(lights: AnalyticLight[], firstTexel?: nu
52
47
  offsets: Int32Array<ArrayBuffer>;
53
48
  texelCount: number;
54
49
  };
55
- export declare function estimateEnvironmentPower(image?: TexturePixelSource): number;
50
+ export declare function estimateEnvironmentPower<T extends TexturePixelSource>(image?: T): number;
56
51
  /** Reusable typed choices; insertion order matches the sampling distribution. */
57
52
  export declare class LightChoiceBuffer {
58
53
  count: number;
@@ -64,12 +59,20 @@ export declare class LightChoiceBuffer {
64
59
  }
65
60
  /** Builds a Walker alias table. Each 16-byte entry is probability/alias/type/index. */
66
61
  export declare function buildLightAliasTable(inputs: LightChoiceInput[] | LightChoiceBuffer): LightSamplingDistribution;
62
+ /**
63
+ * Builds the table a shadow catcher draws its occlusion tests from: the
64
+ * environment and analytic lights of `choices` at their relative weights.
65
+ * Emissive meshes are scene objects, not light already present in the plate
66
+ * the catcher darkens, so their occlusion is not catcher shadow. Returns
67
+ * `undefined` when `choices` holds no emissive triangle and the catcher can
68
+ * share the main table.
69
+ */
70
+ export declare function buildShadowCatcherLightAliasTable(choices: LightChoiceBuffer, scratch?: LightChoiceBuffer): LightSamplingDistribution | undefined;
67
71
  export declare function collectEmissiveTriangles(bindings: EmissiveMeshBinding[], materials: OpenPBRMaterial[]): EmissiveTriangle[];
68
72
  export declare function packEmissiveTriangles(triangles: EmissiveTriangle[], data?: Float32Array): Float32Array<ArrayBufferLike>;
69
73
  /** Caches world-space vertices per mesh, independently of emission strength. */
70
74
  export declare class EmissiveTriangleCache {
71
- private _bindings;
75
+ constructor();
72
76
  private _triangles;
73
77
  collect(bindings: EmissiveMeshBinding[], materials: OpenPBRMaterial[]): EmissiveTriangle[];
74
78
  }
75
- export {};