@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,4 @@
1
+ import type MaterialState from '../scene/MaterialState.js';
2
+ import type Geometry from '../scene/Geometry.js';
3
+ import type MaterialData from './MaterialData.js';
4
+ export declare function wgpuMaterialConstants(materials: MaterialState[], materialData: Pick<MaterialData, 'defines' | 'bufferData'>, mergedGeometry: Geometry, bevelSamples: number, previousNumMaps?: number): Record<string, boolean | number>;
@@ -0,0 +1,52 @@
1
+ import { resolveMaterialAlphaMode } from '../scene/MaterialState.js';
2
+ import { materialUsesMedium } from './materialParams.js';
3
+ import { materialTextureFeatures } from './materialTextureSlots.js';
4
+ import { MATERIAL_SHADER_CAPABILITIES } from './shaderCapabilities.js';
5
+ // Same feature decisions for browser pipeline updates and native scene commits.
6
+ export function wgpuMaterialConstants(materials, materialData, mergedGeometry, bevelSamples, previousNumMaps = 0) {
7
+ const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);
8
+ const SPECTRAL = materials.some((m) => m.transmissionDispersionScale > 0);
9
+ const HAS_MEDIUM = materials.some(materialUsesMedium);
10
+ // Retain the atlas uniform capacity when a stage/material is removed.
11
+ // Shrinking the array would rebuild every pipeline again on the next edit.
12
+ const NUM_MAPS = Math.max(Math.ceil(+materialData.defines.NUM_MAPS / 10) * 10, Number(previousNumMaps ?? 0), 20);
13
+ // Either layer's map requires independent normals, including a smooth
14
+ // coat over a mapped base. Unmapped materials retain the shared path.
15
+ const USE_COAT_NORMAL_FRAMES = materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap));
16
+ return {
17
+ MATERIAL_CAPABILITIES: (materials.some(m => m.transmissionWeight !== 0 || !!m.map && m.mapAlphaUsage === 'transmission')
18
+ ? MATERIAL_SHADER_CAPABILITIES.transmission : 0) |
19
+ (materials.some(m => m.baseMetalness !== 0) ? MATERIAL_SHADER_CAPABILITIES.metal : 0),
20
+ // Match the atlas UV selector. Keep the second set when any texture
21
+ // needs it; material/texture edits already rebuild these constants.
22
+ USE_UV1: materialData.bufferData.mapUvChannel.some(channel => channel > 0.5),
23
+ // Isotropic OpenPBR constructs its own basis. Normal mapping uses
24
+ // triangle UV differentials rather than this vertex tangent.
25
+ USE_TANGENT: mergedGeometry.tangent != null &&
26
+ materials.some(material => material.specularAnisotropy > 0 || material.coatAnisotropy > 0 || (!!material.coatNormalMap && material.coatWeight > 0)),
27
+ USE_COAT_NORMAL_FRAMES,
28
+ USE_ANISOTROPY_DIRECTIONS: USE_COAT_NORMAL_FRAMES || materials.some(m => m.specularAnisotropy > 0 && (m.specularAnisotropyModel === 'gltf' || !!m.anisotropyMap || m.specularAnisotropyRotation !== 0) ||
29
+ m.coatAnisotropy > 0 && m.coatAnisotropyRotation !== 0),
30
+ HAS_MEDIUM,
31
+ HAS_SHADOW_CATCHER: materials.some(m => m.shadowCatcher),
32
+ HAS_THIN_FILM: materials.some((material) => material.thinFilmWeight > 0),
33
+ HAS_COAT: materials.some((material) => material.coatWeight > 0),
34
+ HAS_FUZZ: materials.some((material) => material.fuzzWeight > 0),
35
+ HAS_SUBSURFACE: materials.some((material) => material.subsurfaceWeight > 0),
36
+ HAS_BEVEL,
37
+ HAS_ALPHA_MASK: materials.some((m) => resolveMaterialAlphaMode(m) === 'mask'),
38
+ HAS_ALPHA_BLEND: materials.some((m) => resolveMaterialAlphaMode(m) === 'blend'),
39
+ HAS_ALPHA: materials.some((m) => resolveMaterialAlphaMode(m) !== 'opaque'),
40
+ SPECTRAL,
41
+ BEVEL_SAMPLES: bevelSamples,
42
+ USE_RR: true,
43
+ // Match WebGL: defer roulette for multiple-scattering SSS paths.
44
+ RR_MAX: HAS_MEDIUM ? 12 : 2,
45
+ NUM_UNIFORM_LIGHTS: 64,
46
+ ...materialData.defines,
47
+ NUM_MAPS,
48
+ ...materialTextureFeatures(materialData.defines),
49
+ USE_NORMAL_MAPS: +materialData.defines.NUM_NORMAL_MAPS > 0
50
+ };
51
+ }
52
+ //# sourceMappingURL=wgpuMaterialConstants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuMaterialConstants.js","sourceRoot":"","sources":["../../src/renderer/wgpuMaterialConstants.ts"],"names":[],"mappings":"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","sourcesContent":["import type MaterialState from '../scene/MaterialState.js';\nimport { resolveMaterialAlphaMode } from '../scene/MaterialState.js';\nimport type Geometry from '../scene/Geometry.js';\nimport type MaterialData from './MaterialData.js';\nimport { materialUsesMedium } from './materialParams.js';\nimport { materialTextureFeatures } from './materialTextureSlots.js';\nimport {MATERIAL_SHADER_CAPABILITIES} from './shaderCapabilities.js';\n\n// Same feature decisions for browser pipeline updates and native scene commits.\nexport function wgpuMaterialConstants(materials: MaterialState[], materialData: Pick<MaterialData, 'defines' | 'bufferData'>, mergedGeometry: Geometry,\n bevelSamples: number, previousNumMaps = 0): Record<string, boolean | number> {\n const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);\n const SPECTRAL =\n materials.some((m) => m.transmissionDispersionScale > 0);\n const HAS_MEDIUM = materials.some(materialUsesMedium);\n // Retain the atlas uniform capacity when a stage/material is removed.\n // Shrinking the array would rebuild every pipeline again on the next edit.\n const NUM_MAPS = Math.max(\n Math.ceil(+materialData.defines.NUM_MAPS / 10) * 10,\n Number(previousNumMaps ?? 0),\n 20\n );\n\n // Either layer's map requires independent normals, including a smooth\n // coat over a mapped base. Unmapped materials retain the shared path.\n const USE_COAT_NORMAL_FRAMES = materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap));\n\n return {\n MATERIAL_CAPABILITIES:\n (materials.some(m => m.transmissionWeight !== 0 || !!m.map && m.mapAlphaUsage === 'transmission')\n ? MATERIAL_SHADER_CAPABILITIES.transmission : 0) |\n (materials.some(m => m.baseMetalness !== 0) ? MATERIAL_SHADER_CAPABILITIES.metal : 0),\n // Match the atlas UV selector. Keep the second set when any texture\n // needs it; material/texture edits already rebuild these constants.\n USE_UV1: materialData.bufferData.mapUvChannel.some(channel => channel > 0.5),\n // Isotropic OpenPBR constructs its own basis. Normal mapping uses\n // triangle UV differentials rather than this vertex tangent.\n USE_TANGENT: mergedGeometry.tangent != null &&\n materials.some(material => material.specularAnisotropy > 0 || material.coatAnisotropy > 0 || (!!material.coatNormalMap && material.coatWeight > 0)),\n\n USE_COAT_NORMAL_FRAMES,\n USE_ANISOTROPY_DIRECTIONS: USE_COAT_NORMAL_FRAMES || materials.some(m =>\n m.specularAnisotropy > 0 && (m.specularAnisotropyModel === 'gltf' || !!m.anisotropyMap || m.specularAnisotropyRotation !== 0) ||\n m.coatAnisotropy > 0 && m.coatAnisotropyRotation !== 0),\n HAS_MEDIUM,\n HAS_SHADOW_CATCHER: materials.some(m => m.shadowCatcher),\n HAS_THIN_FILM: materials.some((material) => material.thinFilmWeight > 0),\n HAS_COAT: materials.some((material) => material.coatWeight > 0),\n HAS_FUZZ: materials.some((material) => material.fuzzWeight > 0),\n HAS_SUBSURFACE: materials.some((material) => material.subsurfaceWeight > 0),\n HAS_BEVEL,\n HAS_ALPHA_MASK: materials.some(\n (m) => resolveMaterialAlphaMode(m) === 'mask'\n ),\n HAS_ALPHA_BLEND: materials.some(\n (m) => resolveMaterialAlphaMode(m) === 'blend'\n ),\n HAS_ALPHA: materials.some(\n (m) => resolveMaterialAlphaMode(m) !== 'opaque'\n ),\n\n SPECTRAL,\n BEVEL_SAMPLES: bevelSamples,\n\n USE_RR: true,\n // Match WebGL: defer roulette for multiple-scattering SSS paths.\n RR_MAX: HAS_MEDIUM ? 12 : 2,\n\n NUM_UNIFORM_LIGHTS: 64,\n\n ...materialData.defines,\n\n NUM_MAPS,\n ...materialTextureFeatures(materialData.defines),\n USE_NORMAL_MAPS: +materialData.defines.NUM_NORMAL_MAPS > 0\n };\n\n}\n"]}
@@ -0,0 +1,42 @@
1
+ import type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';
2
+ export declare const WGPU_SCENE_BUFFER_MIN_BYTES = 200;
3
+ export declare function makeRayTraceUniform(): {
4
+ buffer: ArrayBuffer;
5
+ views: {
6
+ outputSize: Float32Array<ArrayBuffer>;
7
+ sampleCount: Float32Array<ArrayBuffer>;
8
+ scaleOffset: Float32Array<ArrayBuffer>;
9
+ lightsCount: Int32Array<ArrayBuffer>;
10
+ transmissiveOutputAlphaMin: Float32Array<ArrayBuffer>;
11
+ jitter: Float32Array<ArrayBuffer>;
12
+ backgroundColor: Float32Array<ArrayBuffer>;
13
+ groundedBackgroundParams: Float32Array<ArrayBuffer>;
14
+ groundedBackgroundCenter: Float32Array<ArrayBuffer>;
15
+ blasOffset: Int32Array<ArrayBuffer>;
16
+ isEmpty: Int32Array<ArrayBuffer>;
17
+ bevel: Int32Array<ArrayBuffer>;
18
+ dispersionWavelengths: Int32Array<ArrayBuffer>;
19
+ envLightPmf: Float32Array<ArrayBuffer>;
20
+ lightChoiceCount: Int32Array<ArrayBuffer>;
21
+ lightWeightTotal: Float32Array<ArrayBuffer>;
22
+ lightSamplingTextureWidth: Int32Array<ArrayBuffer>;
23
+ lightChoiceTexelOffset: Int32Array<ArrayBuffer>;
24
+ bounces: Int32Array<ArrayBuffer>;
25
+ varianceMoments: Int32Array<ArrayBuffer>;
26
+ adaptiveSampling: Int32Array<ArrayBuffer>;
27
+ clamping: Float32Array<ArrayBuffer>;
28
+ directLightCandidates: Int32Array<ArrayBuffer>;
29
+ backgroundFlags: Int32Array<ArrayBuffer>;
30
+ loopUnrollGuard: Uint32Array<ArrayBuffer>;
31
+ sceneFeatureFlags: Uint32Array<ArrayBuffer>;
32
+ sequenceSeed: Uint32Array<ArrayBuffer>;
33
+ zSobolLogSPP: Uint32Array<ArrayBuffer>;
34
+ sampleSequenceOffset: Uint32Array<ArrayBuffer>;
35
+ shadowCatcherChoiceOffset: Int32Array<ArrayBuffer>;
36
+ shadowCatcherChoiceCount: Int32Array<ArrayBuffer>;
37
+ environmentRotation: Float32Array<ArrayBuffer>;
38
+ backgroundMapTransform: Float32Array<ArrayBuffer>;
39
+ backgroundMapRotation: Float32Array<ArrayBuffer>;
40
+ };
41
+ };
42
+ export declare function packWgpuAnalyticLights(lights: AnalyticLight[], texturesIndices: number[], selectionPmfs: number[], iesProfileTexelOffset: (index: number) => number | undefined): Float32Array<ArrayBuffer>;
@@ -0,0 +1,125 @@
1
+ import { matrixStorage } from '../math/storage.js';
2
+ import { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';
3
+ import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';
4
+ import { read } from '../math/access.js';
5
+ export const WGPU_SCENE_BUFFER_MIN_BYTES = 200;
6
+ const FIXED_LIGHT_COUNT = 64;
7
+ const PIXELS_PER_LIGHT = 6;
8
+ export function makeRayTraceUniform() {
9
+ // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html
10
+ const RayTraceUniformValues = new ArrayBuffer(320);
11
+ const RayTraceUniformViews = {
12
+ outputSize: new Float32Array(RayTraceUniformValues, 0, 2),
13
+ sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),
14
+ scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),
15
+ lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),
16
+ transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),
17
+ jitter: new Float32Array(RayTraceUniformValues, 40, 2),
18
+ backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),
19
+ groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),
20
+ groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),
21
+ blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),
22
+ isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),
23
+ bevel: new Int32Array(RayTraceUniformValues, 96, 1),
24
+ dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),
25
+ envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),
26
+ lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),
27
+ lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),
28
+ lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),
29
+ lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),
30
+ bounces: new Int32Array(RayTraceUniformValues, 124, 1),
31
+ varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),
32
+ adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),
33
+ clamping: new Float32Array(RayTraceUniformValues, 136, 1),
34
+ directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),
35
+ backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),
36
+ loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),
37
+ sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),
38
+ sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),
39
+ zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),
40
+ sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),
41
+ // Shadow-catcher light table, relative to lightChoiceTexelOffset.
42
+ shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),
43
+ shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),
44
+ environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),
45
+ backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),
46
+ backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)
47
+ };
48
+ // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for
49
+ // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.
50
+ RayTraceUniformViews.loopUnrollGuard[0] = 4;
51
+ RayTraceUniformViews.environmentRotation.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
52
+ RayTraceUniformViews.backgroundMapRotation.set([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
53
+ RayTraceUniformViews.backgroundMapTransform.set([1, 0, 1, 0]);
54
+ RayTraceUniformViews.bevel[0] = 1;
55
+ RayTraceUniformViews.dispersionWavelengths[0] = 3;
56
+ return {
57
+ buffer: RayTraceUniformValues,
58
+ views: RayTraceUniformViews
59
+ };
60
+ }
61
+ export function packWgpuAnalyticLights(lights, texturesIndices, selectionPmfs, iesProfileTexelOffset) {
62
+ validateSceneLights(lights);
63
+ const numLights = lights.length;
64
+ if (numLights > FIXED_LIGHT_COUNT) {
65
+ console.warn(`Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`);
66
+ }
67
+ const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);
68
+ function packVec3(idx, v) {
69
+ for (let i = 0; i < 3; i++) {
70
+ data[i + idx * 4] = read(v, i);
71
+ }
72
+ }
73
+ const lightTypeConstants = {
74
+ DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,
75
+ SphereLight: CONSTANT_SPHERE_LIGHT,
76
+ RectLight: CONSTANT_RECT_LIGHT,
77
+ SpotLight: CONSTANT_SPOT_LIGHT
78
+ };
79
+ for (let i = 0; i < numLights; i++) {
80
+ const light = lights[i];
81
+ const matrix = matrixStorage(light.transform);
82
+ const color = light.color;
83
+ const intensity = light.intensity;
84
+ const off = i * PIXELS_PER_LIGHT;
85
+ packVec3(off, [matrix[12], matrix[13], matrix[14]]);
86
+ data[off * 4 + 3] = lightTypeConstants[light.type];
87
+ // emission
88
+ const emissionScale = light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;
89
+ packVec3(off + 1, [
90
+ color[0] * emissionScale,
91
+ color[1] * emissionScale,
92
+ color[2] * emissionScale
93
+ ]);
94
+ if (light.type === 'RectLight') {
95
+ data[(off + 1) * 4 + 3] = getRectLightArea(light);
96
+ packVec3(off + 2, getRectLightUOrV(light, 0));
97
+ data[(off + 2) * 4 + 3] = light.spread;
98
+ packVec3(off + 3, getRectLightUOrV(light, 1));
99
+ }
100
+ else if (light.type === 'SphereLight') {
101
+ data[(off + 1) * 4 + 3] = getSphereLightArea(light);
102
+ data[(off + 2) * 4 + 3] = light.radius;
103
+ }
104
+ else if (light.type === 'SpotLight') {
105
+ data[(off + 1) * 4 + 3] = getSpotLightArea(light);
106
+ packVec3(off + 2, getLightDirection(light));
107
+ data[(off + 2) * 4 + 3] = light.radius;
108
+ packVec3(off + 3, [
109
+ Math.cos((light.outerAngle * Math.PI) / 180),
110
+ Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),
111
+ 0
112
+ ]);
113
+ }
114
+ else if (light.type === 'DirectionalLight') {
115
+ packVec3(off + 2, getLightDirection(light));
116
+ }
117
+ data[(off + 3) * 4 + 3] = light.type === 'SpotLight'
118
+ ? iesProfileTexelOffset(i) ?? -1
119
+ : texturesIndices[i] ?? -1;
120
+ data[(off + 4) * 4] = selectionPmfs[i] ?? 0;
121
+ packVec3(off + 5, getRigidLightFrame(light).x);
122
+ }
123
+ return data;
124
+ }
125
+ //# sourceMappingURL=wgpuSceneUniform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuSceneUniform.js","sourceRoot":"","sources":["../../src/renderer/wgpuSceneUniform.ts"],"names":[],"mappings":"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","sourcesContent":["import {matrixStorage} from '../math/storage.js';\nimport type {ReadonlyMathArray} from '../math/types.js';\nimport { getRectLightUOrV, getRectLightArea, getSphereLightArea, getSpotLightArea, getSpotLightRadiance, getLightDirection, getRigidLightFrame, validateSceneLights } from './lightsData.js';\nimport { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPOT_LIGHT } from './lightConstants.js';\nimport type { AnalyticLightState as AnalyticLight } from '../scene/lightState.js';\nimport { read } from '../math/access.js';\nexport const WGPU_SCENE_BUFFER_MIN_BYTES = 200;\nconst FIXED_LIGHT_COUNT = 64;\nconst PIXELS_PER_LIGHT = 6;\n\nexport function makeRayTraceUniform() {\n // Created from https://webgpufundamentals.org/webgpu/lessons/resources/wgsl-offset-computer.html\n const RayTraceUniformValues = new ArrayBuffer(320);\n const RayTraceUniformViews = {\n outputSize: new Float32Array(RayTraceUniformValues, 0, 2),\n sampleCount: new Float32Array(RayTraceUniformValues, 8, 1),\n scaleOffset: new Float32Array(RayTraceUniformValues, 16, 4),\n lightsCount: new Int32Array(RayTraceUniformValues, 32, 1),\n transmissiveOutputAlphaMin: new Float32Array(RayTraceUniformValues, 36, 1),\n jitter: new Float32Array(RayTraceUniformValues, 40, 2),\n backgroundColor: new Float32Array(RayTraceUniformValues, 48, 4),\n groundedBackgroundParams: new Float32Array(RayTraceUniformValues, 64, 4),\n groundedBackgroundCenter: new Float32Array(RayTraceUniformValues, 80, 2),\n blasOffset: new Int32Array(RayTraceUniformValues, 88, 1),\n isEmpty: new Int32Array(RayTraceUniformValues, 92, 1),\n bevel: new Int32Array(RayTraceUniformValues, 96, 1),\n dispersionWavelengths: new Int32Array(RayTraceUniformValues, 100, 1),\n envLightPmf: new Float32Array(RayTraceUniformValues, 104, 1),\n lightChoiceCount: new Int32Array(RayTraceUniformValues, 108, 1),\n lightWeightTotal: new Float32Array(RayTraceUniformValues, 112, 1),\n lightSamplingTextureWidth: new Int32Array(RayTraceUniformValues, 116, 1),\n lightChoiceTexelOffset: new Int32Array(RayTraceUniformValues, 120, 1),\n bounces: new Int32Array(RayTraceUniformValues, 124, 1),\n varianceMoments: new Int32Array(RayTraceUniformValues, 128, 1),\n adaptiveSampling: new Int32Array(RayTraceUniformValues, 132, 1),\n clamping: new Float32Array(RayTraceUniformValues, 136, 1),\n directLightCandidates: new Int32Array(RayTraceUniformValues, 140, 1),\n backgroundFlags: new Int32Array(RayTraceUniformValues, 144, 1),\n loopUnrollGuard: new Uint32Array(RayTraceUniformValues, 148, 1),\n sceneFeatureFlags: new Uint32Array(RayTraceUniformValues, 152, 1),\n sequenceSeed: new Uint32Array(RayTraceUniformValues, 156, 1),\n zSobolLogSPP: new Uint32Array(RayTraceUniformValues, 160, 1),\n sampleSequenceOffset: new Uint32Array(RayTraceUniformValues, 164, 1),\n // Shadow-catcher light table, relative to lightChoiceTexelOffset.\n shadowCatcherChoiceOffset: new Int32Array(RayTraceUniformValues, 168, 1),\n shadowCatcherChoiceCount: new Int32Array(RayTraceUniformValues, 172, 1),\n environmentRotation: new Float32Array(RayTraceUniformValues, 176, 16),\n backgroundMapTransform: new Float32Array(RayTraceUniformValues, 240, 4),\n backgroundMapRotation: new Float32Array(RayTraceUniformValues, 256, 16)\n };\n // Fixed runtime trip bounds discourage thin-film loop unrolling. Keep 4 for\n // 2 polarizations/substrates and 3 channels, independent of BSDF budgets.\n RayTraceUniformViews.loopUnrollGuard[0] = 4;\n RayTraceUniformViews.environmentRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapRotation.set([1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1]);\n RayTraceUniformViews.backgroundMapTransform.set([1,0,1,0]);\n RayTraceUniformViews.bevel[0] = 1;\n RayTraceUniformViews.dispersionWavelengths[0] = 3;\n return {\n buffer: RayTraceUniformValues,\n views: RayTraceUniformViews\n };\n}\nexport function packWgpuAnalyticLights(\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: number[],\n iesProfileTexelOffset: (index: number) => number | undefined\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n if (numLights > FIXED_LIGHT_COUNT) {\n console.warn(\n `Too many lights, only the first ${FIXED_LIGHT_COUNT} lights will be used.`\n );\n }\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3<T extends ReadonlyMathArray>(idx: number, v: T) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = read(v, i);\n }\n }\n\n const lightTypeConstants = {\n DirectionalLight: CONSTANT_DIRECTIONAL_LIGHT,\n SphereLight: CONSTANT_SPHERE_LIGHT,\n RectLight: CONSTANT_RECT_LIGHT,\n SpotLight: CONSTANT_SPOT_LIGHT\n };\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const matrix = matrixStorage(light.transform);\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n [matrix[12], matrix[13], matrix[14]]\n );\n data[off * 4 + 3] = lightTypeConstants[light.type];\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n if (light.type === 'RectLight') {\n data[(off + 1) * 4 + 3] = getRectLightArea(light);\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n } else if (light.type === 'SphereLight') {\n data[(off + 1) * 4 + 3] = getSphereLightArea(light);\n data[(off + 2) * 4 + 3] = light.radius;\n } else if (light.type === 'SpotLight') {\n data[(off + 1) * 4 + 3] = getSpotLightArea(light);\n packVec3(off + 2, getLightDirection(light));\n data[(off + 2) * 4 + 3] = light.radius;\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.cos((Math.min(light.innerAngle, light.outerAngle) * Math.PI) / 180),\n 0\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n }\n data[(off + 3) * 4 + 3] = light.type === 'SpotLight'\n ? iesProfileTexelOffset(i) ?? -1\n : texturesIndices[i] ?? -1;\n data[(off + 4) * 4] = selectionPmfs[i] ?? 0;\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n"]}
@@ -0,0 +1,15 @@
1
+ import { type RayTraceInputHooks } from './wgsl/rayTrace.compute.js';
2
+ export interface WGPUShaderFeatures {
3
+ hasDisplacement: boolean;
4
+ hasAlpha: boolean;
5
+ hasSceneAlpha: boolean;
6
+ hasAnisotropyDirections: boolean;
7
+ hasCoatNormals: boolean;
8
+ blasLayoutMask: number;
9
+ /** Environment presence changes background/MIS semantics independently of packed material data. */
10
+ dynamicEnvironment?: boolean;
11
+ }
12
+ export declare const WGPU_SHADER_DEFINE_KEYS: string[];
13
+ export declare function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>): string[];
14
+ export declare function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake?: boolean): string;
15
+ export declare function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake?: boolean, sceneIntersections?: string, pathDiagnostic?: boolean, inputHooks?: RayTraceInputHooks): string;
@@ -0,0 +1,31 @@
1
+ import rayTraceCompute from './wgsl/rayTrace.compute.js';
2
+ import { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';
3
+ import { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';
4
+ export const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];
5
+ const constantsNotUsed = [
6
+ ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',
7
+ 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',
8
+ 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'
9
+ ];
10
+ export function wgpuPipelineConstantKeys(constants) {
11
+ return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));
12
+ }
13
+ export function wgpuShaderPreamble(constants, bake = false) {
14
+ const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\n');
15
+ const keys = wgpuPipelineConstantKeys(constants);
16
+ const constantsCode = keys.map(key => {
17
+ const value = constants[key];
18
+ return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;
19
+ }).join('\n');
20
+ return `\n${defineCode}\n${constantsCode}\n`;
21
+ }
22
+ export function wgpuShaderSource(constants, features, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks) {
23
+ return wgpuShaderPreamble(constants, bake) + rayTraceCompute({
24
+ ...features,
25
+ spectral: bake ? Boolean(constants.SPECTRAL) : undefined,
26
+ sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,
27
+ materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,
28
+ lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined
29
+ }, sceneIntersections, pathDiagnostic, inputHooks);
30
+ }
31
+ //# sourceMappingURL=wgpuShaderSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wgpuShaderSource.js","sourceRoot":"","sources":["../../src/renderer/wgpuShaderSource.ts"],"names":[],"mappings":"AAAA,OAAO,eAA0C,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAYrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,oBAAoB,CAAC,CAAC;AAChH,MAAM,gBAAgB,GAAG;IACvB,GAAG,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,gBAAgB,EAAE,oBAAoB;IAC/E,yBAAyB,EAAE,GAAG,wBAAwB,EAAE,2BAA2B;IACnF,wBAAwB,EAAE,iBAAiB,EAAE,gBAAgB;CAC9D,CAAC;AACF,MAAM,UAAU,wBAAwB,CAAC,SAA2C;IAClF,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAChI,CAAC;AACD,MAAM,UAAU,kBAAkB,CAAC,SAA2C,EAAE,IAAI,GAAG,KAAK;IAC1F,MAAM,UAAU,GAAG,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtG,MAAM,IAAI,GAAG,wBAAwB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;QACnC,MAAM,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,IAAI,GAAG,MAAM,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,GAAG,CAAC;IAClI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACd,OAAO,KAAK,UAAU,KAAK,aAAa,IAAI,CAAC;AAC/C,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,SAA2C,EAAE,QAA4B,EAAE,IAAI,GAAG,KAAK,EAAE,kBAAkB,GAAG,EAAE,EAAE,cAAc,GAAG,KAAK,EAAE,UAA+B;IACxM,OAAO,kBAAkB,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,eAAe,CAAC;QAC3D,GAAG,QAAQ;QACX,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;QACxH,oBAAoB,EAAE,IAAI,IAAI,SAAS,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,SAAS;QACjI,iBAAiB,EAAE,IAAI,IAAI,SAAS,CAAC,kBAAkB,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,SAAS;KACzH,EAAE,kBAAkB,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import rayTraceCompute, {type RayTraceInputHooks} from './wgsl/rayTrace.compute.js';\nimport { WGPU_SCENE_FEATURE_BITS } from './WGPUSceneFeatures.js';\nimport { MATERIAL_TEXTURE_DEFINES } from './materialTextureSlots.js';\n\nexport interface WGPUShaderFeatures {\n hasDisplacement: boolean;\n hasAlpha: boolean;\n hasSceneAlpha: boolean;\n hasAnisotropyDirections: boolean;\n hasCoatNormals: boolean;\n blasLayoutMask: number;\n /** Environment presence changes background/MIS semantics independently of packed material data. */\n dynamicEnvironment?: boolean;\n}\nexport const WGPU_SHADER_DEFINE_KEYS = ['NUM_MAPS', 'TLAS_STACK_SIZE', 'BLAS_STACK_SIZE', 'NUM_UNIFORM_LIGHTS'];\nconst constantsNotUsed = [\n ...Object.keys(WGPU_SCENE_FEATURE_BITS), 'USE_BACKGROUND', 'USE_BACKGROUND_MAP',\n 'USE_GROUNDED_BACKGROUND', ...MATERIAL_TEXTURE_DEFINES, 'USE_ANISOTROPY_DIRECTIONS',\n 'USE_COAT_NORMAL_FRAMES', 'HAS_ALPHA_BLEND', 'HAS_ALPHA_MASK'\n];\nexport function wgpuPipelineConstantKeys(constants: Record<string, boolean | number>) {\n return Object.keys(constants).sort().filter(key => !WGPU_SHADER_DEFINE_KEYS.includes(key) && !constantsNotUsed.includes(key));\n}\nexport function wgpuShaderPreamble(constants: Record<string, boolean | number>, bake = false): string {\n const defineCode = WGPU_SHADER_DEFINE_KEYS.map(key => `const ${key} = ${constants[key]};`).join('\\n');\n const keys = wgpuPipelineConstantKeys(constants);\n const constantsCode = keys.map(key => {\n const value = constants[key];\n return `${bake ? 'const' : 'override'} ${key} = ${typeof value === 'boolean' ? (value ? 'true' : 'false') : value.toString()};`;\n }).join('\\n');\n return `\\n${defineCode}\\n${constantsCode}\\n`;\n}\nexport function wgpuShaderSource(constants: Record<string, boolean | number>, features: WGPUShaderFeatures, bake = false, sceneIntersections = '', pathDiagnostic = false, inputHooks?: RayTraceInputHooks): string {\n return wgpuShaderPreamble(constants, bake) + rayTraceCompute({\n ...features,\n spectral: bake ? Boolean(constants.SPECTRAL) : undefined,\n sceneCapabilities: bake && constants.SCENE_CAPABILITIES !== undefined ? Number(constants.SCENE_CAPABILITIES) : undefined,\n materialCapabilities: bake && constants.MATERIAL_CAPABILITIES !== undefined ? Number(constants.MATERIAL_CAPABILITIES) : undefined,\n lightCapabilities: bake && constants.LIGHT_CAPABILITIES !== undefined ? Number(constants.LIGHT_CAPABILITIES) : undefined\n }, sceneIntersections, pathDiagnostic, inputHooks);\n}\n"]}
@@ -0,0 +1 @@
1
+ export declare function aovDisplayShader(format: 'rgba16float' | 'rgba8unorm'): string;
@@ -0,0 +1,70 @@
1
+ // Independent of beauty composition and denoising; shared by WebGPU and native.
2
+ export function aovDisplayShader(format) {
3
+ return /* wgsl */ `
4
+ struct DisplayAovAccum { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }
5
+ struct DisplayAovCenter { identity: vec4u, motion: vec4f, }
6
+ struct DisplayAovParams { sizeKind: vec4u, mapping: vec4f, flags: vec4u, }
7
+ @group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;
8
+ @group(0) @binding(1) var<storage, read> center: array<DisplayAovCenter>;
9
+ @group(0) @binding(2) var image: texture_storage_2d<${format}, write>;
10
+ @group(0) @binding(3) var<uniform> params: DisplayAovParams;
11
+
12
+ fn tF(input: u32) -> u32 {
13
+ var v = input;
14
+ v = (v ^ (v >> 16u)) * 0x7feb352du;
15
+ v = (v ^ (v >> 15u)) * 0x846ca68bu;
16
+ return v ^ (v >> 16u);
17
+ }
18
+ fn tG(rgb: vec3f) -> vec3f {
19
+ return select(1.055 * pow(max(rgb, vec3f(0.0)), vec3f(1.0 / 2.4)) - 0.055,
20
+ 12.92 * rgb, rgb <= vec3f(0.0031308));
21
+ }
22
+ fn sE(rgb: vec3f) -> vec3f {
23
+ return select(pow((rgb + 0.055) / 1.055, vec3f(2.4)), rgb / 12.92,
24
+ rgb <= vec3f(0.04045));
25
+ }
26
+ @compute @workgroup_size(8, 8)
27
+ fn main(@builtin(global_invocation_id) id: vec3u) {
28
+ let size = params.sizeKind.xy;
29
+ if (any(id.xy >= size)) { return; }
30
+ let index = id.x + (size.y - 1u - id.y) * size.x;
31
+ let kind = params.sizeKind.w;
32
+ let pixel = accumulation[index];
33
+ let hit = pixel.position.w;
34
+ var color = vec3f(0.0);
35
+ var alpha = hit / f32(max(params.sizeKind.z, 1u));
36
+ let inv = 1.0 / max(hit, 1.0);
37
+ if (kind == 0u) {
38
+ color = vec3f(clamp((pixel.geometry.x * inv - params.mapping.x) /
39
+ (params.mapping.y - params.mapping.x), 0.0, 1.0));
40
+ } else if (kind == 1u) {
41
+ color = clamp(pixel.position.xyz * inv / params.mapping.z * 0.5 + 0.5,
42
+ vec3f(0.0), vec3f(1.0));
43
+ } else if (kind == 2u) {
44
+ color = clamp(pixel.geometry.yzw * inv, vec3f(0.0), vec3f(1.0));
45
+ } else if (kind == 3u || kind == 4u) {
46
+ let r = select(pixel.diffuse, pixel.specular, kind == 4u);
47
+ alpha = r.w / f32(max(params.sizeKind.z, 1u));
48
+ color = tG(clamp(r.xyz / max(r.w, 1.0), vec3f(0.0), vec3f(1.0)));
49
+ } else if (kind == 5u) {
50
+ let identity = center[index].identity;
51
+ alpha = select(1.0, 0.0, identity.x == 0xffffffffu);
52
+ let hash = tF(identity[params.flags.x]);
53
+ color = 0.2 + 0.8 * vec3f(f32(hash & 255u), f32((hash >> 8u) & 255u),
54
+ f32((hash >> 16u) & 255u)) / 255.0;
55
+ } else {
56
+ let m = center[index].motion;
57
+ alpha = select(0.0, 1.0, m.w == 3.0);
58
+ let gR = length(m.xy);
59
+ var hue = 0.0;
60
+ if (gR > 0.0) { hue = fract(atan2(m.y, m.x) / 6.28318530718 + 1.0); }
61
+ let p = abs(fract(vec3f(hue) + vec3f(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);
62
+ color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(gR / params.mapping.w, 0.0, 1.0);
63
+ }
64
+ if (alpha <= 0.0) { color = vec3f(0.0); }
65
+ if (params.flags.y != 0u) { color = sE(color); }
66
+ textureStore(image, vec2i(id.xy), vec4f(color, clamp(alpha, 0.0, 1.0)));
67
+ }
68
+ `;
69
+ }
70
+ //# sourceMappingURL=aovDisplay.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovDisplay.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovDisplay.wgsl.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,UAAU,gBAAgB,CAAC,MAAoC;IACnE,OAAO,UAAU,CAAC;;;;;;sDAMkC,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2D3D,CAAC;AACF,CAAC","sourcesContent":["// Independent of beauty composition and denoising; shared by WebGPU and native.\nexport function aovDisplayShader(format: 'rgba16float' | 'rgba8unorm') {\n return /* wgsl */ `\nstruct DisplayAovAccum { geometry: vec4f, position: vec4f, diffuse: vec4f, specular: vec4f, }\nstruct DisplayAovCenter { identity: vec4u, motion: vec4f, }\nstruct DisplayAovParams { sizeKind: vec4u, mapping: vec4f, flags: vec4u, }\n@group(0) @binding(0) var<storage, read> accumulation: array<DisplayAovAccum>;\n@group(0) @binding(1) var<storage, read> center: array<DisplayAovCenter>;\n@group(0) @binding(2) var image: texture_storage_2d<${format}, write>;\n@group(0) @binding(3) var<uniform> params: DisplayAovParams;\n\nfn displayAovHash(input: u32) -> u32 {\n var v = input;\n v = (v ^ (v >> 16u)) * 0x7feb352du;\n v = (v ^ (v >> 15u)) * 0x846ca68bu;\n return v ^ (v >> 16u);\n}\nfn displayAovSrgb(rgb: vec3f) -> vec3f {\n return select(1.055 * pow(max(rgb, vec3f(0.0)), vec3f(1.0 / 2.4)) - 0.055,\n 12.92 * rgb, rgb <= vec3f(0.0031308));\n}\nfn displayAovLinear(rgb: vec3f) -> vec3f {\n return select(pow((rgb + 0.055) / 1.055, vec3f(2.4)), rgb / 12.92,\n rgb <= vec3f(0.04045));\n}\n@compute @workgroup_size(8, 8)\nfn main(@builtin(global_invocation_id) id: vec3u) {\n let size = params.sizeKind.xy;\n if (any(id.xy >= size)) { return; }\n let index = id.x + (size.y - 1u - id.y) * size.x;\n let kind = params.sizeKind.w;\n let pixel = accumulation[index];\n let hit = pixel.position.w;\n var color = vec3f(0.0);\n var alpha = hit / f32(max(params.sizeKind.z, 1u));\n let inv = 1.0 / max(hit, 1.0);\n if (kind == 0u) {\n color = vec3f(clamp((pixel.geometry.x * inv - params.mapping.x) /\n (params.mapping.y - params.mapping.x), 0.0, 1.0));\n } else if (kind == 1u) {\n color = clamp(pixel.position.xyz * inv / params.mapping.z * 0.5 + 0.5,\n vec3f(0.0), vec3f(1.0));\n } else if (kind == 2u) {\n color = clamp(pixel.geometry.yzw * inv, vec3f(0.0), vec3f(1.0));\n } else if (kind == 3u || kind == 4u) {\n let r = select(pixel.diffuse, pixel.specular, kind == 4u);\n alpha = r.w / f32(max(params.sizeKind.z, 1u));\n color = displayAovSrgb(clamp(r.xyz / max(r.w, 1.0), vec3f(0.0), vec3f(1.0)));\n } else if (kind == 5u) {\n let identity = center[index].identity;\n alpha = select(1.0, 0.0, identity.x == 0xffffffffu);\n let hash = displayAovHash(identity[params.flags.x]);\n color = 0.2 + 0.8 * vec3f(f32(hash & 255u), f32((hash >> 8u) & 255u),\n f32((hash >> 16u) & 255u)) / 255.0;\n } else {\n let m = center[index].motion;\n alpha = select(0.0, 1.0, m.w == 3.0);\n let magnitude = length(m.xy);\n var hue = 0.0;\n if (magnitude > 0.0) { hue = fract(atan2(m.y, m.x) / 6.28318530718 + 1.0); }\n let p = abs(fract(vec3f(hue) + vec3f(0.0, 2.0 / 3.0, 1.0 / 3.0)) * 6.0 - 3.0);\n color = clamp(p - 1.0, vec3f(0.0), vec3f(1.0)) * clamp(magnitude / params.mapping.w, 0.0, 1.0);\n }\n if (alpha <= 0.0) { color = vec3f(0.0); }\n if (params.flags.y != 0u) { color = displayAovLinear(color); }\n textureStore(image, vec2i(id.xy), vec4f(color, clamp(alpha, 0.0, 1.0)));\n}\n`;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: string;
2
+ export default _default;
@@ -0,0 +1,98 @@
1
+ import proposals from './aovReflectanceSamples.wgsl.js';
2
+ // Directional-hemispherical quadrature of the supported unlayered OpenPBR
3
+ // reflection lobes. Keep the original 256 cosine/VNDF proposals and weights;
4
+ // evaluate diffuse and reflection together without traversing the full layered
5
+ // BSDF twice. Callers reject coat, fuzz, anisotropy, SSS and thin film first.
6
+ export default proposals + /* wgsl */ `
7
+ struct oa {
8
+ diffuse: vec3f,
9
+ specular: vec3f,
10
+ }
11
+ fn hN(prepared: ag, qQ: bool, kY: bool) -> oa {
12
+ var result = oa();
13
+ let view = prepared.viewLocal;
14
+ if (view.z <= 1e-6) { return result; }
15
+ let material = prepared.material;
16
+ let alpha = vec2f(material.alphaX, material.alphaY);
17
+ let mg = aF(view, alpha);
18
+ let jl = prepared.weights[OPENPBR_LOBE_DIFFUSE];
19
+ let gb = prepared.weights[OPENPBR_LOBE_METAL];
20
+ let specularWeight = prepared.weights[OPENPBR_LOBE_SPECULAR];
21
+ var ei = 1.0;
22
+ if (kY && prepared.dielectricMsProbability > 0.0) {
23
+ ei = max(bf(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);
24
+ }
25
+ let cr = normalize(vec3f(alpha, 1.0) * view);
26
+ let qP = min(cr.z, 1.0);
27
+ let kh = 1.0 + qP;
28
+ let count = 256u * min(rtUniform.loopUnrollGuard, 4u) / 4u;
29
+ for (var i = 0u; i < count; i++) {
30
+ let vV = i / 2u;
31
+ let u = vec2f((f32(vV) + 0.5) / f32(count / 2u),
32
+ fract(f32(reverseBits(vV)) * 2.3283064365386963e-10 + 0.37));
33
+ let kK = hp[vV];
34
+
35
+
36
+ let hO = prepared.specularAlpha < 0.001 || count != 256u;
37
+ var light = vec3f(kK.xy, sqrt(max(0.0, 1.0 - dot(kK.xy, kK.xy))));
38
+ if (hO) { light = aO(u); }
39
+ if ((i & 1u) != 0u) {
40
+ let kC = (1.0 - u.y) * kh;
41
+ let ex = sqrt(max(0.0, (kC + (1.0 - qP)) * (u.y * kh)));
42
+ var half = normalize(vec3f(alpha, 1.0) * vec3f(cr.xy + ex * kK.zw, kC));
43
+ if (hO) { half = aD(view, alpha, u); }
44
+ light = reflect(-view, half);
45
+ }
46
+
47
+ if (light.z <= 0.0) { continue; }
48
+ let half = normalize(view + light);
49
+ let qH = mg * cW(half, alpha) / (4.0 * view.z);
50
+ let pdf = 0.5 * (light.z * INVPI + qH);
51
+
52
+
53
+ let aA = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));
54
+ if (aA.z <= 0.0) { continue; }
55
+ let scale = abs(aA.z) / (pdf * f32(count));
56
+ if (qQ && jl > 0.0) {
57
+ let compensation = prepared.diffuseSpecularEnergyCompensation * aw(
58
+ prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(aA.z));
59
+ var sZ = 0.0;
60
+ result.diffuse += jl * bJ(material, prepared.diffuseColor,
61
+ view, aA, compensation, &sZ) * scale;
62
+ }
63
+ if (kY) {
64
+ let jn = normalize(view + aA);
65
+ let bm = abs(dot(view, jn));
66
+ var bG = vec3f(0.0);
67
+ if (specularWeight > 0.0) {
68
+ var dielectric = vec3f(af(bm, material.relativeIor));
69
+ if (material.thinWalled) { dielectric = av(dielectric, material.transmissionWeight); }
70
+ bG += specularWeight * material.specularColor * dielectric;
71
+ }
72
+ if (gb > 0.0) {
73
+ bG += gb * material.specularWeight * cw(bm,
74
+ material.baseWeight * material.baseColor, material.specularColor);
75
+ }
76
+ let rJ = cW(jn, alpha) * mg
77
+ * aF(aA, alpha) / (4.0 * max(aA.z * view.z, 1e-8));
78
+ var reflection = bG * rJ;
79
+ if (gb > 0.0 && prepared.metalMsFactor > 0.0) {
80
+ let cL = min(prepared.metalMsFactor * aV(prepared.specularAlpha, aA.z), 1.0 / max(aA.z, 1e-8));
81
+ reflection += gb * prepared.metalMsScale * cL * INVPI;
82
+ }
83
+ if (prepared.dielectricMsProbability > 0.0) {
84
+ let oZ = prepared.dielectricMsViewLoss * bb(
85
+ prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(aA.z)) / ei;
86
+ let cL = min(oZ * prepared.dielectricMsReflectionRatio, 1.0 / abs(aA.z));
87
+ reflection += prepared.dielectricMsReflectionScale * cL * INVPI;
88
+ }
89
+ result.specular += reflection * scale;
90
+ }
91
+ }
92
+ return result;
93
+ }
94
+ fn vT(prepared: ag) -> oa {
95
+ return hN(prepared, true, true);
96
+ }
97
+ `;
98
+ //# sourceMappingURL=aovReflectance.wgsl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aovReflectance.wgsl.js","sourceRoot":"","sources":["../../../src/renderer/wgsl/aovReflectance.wgsl.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,iCAAiC,CAAC;AAExD,0EAA0E;AAC1E,6EAA6E;AAC7E,+EAA+E;AAC/E,8EAA8E;AAC9E,eAAe,SAAS,GAAG,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2FrC,CAAC","sourcesContent":["import proposals from './aovReflectanceSamples.wgsl.js';\n\n// Directional-hemispherical quadrature of the supported unlayered OpenPBR\n// reflection lobes. Keep the original 256 cosine/VNDF proposals and weights;\n// evaluate diffuse and reflection together without traversing the full layered\n// BSDF twice. Callers reject coat, fuzz, anisotropy, SSS and thin film first.\nexport default proposals + /* wgsl */ `\nstruct MtReflectance {\n diffuse: vec3f,\n specular: vec3f,\n}\nfn mtFrameReflectanceComponents(prepared: OpenPbrPreparedBsdf, wantDiffuse: bool, wantSpecular: bool) -> MtReflectance {\n var result = MtReflectance();\n let view = prepared.viewLocal;\n if (view.z <= 1e-6) { return result; }\n let material = prepared.material;\n let alpha = vec2f(material.alphaX, material.alphaY);\n let viewMasking = sampling_ggx_smith_g1(view, alpha);\n let diffuseWeight = prepared.weights[OPENPBR_LOBE_DIFFUSE];\n let metalWeight = prepared.weights[OPENPBR_LOBE_METAL];\n let specularWeight = prepared.weights[OPENPBR_LOBE_SPECULAR];\n var dielectricAverageLoss = 1.0;\n if (wantSpecular && prepared.dielectricMsProbability > 0.0) {\n dielectricAverageLoss = max(openpbr_ideal_dielectric_average_loss(prepared.refractionEtaTOverEtaI, prepared.specularAlpha), 1e-12);\n }\n let sphericalView = normalize(vec3f(alpha, 1.0) * view);\n let viewZ = min(sphericalView.z, 1.0);\n let capSpan = 1.0 + viewZ;\n let count = 256u * min(rtUniform.loopUnrollGuard, 4u) / 4u;\n for (var i = 0u; i < count; i++) {\n let pair = i / 2u;\n let u = vec2f((f32(pair) + 0.5) / f32(count / 2u),\n fract(f32(reverseBits(pair)) * 2.3283064365386963e-10 + 0.37));\n let proposal = mtReflectanceProposals[pair];\n // Retain runtime proposals near delta lobes: tiny device-specific sin/cos\n // rounding differences can otherwise be magnified by their narrow PDFs.\n let runtimeProposal = prepared.specularAlpha < 0.001 || count != 256u;\n var light = vec3f(proposal.xy, sqrt(max(0.0, 1.0 - dot(proposal.xy, proposal.xy))));\n if (runtimeProposal) { light = sampling_cosine_hemisphere(u); }\n if ((i & 1u) != 0u) {\n let normalZ = (1.0 - u.y) * capSpan;\n let radial = sqrt(max(0.0, (normalZ + (1.0 - viewZ)) * (u.y * capSpan)));\n var half = normalize(vec3f(alpha, 1.0) * vec3f(sphericalView.xy + radial * proposal.zw, normalZ));\n if (runtimeProposal) { half = sampling_ggx_visible_normal(view, alpha, u); }\n light = reflect(-view, half);\n }\n // Rejected VNDF proposals retain their weight in the denominator.\n if (light.z <= 0.0) { continue; }\n let half = normalize(view + light);\n let specularPdf = viewMasking * sampling_ggx_ndf(half, alpha) / (4.0 * view.z);\n let pdf = 0.5 * (light.z * INVPI + specularPdf);\n // Preserve the production evaluator's frame round trip, including FP32\n // rounding near narrow highlights. Proposal PDFs use the original light.\n let evaluatedLight = openpbr_to_local(prepared.basis, openpbr_to_world(prepared.basis, light));\n if (evaluatedLight.z <= 0.0) { continue; }\n let scale = abs(evaluatedLight.z) / (pdf * f32(count));\n if (wantDiffuse && diffuseWeight > 0.0) {\n let compensation = prepared.diffuseSpecularEnergyCompensation * openpbr_opaque_energy_complement(\n prepared.specularEtaTOverEtaI, prepared.specularAlpha, abs(evaluatedLight.z));\n var unusedPdf = 0.0;\n result.diffuse += diffuseWeight * openpbr_eval_diffuse(material, prepared.diffuseColor,\n view, evaluatedLight, compensation, &unusedPdf) * scale;\n }\n if (wantSpecular) {\n let evaluatedHalf = normalize(view + evaluatedLight);\n let viewHalf = abs(dot(view, evaluatedHalf));\n var fresnel = vec3f(0.0);\n if (specularWeight > 0.0) {\n var dielectric = vec3f(openpbr_dielectric_fresnel(viewHalf, material.relativeIor));\n if (material.thinWalled) { dielectric = openpbr_thin_wall_reflection_coefficient(dielectric, material.transmissionWeight); }\n fresnel += specularWeight * material.specularColor * dielectric;\n }\n if (metalWeight > 0.0) {\n fresnel += metalWeight * material.specularWeight * openpbr_metal_fresnel(viewHalf,\n material.baseWeight * material.baseColor, material.specularColor);\n }\n let microfacet = sampling_ggx_ndf(evaluatedHalf, alpha) * viewMasking\n * sampling_ggx_smith_g1(evaluatedLight, alpha) / (4.0 * max(evaluatedLight.z * view.z, 1e-8));\n var reflection = fresnel * microfacet;\n if (metalWeight > 0.0 && prepared.metalMsFactor > 0.0) {\n let factor = min(prepared.metalMsFactor * openpbr_metal_energy_complement(prepared.specularAlpha, evaluatedLight.z), 1.0 / max(evaluatedLight.z, 1e-8));\n reflection += metalWeight * prepared.metalMsScale * factor * INVPI;\n }\n if (prepared.dielectricMsProbability > 0.0) {\n let factors = prepared.dielectricMsViewLoss * openpbr_ideal_dielectric_loss(\n prepared.refractionEtaTOverEtaI, prepared.specularAlpha, abs(evaluatedLight.z)) / dielectricAverageLoss;\n let factor = min(factors * prepared.dielectricMsReflectionRatio, 1.0 / abs(evaluatedLight.z));\n reflection += prepared.dielectricMsReflectionScale * factor * INVPI;\n }\n result.specular += reflection * scale;\n }\n }\n return result;\n}\nfn mtFrameReflectance(prepared: OpenPbrPreparedBsdf) -> MtReflectance {\n return mtFrameReflectanceComponents(prepared, true, true);\n}\n`;\n"]}
@@ -0,0 +1,2 @@
1
+ declare const _default: "\nconst mtReflectanceProposals: array<vec4f, 128> = array<vec4f, 128>(\n vec4f(-0.971247852, -0.202764958, 0.999698818, 0.0245412290),\n vec4f(-0.808660269, 0.547487736, 0.997290432, 0.0735645667),\n vec4f(-0.942509234, 0.187289074, 0.992479563, 0.122410677),\n vec4f(-0.763038993, -0.558020830, 0.985277653, 0.170961902),\n vec4f(-0.929654300, -0.00785388052, 0.975702107, 0.219101235),\n vec4f(-0.656618595, 0.740912974, 0.963776052, 0.266712785),\n vec4f(-0.817265987, 0.373183846, 0.949528158, 0.313681751),\n vec4f(-0.793490529, -0.386950523, 0.932992816, 0.359895051),\n vec4f(-0.860713601, -0.105764769, 0.914209723, 0.405241340),\n vec4f(-0.604139447, 0.619064212, 0.893224299, 0.449611336),\n vec4f(-0.787263036, 0.281084418, 0.870086968, 0.492898226),\n vec4f(-0.673318744, -0.468566477, 0.844853580, 0.534997642),\n vec4f(-0.799623907, 0.0901312605, 0.817584813, 0.575808227),\n vec4f(-0.570307195, -0.676738262, 0.788346410, 0.615231633),\n vec4f(-0.627450705, 0.452229142, 0.757208824, 0.653172851),\n vec4f(-0.698281944, -0.294418186, 0.724247098, 0.689540565),\n vec4f(-0.726036906, -0.153989345, 0.689540505, 0.724247098),\n vec4f(-0.523753047, 0.608020604, 0.653172791, 0.757208884),\n vec4f(-0.671607554, 0.233185455, 0.615231574, 0.788346410),\n vec4f(-0.491990626, -0.494420350, 0.575808167, 0.817584813),\n vec4f(-0.678437173, 0.0412081257, 0.534997642, 0.844853580),\n vec4f(-0.495611340, -0.807542920, 0.492898196, 0.870086968),\n vec4f(-0.508582473, 0.402262419, 0.449611306, 0.893224299),\n vec4f(-0.537693322, -0.333672792, 0.405241281, 0.914209783),\n vec4f(-0.614562631, -0.0568606183, 0.359894961, 0.932992816),\n vec4f(-0.452296555, 0.809743226, 0.313681662, 0.949528217),\n vec4f(-0.492342144, 0.317682207, 0.266712755, 0.963776052),\n vec4f(-0.403601944, -0.406031638, 0.219101220, 0.975702107),\n vec4f(-0.537260950, 0.137945175, 0.170961857, 0.985277653),\n vec4f(-0.404928178, -0.715918541, 0.122410625, 0.992479563),\n vec4f(-0.386338592, 0.556550741, 0.0735644922, 0.997290432),\n vec4f(-0.445942074, -0.242918074, 0.0245411359, 0.999698818),\n vec4f(-0.459759980, -0.175696611, -0.0245412234, 0.999698818),\n vec4f(-0.359771132, 0.682195961, -0.0735645741, 0.997290432),\n vec4f(-0.412575692, 0.205535084, -0.122410707, 0.992479503),\n vec4f(-0.336475104, -0.646421731, -0.170961946, 0.985277653),\n vec4f(-0.429363400, 0.0166855231, -0.219101310, 0.975702107),\n vec4f(-0.319253087, -0.925218344, -0.266712844, 0.963776052),\n vec4f(-0.294470191, 0.430103362, -0.313681722, 0.949528158),\n vec4f(-0.281283021, -0.387403429, -0.359895051, 0.932992816),\n vec4f(-0.358183086, -0.0808178857, -0.405241340, 0.914209723),\n vec4f(-0.271769434, 0.854052365, -0.449611366, 0.893224299),\n vec4f(-0.244775921, 0.311606824, -0.492898166, 0.870087028),\n vec4f(-0.244355842, -0.552090824, -0.534997702, 0.844853520),\n vec4f(-0.283291280, 0.112162955, -0.575808167, 0.817584813),\n vec4f(-0.224362880, -0.823741674, -0.615231693, 0.788346350),\n vec4f(-0.210826442, 0.610893846, -0.653172851, 0.757208824),\n vec4f(-0.191608176, -0.297364026, -0.689540684, 0.724246979),\n vec4f(-0.207833603, -0.124338157, -0.724247158, 0.689540505),\n vec4f(-0.176593989, 0.814833522, -0.757208824, 0.653172851),\n vec4f(-0.158949688, 0.293469012, -0.788346469, 0.615231514),\n vec4f(-0.152046368, -0.648668587, -0.817584813, 0.575808167),\n vec4f(-0.167782038, 0.0643178672, -0.844853640, 0.534997463),\n vec4f(-0.128430068, -0.907204390, -0.870087028, 0.492898136),\n vec4f(-0.115809105, 0.572147131, -0.893224299, 0.449611366),\n vec4f(-0.103222348, -0.403248310, -0.914209783, 0.405241221),\n vec4f(-0.112737618, -0.0319865458, -0.932992816, 0.359895051),\n vec4f(-0.0796749964, 0.955433667, -0.949528217, 0.313681602),\n vec4f(-0.0672519580, 0.453793734, -0.963776052, 0.266712725),\n vec4f(-0.0551275201, -0.538435221, -0.975702167, 0.219101071),\n vec4f(-0.0426490456, 0.204346836, -0.985277653, 0.170961812),\n vec4f(-0.0306719355, -0.790655255, -0.992479503, 0.122410700),\n vec4f(-0.0184057076, 0.708510995, -0.997290492, 0.0735644475),\n vec4f(-0.00613544276, -0.291185349, -0.999698818, 0.0245412104),\n vec4f(0.00613530306, -0.244297966, -0.999698818, -0.0245413855),\n vec4f(0.0184059385, 0.755400777, -0.997290432, -0.0735646188),\n vec4f(0.0306059923, 0.253786176, -0.992479503, -0.122410871),\n vec4f(0.0429276451, -0.743136168, -0.985277653, -0.170961991),\n vec4f(0.0701737553, 0.00441496586, -0.975702107, -0.219101235),\n vec4f(0.0674433559, -0.992085159, -0.963776052, -0.266712904),\n vec4f(0.0794365108, 0.499346048, -0.949528158, -0.313681781),\n vec4f(0.0915081054, -0.485832185, -0.932992756, -0.359895200),\n vec4f(0.101071075, -0.0861614645, -0.914209723, -0.405241400),\n vec4f(0.116242222, 0.872919321, -0.893224180, -0.449611515),\n vec4f(0.126407236, 0.359021723, -0.870086908, -0.492898285),\n vec4f(0.139908314, -0.603366435, -0.844853580, -0.534997642),\n vec4f(0.168981716, 0.0979395211, -0.817584693, -0.575808346),\n vec4f(0.164669126, -0.853637457, -0.788346410, -0.615231633),\n vec4f(0.175589874, 0.605686426, -0.757208705, -0.653172970),\n vec4f(0.181917489, -0.321471483, -0.724247038, -0.689540625),\n vec4f(0.219242185, -0.135647133, -0.689540565, -0.724247098),\n vec4f(0.212299466, 0.790099680, -0.653172910, -0.757208765),\n vec4f(0.208243251, 0.240495890, -0.615231574, -0.788346469),\n vec4f(0.234419063, -0.640313387, -0.575808048, -0.817584932),\n vec4f(0.315854102, 0.0532567836, -0.534997344, -0.844853759),\n vec4f(0.260333687, -0.894772291, -0.492898196, -0.870086968),\n vec4f(0.265374005, 0.502337217, -0.449611217, -0.893224359),\n vec4f(0.267429054, -0.339113116, -0.405241072, -0.914209843),\n vec4f(0.380209267, -0.0445682108, -0.359895110, -0.932992756),\n vec4f(0.307221651, 0.891683638, -0.313681692, -0.949528217),\n vec4f(0.296788067, 0.329054117, -0.266712576, -0.963776112),\n vec4f(0.317195147, -0.457708418, -0.219100907, -0.975702226),\n vec4f(0.419729054, 0.148764044, -0.170961887, -0.985277653),\n vec4f(0.349995196, -0.727014899, -0.122410536, -0.992479563),\n vec4f(0.356363803, 0.594497383, -0.0735642835, -0.997290492),\n vec4f(0.434345096, -0.231501341, -0.0245412868, -0.999698818),\n vec4f(0.480473697, -0.164373189, 0.0245413091, -0.999698818),\n vec4f(0.392657876, 0.681903303, 0.0735647827, -0.997290432),\n vec4f(0.492657542, 0.218807966, 0.122411035, -0.992479503),\n vec4f(0.409054011, -0.584142148, 0.170961916, -0.985277653),\n vec4f(0.569577277, 0.0289491210, 0.219101399, -0.975702107),\n vec4f(0.442882210, -0.855257273, 0.266713053, -0.963775992),\n vec4f(0.459734946, 0.387970626, 0.313681692, -0.949528217),\n vec4f(0.513070345, -0.343044043, 0.359895140, -0.932992756),\n vec4f(0.629031241, -0.0690753013, 0.405241549, -0.914209664),\n vec4f(0.483215511, 0.773316741, 0.449611664, -0.893224120),\n vec4f(0.586818159, 0.310843110, 0.492898226, -0.870086968),\n vec4f(0.528679490, -0.427168757, 0.534997761, -0.844853461),\n vec4f(0.683721542, 0.126429096, 0.575808465, -0.817584634),\n vec4f(0.517971814, -0.658907175, 0.615231574, -0.788346410),\n vec4f(0.548397303, 0.476606160, 0.653172910, -0.757208765),\n vec4f(0.695181608, -0.259932309, 0.689540744, -0.724246919),\n vec4f(0.748597383, -0.117820688, 0.724247038, -0.689540625),\n vec4f(0.556980729, 0.641256869, 0.757208884, -0.653172791),\n vec4f(0.741829991, 0.268901259, 0.788346529, -0.615231454),\n vec4f(0.647817433, -0.477341115, 0.817584991, -0.575807929),\n vec4f(0.816602290, 0.0779312477, 0.844853580, -0.534997642),\n vec4f(0.599919200, -0.671730816, 0.870087087, -0.492898077),\n vec4f(0.724726558, 0.447135508, 0.893224418, -0.449611068),\n vec4f(0.810727239, -0.307791352, 0.914209723, -0.405241370),\n vec4f(0.882583082, -0.0201240778, 0.932992816, -0.359894961),\n vec4f(0.645550549, 0.729843259, 0.949528277, -0.313681543),\n vec4f(0.839177251, 0.362342149, 0.963776171, -0.266712397),\n vec4f(0.839526892, -0.399391353, 0.975702107, -0.219101220),\n vec4f(0.928934336, 0.175204813, 0.985277653, -0.170961723),\n vec4f(0.774228692, -0.569184363, 0.992479563, -0.122410372),\n vec4f(0.815476179, 0.537282884, 0.997290432, -0.0735645965),\n vec4f(0.968665719, -0.214761987, 0.999698818, -0.0245411228)\n);\n";
2
+ export default _default;