@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
@@ -0,0 +1,121 @@
1
+ import bsdf from './chunks/openPbrBsdf.glsl.js';
2
+ import sampling from './chunks/sampling.glsl.js';
3
+ import reflectance from './aovReflectance.glsl.js';
4
+ import { FragmentShader, Shader } from '../shader.js';
5
+ import common from './chunks/common.glsl.js';
6
+ import core from './chunks/rayTraceCore.glsl.js';
7
+ import materials from './chunks/materialBuffer.glsl.js';
8
+ import intersect from './chunks/intersect.glsl.js';
9
+ import uvProjection from './chunks/uvProjection.glsl.js';
10
+ import random from './chunks/random.glsl.js';
11
+ import cameraRay from './chunks/cameraRay.glsl.js';
12
+ import rand from './chunks/rand.glsl.js';
13
+ const surface = /* glsl */ `
14
+ uint ke(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }
15
+ vec3 iN(int offset){return vec3(uintBitsToFloat(ke(offset)),uintBitsToFloat(ke(offset+1)),uintBitsToFloat(ke(offset+2)));}
16
+ mat4 ow(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(ke(offset+i*4+j)); return m; }
17
+ Ray wJ(vec2 uv) {
18
+ vec4 origin = viewProjectionInv*vec4(uv*2.0-1.0,-1.0,1.0);
19
+ vec4 target = viewProjectionInv*vec4(uv*2.0-1.0,1.0,1.0);
20
+ Ray ray; gC(ray, origin.xyz/origin.w, normalize(target.xyz*origin.w-origin.xyz*target.w)); return ray;
21
+ }
22
+ bool mQ(Ray wX, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {
23
+ Ray ray=wX; si.triangleIndex=-1;
24
+ for(int layer=0;layer<32;layer++) {
25
+ intersectScene(ray,si,false); if(!si.hit) return false;
26
+ dg(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);
27
+ if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;
28
+ ray.o=si.position+ray.d*(EPS*0.02);
29
+ }
30
+ return false;
31
+ }
32
+ `;
33
+ export function aovTraceFragment(center) {
34
+ const shader = new FragmentShader({ name: center ? 'AOV center' : 'AOV accumulation',
35
+ outputs: center ? ['id', 'motion'] : ['geometry', 'position', 'diffuse', 'specular'],
36
+ outputTypes: center ? { id: 'uvec4' } : {}, defines: { DEPTH_QUERY_MODE: true },
37
+ includes: [core, materials, intersect, random],
38
+ uniforms: { viewProjectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),
39
+ cameraApertureRadius: Shader.uniform('float', 0), cameraFocusDistance: Shader.uniform('float', 10),
40
+ viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),
41
+ previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),
42
+ previousGeometry: Shader.uniform('sampler2D'), previousPosition: Shader.uniform('sampler2D'),
43
+ previousDiffuse: Shader.uniform('sampler2D'), previousSpecular: Shader.uniform('sampler2D'),
44
+ openPbrEnergyLut: Shader.uniform('sampler2D'), aovMask: Shader.uniform('int', 0),
45
+ aovSample: Shader.uniform('int', 0) },
46
+ main: /* glsl */ `
47
+ ${common}
48
+ ${rand}
49
+ ${random.main}
50
+ ${core.main}
51
+ ${uvProjection}
52
+ ${materials.main}
53
+ ${intersect.main}
54
+ ${cameraRay}
55
+ ${center ? '' : sampling + bsdf + reflectance}
56
+ ${surface}
57
+ void main() {
58
+ ${center ? /* glsl */ `
59
+ out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);
60
+ Ray ray=wJ((floor(gl_FragCoord.xy)+0.5)/viewportSize);
61
+ SurfaceInteraction si; OpenPbrResolvedMaterial material;
62
+ if(!mQ(ray,si,material)) return;
63
+ int offset=52+si.instanceIndex*24;
64
+ out_id=uvec4(ke(offset),ke(offset+1),ke(int(ke(16))+si.materialIndex),ke(int(ke(17))+si.triangleIndex));
65
+ out_motion.z=dot(si.position-iN(36),iN(40));
66
+ if(ke(offset+2)==0u)return;
67
+ vec4 qA=ow(offset+4)*vec4(si.position,1.0);
68
+ vec4 ps=ow(0)*qA;
69
+ if(ps.w<=0.0)return;
70
+ vec3 tX=ps.xyz/ps.w;vec2 iz=(tX.xy*0.5+0.5)*viewportSize;
71
+ if(any(lessThan(iz,vec2(0.0)))||any(greaterThanEqual(iz,viewportSize))||abs(tX.z)>1.0)return;
72
+ uvec4 identity=texelFetch(previousId,ivec2(iz),0);float qz=texelFetch(previousMotion,ivec2(iz),0).z;
73
+ if(any(notEqual(identity.xy,out_id.xy))||abs(qz-dot(qA.xyz-iN(44),iN(48)))>max(1e-4,abs(qz)*1e-3))return;
74
+ out_motion=vec4((iz-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);
75
+ ` : /* glsl */ `
76
+ ivec2 coord=ivec2(gl_FragCoord.xy);
77
+ out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);
78
+ out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);
79
+ out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);
80
+ out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);
81
+ rG(); aZ=uvec2(floor(gl_FragCoord.xy));
82
+ gW(floor(gl_FragCoord.xy),int(aQ ^ dG(uint(sequenceSeed))));
83
+ Ray ray=wJ((floor(gl_FragCoord.xy)+dZ(CAMERA_PIXEL))/viewportSize);
84
+ if(cameraApertureRadius>0.0) {
85
+ vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);
86
+ vec3 jN=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));
87
+ vec2 xU=cameraApertureRadius*kN(dZ(CAMERA_LENS));
88
+ vec3 origin=(viewInv*vec4(xU,0.0,1.0)).xyz;
89
+ gC(ray,origin,normalize(jN-origin));
90
+ }
91
+ SurfaceInteraction si; OpenPbrResolvedMaterial material;
92
+ if(!mQ(ray,si,material)) return;
93
+ float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);
94
+ bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;
95
+ out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);
96
+ #ifdef AOV_REFLECTANCE
97
+ if((aovMask&24)!=0 && !unsupported){
98
+ vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),fu=-dot(face,ray.d);
99
+ if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){
100
+ if(cosine<0.0){normal=-normal;cosine=-cosine;}if(fu<0.0){face=-face;fu=-fu;}
101
+ }
102
+ if(fu>=0.0&&cosine<0.0){normal=face;cosine=fu;}
103
+ if(cosine<0.0)normal=-normal;
104
+ material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;
105
+ vec3 tangent=vec3(0.0);
106
+ #ifdef USE_TANGENT
107
+ tangent=si.tangent;
108
+ #endif
109
+ ag prepared=ds(tangent,material,-ray.d,normal);
110
+ vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);
111
+ out_diffuse+=vec4(diffuse,1.0);out_specular+=vec4(specular,1.0);
112
+ }
113
+ #endif
114
+ out_position+=vec4(si.position,1.0);
115
+ `}
116
+ }
117
+ ` });
118
+ shader.parallelCompile = true;
119
+ return shader;
120
+ }
121
+ //# sourceMappingURL=aovTrace.frag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovTrace.frag.js","sourceRoot":"","sources":["../../../src/renderer/glsl/aovTrace.frag.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,8BAA8B,CAAC;AAChD,OAAO,QAAQ,MAAM,2BAA2B,CAAC;AACjD,OAAO,WAAW,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAC,cAAc,EAAE,MAAM,EAAC,MAAM,cAAc,CAAC;AACpD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,IAAI,MAAM,+BAA+B,CAAC;AACjD,OAAO,SAAS,MAAM,iCAAiC,CAAC;AACxD,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,MAAM,MAAM,yBAAyB,CAAC;AAC7C,OAAO,SAAS,MAAM,4BAA4B,CAAC;AACnD,OAAO,IAAI,MAAM,uBAAuB,CAAC;AACzC,MAAM,OAAO,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;CAmB1B,CAAC;AACF,MAAM,UAAU,gBAAgB,CAAC,MAAe;IAC9C,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,kBAAkB;QACjF,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAAC,UAAU,EAAC,SAAS,EAAC,UAAU,CAAC;QAChF,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC,EAAC,EAAE,EAAE,OAAO,EAAC,CAAC,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,EAAC,gBAAgB,EAAE,IAAI,EAAC;QAC3E,QAAQ,EAAE,CAAC,IAAI,EAAC,SAAS,EAAC,SAAS,EAAC,MAAM,CAAC;QAC3C,QAAQ,EAAE,EAAC,iBAAiB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YACnF,oBAAoB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,EAAC,EAAE,CAAC;YAChG,YAAY,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC;YAC5E,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YACrF,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5F,eAAe,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;YAC3F,gBAAgB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAC,CAAC,CAAC;YAC/E,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,EAAC,CAAC,CAAC,EAAC;QACrC,IAAI,EAAE,UAAU,CAAC;EACnB,MAAM;EACN,IAAI;EACJ,MAAM,CAAC,IAAI;EACX,IAAI,CAAC,IAAI;EACT,YAAY;EACZ,SAAS,CAAC,IAAI;EACd,SAAS,CAAC,IAAI;EACd,SAAS;EACT,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAC,IAAI,GAAC,WAAW;EACvC,OAAO;;EAEL,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;CAiBrB,CAAC,CAAC,CAAC,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwCd;;CAEF,EAAC,CAAC,CAAC;IACF,MAAM,CAAC,eAAe,GAAG,IAAI,CAAC;IAC9B,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import bsdf from './chunks/openPbrBsdf.glsl.js';\nimport sampling from './chunks/sampling.glsl.js';\nimport reflectance from './aovReflectance.glsl.js';\nimport {FragmentShader, Shader} from '../shader.js';\nimport common from './chunks/common.glsl.js';\nimport core from './chunks/rayTraceCore.glsl.js';\nimport materials from './chunks/materialBuffer.glsl.js';\nimport intersect from './chunks/intersect.glsl.js';\nimport uvProjection from './chunks/uvProjection.glsl.js';\nimport random from './chunks/random.glsl.js';\nimport cameraRay from './chunks/cameraRay.glsl.js';\nimport rand from './chunks/rand.glsl.js';\nconst surface = /* glsl */ `\nuint aovWord(int index) { ivec2 size = textureSize(aovScene,0); uvec4 v = texelFetch(aovScene, ivec2((index/4)%size.x, (index/4)/size.x),0); return v[index%4]; }\nvec3 aovVector(int offset){return vec3(uintBitsToFloat(aovWord(offset)),uintBitsToFloat(aovWord(offset+1)),uintBitsToFloat(aovWord(offset+2)));}\nmat4 aovMatrix(int offset) { mat4 m; for (int i=0;i<4;i++) for(int j=0;j<4;j++) m[i][j]=uintBitsToFloat(aovWord(offset+i*4+j)); return m; }\nRay aovRay(vec2 uv) {\n vec4 origin = viewProjectionInv*vec4(uv*2.0-1.0,-1.0,1.0);\n vec4 target = viewProjectionInv*vec4(uv*2.0-1.0,1.0,1.0);\n Ray ray; initRay(ray, origin.xyz/origin.w, normalize(target.xyz*origin.w-origin.xyz*target.w)); return ray;\n}\nbool aovSurface(Ray inputRay, out SurfaceInteraction si, out OpenPbrResolvedMaterial material) {\n Ray ray=inputRay; si.triangleIndex=-1;\n for(int layer=0;layer<32;layer++) {\n intersectScene(ray,si,false); if(!si.hit) return false;\n getMaterial(material,si.materialIndex,si.uv,si.uv1,si.instanceIndex,si.vertexColor);\n if(material.materialType!=SHADOW_CATCHER && material.alpha>=0.5) return true;\n ray.o=si.position+ray.d*(EPS*0.02);\n }\n return false;\n}\n`;\nexport function aovTraceFragment(center: boolean) {\n const shader = new FragmentShader({name: center ? 'AOV center' : 'AOV accumulation',\n outputs: center ? ['id','motion'] : ['geometry','position','diffuse','specular'],\n outputTypes: center ? {id: 'uvec4'} : {}, defines: {DEPTH_QUERY_MODE: true},\n includes: [core,materials,intersect,random],\n uniforms: {viewProjectionInv: Shader.uniform('mat4'), viewInv: Shader.uniform('mat4'),\n cameraApertureRadius: Shader.uniform('float',0), cameraFocusDistance: Shader.uniform('float',10),\n viewportSize: Shader.uniform('vec2'), aovScene: Shader.uniform('usampler2D'),\n previousId: Shader.uniform('usampler2D'), previousMotion: Shader.uniform('sampler2D'),\n previousGeometry: Shader.uniform('sampler2D'), previousPosition: Shader.uniform('sampler2D'),\n previousDiffuse: Shader.uniform('sampler2D'), previousSpecular: Shader.uniform('sampler2D'),\n openPbrEnergyLut: Shader.uniform('sampler2D'), aovMask: Shader.uniform('int',0),\n aovSample: Shader.uniform('int',0)},\n main: /* glsl */ `\n${common}\n${rand}\n${random.main}\n${core.main}\n${uvProjection}\n${materials.main}\n${intersect.main}\n${cameraRay}\n${center ? '' : sampling+bsdf+reflectance}\n${surface}\nvoid main() {\n ${center ? /* glsl */ `\n out_id=uvec4(0xffffffffu); out_motion=vec4(0.0);\n Ray ray=aovRay((floor(gl_FragCoord.xy)+0.5)/viewportSize);\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n int offset=52+si.instanceIndex*24;\n out_id=uvec4(aovWord(offset),aovWord(offset+1),aovWord(int(aovWord(16))+si.materialIndex),aovWord(int(aovWord(17))+si.triangleIndex));\n out_motion.z=dot(si.position-aovVector(36),aovVector(40));\n if(aovWord(offset+2)==0u)return;\n vec4 oldWorld=aovMatrix(offset+4)*vec4(si.position,1.0);\n vec4 oldClip=aovMatrix(0)*oldWorld;\n if(oldClip.w<=0.0)return;\n vec3 oldNdc=oldClip.xyz/oldClip.w;vec2 oldPixel=(oldNdc.xy*0.5+0.5)*viewportSize;\n if(any(lessThan(oldPixel,vec2(0.0)))||any(greaterThanEqual(oldPixel,viewportSize))||abs(oldNdc.z)>1.0)return;\n uvec4 identity=texelFetch(previousId,ivec2(oldPixel),0);float oldDepth=texelFetch(previousMotion,ivec2(oldPixel),0).z;\n if(any(notEqual(identity.xy,out_id.xy))||abs(oldDepth-dot(oldWorld.xyz-aovVector(44),aovVector(48)))>max(1e-4,abs(oldDepth)*1e-3))return;\n out_motion=vec4((oldPixel-gl_FragCoord.xy)*vec2(1.0,-1.0),out_motion.z,3.0);\n ` : /* glsl */ `\n ivec2 coord=ivec2(gl_FragCoord.xy);\n out_geometry=aovSample==0 ? vec4(0.0) : texelFetch(previousGeometry,coord,0);\n out_position=aovSample==0 ? vec4(0.0) : texelFetch(previousPosition,coord,0);\n out_diffuse=aovSample==0 ? vec4(0.0) : texelFetch(previousDiffuse,coord,0);\n out_specular=aovSample==0 ? vec4(0.0) : texelFetch(previousSpecular,coord,0);\n initRandom(); samplingPixel=uvec2(floor(gl_FragCoord.xy));\n rng_initialize(floor(gl_FragCoord.xy),int(pixelSampleIndex ^ sampleHash(uint(sequenceSeed))));\n Ray ray=aovRay((floor(gl_FragCoord.xy)+sample2D(CAMERA_PIXEL))/viewportSize);\n if(cameraApertureRadius>0.0) {\n vec3 eye=viewInv[3].xyz, forward=-normalize(viewInv[2].xyz);\n vec3 focusPoint=eye+ray.d*(cameraFocusDistance/dot(ray.d,forward));\n vec2 lens=cameraApertureRadius*sampleCircle(sample2D(CAMERA_LENS));\n vec3 origin=(viewInv*vec4(lens,0.0,1.0)).xyz;\n initRay(ray,origin,normalize(focusPoint-origin));\n }\n SurfaceInteraction si; OpenPbrResolvedMaterial material;\n if(!aovSurface(ray,si,material)) return;\n float depth=max(dot(si.position-viewInv[3].xyz,-normalize(viewInv[2].xyz)),0.0);\n bool unsupported=material.materialType!=STANDARD || material.alpha<1.0 || material.coatWeight>0.0 || material.fuzzWeight>0.0 || material.specularAnisotropy>0.0 || material.subsurfaceWeight>0.0 || dot(material.mediumScattering,material.mediumScattering)>0.0 || material.bevel>0.0 || material.thinFilmWeight>0.0 || material.transmissionDispersionScale>0.0;\n out_geometry+=vec4(depth,material.specularRoughness,material.baseMetalness,unsupported?1.0:0.0);\n #ifdef AOV_REFLECTANCE\n if((aovMask&24)!=0 && !unsupported){\n vec3 normal=si.normal,face=si.faceNormal;float cosine=-dot(normal,ray.d),faceCosine=-dot(face,ray.d);\n if(material.thinWalled&&(material.transmissionWeight>0.0||material.subsurfaceWeight>0.0)){\n if(cosine<0.0){normal=-normal;cosine=-cosine;}if(faceCosine<0.0){face=-face;faceCosine=-faceCosine;}\n }\n if(faceCosine>=0.0&&cosine<0.0){normal=face;cosine=faceCosine;}\n if(cosine<0.0)normal=-normal;\n material.inside=cosine<=0.0&&!material.thinWalled;material.relativeIor=cosine>0.0?1.0/material.specularIor:material.specularIor;\n vec3 tangent=vec3(0.0);\n#ifdef USE_TANGENT\n tangent=si.tangent;\n#endif\n OpenPbrPreparedBsdf prepared=openpbr_prepare(tangent,material,-ray.d,normal);\n vec3 diffuse,specular;aovReflectance(prepared,(aovMask&8)!=0,(aovMask&16)!=0,diffuse,specular);\n out_diffuse+=vec4(diffuse,1.0);out_specular+=vec4(specular,1.0);\n }\n #endif\n out_position+=vec4(si.position,1.0);\n `}\n}\n`});\n shader.parallelCompile = true;\n return shader;\n}\n"]}
@@ -3,16 +3,16 @@
3
3
  // Copyright (c) 2019 HOVER, MIT license; see LICENSES/RayTracingRenderer-MIT.txt.
4
4
  // Shared primary-ray construction keeps beauty and catcher coverage aligned.
5
5
  export default /* glsl */ `
6
- Ray hC(vec2 fH) {
7
- vec4 origin = viewProjectionInv * vec4(fH * 2.0 - 1.0, -1.0, 1.0);
8
- vec4 target = viewProjectionInv * vec4(fH * 2.0 - 1.0, 1.0, 1.0);
6
+ Ray fj(vec2 coord) {
7
+ vec4 origin = viewProjectionInv * vec4(coord * 2.0 - 1.0, -1.0, 1.0);
8
+ vec4 target = viewProjectionInv * vec4(coord * 2.0 - 1.0, 1.0, 1.0);
9
9
  Ray cam;
10
- iC(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
10
+ gC(cam, origin.xyz / origin.w, normalize(target.xyz * origin.w - origin.xyz * target.w));
11
11
 
12
12
  return cam;
13
13
  }
14
14
 
15
- vec2 oK(vec2 p) {
15
+ vec2 kN(vec2 p) {
16
16
  p = 2.0 * p - 1.0;
17
17
  bool greater = abs(p.x) > abs(p.y);
18
18
  float r = greater ? p.x : p.y;
@@ -20,16 +20,16 @@ float theta = greater ? 0.25 * PI * p.y / p.x : PI * (0.5 - 0.25 * p.x / p.y);
20
20
  return r * vec2(cos(theta), sin(theta));
21
21
  }
22
22
 
23
- Ray nM() {
24
- Ray cam = hC(v_Texcoord + sa());
23
+ Ray oG() {
24
+ Ray cam = fj(v_Texcoord + tg());
25
25
  if (cameraApertureRadius > 0.0) {
26
26
 
27
27
  vec3 eye = viewInv[3].xyz;
28
- vec3 oj = -normalize(viewInv[2].xyz);
29
- vec3 qy = eye + cam.d * (cameraFocusDistance / dot(cam.d, oj));
30
- vec2 rK = cameraApertureRadius * oK(fp(CAMERA_LENS));
31
- vec3 origin = vec3(viewInv * vec4(rK, 0.0, 1.0));
32
- iC(cam, origin, normalize(qy - origin));
28
+ vec3 forward = -normalize(viewInv[2].xyz);
29
+ vec3 jN = eye + cam.d * (cameraFocusDistance / dot(cam.d, forward));
30
+ vec2 sK = cameraApertureRadius * kN(dZ(CAMERA_LENS));
31
+ vec3 origin = vec3(viewInv * vec4(sK, 0.0, 1.0));
32
+ gC(cam, origin, normalize(jN - origin));
33
33
  }
34
34
  return cam;
35
35
  }
@@ -11,21 +11,22 @@ export default createShaderMixin({
11
11
  envMapDistribution: Shader.uniform('sampler2D'),
12
12
  backgroundMap: Shader.uniform('sampler2D'),
13
13
  backgroundMapTransform: Shader.uniform('vec4', [1, 0, 1, 0]),
14
+ backgroundMapRotation: Shader.uniform('mat3', [1, 0, 0, 0, 1, 0, 0, 0, 1]),
14
15
  groundedBackgroundParams: Shader.uniform('vec4'),
15
16
  groundedBackgroundCenter: Shader.uniform('vec2')
16
17
  },
17
18
  main: glsl `
18
- vec2 eL(vec3 gh) {
19
- float phi = mod(atan(-gh.z, -gh.x), TWOPI);
20
- float theta = acos(clamp(gh.y, -1.0, 1.0));
19
+ vec2 eV(vec3 gx) {
20
+ float phi = mod(atan(-gx.z, -gx.x), TWOPI);
21
+ float theta = acos(clamp(gx.y, -1.0, 1.0));
21
22
  return vec2(phi * 0.5 * INVPI, theta * INVPI);
22
23
  }
23
24
 
24
- vec2 cY(vec3 mP) {
25
- return eL(transpose(environmentRotation) * mP);
25
+ vec2 dm(vec3 nO) {
26
+ return eV(transpose(environmentRotation) * nO);
26
27
  }
27
28
 
28
- float qB(float u, out int vOffset, out float pdf) {
29
+ float rE(float u, out int vOffset, out float pdf) {
29
30
  ivec2 size = textureSize(envMap, 0);
30
31
 
31
32
  int left = 0;
@@ -51,7 +52,7 @@ pdf = s0.y;
51
52
  return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);
52
53
  }
53
54
 
54
- float qA(float u, int vOffset, out float pdf) {
55
+ float rD(float u, int vOffset, out float pdf) {
55
56
  ivec2 size = textureSize(envMap, 0);
56
57
 
57
58
  int left = 0;
@@ -65,123 +66,128 @@ left = mid + 1;
65
66
  right = mid;
66
67
  }
67
68
  }
68
- int oR = left - 1;
69
+ int pO = left - 1;
69
70
 
70
71
 
71
72
 
72
- vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + oR, vOffset), 0).xy;
73
- vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + oR + 1, vOffset), 0).xy;
73
+ vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + pO, vOffset), 0).xy;
74
+ vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + pO + 1, vOffset), 0).xy;
74
75
 
75
76
  pdf = s0.y;
76
77
 
77
- return (float(oR) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
78
+ return (float(pO) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);
78
79
  }
79
80
 
80
81
 
81
- vec3 oL(vec2 random, out vec2 uv, out float pdf) {
82
- vec2 he;
82
+ float eW(vec2 ew, float v) {
83
+ if (!(v > 0.0 && v < 1.0)) { return 0.0; }
84
+ float sinTheta = sin(min(v, 1.0 - v) * PI);
85
+ return ew.x * ew.y * INVPI2 / (2.0 * sinTheta);
86
+ }
87
+
88
+
89
+ vec3 pI(vec2 random, out vec2 uv, out float pdf) {
90
+ vec2 ew;
83
91
  int vOffset;
84
92
 
85
- uv.y = qB(random.x, vOffset, he.y);
86
- uv.x = qA(random.y, vOffset, he.x);
93
+ uv.y = rE(random.x, vOffset, ew.y);
94
+ uv.x = rD(random.y, vOffset, ew.x);
87
95
 
88
96
  float phi = uv.x * TWOPI;
89
97
  float theta = uv.y * PI;
90
- float cc = cos(theta);
98
+ float ci = cos(theta);
91
99
  float sinTheta = sin(theta);
92
- float ul = cos(phi);
93
- float uw = sin(phi);
100
+ float vM = cos(phi);
101
+ float vX = sin(phi);
94
102
 
95
- vec3 dir = vec3(-sinTheta * ul, cc, -sinTheta * uw);
103
+ vec3 dir = vec3(-sinTheta * vM, ci, -sinTheta * vX);
96
104
 
97
- pdf = he.x * he.y * INVPI2 / (2.0 * sinTheta);
105
+ pdf = eW(ew, uv.y);
98
106
 
99
107
  return environmentRotation * dir;
100
108
  }
101
109
 
102
- float iB(vec2 uv) {
110
+ float iT(vec2 uv) {
103
111
  vec2 size = vec2(textureSize(envMap, 0));
104
112
 
105
- float sinTheta = sin(uv.y * PI);
106
-
107
- uv *= size;
113
+ ivec2 pixel = clamp(ivec2(uv * size), ivec2(0), ivec2(size) - ivec2(1));
108
114
 
109
- float sL = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;
110
- float sM = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;
115
+ float ub = texelFetch(envMapDistribution, ivec2(1 + pixel.x, pixel.y), 0).y;
116
+ float uc = texelFetch(envMapDistribution, ivec2(0, pixel.y), 0).y;
111
117
 
112
- return sL * sM * INVPI2 / (2.0 * sinTheta);
118
+ return eW(vec2(ub, uc), uv.y);
113
119
  }
114
120
 
115
- float dq(vec3 sN, float height, float radius) {
116
- float fR = length(sN);
117
- if (fR < 0.00001) {
121
+ float dK(vec3 point, float height, float radius) {
122
+ float ge = length(point);
123
+ if (ge < 0.00001) {
118
124
  return -radius;
119
125
  }
120
126
 
121
- float iG = radius * sN.y / fR;
122
- float iq = -1.5 * height;
123
- float ev;
124
- if (iG >= 0.0) {
125
- ev = radius;
126
- } else if (iG < iq) {
127
- ev = -height * fR / sN.y;
127
+ float iX = radius * point.y / ge;
128
+ float iL = -1.5 * height;
129
+ float eH;
130
+ if (iX >= 0.0) {
131
+ eH = radius;
132
+ } else if (iX < iL) {
133
+ eH = -height * ge / point.y;
128
134
  } else {
129
- float dW = 1.0
130
- - iG * iG / (3.0 * iq * iq);
131
- ev = radius * dW;
135
+ float cL = 1.0
136
+ - iX * iX / (3.0 * iL * iL);
137
+ eH = radius * cL;
132
138
  }
133
- return fR - ev;
139
+ return ge - eH;
134
140
  }
135
141
 
136
- vec3 eT(vec3 origin, vec3 d) {
142
+ vec3 fd(vec3 origin, vec3 d) {
137
143
  #ifdef USE_GROUNDED_BACKGROUND
138
144
  float height = groundedBackgroundParams.x;
139
145
  float radius = groundedBackgroundParams.y;
140
- float vN = groundedBackgroundParams.z;
141
- vec3 bY = normalize(d);
142
- vec3 bB = origin - vec3(
146
+ float xB = groundedBackgroundParams.z;
147
+ vec3 cf = normalize(d);
148
+ vec3 bI = origin - vec3(
143
149
  groundedBackgroundCenter.x,
144
- vN + height,
150
+ xB + height,
145
151
  groundedBackgroundCenter.y
146
152
  );
147
153
 
148
154
 
149
155
 
150
- float eJ = dot(bB, bY);
151
- float ej = eJ * eJ
152
- - dot(bB, bB) + radius * radius;
153
- if (ej > 0.0) {
154
- float cC = -eJ + sqrt(ej);
156
+ float eT = dot(bI, cf);
157
+ float br = eT * eT
158
+ - dot(bI, bI) + radius * radius;
159
+ if (br > 0.0) {
160
+ float cM = -eT + sqrt(br);
155
161
  if (
156
- cC > 0.0
157
- && dq(bB, height, radius) <= 0.0
162
+ cM > 0.0
163
+ && dK(bI, height, radius) <= 0.0
158
164
  ) {
159
- vec3 nO = bB + bY * cC;
160
- if (nO.y >= 0.0) {
161
- return normalize(nO);
165
+ vec3 oK = bI + cf * cM;
166
+ if (oK.y >= 0.0) {
167
+ return normalize(oK);
162
168
  }
163
169
 
164
- if (bY.y < -0.00001 && radius > 1.5 * height) {
165
- float hT = (-height - bB.y) / bY.y;
166
- vec3 nE = bB + bY * hT;
167
- float om = (2.0 / 3.0)
170
+ if (cf.y < -0.00001 && radius > 1.5 * height) {
171
+ float ir = (-height - bI.y) / cf.y;
172
+ vec3 oB = bI + cf * ir;
173
+ float pe = (2.0 / 3.0)
168
174
  * sqrt(radius * radius - 2.25 * height * height);
169
- if (hT > 0.0 && length(nE.xz) <= om) {
170
- return normalize(nE);
175
+ if (ir > 0.0 && length(oB.xz) <= pe) {
176
+ return normalize(oB);
171
177
  }
172
178
  }
173
179
 
174
- float cN = 0.0;
180
+ float cV = 0.0;
175
181
  for (int i = 0; i < 14; i++) {
176
- float fh = (cN + cC) * 0.5;
177
- vec3 pL = bB + bY * fh;
178
- if (dq(pL, height, radius) > 0.0) {
179
- cC = fh;
182
+ float fB = (cV + cM) * 0.5;
183
+ vec3 qy = bI + cf * fB;
184
+ if (dK(qy, height, radius) > 0.0) {
185
+ cM = fB;
180
186
  } else {
181
- cN = fh;
187
+ cV = fB;
182
188
  }
183
189
  }
184
- vec3 hit = bB + bY * ((cN + cC) * 0.5);
190
+ vec3 hit = bI + cf * ((cV + cM) * 0.5);
185
191
  return normalize(hit);
186
192
  }
187
193
  }
@@ -189,15 +195,15 @@ return normalize(hit);
189
195
  return d;
190
196
  }
191
197
 
192
- vec4 cx(vec3 origin, vec3 d) {
193
- d = eT(origin, d);
198
+ vec4 cG(vec3 origin, vec3 d) {
199
+ d = fd(origin, d);
194
200
  #ifdef USE_BACKGROUND
195
201
  vec4 t = backgroundMapTransform;
196
202
  d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);
197
- vec4 aW = textureLinear(backgroundMap, eL(d));
198
- return vec4(aW.rgb * t.z, aW.a);
203
+ vec4 bc = textureLinear(backgroundMap, eV(transpose(backgroundMapRotation) * d));
204
+ return vec4(bc.rgb * t.z, bc.a);
199
205
  #else
200
- return textureLinear(backgroundMap, cY(d));
206
+ return textureLinear(backgroundMap, dm(d));
201
207
  #endif
202
208
  }`
203
209
  });
@@ -1 +1 @@
1
- {"version":3,"file":"envMap.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/envMap.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,sFAAsF;AACtF,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QACzD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAyLV;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\n// Sample the environment map using a cumulative distribution function as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Sampling_Light_Sources.html#InfiniteAreaLights\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nexport default createShaderMixin({\n uniforms: {\n environmentRotation: Shader.uniform('mat3', [1,0,0, 0,1,0, 0,0,1]),\n envMap: Shader.uniform('sampler2D'),\n envMapDistribution: Shader.uniform('sampler2D'),\n backgroundMap: Shader.uniform('sampler2D'),\n backgroundMapTransform: Shader.uniform('vec4', [1,0,1,0]),\n groundedBackgroundParams: Shader.uniform('vec4'),\n groundedBackgroundCenter: Shader.uniform('vec2')\n },\n main: glsl`\nvec2 cartesianToEquirect(vec3 pointOnSphere) {\n float phi = mod(atan(-pointOnSphere.z, -pointOnSphere.x), TWOPI);\n float theta = acos(clamp(pointOnSphere.y, -1.0, 1.0));\n return vec2(phi * 0.5 * INVPI, theta * INVPI);\n}\n\nvec2 environmentUv(vec3 worldDirection) {\n return cartesianToEquirect(transpose(environmentRotation) * worldDirection);\n}\n\nfloat getEnvmapV(float u, out int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.y + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(0, mid), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n vOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(0, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(0, vOffset + 1), 0).xy;\n\n pdf = s0.y;\n\n return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);\n}\n\nfloat getEnvmapU(float u, int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.x + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(1 + mid, vOffset), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n int uOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + uOffset, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + uOffset + 1, vOffset), 0).xy;\n\n pdf = s0.y;\n\n return (float(uOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);\n}\n\n// Perform two binary searches to find light direction.\nvec3 sampleEnvmap(vec2 random, out vec2 uv, out float pdf) {\n vec2 partialPdf;\n int vOffset;\n\n uv.y = getEnvmapV(random.x, vOffset, partialPdf.y);\n uv.x = getEnvmapU(random.y, vOffset, partialPdf.x);\n\n float phi = uv.x * TWOPI;\n float theta = uv.y * PI;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n float cosPhi = cos(phi);\n float sinPhi = sin(phi);\n\n vec3 dir = vec3(-sinTheta * cosPhi, cosTheta, -sinTheta * sinPhi);\n\n pdf = partialPdf.x * partialPdf.y * INVPI2 / (2.0 * sinTheta);\n\n return environmentRotation * dir;\n}\n\nfloat envMapPdf(vec2 uv) {\n vec2 size = vec2(textureSize(envMap, 0));\n\n float sinTheta = sin(uv.y * PI);\n\n uv *= size;\n\n float partialX = texelFetch(envMapDistribution, ivec2(1.0 + uv.x, uv.y), 0).y;\n float partialY = texelFetch(envMapDistribution, ivec2(0, uv.y), 0).y;\n\n return partialX * partialY * INVPI2 / (2.0 * sinTheta);\n}\n\nfloat groundedSurfaceDistance(vec3 point, float height, float radius) {\n float pointLength = length(point);\n if (pointLength < 0.00001) {\n return -radius;\n }\n\n float originalY = radius * point.y / pointLength;\n float transitionY = -1.5 * height;\n float surfaceRadius;\n if (originalY >= 0.0) {\n surfaceRadius = radius;\n } else if (originalY < transitionY) {\n surfaceRadius = -height * pointLength / point.y;\n } else {\n float factor = 1.0\n - originalY * originalY / (3.0 * transitionY * transitionY);\n surfaceRadius = radius * factor;\n }\n return pointLength - surfaceRadius;\n}\n\nvec3 groundedBackgroundDirection(vec3 origin, vec3 d) {\n#ifdef USE_GROUNDED_BACKGROUND\n float height = groundedBackgroundParams.x;\n float radius = groundedBackgroundParams.y;\n float groundY = groundedBackgroundParams.z;\n vec3 rayDirection = normalize(d);\n vec3 localOrigin = origin - vec3(\n groundedBackgroundCenter.x,\n groundY + height,\n groundedBackgroundCenter.y\n );\n\n // The grounded skybox is a deformed sphere. Find the point where the ray\n // exits that surface so its texture lookup matches the rasterized geometry.\n float projectedOrigin = dot(localOrigin, rayDirection);\n float discriminant = projectedOrigin * projectedOrigin\n - dot(localOrigin, localOrigin) + radius * radius;\n if (discriminant > 0.0) {\n float farDistance = -projectedOrigin + sqrt(discriminant);\n if (\n farDistance > 0.0\n && groundedSurfaceDistance(localOrigin, height, radius) <= 0.0\n ) {\n vec3 sphereHit = localOrigin + rayDirection * farDistance;\n if (sphereHit.y >= 0.0) {\n return normalize(sphereHit);\n }\n\n if (rayDirection.y < -0.00001 && radius > 1.5 * height) {\n float groundDistance = (-height - localOrigin.y) / rayDirection.y;\n vec3 groundHit = localOrigin + rayDirection * groundDistance;\n float groundRadius = (2.0 / 3.0)\n * sqrt(radius * radius - 2.25 * height * height);\n if (groundDistance > 0.0 && length(groundHit.xz) <= groundRadius) {\n return normalize(groundHit);\n }\n }\n\n float nearDistance = 0.0;\n for (int i = 0; i < 14; i++) {\n float middleDistance = (nearDistance + farDistance) * 0.5;\n vec3 middlePoint = localOrigin + rayDirection * middleDistance;\n if (groundedSurfaceDistance(middlePoint, height, radius) > 0.0) {\n farDistance = middleDistance;\n } else {\n nearDistance = middleDistance;\n }\n }\n vec3 hit = localOrigin + rayDirection * ((nearDistance + farDistance) * 0.5);\n return normalize(hit);\n }\n }\n#endif\n return d;\n}\n\nvec4 sampleBackgroundFromRay(vec3 origin, vec3 d) {\n d = groundedBackgroundDirection(origin, d);\n#ifdef USE_BACKGROUND\n vec4 t = backgroundMapTransform;\n d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);\n vec4 backgroundSample = textureLinear(backgroundMap, cartesianToEquirect(d));\n return vec4(backgroundSample.rgb * t.z, backgroundSample.a);\n#else\n return textureLinear(backgroundMap, environmentUv(d));\n#endif\n}`\n});\n"]}
1
+ {"version":3,"file":"envMap.glsl.js","sourceRoot":"","sources":["../../../../src/renderer/glsl/chunks/envMap.glsl.ts"],"names":[],"mappings":"AAAA,qDAAqD;AACrD,sDAAsD;AACtD,kFAAkF;AAElF,sFAAsF;AACtF,uHAAuH;AAEvH,OAAO,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAElE,eAAe,iBAAiB,CAAC;IAC/B,QAAQ,EAAE;QACR,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QACnC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC1C,sBAAsB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QACzD,qBAAqB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAE,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QACpE,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAChD,wBAAwB,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;KACjD;IACD,IAAI,EAAE,IAAI,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8LV;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\n// Sample the environment map using a cumulative distribution function as described in\n// http://www.pbr-book.org/3ed-2018/Light_Transport_I_Surface_Reflection/Sampling_Light_Sources.html#InfiniteAreaLights\n\nimport { createShaderMixin, glsl, Shader } from '../../shader.js';\n\nexport default createShaderMixin({\n uniforms: {\n environmentRotation: Shader.uniform('mat3', [1,0,0, 0,1,0, 0,0,1]),\n envMap: Shader.uniform('sampler2D'),\n envMapDistribution: Shader.uniform('sampler2D'),\n backgroundMap: Shader.uniform('sampler2D'),\n backgroundMapTransform: Shader.uniform('vec4', [1,0,1,0]),\n backgroundMapRotation: Shader.uniform('mat3', [1,0,0, 0,1,0, 0,0,1]),\n groundedBackgroundParams: Shader.uniform('vec4'),\n groundedBackgroundCenter: Shader.uniform('vec2')\n },\n main: glsl`\nvec2 cartesianToEquirect(vec3 pointOnSphere) {\n float phi = mod(atan(-pointOnSphere.z, -pointOnSphere.x), TWOPI);\n float theta = acos(clamp(pointOnSphere.y, -1.0, 1.0));\n return vec2(phi * 0.5 * INVPI, theta * INVPI);\n}\n\nvec2 environmentUv(vec3 worldDirection) {\n return cartesianToEquirect(transpose(environmentRotation) * worldDirection);\n}\n\nfloat getEnvmapV(float u, out int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.y + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(0, mid), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n vOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(0, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(0, vOffset + 1), 0).xy;\n\n pdf = s0.y;\n\n return (float(vOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.y);\n}\n\nfloat getEnvmapU(float u, int vOffset, out float pdf) {\n ivec2 size = textureSize(envMap, 0);\n\n int left = 0;\n int right = size.x + 1; // cdf length is the length of the env map + 1\n while (left < right) {\n int mid = (left + right) >> 1;\n float s = texelFetch(envMapDistribution, ivec2(1 + mid, vOffset), 0).x;\n if (s <= u) {\n left = mid + 1;\n } else {\n right = mid;\n }\n }\n int uOffset = left - 1;\n\n // x channel is cumulative distribution of env map luminance\n // y channel is partial probability density of env map luminance\n vec2 s0 = texelFetch(envMapDistribution, ivec2(1 + uOffset, vOffset), 0).xy;\n vec2 s1 = texelFetch(envMapDistribution, ivec2(1 + uOffset + 1, vOffset), 0).xy;\n\n pdf = s0.y;\n\n return (float(uOffset) + (u - s0.x) / (s1.x - s0.x)) / float(size.x);\n}\n\n// Match the WGSL pole convention and keep the Jacobian positive in f32.\nfloat envMapSolidAnglePdf(vec2 partialPdf, float v) {\n if (!(v > 0.0 && v < 1.0)) { return 0.0; }\n float sinTheta = sin(min(v, 1.0 - v) * PI);\n return partialPdf.x * partialPdf.y * INVPI2 / (2.0 * sinTheta);\n}\n\n// Perform two binary searches to find light direction.\nvec3 sampleEnvmap(vec2 random, out vec2 uv, out float pdf) {\n vec2 partialPdf;\n int vOffset;\n\n uv.y = getEnvmapV(random.x, vOffset, partialPdf.y);\n uv.x = getEnvmapU(random.y, vOffset, partialPdf.x);\n\n float phi = uv.x * TWOPI;\n float theta = uv.y * PI;\n float cosTheta = cos(theta);\n float sinTheta = sin(theta);\n float cosPhi = cos(phi);\n float sinPhi = sin(phi);\n\n vec3 dir = vec3(-sinTheta * cosPhi, cosTheta, -sinTheta * sinPhi);\n\n pdf = envMapSolidAnglePdf(partialPdf, uv.y);\n\n return environmentRotation * dir;\n}\n\nfloat envMapPdf(vec2 uv) {\n vec2 size = vec2(textureSize(envMap, 0));\n\n ivec2 pixel = clamp(ivec2(uv * size), ivec2(0), ivec2(size) - ivec2(1));\n\n float partialX = texelFetch(envMapDistribution, ivec2(1 + pixel.x, pixel.y), 0).y;\n float partialY = texelFetch(envMapDistribution, ivec2(0, pixel.y), 0).y;\n\n return envMapSolidAnglePdf(vec2(partialX, partialY), uv.y);\n}\n\nfloat groundedSurfaceDistance(vec3 point, float height, float radius) {\n float pointLength = length(point);\n if (pointLength < 0.00001) {\n return -radius;\n }\n\n float originalY = radius * point.y / pointLength;\n float transitionY = -1.5 * height;\n float surfaceRadius;\n if (originalY >= 0.0) {\n surfaceRadius = radius;\n } else if (originalY < transitionY) {\n surfaceRadius = -height * pointLength / point.y;\n } else {\n float factor = 1.0\n - originalY * originalY / (3.0 * transitionY * transitionY);\n surfaceRadius = radius * factor;\n }\n return pointLength - surfaceRadius;\n}\n\nvec3 groundedBackgroundDirection(vec3 origin, vec3 d) {\n#ifdef USE_GROUNDED_BACKGROUND\n float height = groundedBackgroundParams.x;\n float radius = groundedBackgroundParams.y;\n float groundY = groundedBackgroundParams.z;\n vec3 rayDirection = normalize(d);\n vec3 localOrigin = origin - vec3(\n groundedBackgroundCenter.x,\n groundY + height,\n groundedBackgroundCenter.y\n );\n\n // The grounded skybox is a deformed sphere. Find the point where the ray\n // exits that surface so its texture lookup matches the rasterized geometry.\n float projectedOrigin = dot(localOrigin, rayDirection);\n float discriminant = projectedOrigin * projectedOrigin\n - dot(localOrigin, localOrigin) + radius * radius;\n if (discriminant > 0.0) {\n float farDistance = -projectedOrigin + sqrt(discriminant);\n if (\n farDistance > 0.0\n && groundedSurfaceDistance(localOrigin, height, radius) <= 0.0\n ) {\n vec3 sphereHit = localOrigin + rayDirection * farDistance;\n if (sphereHit.y >= 0.0) {\n return normalize(sphereHit);\n }\n\n if (rayDirection.y < -0.00001 && radius > 1.5 * height) {\n float groundDistance = (-height - localOrigin.y) / rayDirection.y;\n vec3 groundHit = localOrigin + rayDirection * groundDistance;\n float groundRadius = (2.0 / 3.0)\n * sqrt(radius * radius - 2.25 * height * height);\n if (groundDistance > 0.0 && length(groundHit.xz) <= groundRadius) {\n return normalize(groundHit);\n }\n }\n\n float nearDistance = 0.0;\n for (int i = 0; i < 14; i++) {\n float middleDistance = (nearDistance + farDistance) * 0.5;\n vec3 middlePoint = localOrigin + rayDirection * middleDistance;\n if (groundedSurfaceDistance(middlePoint, height, radius) > 0.0) {\n farDistance = middleDistance;\n } else {\n nearDistance = middleDistance;\n }\n }\n vec3 hit = localOrigin + rayDirection * ((nearDistance + farDistance) * 0.5);\n return normalize(hit);\n }\n }\n#endif\n return d;\n}\n\nvec4 sampleBackgroundFromRay(vec3 origin, vec3 d) {\n d = groundedBackgroundDirection(origin, d);\n#ifdef USE_BACKGROUND\n vec4 t = backgroundMapTransform;\n d = vec3(t.x * d.x - t.y * d.z, d.y, t.y * d.x + t.x * d.z);\n vec4 backgroundSample = textureLinear(backgroundMap, cartesianToEquirect(transpose(backgroundMapRotation) * d));\n return vec4(backgroundSample.rgb * t.z, backgroundSample.a);\n#else\n return textureLinear(backgroundMap, environmentUv(d));\n#endif\n}`\n});\n"]}