@meimu/mutracer 0.2.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (372) hide show
  1. package/CHANGELOG.md +222 -0
  2. package/LICENSES/FidelityFX-FSR.txt +19 -0
  3. package/LICENSES/pbrt-v4-Apache-2.0.txt +202 -0
  4. package/README.md +3 -0
  5. package/THIRD_PARTY_NOTICES.md +18 -4
  6. package/dist/assets/bvh.worker.js +1 -1
  7. package/dist/mutracer.umd.js +9328 -7614
  8. package/docs/api.md +83 -35
  9. package/docs/caustics.md +80 -0
  10. package/docs/materials.md +9 -6
  11. package/docs/performance.md +7 -0
  12. package/docs/post-processing.md +62 -9
  13. package/docs/progressive-rendering.md +53 -9
  14. package/docs/sampling.md +4 -0
  15. package/docs/technical/acceleration.md +52 -0
  16. package/docs/technical/aovs.md +79 -0
  17. package/docs/technical/caustics.md +109 -0
  18. package/docs/technical/continuous-spectrum.md +122 -0
  19. package/docs/technical/display-upscale.md +82 -0
  20. package/docs/technical/openpbr.md +99 -0
  21. package/docs/technical/pbrt-import.md +168 -0
  22. package/docs/technical/tiling.md +74 -0
  23. package/docs/technical/webgl.md +53 -0
  24. package/docs/updates.md +3 -1
  25. package/docs/viewer-checklist.md +65 -0
  26. package/docs/viewer.md +18 -6
  27. package/lib/Display.d.ts +19 -5
  28. package/lib/Display.js +10 -7
  29. package/lib/Display.js.map +1 -1
  30. package/lib/Engine.d.ts +4 -1
  31. package/lib/Engine.js +77 -14
  32. package/lib/Engine.js.map +1 -1
  33. package/lib/Render.d.ts +81 -24
  34. package/lib/Render.js +201 -26
  35. package/lib/Render.js.map +1 -1
  36. package/lib/RenderLoop.d.ts +7 -3
  37. package/lib/RenderLoop.js +68 -44
  38. package/lib/RenderLoop.js.map +1 -1
  39. package/lib/main.d.ts +4 -2
  40. package/lib/main.js +1 -0
  41. package/lib/main.js.map +1 -1
  42. package/lib/oidn.d.ts +1 -1
  43. package/lib/renderer/AovPrimitiveCache.js +39 -8
  44. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  45. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  46. package/lib/renderer/DisplayPostProcess.js +51 -18
  47. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  48. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  49. package/lib/renderer/GPUTraceQueue.js +3 -1
  50. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  51. package/lib/renderer/MaterialData.js +7 -2
  52. package/lib/renderer/MaterialData.js.map +1 -1
  53. package/lib/renderer/RenderingPipeline.d.ts +11 -1
  54. package/lib/renderer/RenderingPipeline.js.map +1 -1
  55. package/lib/renderer/TileRender.d.ts +2 -2
  56. package/lib/renderer/TileRender.js +128 -7
  57. package/lib/renderer/TileRender.js.map +1 -1
  58. package/lib/renderer/WGPUAov.d.ts +6 -1
  59. package/lib/renderer/WGPUAov.js +108 -14
  60. package/lib/renderer/WGPUAov.js.map +1 -1
  61. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  62. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  63. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  64. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  65. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  66. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  67. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  68. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  69. package/lib/renderer/WGPUPhotonMap.js +191 -0
  70. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  71. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  72. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  73. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  74. package/lib/renderer/WGPURayTracePass.d.ts +65 -21
  75. package/lib/renderer/WGPURayTracePass.js +730 -409
  76. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  77. package/lib/renderer/WGPURenderingPipeline.js +110 -68
  78. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  79. package/lib/renderer/WebGLAov.js +3 -3
  80. package/lib/renderer/WebGLAov.js.map +1 -1
  81. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  82. package/lib/renderer/WebGLFullQuadPass.js +10 -0
  83. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  84. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  85. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  86. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  87. package/lib/renderer/WebGLRayTracePass.d.ts +20 -11
  88. package/lib/renderer/WebGLRayTracePass.js +157 -116
  89. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  90. package/lib/renderer/WebGLRenderingPipeline.js +17 -14
  91. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  92. package/lib/renderer/WebGLSkyBaker.js +60 -60
  93. package/lib/renderer/accumulationTarget.d.ts +2 -1
  94. package/lib/renderer/accumulationTarget.js.map +1 -1
  95. package/lib/renderer/aov.d.ts +13 -1
  96. package/lib/renderer/aov.js +21 -2
  97. package/lib/renderer/aov.js.map +1 -1
  98. package/lib/renderer/aovDisplay.js +2 -2
  99. package/lib/renderer/aovDisplay.js.map +1 -1
  100. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  101. package/lib/renderer/binnedSahBvh.js +24 -17
  102. package/lib/renderer/binnedSahBvh.js.map +1 -1
  103. package/lib/renderer/bvhAccel.d.ts +3 -1
  104. package/lib/renderer/bvhAccel.js +36 -6
  105. package/lib/renderer/bvhAccel.js.map +1 -1
  106. package/lib/renderer/cameraUniform.d.ts +1 -1
  107. package/lib/renderer/cameraUniform.js +6 -2
  108. package/lib/renderer/cameraUniform.js.map +1 -1
  109. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  110. package/lib/renderer/causticDiagnostics.js +5 -0
  111. package/lib/renderer/causticDiagnostics.js.map +1 -0
  112. package/lib/renderer/causticEmission.d.ts +10 -0
  113. package/lib/renderer/causticEmission.js +40 -0
  114. package/lib/renderer/causticEmission.js.map +1 -0
  115. package/lib/renderer/causticUniform.d.ts +12 -0
  116. package/lib/renderer/causticUniform.js +22 -0
  117. package/lib/renderer/causticUniform.js.map +1 -0
  118. package/lib/renderer/caustics.d.ts +16 -0
  119. package/lib/renderer/caustics.js +93 -0
  120. package/lib/renderer/caustics.js.map +1 -0
  121. package/lib/renderer/compactVertices.d.ts +14 -0
  122. package/lib/renderer/compactVertices.js +124 -0
  123. package/lib/renderer/compactVertices.js.map +1 -0
  124. package/lib/renderer/easu.d.ts +11 -0
  125. package/lib/renderer/easu.js +156 -0
  126. package/lib/renderer/easu.js.map +1 -0
  127. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  128. package/lib/renderer/geometryUpdateState.js.map +1 -1
  129. package/lib/renderer/geometryUpdates.js +3 -2
  130. package/lib/renderer/geometryUpdates.js.map +1 -1
  131. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  132. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  133. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  134. package/lib/renderer/glsl/aovTrace.frag.js +45 -37
  135. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  136. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  137. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  138. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  139. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  140. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  141. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  142. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  143. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  144. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  145. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  146. package/lib/renderer/glsl/chunks/intersect.glsl.js +478 -465
  147. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  148. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  149. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  150. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  151. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  152. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  153. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  154. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  155. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +70 -63
  156. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  157. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +89 -75
  158. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  159. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  160. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +160 -118
  161. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  162. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  163. package/lib/renderer/glsl/chunks/sampling.glsl.js +88 -91
  164. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  165. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  166. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  167. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  168. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  169. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  170. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  171. package/lib/renderer/glsl/depthQuery.frag.js +13 -7
  172. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  173. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  174. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  175. package/lib/renderer/glsl/rayTrace.frag.js +338 -252
  176. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  177. package/lib/renderer/glsl/shadowCatcher.frag.js +27 -26
  178. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  179. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  180. package/lib/renderer/gpuMemory.js +1 -1
  181. package/lib/renderer/gpuMemory.js.map +1 -1
  182. package/lib/renderer/lightSampling.d.ts +3 -2
  183. package/lib/renderer/lightSampling.js +14 -8
  184. package/lib/renderer/lightSampling.js.map +1 -1
  185. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  186. package/lib/renderer/openPbrEnergyLut.js +18 -1
  187. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  188. package/lib/renderer/pathLimits.d.ts +5 -4
  189. package/lib/renderer/pathLimits.js +6 -5
  190. package/lib/renderer/pathLimits.js.map +1 -1
  191. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  192. package/lib/renderer/prepareMeshBVH.js +5 -3
  193. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  194. package/lib/renderer/progressiveScheduler.js +5 -4
  195. package/lib/renderer/progressiveScheduler.js.map +1 -1
  196. package/lib/renderer/renderPipeline.d.ts +5 -0
  197. package/lib/renderer/renderPipeline.js +1 -0
  198. package/lib/renderer/renderPipeline.js.map +1 -1
  199. package/lib/renderer/researchTransport.d.ts +31 -0
  200. package/lib/renderer/researchTransport.js +5 -0
  201. package/lib/renderer/researchTransport.js.map +1 -0
  202. package/lib/renderer/sceneAssembly.d.ts +1 -1
  203. package/lib/renderer/sceneAssembly.js +4 -3
  204. package/lib/renderer/sceneAssembly.js.map +1 -1
  205. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  206. package/lib/renderer/sceneChangeDetector.js +3 -1
  207. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  208. package/lib/renderer/sceneLayoutSchema.d.ts +2 -0
  209. package/lib/renderer/sceneLayoutSchema.js +3 -3
  210. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  211. package/lib/renderer/scenePreparation.d.ts +3 -2
  212. package/lib/renderer/scenePreparation.js +18 -2
  213. package/lib/renderer/scenePreparation.js.map +1 -1
  214. package/lib/renderer/scratchSampling.js +6 -6
  215. package/lib/renderer/spectrum.d.ts +21 -0
  216. package/lib/renderer/spectrum.js +154 -0
  217. package/lib/renderer/spectrum.js.map +1 -0
  218. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  219. package/lib/renderer/staticBvhPreparation.js +8 -2
  220. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  221. package/lib/renderer/surfaceHit.d.ts +10 -0
  222. package/lib/renderer/surfaceHit.js +22 -0
  223. package/lib/renderer/surfaceHit.js.map +1 -0
  224. package/lib/renderer/tangentRequirements.d.ts +2 -0
  225. package/lib/renderer/tangentRequirements.js +7 -0
  226. package/lib/renderer/tangentRequirements.js.map +1 -0
  227. package/lib/renderer/textureAtlas.d.ts +4 -0
  228. package/lib/renderer/textureAtlas.js +48 -2
  229. package/lib/renderer/textureAtlas.js.map +1 -1
  230. package/lib/renderer/webgl.js +4 -0
  231. package/lib/renderer/webgl.js.map +1 -1
  232. package/lib/renderer/webglLightSampling.d.ts +39 -0
  233. package/lib/renderer/webglLightSampling.js +15 -0
  234. package/lib/renderer/webglLightSampling.js.map +1 -0
  235. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  236. package/lib/renderer/webglVertexAttributes.js +44 -0
  237. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  238. package/lib/renderer/wgpuBindlessSource.js +3 -3
  239. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  240. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  241. package/lib/renderer/wgpuSceneUniform.js +2 -2
  242. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  243. package/lib/renderer/wgpuShaderSource.d.ts +22 -0
  244. package/lib/renderer/wgpuShaderSource.js +3 -1
  245. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  246. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  247. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  248. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  249. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  250. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  251. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  252. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  253. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  254. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  256. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  257. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  258. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  259. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  260. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  261. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  262. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  263. package/lib/renderer/wgsl/causticLight.compute.js +539 -0
  264. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  265. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  266. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  267. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  268. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  269. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  270. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  271. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  272. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  273. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  274. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  275. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  276. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  277. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  278. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  279. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  280. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +634 -620
  281. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  282. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  283. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +23 -21
  284. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  285. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +3 -1
  286. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +77 -74
  287. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  288. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +795 -795
  289. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  290. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  291. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +5 -1
  292. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +45 -29
  293. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  294. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  295. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  296. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  297. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  298. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +228 -189
  299. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  300. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  301. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  302. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  303. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  304. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +88 -92
  305. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  306. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  307. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  308. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  309. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  310. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  311. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  312. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  313. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  314. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  315. package/lib/renderer/wgsl/compose.frag.wgsl.js +100 -98
  316. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  317. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  318. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  319. package/lib/renderer/wgsl/depthQuery.wgsl.js +12 -3
  320. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  321. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  322. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  323. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  324. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  325. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  326. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  327. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  328. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  329. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  330. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  331. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  332. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  333. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  334. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  335. package/lib/renderer/wgsl/rayTrace.compute.d.ts +23 -1
  336. package/lib/renderer/wgsl/rayTrace.compute.js +531 -543
  337. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  338. package/lib/scene/MaterialState.d.ts +2 -2
  339. package/lib/scene/MaterialState.js +2 -2
  340. package/lib/scene/MaterialState.js.map +1 -1
  341. package/lib/scene/Scene.js.map +1 -1
  342. package/lib/settings/render.d.ts +22 -0
  343. package/lib/settings/render.js +2 -0
  344. package/lib/settings/render.js.map +1 -1
  345. package/lib/util/fromTHREE.js +23 -16
  346. package/lib/util/fromTHREE.js.map +1 -1
  347. package/lib/version.d.ts +1 -1
  348. package/lib/version.js +1 -1
  349. package/lib/version.js.map +1 -1
  350. package/llms.txt +2 -1
  351. package/package.json +7 -4
  352. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  353. package/lib/oidnBundledWeights.cdn.js +0 -5
  354. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  355. package/lib/renderer/bvh.worker.d.ts +0 -1
  356. package/lib/renderer/bvh.worker.js +0 -16
  357. package/lib/renderer/bvh.worker.js.map +0 -1
  358. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  359. package/lib/renderer/bvhWorkerBuild.js +0 -17
  360. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  361. package/lib/renderer/lightCore.d.ts +0 -12
  362. package/lib/renderer/lightCore.js +0 -13
  363. package/lib/renderer/lightCore.js.map +0 -1
  364. package/lib/renderer/materialCore.d.ts +0 -8
  365. package/lib/renderer/materialCore.js +0 -9
  366. package/lib/renderer/materialCore.js.map +0 -1
  367. package/lib/scene/PixelTexture.d.ts +0 -6
  368. package/lib/scene/PixelTexture.js +0 -10
  369. package/lib/scene/PixelTexture.js.map +0 -1
  370. package/lib/util/studioLighting.d.ts +0 -18
  371. package/lib/util/studioLighting.js +0 -36
  372. package/lib/util/studioLighting.js.map +0 -1
@@ -6,31 +6,31 @@ import { INSTANCE_VEC4_STRIDE } from '../../bvhAccel.js';
6
6
  import { createShaderMixin, glsl, Shader } from '../../shader.js';
7
7
  function getBVHTraverseCode(handleHitCode, skipTriangleCode = '', initialTMax = 'RAY_MAX_DISTANCE') {
8
8
  const intersectTriangles = glsl `
9
- ivec3 vertexOffset = ivec3(floatBitsToInt(bF(bY * ${INSTANCE_VEC4_STRIDE}).y));
9
+ ivec3 vertexOffset = ivec3(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).y));
10
10
  for (int k = 0; k < primitiveCount; k++) {
11
11
  int triangleIndex = primitiveOffset + k;
12
12
  ${skipTriangleCode}
13
- vec4 r3 = dJ(triangleIndex);
13
+ vec4 r3 = fetchBVH(triangleIndex);
14
14
  ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
15
- fP tri = fP(
16
- lm(positionBuffer, index.x, vertexColumns).xyz,
17
- lm(positionBuffer, index.y, vertexColumns).xyz,
18
- lm(positionBuffer, index.z, vertexColumns).xyz
15
+ fL tri = fL(
16
+ fetchData(positionBuffer, index.x, vertexColumns).xyz,
17
+ fetchData(positionBuffer, index.y, vertexColumns).xyz,
18
+ fetchData(positionBuffer, index.z, vertexColumns).xyz
19
19
  );
20
- eK hit = ga(o, d, tri, eq, gY, tMax);
20
+ eF hit = fY(o, d, tri, ei, gZ, tMax);
21
21
 
22
22
  if (hit.t > 0.0) {
23
23
  tMax = hit.t;
24
24
  vec3 e1 = tri.p1 - tri.p0;
25
25
  vec3 e2 = tri.p2 - tri.p0;
26
26
  vec3 faceNormal = normalize(cross(e1, e2));
27
- int kP = int(ah(
28
- floatBitsToInt(bF(bY * ${INSTANCE_VEC4_STRIDE}).z)
27
+ int lc = int(af(
28
+ floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)
29
29
  ).x);
30
- bool jd = fetchMatData(
31
- kP * MAT_DATA_SIZE + MAT_ROW_ALPHA
30
+ bool jm = fetchMatData(
31
+ lc * MAT_DATA_SIZE + MAT_ROW_ALPHA
32
32
  ).z > 0.5;
33
- if (!doubleSided && !jd && dot(faceNormal, d) > 0.0) {
33
+ if (!doubleSided && !jm && dot(faceNormal, d) > 0.0) {
34
34
  continue;
35
35
  }
36
36
 
@@ -41,257 +41,260 @@ ${handleHitCode}
41
41
  return glsl `
42
42
  ivec2 stack[STACK_SIZE];
43
43
  int top = -1;
44
- int ud = -1;
44
+ int vQ = -1;
45
45
  float tMax = ${initialTMax};
46
46
 
47
47
  vec3 o = ray.o;
48
48
  vec3 d = ray.d;
49
49
 
50
- bool sj = false;
51
- vec3 hS;
52
- vec3 aC;
53
- ivec3 hK;
50
+ bool tD = false;
51
+ vec3 hU;
52
+ vec3 aw;
53
+ ivec3 hL;
54
54
 
55
- fP mk;
55
+ fL mL;
56
56
 
57
57
 
58
58
  top = 0;
59
59
  stack[0] = ivec2(0, -1);
60
60
 
61
- int yk = 0;
62
- while(top >= 0 && yk < 5000) {
63
- yk++;
61
+ int AI = 0;
62
+ while(top >= 0 && AI < 5000) {
63
+ AI++;
64
64
  ivec2 node = stack[top--];
65
65
 
66
- int bY = node.y;
66
+ int bK = node.y;
67
67
 
68
- if (bY != ud) {
69
- if (bY < 0) {
68
+ if (bK != vQ) {
69
+ if (bK < 0) {
70
70
  o = ray.o;
71
71
  d = ray.d;
72
72
  }
73
73
  else {
74
74
  mat4 w2l = mat4(
75
- bF(bY * ${INSTANCE_VEC4_STRIDE} + 1),
76
- bF(bY * ${INSTANCE_VEC4_STRIDE} + 2),
77
- bF(bY * ${INSTANCE_VEC4_STRIDE} + 3),
78
- bF(bY * ${INSTANCE_VEC4_STRIDE} + 4)
75
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 1),
76
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 2),
77
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 3),
78
+ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 4)
79
79
  );
80
80
  o = (w2l * vec4(ray.o, 1.0)).xyz;
81
81
  d = (w2l * vec4(ray.d, 0.0)).xyz;
82
82
  }
83
- eq = maxDimension(abs(d));
84
- gY = nk(d, eq);
85
- ud = bY;
83
+ ei = maxDimension(abs(d));
84
+ gZ = nV(d, ei);
85
+ vQ = bK;
86
86
  }
87
87
 
88
- int bw = bY < 0 ? 0 : blasOffset;
89
- uint fY = bY < 0 ? 0u : floatBitsToUint(bF(bY * ${INSTANCE_VEC4_STRIDE}).x);
90
- int he = int(fY >> 30u);
91
- int fg = int(fY & 0x3fffffffu);
88
+ int bufferOff = bK < 0 ? 0 : blasOffset;
89
+ uint fW = bK < 0 ? 0u : floatBitsToUint(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).x);
90
+ int hj = int(fW >> 30u);
91
+ int fc = int(fW & 0x3fffffffu);
92
92
  int primitiveCount = 0;
93
93
  int primitiveOffset = 0;
94
94
 
95
- if (he == 3) {
96
- uint iw = uint(node.x);
97
- if ((iw & 0x80000000u) != 0u) {
98
- primitiveCount = int((iw >> 23u) & 0xffu);
99
- primitiveOffset = bw + fg + int(iw & 0x007fffffu);
95
+ if (hj == 3) {
96
+ uint iE = uint(node.x);
97
+ if ((iE & 0x80000000u) != 0u) {
98
+ primitiveCount = int((iE >> 23u) & 0xffu);
99
+ primitiveOffset = bufferOff + fc + int(iE & 0x007fffffu);
100
100
  }
101
101
  else {
102
- int i = node.x + bw;
103
- vec4 jZ = dJ(i);
104
- vec4 fU = dJ(i + 1);
105
- vec4 nS = dJ(i + 2);
106
- vec4 nT = dJ(i + 3);
107
- vec4 nU = dJ(i + 4);
108
- uint header = floatBitsToUint(jZ.w);
109
- int sH = int(header << 24u) >> 24;
110
- int sI = int((header >> 8u) << 24u) >> 24;
111
- int sJ = int((header >> 16u) << 24u) >> 24;
112
- vec3 hZ = vec3(
113
- uintBitsToFloat(uint(sH + 127) << 23u),
114
- uintBitsToFloat(uint(sI + 127) << 23u),
115
- uintBitsToFloat(uint(sJ + 127) << 23u)
102
+ int i = node.x + bufferOff;
103
+ vec4 kj = fetchBVH(i);
104
+ vec4 fR = fetchBVH(i + 1);
105
+ vec4 oG = fetchBVH(i + 2);
106
+ vec4 oH = fetchBVH(i + 3);
107
+ vec4 oI = fetchBVH(i + 4);
108
+ uint header = floatBitsToUint(kj.w);
109
+ int uc = int(header << 24u) >> 24;
110
+ int ud = int((header >> 8u) << 24u) >> 24;
111
+ int ue = int((header >> 16u) << 24u) >> 24;
112
+ vec3 ih = vec3(
113
+ uintBitsToFloat(uint(uc + 127) << 23u),
114
+ uintBitsToFloat(uint(ud + 127) << 23u),
115
+ uintBitsToFloat(uint(ue + 127) << 23u)
116
116
  );
117
- uint childBase = floatBitsToUint(fU.x);
118
- uint pM = floatBitsToUint(fU.y);
117
+ uint childBase = floatBitsToUint(fR.x);
118
+ uint qE = floatBitsToUint(fR.y);
119
119
  uint internalMask = header >> 24u;
120
- uint vU = (d.x < 0.0 ? 4u : 0u) |
120
+ uint yl = (d.x < 0.0 ? 4u : 0u) |
121
121
  (d.y < 0.0 ? 2u : 0u) |
122
122
  (d.z < 0.0 ? 1u : 0u);
123
- uint gV[12] = uint[12](
124
- floatBitsToUint(nS.x), floatBitsToUint(nS.y),
125
- floatBitsToUint(nS.z), floatBitsToUint(nS.w),
126
- floatBitsToUint(nT.x), floatBitsToUint(nT.y),
127
- floatBitsToUint(nT.z), floatBitsToUint(nT.w),
128
- floatBitsToUint(nU.x), floatBitsToUint(nU.y),
129
- floatBitsToUint(nU.z), floatBitsToUint(nU.w)
123
+ uint gX[12] = uint[12](
124
+ floatBitsToUint(oG.x), floatBitsToUint(oG.y),
125
+ floatBitsToUint(oG.z), floatBitsToUint(oG.w),
126
+ floatBitsToUint(oH.x), floatBitsToUint(oH.y),
127
+ floatBitsToUint(oH.z), floatBitsToUint(oH.w),
128
+ floatBitsToUint(oI.x), floatBitsToUint(oI.y),
129
+ floatBitsToUint(oI.z), floatBitsToUint(oI.w)
130
130
  );
131
131
 
132
132
  for (int order = 7; order >= 0; order--) {
133
- uint slot = uint(order) ^ vU;
134
- uint tT = slot >= 4u
135
- ? floatBitsToUint(fU.w)
136
- : floatBitsToUint(fU.z);
137
- uint meta = (tT >> ((slot & 3u) * 8u)) & 0xffu;
133
+ uint slot = uint(order) ^ yl;
134
+ uint vF = slot >= 4u
135
+ ? floatBitsToUint(fR.w)
136
+ : floatBitsToUint(fR.z);
137
+ uint meta = (vF >> ((slot & 3u) * 8u)) & 0xffu;
138
138
  if (meta == 0u) continue;
139
- uint mI = (slot & 3u) * 8u;
140
- uint lF = slot >> 2u;
141
- vec3 uX = vec3(
142
- float((gV[lF] >> mI) & 0xffu),
143
- float((gV[2u + lF] >> mI) & 0xffu),
144
- float((gV[4u + lF] >> mI) & 0xffu)
139
+ uint nr = (slot & 3u) * 8u;
140
+ uint me = slot >> 2u;
141
+ vec3 wS = vec3(
142
+ float((gX[me] >> nr) & 0xffu),
143
+ float((gX[2u + me] >> nr) & 0xffu),
144
+ float((gX[4u + me] >> nr) & 0xffu)
145
145
  );
146
- vec3 uW = vec3(
147
- float((gV[6u + lF] >> mI) & 0xffu),
148
- float((gV[8u + lF] >> mI) & 0xffu),
149
- float((gV[10u + lF] >> mI) & 0xffu)
146
+ vec3 wR = vec3(
147
+ float((gX[6u + me] >> nr) & 0xffu),
148
+ float((gX[8u + me] >> nr) & 0xffu),
149
+ float((gX[10u + me] >> nr) & 0xffu)
150
150
  );
151
- vec3 wN = jZ.xyz + uX * hZ;
152
- vec3 wM = jZ.xyz + uW * hZ;
153
- if (cU(o, d, wN, wM, tMax) <= 0.0) continue;
154
- uint kb = meta & 0x1fu;
155
- if (kb >= 24u) {
156
- uint om = internalMask & ((1u << slot) - 1u);
157
- uint un = childBase + rY(om);
151
+ vec3 zp = kj.xyz + wS * ih;
152
+ vec3 zo = kj.xyz + wR * ih;
153
+ if (bP(o, d, zp, zo, tMax) <= 0.0) continue;
154
+ uint kl = meta & 0x1fu;
155
+ if (kl >= 24u) {
156
+ uint oZ = internalMask & ((1u << slot) - 1u);
157
+ uint wb = childBase + tl(oZ);
158
158
  stack[++top] = ivec2(
159
- fg + int(un * 5u), bY
159
+ fc + int(wb * 5u), bK
160
160
  );
161
161
  }
162
162
  else {
163
- uint triangleCount = rY(meta >> 5u);
164
- uint sV = pM + kb;
165
- uint wZ = 0x80000000u |
163
+ uint triangleCount = tl(meta >> 5u);
164
+ uint ut = qE + kl;
165
+ uint zC = 0x80000000u |
166
166
  (triangleCount << 23u) |
167
- (sV & 0x007fffffu);
168
- stack[++top] = ivec2(int(wZ), bY);
167
+ (ut & 0x007fffffu);
168
+ stack[++top] = ivec2(int(zC), bK);
169
169
  }
170
170
  }
171
171
  }
172
172
  }
173
- else if (he == 2) {
174
- int i = node.x + bw;
175
- vec4 wP = dJ(i);
176
- vec4 wQ = dJ(i + 1);
177
- vec4 wR = dJ(i + 2);
178
- vec4 wS = dJ(i + 3);
179
- primitiveCount = int(floatBitsToUint(wR.w));
173
+ else if (hj == 2) {
174
+ int i = node.x + bufferOff;
175
+ vec4 zr = fetchBVH(i);
176
+ vec4 zs = fetchBVH(i + 1);
177
+ vec4 zt = fetchBVH(i + 2);
178
+ vec4 zu = fetchBVH(i + 3);
179
+ primitiveCount = int(floatBitsToUint(zt.w));
180
180
  if (primitiveCount > 0) {
181
- primitiveOffset = bw + fg + int(floatBitsToUint(wS.w));
181
+ primitiveOffset = bufferOff + fc + int(floatBitsToUint(zu.w));
182
182
  }
183
183
  else {
184
- int left = fg + int(floatBitsToUint(wP.w) * 4u);
185
- int right = fg + int(floatBitsToUint(wQ.w) * 4u);
186
- float d0 = cU(o, d, wP.xyz, wQ.xyz, tMax);
187
- float d1 = cU(o, d, wR.xyz, wS.xyz, tMax);
184
+ int left = fc + int(floatBitsToUint(zr.w) * 4u);
185
+ int right = fc + int(floatBitsToUint(zs.w) * 4u);
186
+ float d0 = bP(o, d, zr.xyz, zs.xyz, tMax);
187
+ float d1 = bP(o, d, zt.xyz, zu.xyz, tMax);
188
188
  if (d0 > d1) {
189
- if (d0 > 0.0) stack[++top] = ivec2(left, bY);
190
- if (d1 > 0.0) stack[++top] = ivec2(right, bY);
189
+ if (d0 > 0.0) stack[++top] = ivec2(left, bK);
190
+ if (d1 > 0.0) stack[++top] = ivec2(right, bK);
191
191
  }
192
192
  else {
193
- if (d1 > 0.0) stack[++top] = ivec2(right, bY);
194
- if (d0 > 0.0) stack[++top] = ivec2(left, bY);
193
+ if (d1 > 0.0) stack[++top] = ivec2(right, bK);
194
+ if (d0 > 0.0) stack[++top] = ivec2(left, bK);
195
195
  }
196
196
  }
197
197
  }
198
- else if (he == 1) {
199
- uint iw = uint(node.x);
200
- if ((iw & 0x80000000u) != 0u) {
201
- primitiveCount = int((iw >> 23u) & 0xffu);
202
- primitiveOffset = bw + fg + int(iw & 0x007fffffu);
198
+ else if (hj == 1) {
199
+ uint iE = uint(node.x);
200
+ if ((iE & 0x80000000u) != 0u) {
201
+ primitiveCount = int((iE >> 23u) & 0xffu);
202
+ primitiveOffset = bufferOff + fc + int(iE & 0x007fffffu);
203
203
  }
204
204
  else {
205
- int i = node.x + bw;
206
- vec4 vJ = dJ(i);
207
- vec4 sz = dJ(i + 1);
208
- vec4 qR = dJ(i + 2);
209
- vec4 oQ = dJ(i + 3);
210
- vec3 nodeMin = vJ.xyz;
211
- vec3 er = vec3(vJ.w, sz.x, sz.y);
212
- uint mT[4] = uint[4](
213
- floatBitsToUint(sz.z), floatBitsToUint(sz.w),
214
- floatBitsToUint(qR.x), floatBitsToUint(qR.y)
205
+ int i = node.x + bufferOff;
206
+ vec4 xS = fetchBVH(i);
207
+ vec4 tR = fetchBVH(i + 1);
208
+ vec4 rW = fetchBVH(i + 2);
209
+ vec4 pL = fetchBVH(i + 3);
210
+ vec3 nodeMin = xS.xyz;
211
+ vec3 ej = vec3(xS.w, tR.x, tR.y);
212
+ uint nH[4] = uint[4](
213
+ floatBitsToUint(tR.z), floatBitsToUint(tR.w),
214
+ floatBitsToUint(rW.x), floatBitsToUint(rW.y)
215
215
  );
216
- vec4 wx = fp(floatBitsToUint(qR.z));
217
- vec4 wy = fp(floatBitsToUint(qR.w));
218
- vec4 wB = fp(floatBitsToUint(oQ.x));
219
- vec4 wu = fp(floatBitsToUint(oQ.y));
220
- vec4 wv = fp(floatBitsToUint(oQ.z));
221
- vec4 ww = fp(floatBitsToUint(oQ.w));
222
- vec3 gr = fo(d);
223
- vec3 padding = fk(gr, o);
224
- vec4 tx0 = (nodeMin.x + wx * er.x - o.x) * gr.x;
225
- vec4 tx1 = (nodeMin.x + wu * er.x - o.x) * gr.x;
226
- vec4 ty0 = (nodeMin.y + wy * er.y - o.y) * gr.y;
227
- vec4 ty1 = (nodeMin.y + wv * er.y - o.y) * gr.y;
228
- vec4 tz0 = (nodeMin.z + wB * er.z - o.z) * gr.z;
229
- vec4 tz1 = (nodeMin.z + ww * er.z - o.z) * gr.z;
230
- vec4 nJ = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
231
- vec4 sY = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
232
- vec4 distance = mix(sY, nJ, greaterThan(nJ, vec4(0.0)));
233
- distance = mix(distance, vec4(-1.0), greaterThan(nJ, min(sY, vec4(tMax))));
234
- float fq[4] = float[4](distance.x, distance.y, distance.z, distance.w);
216
+ vec4 yV = fh(floatBitsToUint(rW.z));
217
+ vec4 yW = fh(floatBitsToUint(rW.w));
218
+ vec4 yX = fh(floatBitsToUint(pL.x));
219
+ vec4 yS = fh(floatBitsToUint(pL.y));
220
+ vec4 yT = fh(floatBitsToUint(pL.z));
221
+ vec4 yU = fh(floatBitsToUint(pL.w));
222
+ vec3 invD = traversalInverse(d);
223
+ vec3 padding = ff(invD, o);
224
+ vec4 tx0 = (nodeMin.x + yV * ej.x - o.x) * invD.x;
225
+ vec4 tx1 = (nodeMin.x + yS * ej.x - o.x) * invD.x;
226
+ vec4 ty0 = (nodeMin.y + yW * ej.y - o.y) * invD.y;
227
+ vec4 ty1 = (nodeMin.y + yT * ej.y - o.y) * invD.y;
228
+ vec4 tz0 = (nodeMin.z + yX * ej.z - o.z) * invD.z;
229
+ vec4 tz1 = (nodeMin.z + yU * ej.z - o.z) * invD.z;
230
+ vec4 ot = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
231
+ vec4 uA = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
232
+ vec4 distance = mix(uA, ot, greaterThan(ot, vec4(0.0)));
233
+ distance = mix(distance, vec4(-1.0), greaterThan(ot, min(uA, vec4(tMax))));
234
+ float fi[4] = float[4](distance.x, distance.y, distance.z, distance.w);
235
235
 
236
236
 
237
237
  for (int order = 0; order < 4; order++) {
238
- float em = -1.0;
239
- int eB = -1;
238
+ float ee = -1.0;
239
+ int eq = -1;
240
240
  for (int child = 0; child < 4; child++) {
241
- if (mT[child] != 0u && fq[child] > em) {
242
- em = fq[child];
243
- eB = child;
241
+ if (nH[child] != 0u && fi[child] > ee) {
242
+ ee = fi[child];
243
+ eq = child;
244
244
  }
245
245
  }
246
- if (eB >= 0 && em > 0.0) {
247
- uint oy = mT[eB];
248
- int ki = int(oy);
249
- if ((oy & 0x80000000u) == 0u) {
250
- ki += fg;
246
+ if (eq >= 0 && ee > 0.0) {
247
+ uint ph = nH[eq];
248
+ int kv = int(ph);
249
+ if ((ph & 0x80000000u) == 0u) {
250
+ kv += fc;
251
251
  }
252
- stack[++top] = ivec2(ki, bY);
253
- fq[eB] = -1.0;
252
+ stack[++top] = ivec2(kv, bK);
253
+ fi[eq] = -1.0;
254
254
  }
255
255
  }
256
256
  }
257
257
  }
258
258
  else {
259
- int i = node.x + bw;
260
- vec4 r1 = dJ(i);
261
- int bl = floatBitsToInt(r1.w);
259
+ int i = node.x + bufferOff;
260
+ vec4 r1 = fetchBVH(i);
261
+ int bh = floatBitsToInt(r1.w);
262
262
 
263
- if (bl >= 0) {
263
+ if (bh >= 0) {
264
264
  int left = node.x + 2;
265
- int right = bl + fg;
265
+ int right = bh + fc;
266
266
 
267
- float d0 = cU(o, d, dJ(left + bw).xyz, dJ(left + 1 + bw).xyz, tMax);
268
- float d1 = cU(o, d, dJ(right + bw).xyz, dJ(right + 1 + bw).xyz, tMax);
267
+ float d0 = bP(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);
268
+ float d1 = bP(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).xyz, tMax);
269
269
  if (d0 > d1) {
270
270
  if (d0 > 0.0) {
271
- stack[++top] = ivec2(left, bY);
271
+ stack[++top] = ivec2(left, bK);
272
272
  }
273
273
  if (d1 > 0.0) {
274
- stack[++top] = ivec2(right, bY);
274
+ stack[++top] = ivec2(right, bK);
275
275
  }
276
276
  }
277
277
  else {
278
278
  if (d1 > 0.0) {
279
- stack[++top] = ivec2(right, bY);
279
+ stack[++top] = ivec2(right, bK);
280
280
  }
281
281
  if (d0 > 0.0) {
282
- stack[++top] = ivec2(left, bY);
282
+ stack[++top] = ivec2(left, bK);
283
283
  }
284
284
  }
285
285
  }
286
286
  else {
287
- if (bY < 0) {
288
- for (int k = 0; k < -bl; k++) {
289
- vec4 r3 = dJ(i + 2 + k);
287
+ if (bK < 0) {
288
+ for (int k = 0; k < -bh; k++) {
289
+ vec4 r3 = fetchBVH(i + 2 + k);
290
+ int box = floatBitsToInt(r3.w);
291
+ if (bP(ray.o, ray.d, fetchBVH(box).xyz, fetchBVH(box + 1).xyz, tMax) > 0.0) {
290
292
  stack[++top] = ivec2(floatBitsToInt(r3.y), floatBitsToInt(r3.x));
291
293
  }
292
294
  }
295
+ }
293
296
  else {
294
- primitiveCount = -bl;
297
+ primitiveCount = -bh;
295
298
  primitiveOffset = i + 2;
296
299
  }
297
300
  }
@@ -303,31 +306,31 @@ ${intersectTriangles}
303
306
  `;
304
307
  }
305
308
  export default createShaderMixin({
309
+ defines: {
310
+ VERTEX_ATTRIBUTE_STRIDE: 2
311
+ },
306
312
  uniforms: {
307
313
  positionBuffer: Shader.uniform('sampler2D'),
308
- normalBuffer: Shader.uniform('sampler2D'),
309
- tangentBuffer: Shader.uniform('sampler2D'),
310
- uvBuffer: Shader.uniform('sampler2D'),
311
- uv1Buffer: Shader.uniform('sampler2D'),
312
- colorBuffer: Shader.uniform('sampler2D'),
313
- materialIndexBuffer: Shader.uniform('sampler2D'),
314
+ // Interleaved shading attributes; layout in webglVertexAttributes.ts.
315
+ vertexAttributes: Shader.uniform('sampler2D'),
316
+ // TLAS, BLASes and then the instance records.
314
317
  bvhBuffer: Shader.uniform('sampler2D'),
315
- instancesBuffer: Shader.uniform('sampler2D'),
316
318
  bvhColumns: Shader.uniform('int', 1),
317
319
  vertexColumns: Shader.uniform('int', 1),
318
- instancesColumns: Shader.uniform('int', 1),
320
+ vertexAttributeColumns: Shader.uniform('int', 1),
321
+ instancesOffset: Shader.uniform('int', 0),
319
322
  blasOffset: Shader.uniform('int'),
320
323
  isEmptyScene: Shader.uniform('bool')
321
324
  },
322
325
  main: glsl `
323
326
 
324
- struct fP {
327
+ struct fL {
325
328
  vec3 p0;
326
329
  vec3 p1;
327
330
  vec3 p2;
328
331
  };
329
332
  #ifdef NUM_LIGHTS
330
- float hL(float rad, vec3 pos, Ray r) {
333
+ float hM(float rad, vec3 pos, Ray r) {
331
334
  vec3 op = pos - r.o;
332
335
  float eps = 0.001;
333
336
  float b = dot(op, r.d);
@@ -347,7 +350,7 @@ return t2;
347
350
  return INF;
348
351
  }
349
352
 
350
- float og(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
353
+ float oU(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
351
354
  float dt = dot(r.d, n);
352
355
  float t = (dot(n, pos) - dot(n, r.o)) / dt;
353
356
 
@@ -366,7 +369,17 @@ return t;
366
369
  return INF;
367
370
  }
368
371
 
369
- float nr(Ray r, Light light, out LightSampleRec lightSample) {
372
+ float sphereSolidAnglePdf(vec3 origin, vec3 center, float radius) {
373
+ float ao = distance(origin, center);
374
+ if (ao <= radius) return INV4PI;
375
+ float sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
376
+ float cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
377
+
378
+ float oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
379
+ return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
380
+ }
381
+
382
+ float iB(Ray r, Light light, out LightSampleRec lightSample) {
370
383
 
371
384
 
372
385
 
@@ -383,15 +396,15 @@ vec3 normal = normalize(cross(u, v));
383
396
  if (dot(normal, r.d) > 0.)
384
397
  return INF;
385
398
 
386
- d = og(pos, u, v, normal, r);
399
+ d = oU(pos, u, v, normal, r);
387
400
  if (d < 0.) {
388
401
  d = INF;
389
402
  }
390
403
  else {
391
- float ci = dot(-r.d, normal);
404
+ float cv = dot(-r.d, normal);
392
405
  float spread = light.spread;
393
- if (ci >= cos(spread * PI / 2.0)) {
394
- lightSample.pdf = (d * d) / (light.area * ci);
406
+ if (cv >= cos(spread * PI / 2.0)) {
407
+ lightSample.pdf = (d * d) / (light.area * cv);
395
408
  lightSample.emission = light.emission;
396
409
  }
397
410
  }
@@ -400,10 +413,10 @@ lightSample.emission = light.emission;
400
413
  #ifdef HAS_SPHERE_LIGHTS
401
414
  if (type == SPHERE_LIGHT) {
402
415
  if (light.radius <= 0.0) {
403
- vec3 kT = light.position - r.o;
404
- float projection = dot(kT, r.d);
405
- vec3 bk = kT - projection * r.d;
406
- if (projection <= EPS || dot(bk, bk) > 1e-8) return INF;
416
+ vec3 lj = light.position - r.o;
417
+ float projection = dot(lj, r.d);
418
+ vec3 bf = lj - projection * r.d;
419
+ if (projection <= EPS || dot(bf, bf) > 1e-8) return INF;
407
420
  d = projection;
408
421
  lightSample.direction = r.d;
409
422
  lightSample.normal = -r.d;
@@ -411,21 +424,15 @@ lightSample.dist = d;
411
424
  lightSample.pdf = 1.0;
412
425
  lightSample.isDelta = true;
413
426
  } else {
414
- d = hL(light.radius, light.position, r);
427
+ d = hM(light.radius, light.position, r);
415
428
  lightSample.isDelta = false;
416
429
  }
417
430
  if (d < 0.) {
418
431
  d = INF;
419
432
  }
420
433
  else {
421
- float ak = distance(r.o, light.position);
422
- float cosThetaMax = ak <= light.radius
423
- ? -1.0
424
- : sqrt(max(0.0, 1.0 - light.radius * light.radius / (ak * ak)));
425
434
  if (light.radius > 0.0) {
426
- lightSample.pdf = ak <= light.radius
427
- ? INV4PI
428
- : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
435
+ lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
429
436
  }
430
437
  lightSample.emission = light.radius <= 0.0
431
438
  ? light.emission / max(d * d, 1e-8)
@@ -436,10 +443,10 @@ lightSample.emission = light.radius <= 0.0
436
443
  #ifdef HAS_SPOT_LIGHTS
437
444
  if (type == SPOT_LIGHT) {
438
445
  if (light.radius <= 0.0) {
439
- vec3 kT = light.position - r.o;
440
- float projection = dot(kT, r.d);
441
- vec3 bk = kT - projection * r.d;
442
- if (projection <= EPS || dot(bk, bk) > 1e-8) return INF;
446
+ vec3 lj = light.position - r.o;
447
+ float projection = dot(lj, r.d);
448
+ vec3 bf = lj - projection * r.d;
449
+ if (projection <= EPS || dot(bf, bf) > 1e-8) return INF;
443
450
  d = projection;
444
451
  lightSample.direction = r.d;
445
452
  lightSample.normal = -r.d;
@@ -447,23 +454,17 @@ lightSample.dist = d;
447
454
  lightSample.pdf = 1.0;
448
455
  lightSample.isDelta = true;
449
456
  } else {
450
- d = hL(light.radius, light.position, r);
457
+ d = hM(light.radius, light.position, r);
451
458
  lightSample.isDelta = false;
452
459
  }
453
460
  if (d != INF) {
454
- vec3 wW = r.o + d * r.d;
455
- float nv = bP(light, normalize(r.o - wW));
456
- if (nv <= 0.0) return INF;
457
- float ak = distance(r.o, light.position);
458
- float cosThetaMax = ak <= light.radius
459
- ? -1.0
460
- : sqrt(max(0.0, 1.0 - light.radius * light.radius / (ak * ak)));
461
+ vec3 zA = r.o + d * r.d;
462
+ float od = evaluateSpotEmissionMultiplier(light, normalize(r.o - zA));
463
+ if (od <= 0.0) return INF;
461
464
  if (light.radius > 0.0) {
462
- lightSample.pdf = ak <= light.radius
463
- ? INV4PI
464
- : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
465
+ lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
465
466
  }
466
- lightSample.emission = light.emission * nv * (light.radius <= 0.0
467
+ lightSample.emission = light.emission * od * (light.radius <= 0.0
467
468
  ? 1.0 / max(d * d, 1e-8)
468
469
  : 1.0);
469
470
  }
@@ -474,106 +475,122 @@ return d;
474
475
  }
475
476
  #endif
476
477
 
477
- int fF(ivec4 m0, ivec4 m1, ivec4 m2, vec3 eU) {
478
- vec2 m00 = ah(m0.x);
479
- vec2 m01 = ah(m0.y);
480
- vec2 m02 = ah(m0.z);
481
- vec2 m10 = ah(m1.x);
482
- vec2 m11 = ah(m1.y);
483
- vec2 m12 = ah(m1.z);
484
- vec2 m20 = ah(m2.x);
485
- vec2 m21 = ah(m2.y);
486
- vec2 m22 = ah(m2.z);
487
- float w00 = m00.y * eU.x;
488
- float w01 = m01.y * eU.x;
489
- float w02 = m02.y * eU.x;
490
- float w10 = m10.y * eU.y;
491
- float w11 = m11.y * eU.y;
492
- float w12 = m12.y * eU.y;
493
- float w20 = m20.y * eU.z;
494
- float w21 = m21.y * eU.z;
495
- float w22 = m22.y * eU.z;
496
-
497
- float hy = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
498
-
499
- w00 = w00 / hy;
500
- w01 = w01 / hy + w00;
501
- w02 = w02 / hy + w01;
502
- w10 = w10 / hy + w02;
503
- w11 = w11 / hy + w10;
504
- w12 = w12 / hy + w11;
505
- w20 = w20 / hy + w12;
506
- w21 = w21 / hy + w20;
507
- w22 = w22 / hy + w21;
508
-
509
- float rand = eC(0u);
510
- float oh;
478
+ int fv(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
479
+ vec2 m00 = af(m0.x);
480
+ vec2 m01 = af(m0.y);
481
+ vec2 m02 = af(m0.z);
482
+ vec2 m10 = af(m1.x);
483
+ vec2 m11 = af(m1.y);
484
+ vec2 m12 = af(m1.z);
485
+ vec2 m20 = af(m2.x);
486
+ vec2 m21 = af(m2.y);
487
+ vec2 m22 = af(m2.z);
488
+ float w00 = m00.y * bary.x;
489
+ float w01 = m01.y * bary.x;
490
+ float w02 = m02.y * bary.x;
491
+ float w10 = m10.y * bary.y;
492
+ float w11 = m11.y * bary.y;
493
+ float w12 = m12.y * bary.y;
494
+ float w20 = m20.y * bary.z;
495
+ float w21 = m21.y * bary.z;
496
+ float w22 = m22.y * bary.z;
497
+
498
+ float hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
499
+
500
+ w00 = w00 / hB;
501
+ w01 = w01 / hB + w00;
502
+ w02 = w02 / hB + w01;
503
+ w10 = w10 / hB + w02;
504
+ w11 = w11 / hB + w10;
505
+ w12 = w12 / hB + w11;
506
+ w20 = w20 / hB + w12;
507
+ w21 = w21 / hB + w20;
508
+ w22 = w22 / hB + w21;
509
+
510
+ float rand = cm(0u);
511
+ float oV;
511
512
  if (rand < w00) {
512
- oh = m00.x;
513
+ oV = m00.x;
513
514
  } else if (rand < w01) {
514
- oh = m01.x;
515
+ oV = m01.x;
515
516
  } else if (rand < w02) {
516
- oh = m02.x;
517
+ oV = m02.x;
517
518
  } else if (rand < w10) {
518
- oh = m10.x;
519
+ oV = m10.x;
519
520
  } else if (rand < w11) {
520
- oh = m11.x;
521
+ oV = m11.x;
521
522
  } else if (rand < w12) {
522
- oh = m12.x;
523
+ oV = m12.x;
523
524
  } else if (rand < w20) {
524
- oh = m20.x;
525
+ oV = m20.x;
525
526
  } else if (rand < w21) {
526
- oh = m21.x;
527
+ oV = m21.x;
527
528
  } else {
528
- oh = m22.x;
529
+ oV = m22.x;
529
530
  }
530
- return int(oh);
531
+ return int(oV);
531
532
  }
532
533
 
533
534
 
534
- vec4 bF(int i);
535
+ vec4 fetchIns(int i);
536
+
537
+ vec4 bs(int vertex, int slot) {
538
+ return fetchData(vertexAttributes, vertex * VERTEX_ATTRIBUTE_STRIDE + slot, vertexAttributeColumns);
539
+ }
540
+ vec3 fetchVertexNormal(int vertex) { return bs(vertex, 0).xyz; }
541
+ vec2 er(int vertex) { return bs(vertex, 1).xy; }
542
+ ivec4 dT(int vertex) {
543
+ return ivec4(bs(vertex, 0).w, bs(vertex, 1).zw, 0.0);
544
+ }
545
+ vec2 dK(int vertex) {
546
+ #ifdef USE_UV1
547
+ return bs(vertex, VERTEX_UV1_SLOT).xy;
548
+ #else
549
+ return vec2(0.0);
550
+ #endif
551
+ }
552
+ #ifdef USE_TANGENT
553
+ vec4 ef(int vertex) { return bs(vertex, VERTEX_TANGENT_SLOT); }
554
+ #endif
535
555
 
536
556
 
537
- mat2x3 eP(vec3 normal, vec3 dp1, vec3 dp2, vec2 oW, vec2 oX, vec4 aX) {
538
- float determinant = oW.x * oX.y - oW.y * oX.x;
539
- vec3 t = aX.xyz;
557
+ mat2x3 eI(vec3 normal, vec3 dp1, vec3 dp2, vec2 pU, vec2 pV, vec4 aT) {
558
+ float determinant = pU.x * pV.y - pU.y * pV.x;
559
+ vec3 t = aT.xyz;
540
560
  vec3 b = vec3(0.0);
541
561
 
542
- float rF = abs(aX.w) > 1.5 ? 0.0 : aX.w;
562
+ float sO = abs(aT.w) > 1.5 ? 0.0 : aT.w;
543
563
  if (abs(determinant) > 1e-12) {
544
- vec3 dt = (dp1 * oX.y - dp2 * oW.y) / determinant;
545
- vec3 db = (dp2 * oW.x - dp1 * oX.x) / determinant;
564
+ vec3 dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
565
+ vec3 db = (dp2 * pU.x - dp1 * pV.x) / determinant;
546
566
  if (dot(t, t) < 1e-8) { t = dt; }
547
- if (rF == 0.0) { rF = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
567
+ if (sO == 0.0) { sO = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
548
568
  }
549
569
  t -= normal * dot(normal, t);
550
570
  if (dot(t, t) < 1e-8) {
551
- float iI = (normal.z >= 0.0 ? 1.0 : -1.0);
552
- float cL = -1.0 / (iI + normal.z);
553
- float xy = normal.x * normal.y * cL;
554
- t = vec3(1.0 + iI * normal.x * normal.x * cL, iI * xy, -iI * normal.x);
555
- b = vec3(xy, iI + normal.y * normal.y * cL, -normal.y);
571
+ float iP = (normal.z >= 0.0 ? 1.0 : -1.0);
572
+ float cA = -1.0 / (iP + normal.z);
573
+ float xy = normal.x * normal.y * cA;
574
+ t = vec3(1.0 + iP * normal.x * normal.x * cA, iP * xy, -iP * normal.x);
575
+ b = vec3(xy, iP + normal.y * normal.y * cA, -normal.y);
556
576
  }
557
577
  else { t = normalize(t); b = normalize(cross(normal, t)); }
558
- return mat2x3(t, b * (rF < 0.0 ? -1.0 : 1.0));
578
+ return mat2x3(t, b * (sO < 0.0 ? -1.0 : 1.0));
559
579
  }
560
580
 
561
- void hH(inout SurfaceInteraction si, fP tri, vec3 barycentric, ivec3 index) {
581
+ void hI(inout SurfaceInteraction si, fL tri, vec3 barycentric, ivec3 index) {
562
582
  si.hit = true;
563
583
  si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
564
- ivec2 i0 = hd(index.x, vertexColumns);
565
- ivec2 i1 = hd(index.y, vertexColumns);
566
- ivec2 i2 = hd(index.z, vertexColumns);
567
584
  si.vertexColor = vec3(1.0);
568
585
  #ifdef USE_VERTEX_COLOR
569
- si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
570
- + barycentric.y * texelFetch(colorBuffer, i1, 0).rgb
571
- + barycentric.z * texelFetch(colorBuffer, i2, 0).rgb;
586
+ si.vertexColor = barycentric.x * bs(index.x, VERTEX_COLOR_SLOT).rgb
587
+ + barycentric.y * bs(index.y, VERTEX_COLOR_SLOT).rgb
588
+ + barycentric.z * bs(index.z, VERTEX_COLOR_SLOT).rgb;
572
589
  #endif
573
590
 
574
- vec3 n0 = texelFetch(normalBuffer, i0, 0).xyz;
575
- vec3 n1 = texelFetch(normalBuffer, i1, 0).xyz;
576
- vec3 n2 = texelFetch(normalBuffer, i2, 0).xyz;
591
+ vec3 n0 = fetchVertexNormal(index.x);
592
+ vec3 n1 = fetchVertexNormal(index.y);
593
+ vec3 n2 = fetchVertexNormal(index.z);
577
594
  vec3 normal = normalize(barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2);
578
595
  si.vertexNormal = normal;
579
596
 
@@ -582,14 +599,14 @@ si.vertexNormal = normal;
582
599
 
583
600
 
584
601
  vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
585
- vec3 kR = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
602
+ vec3 le = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
586
603
  float a = dot(n2 - n0, tri.p0 - tri.p2);
587
604
  float b = dot(n2 - n1, tri.p1 - tri.p2);
588
605
  float c = dot(n1 - n0, tri.p1 - tri.p0);
589
606
  float h = a * barycentric.x * (barycentric.x - 1.0)
590
607
  + (a + b + c) * barycentric.x * barycentric.y
591
608
  + b * barycentric.y * (barycentric.y - 1.0);
592
- if (dot(kR, geometricNormal) > 0.0) {
609
+ if (dot(le, geometricNormal) > 0.0) {
593
610
  float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
594
611
  float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
595
612
  float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -607,155 +624,154 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
607
624
  h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
608
625
  h = min(-min(min(h0, h1), h2), h * 0.5);
609
626
  }
610
- si.shadowOffset = kR * h;
611
-
627
+ si.shadowOffset = le * h;
612
628
 
613
- ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
614
- ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
615
- ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
629
+ ivec4 m0 = dT(index.x);
630
+ ivec4 m1 = dT(index.y);
631
+ ivec4 m2 = dT(index.z);
616
632
 
617
633
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
618
- si.materialIndex = fF(m0, m1, m2, barycentric);
634
+ si.materialIndex = fv(m0, m1, m2, barycentric);
619
635
  }
620
636
 
621
- vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
622
- vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
623
- vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
637
+ vec2 uv0 = er(index.x);
638
+ vec2 uv1 = er(index.y);
639
+ vec2 uv2 = er(index.z);
624
640
  #if defined(NUM_DIFFUSE_MAPS) || defined(NUM_NORMAL_MAPS) || defined(NUM_METALLIC_ROUGHNESS_MAPS) || defined(NUM_ROUGHNESS_MAPS) || defined(NUM_METALNESS_MAPS) || defined(NUM_EMISSIVE_MAPS) || defined(NUM_THIN_FILM_MAPS) || defined(NUM_ANISOTROPY_MAPS) || defined(NUM_COAT_NORMAL_MAPS)
625
641
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
626
- vec2 secondaryUv0 = texelFetch(uv1Buffer, i0, 0).xy;
627
- vec2 secondaryUv1 = texelFetch(uv1Buffer, i1, 0).xy;
628
- vec2 secondaryUv2 = texelFetch(uv1Buffer, i2, 0).xy;
629
- vec2 dj = barycentric.x * secondaryUv0
642
+ vec2 secondaryUv0 = dK(index.x);
643
+ vec2 secondaryUv1 = dK(index.y);
644
+ vec2 secondaryUv2 = dK(index.z);
645
+ vec2 cT = barycentric.x * secondaryUv0
630
646
  + barycentric.y * secondaryUv1
631
647
  + barycentric.z * secondaryUv2;
632
648
 
633
- vec4 mw = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
634
- int uvProjection = int(mw.r);
649
+ vec4 mU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
650
+ int uvProjection = int(mU.r);
635
651
  if (uvProjection > 0) {
636
- uv = gU(uvProjection, si.position, normal, mw.zw);
637
- dj = uv;
652
+ uv = gW(uvProjection, si.position, normal, mU.zw);
653
+ cT = uv;
638
654
  } else {
639
- uv *= mw.zw;
640
- dj *= mw.zw;
655
+ uv *= mU.zw;
656
+ cT *= mU.zw;
641
657
  }
642
658
  #else
643
659
  vec2 uv = vec2(0.0);
644
- vec2 dj = vec2(0.0);
660
+ vec2 cT = vec2(0.0);
645
661
  #endif
646
662
 
647
663
  #ifdef USE_COAT_NORMAL_FRAMES
648
664
  si.coatNormal = normal;
649
665
  #ifdef NUM_COAT_NORMAL_MAPS
650
- float pQ = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
666
+ float qK = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
651
667
  #endif
652
668
  #endif
653
669
  vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
654
- float uL = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
655
- if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || uL != 0.0
670
+ float wB = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
671
+ if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || wB != 0.0
656
672
  #ifdef USE_COAT_NORMAL_FRAMES
657
673
  || fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
658
674
  #endif
659
675
  ) {
660
676
  vec3 dp1 = tri.p0 - tri.p2;
661
677
  vec3 dp2 = tri.p1 - tri.p2;
662
- vec4 aX = vec4(0.0);
678
+ vec4 aT = vec4(0.0);
663
679
  #ifdef USE_TANGENT
664
- aX = barycentric.x * texelFetch(tangentBuffer, i0, 0)
665
- + barycentric.y * texelFetch(tangentBuffer, i1, 0)
666
- + barycentric.z * texelFetch(tangentBuffer, i2, 0);
680
+ aT = barycentric.x * ef(index.x)
681
+ + barycentric.y * ef(index.y)
682
+ + barycentric.z * ef(index.z);
667
683
  #endif
668
- mat2x3 fc = eP(normal, dp1, dp2, uv0-uv2, uv1-uv2, aX);
669
- si.geometryTangent = fc[0];
670
- si.geometryBitangent = fc[1];
671
- mat2x3 gm = fc;
684
+ mat2x3 eV = eI(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
685
+ si.geometryTangent = eV[0];
686
+ si.geometryBitangent = eV[1];
687
+ mat2x3 gp = eV;
672
688
  #ifdef NUM_ANISOTROPY_MAPS
673
689
  if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
674
- vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
675
- vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
676
- vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
677
- gm = eP(normal, dp1, dp2, a-c, b-c, (aX.w == 0.0 ? vec4(0.0) : aX));
690
+ vec2 a = dK(index.x);
691
+ vec2 b = dK(index.y);
692
+ vec2 c = dK(index.z);
693
+ gp = eI(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
678
694
  }
679
695
  #endif
680
- si.directionTangent = gm[0];
681
- si.directionBitangent = gm[1];
696
+ si.directionTangent = gp[0];
697
+ si.directionBitangent = gp[1];
682
698
  #if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
683
- if (pQ >= 0.0) {
684
- int lg = int(pQ);
685
- mat2x3 mU = fc;
686
- if (mapUvChannel[lg] > 0.5) {
687
- vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
688
- vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
689
- vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
690
- mU = eP(normal, dp1, dp2, a-c, b-c,
691
- aX.w == 0.0 ? vec4(0.0) : aX);
692
- }
693
- vec3 decoded = sampleMap(lg, getMapUvSet(lg, uv, dj)).rgb * 2.0 - 1.0;
694
- vec3 mapped = mU[0] * decoded.x * directionMaterial.z
695
- + mU[1] * decoded.y * directionMaterial.w + normal * decoded.z;
699
+ if (qK >= 0.0) {
700
+ int lI = int(qK);
701
+ mat2x3 nI = eV;
702
+ if (mapUvChannel[lI] > 0.5) {
703
+ vec2 a = dK(index.x);
704
+ vec2 b = dK(index.y);
705
+ vec2 c = dK(index.z);
706
+ nI = eI(normal, dp1, dp2, a-c, b-c,
707
+ aT.w == 0.0 ? vec4(0.0) : aT);
708
+ }
709
+ vec3 decoded = sampleMap(lI, getMapUvSet(lI, uv, cT)).rgb * 2.0 - 1.0;
710
+ vec3 mapped = nI[0] * decoded.x * directionMaterial.z
711
+ + nI[1] * decoded.y * directionMaterial.w + normal * decoded.z;
696
712
  if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
697
713
  }
698
714
  #endif
699
715
  }
700
716
 
701
717
  si.uv = uv;
702
- si.uv1 = dj;
718
+ si.uv1 = cT;
703
719
 
704
720
  #ifdef USE_TANGENT
705
- vec3 t0 = texelFetch(tangentBuffer, i0, 0).xyz;
706
- vec3 t1 = texelFetch(tangentBuffer, i1, 0).xyz;
707
- vec3 t2 = texelFetch(tangentBuffer, i2, 0).xyz;
721
+ vec3 t0 = ef(index.x).xyz;
722
+ vec3 t1 = ef(index.y).xyz;
723
+ vec3 t2 = ef(index.z).xyz;
708
724
  si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z * t2);
709
725
  #endif
710
726
  #if defined(NUM_NORMAL_MAPS)
711
727
  vec3 dp1 = tri.p0 - tri.p2;
712
728
  vec3 dp2 = tri.p1 - tri.p2;
713
- vec2 oW = uv0 - uv2;
714
- vec2 oX = uv1 - uv2;
715
- si.normal = pd(
716
- si.materialIndex, uv, normal, dp1, dp2, oW, oX
729
+ vec2 pU = uv0 - uv2;
730
+ vec2 pV = uv1 - uv2;
731
+ si.normal = qa(
732
+ si.materialIndex, uv, normal, dp1, dp2, pU, pV
717
733
  );
718
734
  #else
719
735
  si.normal = normal;
720
736
  #endif
721
737
  }
722
738
 
723
- struct eK {
739
+ struct eF {
724
740
  float t;
725
741
  vec3 barycentric;
726
742
  };
727
743
 
728
- vec4 dJ(int i) {
729
- return lm(bvhBuffer, i, bvhColumns);
744
+ vec4 fetchBVH(int i) {
745
+ return fetchData(bvhBuffer, i, bvhColumns);
730
746
  }
731
747
 
732
- vec4 bF(int i) {
733
- return lm(instancesBuffer, i, instancesColumns);
748
+ vec4 fetchIns(int i) {
749
+ return fetchData(bvhBuffer, instancesOffset + i, bvhColumns);
734
750
  }
735
751
 
736
752
 
737
753
 
738
- uint rY(uint value) {
754
+ uint tl(uint value) {
739
755
  value -= (value >> 1u) & 0x55555555u;
740
756
  value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
741
757
  value = (value + (value >> 4u)) & 0x0f0f0f0fu;
742
758
  return (value * 0x01010101u) >> 24u;
743
759
  }
744
760
 
745
- vec4 fp(uint mE) {
761
+ vec4 fh(uint nk) {
746
762
  return vec4(
747
- float(mE & 0xffu),
748
- float((mE >> 8u) & 0xffu),
749
- float((mE >> 16u) & 0xffu),
750
- float(mE >> 24u)
763
+ float(nk & 0xffu),
764
+ float((nk >> 8u) & 0xffu),
765
+ float((nk >> 16u) & 0xffu),
766
+ float(nk >> 24u)
751
767
  ) / 255.0;
752
768
  }
753
769
 
754
770
 
755
771
 
756
772
 
757
- eK ga(vec3 o, vec3 d, fP tri, int eq, vec3 gY, float tMax) {
758
- eK ti;
773
+ eF fY(vec3 o, vec3 d, fL tri, int ei, vec3 gZ, float tMax) {
774
+ eF ti;
759
775
 
760
776
 
761
777
  vec3 p0t = tri.p0 - o;
@@ -763,20 +779,20 @@ vec3 p1t = tri.p1 - o;
763
779
  vec3 p2t = tri.p2 - o;
764
780
 
765
781
 
766
- if (eq == 0) {
782
+ if (ei == 0) {
767
783
  p0t = p0t.yzx;
768
784
  p1t = p1t.yzx;
769
785
  p2t = p2t.yzx;
770
- } else if (eq == 1) {
786
+ } else if (ei == 1) {
771
787
  p0t = p0t.zxy;
772
788
  p1t = p1t.zxy;
773
789
  p2t = p2t.zxy;
774
790
  }
775
791
 
776
792
 
777
- p0t.xy += gY.xy * p0t.z;
778
- p1t.xy += gY.xy * p1t.z;
779
- p2t.xy += gY.xy * p2t.z;
793
+ p0t.xy += gZ.xy * p0t.z;
794
+ p1t.xy += gZ.xy * p1t.z;
795
+ p2t.xy += gZ.xy * p2t.z;
780
796
 
781
797
 
782
798
  vec3 e = vec3(
@@ -786,9 +802,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
786
802
  );
787
803
 
788
804
  #ifdef DEPTH_QUERY_MODE
789
- vec3 sF = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
805
+ vec3 ua = abs(vec3(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
790
806
  + abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
791
- e = mix(e, vec3(0.0), lessThanEqual(abs(e), sF * 1e-6));
807
+ e = mix(e, vec3(0.0), lessThanEqual(abs(e), ua * 1e-6));
792
808
  #endif
793
809
 
794
810
 
@@ -801,19 +817,19 @@ float det = e.x + e.y + e.z;
801
817
  if (det == 0.0) return ti;
802
818
  #endif
803
819
 
804
- p0t.z *= gY.z;
805
- p1t.z *= gY.z;
806
- p2t.z *= gY.z;
807
- float sw = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
820
+ p0t.z *= gZ.z;
821
+ p1t.z *= gZ.z;
822
+ p2t.z *= gZ.z;
823
+ float tQ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
808
824
 
809
825
 
810
- if (abs(sw) > abs(tMax * det)) {
826
+ if (abs(tQ) > abs(tMax * det)) {
811
827
  return ti;
812
828
  }
813
829
 
814
- float tN = 1. / det;
815
- ti.t = sw * tN;
816
- ti.barycentric = e * tN;
830
+ float vu = 1. / det;
831
+ ti.t = tQ * vu;
832
+ ti.barycentric = e * vu;
817
833
 
818
834
  return ti;
819
835
  }
@@ -824,18 +840,18 @@ vec3 max;
824
840
  };
825
841
 
826
842
 
827
- vec3 fo(vec3 d) {
843
+ vec3 traversalInverse(vec3 d) {
828
844
  #ifdef DEPTH_QUERY_MODE
829
- vec3 aq = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
830
- return 1.0 / aq;
845
+ vec3 ah = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
846
+ return 1.0 / ah;
831
847
  #else
832
848
  return 1.0 / d;
833
849
  #endif
834
850
  }
835
851
 
836
- vec3 fk(vec3 gr, vec3 o) {
852
+ vec3 ff(vec3 invD, vec3 o) {
837
853
  #ifdef DEPTH_QUERY_MODE
838
- return abs(gr) * max(vec3(1.0), abs(o)) * 1e-6;
854
+ return abs(invD) * max(vec3(1.0), abs(o)) * 1e-6;
839
855
  #else
840
856
  return vec3(0.0);
841
857
  #endif
@@ -843,21 +859,21 @@ return vec3(0.0);
843
859
 
844
860
 
845
861
 
846
- float cU(vec3 o, vec3 d, vec3 xq, vec3 xp, float tMax) {
862
+ float bP(vec3 o, vec3 d, vec3 zT, vec3 zS, float tMax) {
847
863
  #ifdef DEPTH_QUERY_MODE
848
- vec3 gr = fo(d);
849
- vec3 wG = (xq - o) * gr;
850
- vec3 wI = (xp - o) * gr;
851
- vec3 padding = fk(gr, o);
864
+ vec3 invD = traversalInverse(d);
865
+ vec3 zi = (zT - o) * invD;
866
+ vec3 zj = (zS - o) * invD;
867
+ vec3 padding = ff(invD, o);
852
868
  #else
853
- vec3 wG = (xq - o) / d;
854
- vec3 wI = (xp - o) / d;
869
+ vec3 zi = (zT - o) / d;
870
+ vec3 zj = (zS - o) / d;
855
871
  vec3 padding = vec3(0.0);
856
872
  #endif
857
- vec3 nJ = min(wG, wI) - padding;
858
- vec3 sY = max(wG, wI) + padding;
859
- float t0 = max(nJ.x, max(nJ.y, nJ.z));
860
- float t1 = min(sY.x, min(sY.y, sY.z));
873
+ vec3 ot = min(zi, zj) - padding;
874
+ vec3 uA = max(zi, zj) + padding;
875
+ float t0 = max(ot.x, max(ot.y, ot.z));
876
+ float t1 = min(uA.x, min(uA.y, uA.z));
861
877
 
862
878
  return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
863
879
  }
@@ -866,12 +882,12 @@ int maxDimension(vec3 v) {
866
882
  return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
867
883
  }
868
884
 
869
- vec3 nk(vec3 d, int eq) {
885
+ vec3 nV(vec3 d, int ei) {
870
886
 
871
887
 
872
- if (eq == 0) {
888
+ if (ei == 0) {
873
889
  return vec3(-d.y, -d.z, 1.0) / d.x;
874
- } else if (eq == 1) {
890
+ } else if (ei == 1) {
875
891
  return vec3(-d.z, -d.x, 1.0) / d.y;
876
892
  } else {
877
893
  return vec3(-d.x, -d.y, 1.0) / d.z;
@@ -886,39 +902,39 @@ if (isEmptyScene) {
886
902
  return;
887
903
  }
888
904
 
889
- int eq = maxDimension(abs(ray.d));
890
- vec3 gY = nk(ray.d, eq);
891
- int ap;
905
+ int ei = maxDimension(abs(ray.d));
906
+ vec3 gZ = nV(ray.d, ei);
907
+ int am;
892
908
 
893
909
  ${getBVHTraverseCode(glsl `
894
910
  si.triangleIndex = triangleIndex;
895
- mk = tri;
896
- hS = faceNormal;
897
- aC = hit.barycentric;
898
- hK = index;
899
- sj = true;
900
- ap = bY;
911
+ mL = tri;
912
+ hU = faceNormal;
913
+ aw = hit.barycentric;
914
+ hL = index;
915
+ tD = true;
916
+ am = bK;
901
917
  `)}
902
918
 
903
- if (sj) {
904
- si.instanceIndex = ap;
905
- si.materialIndex = int(ah(floatBitsToInt(bF(ap * ${INSTANCE_VEC4_STRIDE}).z)).x);
919
+ if (tD) {
920
+ si.instanceIndex = am;
921
+ si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
906
922
 
907
- hH(si, mk, aC, hK);
923
+ hI(si, mL, aw, hL);
908
924
  mat4 l2w = mat4(
909
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 5),
910
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 6),
911
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 7),
912
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 8)
925
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
926
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
927
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
928
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
913
929
  );
914
930
  mat4 w2l = mat4(
915
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 1),
916
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 2),
917
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 3),
918
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 4)
931
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
932
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
933
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
934
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
919
935
  );
920
936
  mat3 aH = transpose(mat3(w2l));
921
- si.faceNormal = normalize(aH * hS);
937
+ si.faceNormal = normalize(aH * hU);
922
938
  si.vertexNormal = normalize(aH * si.vertexNormal);
923
939
  si.normal = normalize(aH * si.normal);
924
940
  #ifdef USE_COAT_NORMAL_FRAMES
@@ -947,42 +963,42 @@ return;
947
963
  }
948
964
 
949
965
  bool doubleSided = true;
950
- int eq = maxDimension(abs(ray.d));
951
- vec3 gY = nk(ray.d, eq);
952
- int ap;
966
+ int ei = maxDimension(abs(ray.d));
967
+ vec3 gZ = nV(ray.d, ei);
968
+ int am;
953
969
 
954
970
  ${getBVHTraverseCode(glsl `
955
971
  si.triangleIndex = triangleIndex;
956
- mk = tri;
957
- hS = faceNormal;
958
- aC = hit.barycentric;
959
- hK = index;
960
- sj = true;
961
- ap = bY;
972
+ mL = tri;
973
+ hU = faceNormal;
974
+ aw = hit.barycentric;
975
+ hL = index;
976
+ tD = true;
977
+ am = bK;
962
978
  `, glsl `
963
- if (bY != instanceIndex) {
979
+ if (bK != instanceIndex) {
964
980
  continue;
965
981
  }
966
982
  `, 'maxDistance')}
967
983
 
968
- if (sj) {
969
- si.instanceIndex = ap;
970
- si.materialIndex = int(ah(floatBitsToInt(bF(ap * ${INSTANCE_VEC4_STRIDE}).z)).x);
971
- hH(si, mk, aC, hK);
984
+ if (tD) {
985
+ si.instanceIndex = am;
986
+ si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
987
+ hI(si, mL, aw, hL);
972
988
  mat4 l2w = mat4(
973
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 5),
974
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 6),
975
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 7),
976
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 8)
989
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
990
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
991
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 7),
992
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 8)
977
993
  );
978
994
  mat4 w2l = mat4(
979
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 1),
980
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 2),
981
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 3),
982
- bF(ap * ${INSTANCE_VEC4_STRIDE} + 4)
995
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 1),
996
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
997
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
998
+ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
983
999
  );
984
1000
  mat3 aH = transpose(mat3(w2l));
985
- si.faceNormal = normalize(aH * hS);
1001
+ si.faceNormal = normalize(aH * hU);
986
1002
  si.vertexNormal = normalize(aH * si.vertexNormal);
987
1003
  si.normal = normalize(aH * si.normal);
988
1004
  #ifdef USE_COAT_NORMAL_FRAMES
@@ -1002,35 +1018,32 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
1002
1018
  }
1003
1019
  }
1004
1020
 
1005
- bool intersectSceneShadow(in Ray ray, float lightDistance, int kn) {
1021
+ bool intersectSceneShadow(in Ray ray, float lightDistance, int kx) {
1006
1022
 
1007
1023
  if (isEmptyScene) {
1008
1024
  return false;
1009
1025
  }
1010
1026
 
1011
1027
  bool doubleSided = true;
1012
- int eq = maxDimension(abs(ray.d));
1013
- vec3 gY = nk(ray.d, eq);
1028
+ int ei = maxDimension(abs(ray.d));
1029
+ vec3 gZ = nV(ray.d, ei);
1014
1030
 
1015
1031
  ${getBVHTraverseCode(glsl `
1016
1032
 
1017
1033
 
1018
- bool jS = true;
1034
+ bool kc = true;
1019
1035
  vec3 barycentric = hit.barycentric;
1020
1036
  vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
1021
1037
 
1022
- if (jS) {
1038
+ if (kc) {
1023
1039
  #ifdef HAS_ALPHA
1024
- int materialIndex = int(ah(floatBitsToInt(bF(bY * ${INSTANCE_VEC4_STRIDE}).z)).x);
1025
- ivec2 i0 = hd(index.x, vertexColumns);
1026
- ivec2 i1 = hd(index.y, vertexColumns);
1027
- ivec2 i2 = hd(index.z, vertexColumns);
1028
- ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
1029
- ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
1030
- ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
1040
+ int materialIndex = int(af(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)).x);
1041
+ ivec4 m0 = dT(index.x);
1042
+ ivec4 m1 = dT(index.y);
1043
+ ivec4 m2 = dT(index.z);
1031
1044
 
1032
1045
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
1033
- materialIndex = fF(m0, m1, m2, barycentric);
1046
+ materialIndex = fv(m0, m1, m2, barycentric);
1034
1047
  }
1035
1048
 
1036
1049
  int ii = materialIndex * MAT_DATA_SIZE;
@@ -1040,16 +1053,16 @@ float alpha = fetchMatData(ii + MAT_ROW_ALPHA_FILM).r;
1040
1053
  if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {
1041
1054
  int diffuseMapIndex = int(fetchMatData(ii + MAT_ROW_METALLIC_MAPS).z);
1042
1055
  if (diffuseMapIndex >= 0) {
1043
- vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1044
- vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1045
- vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
1056
+ vec2 uv0 = er(index.x);
1057
+ vec2 uv1 = er(index.y);
1058
+ vec2 uv2 = er(index.z);
1046
1059
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1047
- vec4 mw = fetchMatData(ii + MAT_ROW_UV);
1048
- int uvProjection = int(mw.r);
1060
+ vec4 mU = fetchMatData(ii + MAT_ROW_UV);
1061
+ int uvProjection = int(mU.r);
1049
1062
  if (uvProjection > 0) {
1050
- uv = gU(uvProjection, position, hS, mw.zw);
1063
+ uv = gW(uvProjection, position, hU, mU.zw);
1051
1064
  } else {
1052
- uv *= mw.zw;
1065
+ uv *= mU.zw;
1053
1066
  }
1054
1067
 
1055
1068
  alpha *= sampleMap(diffuseMapIndex, uv).a;
@@ -1059,36 +1072,36 @@ alpha *= sampleMap(diffuseMapIndex, uv).a;
1059
1072
  #ifdef NUM_ALPHA_MAPS
1060
1073
  int alphaMapIndex = int(fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).z);
1061
1074
  if (alphaMapIndex >= 0) {
1062
- vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1063
- vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1064
- vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
1075
+ vec2 uv0 = er(index.x);
1076
+ vec2 uv1 = er(index.y);
1077
+ vec2 uv2 = er(index.z);
1065
1078
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1066
- vec4 mw = fetchMatData(ii + MAT_ROW_UV);
1067
- int uvProjection = int(mw.r);
1079
+ vec4 mU = fetchMatData(ii + MAT_ROW_UV);
1080
+ int uvProjection = int(mU.r);
1068
1081
  if (uvProjection > 0) {
1069
- uv = gU(uvProjection, position, hS, mw.zw);
1082
+ uv = gW(uvProjection, position, hU, mU.zw);
1070
1083
  } else {
1071
- uv *= mw.zw;
1084
+ uv *= mU.zw;
1072
1085
  }
1073
1086
  alpha *= sampleMap(alphaMapIndex, uv).g;
1074
1087
  }
1075
1088
  #endif
1076
1089
  float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
1077
- alpha = mb(
1090
+ alpha = mB(
1078
1091
  alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
1079
1092
  );
1080
- if (eC(0u) > alpha) {
1093
+ if (cm(0u) > alpha) {
1081
1094
 
1082
1095
  tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1083
- jS = false;
1096
+ kc = false;
1084
1097
  }
1085
1098
  #endif
1086
1099
  }
1087
- if (jS) {
1100
+ if (kc) {
1088
1101
  return true;
1089
1102
  }
1090
1103
  `, glsl `
1091
- if (triangleIndex == kn) {
1104
+ if (triangleIndex == kx) {
1092
1105
  continue;
1093
1106
  }
1094
1107
  `, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}