@meimu/mutracer 0.3.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 (304) 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/THIRD_PARTY_NOTICES.md +18 -4
  5. package/dist/assets/bvh.worker.js +1 -1
  6. package/dist/mutracer.umd.js +6260 -5580
  7. package/docs/api.md +45 -18
  8. package/docs/materials.md +4 -2
  9. package/docs/performance.md +7 -0
  10. package/docs/post-processing.md +62 -9
  11. package/docs/progressive-rendering.md +3 -0
  12. package/docs/sampling.md +4 -0
  13. package/docs/technical/acceleration.md +52 -0
  14. package/docs/technical/aovs.md +79 -0
  15. package/docs/technical/caustics.md +109 -0
  16. package/docs/technical/continuous-spectrum.md +29 -0
  17. package/docs/technical/display-upscale.md +82 -0
  18. package/docs/technical/openpbr.md +99 -0
  19. package/docs/technical/pbrt-import.md +168 -0
  20. package/docs/technical/tiling.md +74 -0
  21. package/docs/technical/webgl.md +53 -0
  22. package/docs/viewer.md +11 -1
  23. package/lib/Display.d.ts +19 -5
  24. package/lib/Display.js +10 -7
  25. package/lib/Display.js.map +1 -1
  26. package/lib/Engine.d.ts +2 -1
  27. package/lib/Engine.js +30 -2
  28. package/lib/Engine.js.map +1 -1
  29. package/lib/Render.d.ts +20 -11
  30. package/lib/Render.js +32 -7
  31. package/lib/Render.js.map +1 -1
  32. package/lib/main.d.ts +3 -1
  33. package/lib/main.js +1 -0
  34. package/lib/main.js.map +1 -1
  35. package/lib/oidn.d.ts +1 -1
  36. package/lib/renderer/AovPrimitiveCache.js +39 -8
  37. package/lib/renderer/AovPrimitiveCache.js.map +1 -1
  38. package/lib/renderer/DisplayPostProcess.d.ts +8 -3
  39. package/lib/renderer/DisplayPostProcess.js +51 -18
  40. package/lib/renderer/DisplayPostProcess.js.map +1 -1
  41. package/lib/renderer/MaterialData.js +7 -2
  42. package/lib/renderer/MaterialData.js.map +1 -1
  43. package/lib/renderer/RenderingPipeline.d.ts +7 -1
  44. package/lib/renderer/RenderingPipeline.js.map +1 -1
  45. package/lib/renderer/TileRender.d.ts +2 -2
  46. package/lib/renderer/TileRender.js +128 -7
  47. package/lib/renderer/TileRender.js.map +1 -1
  48. package/lib/renderer/WGPUAov.d.ts +6 -1
  49. package/lib/renderer/WGPUAov.js +108 -14
  50. package/lib/renderer/WGPUAov.js.map +1 -1
  51. package/lib/renderer/WGPUCanvasSurface.js +12 -1
  52. package/lib/renderer/WGPUCanvasSurface.js.map +1 -1
  53. package/lib/renderer/WGPUEnvMapDistribution.js +19 -19
  54. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  55. package/lib/renderer/WGPURayTraceOutput.js +12 -12
  56. package/lib/renderer/WGPURayTracePass.d.ts +17 -4
  57. package/lib/renderer/WGPURayTracePass.js +194 -71
  58. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  59. package/lib/renderer/WGPURenderingPipeline.js +46 -40
  60. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  61. package/lib/renderer/WebGLAov.js +3 -3
  62. package/lib/renderer/WebGLAov.js.map +1 -1
  63. package/lib/renderer/WebGLFullQuadPass.d.ts +1 -1
  64. package/lib/renderer/WebGLFullQuadPass.js +8 -2
  65. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  66. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  67. package/lib/renderer/WebGLJNLMDenoiser.js.map +1 -1
  68. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  69. package/lib/renderer/WebGLRayTracePass.d.ts +14 -10
  70. package/lib/renderer/WebGLRayTracePass.js +115 -111
  71. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  72. package/lib/renderer/WebGLRenderingPipeline.js +10 -3
  73. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  74. package/lib/renderer/WebGLSkyBaker.js +57 -57
  75. package/lib/renderer/aov.d.ts +13 -1
  76. package/lib/renderer/aov.js +21 -2
  77. package/lib/renderer/aov.js.map +1 -1
  78. package/lib/renderer/aovDisplay.js +2 -2
  79. package/lib/renderer/aovDisplay.js.map +1 -1
  80. package/lib/renderer/binnedSahBvh.d.ts +2 -1
  81. package/lib/renderer/binnedSahBvh.js +24 -17
  82. package/lib/renderer/binnedSahBvh.js.map +1 -1
  83. package/lib/renderer/bvhAccel.d.ts +3 -1
  84. package/lib/renderer/bvhAccel.js +36 -6
  85. package/lib/renderer/bvhAccel.js.map +1 -1
  86. package/lib/renderer/cameraUniform.d.ts +1 -1
  87. package/lib/renderer/cameraUniform.js +6 -2
  88. package/lib/renderer/cameraUniform.js.map +1 -1
  89. package/lib/renderer/compactVertices.d.ts +14 -0
  90. package/lib/renderer/compactVertices.js +124 -0
  91. package/lib/renderer/compactVertices.js.map +1 -0
  92. package/lib/renderer/easu.d.ts +11 -0
  93. package/lib/renderer/easu.js +156 -0
  94. package/lib/renderer/easu.js.map +1 -0
  95. package/lib/renderer/geometryUpdateState.d.ts +1 -0
  96. package/lib/renderer/geometryUpdateState.js.map +1 -1
  97. package/lib/renderer/geometryUpdates.js +3 -2
  98. package/lib/renderer/geometryUpdates.js.map +1 -1
  99. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  100. package/lib/renderer/glsl/aovReflectance.glsl.js +35 -35
  101. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  102. package/lib/renderer/glsl/aovTrace.frag.js +44 -36
  103. package/lib/renderer/glsl/aovTrace.frag.js.map +1 -1
  104. package/lib/renderer/glsl/chunks/cameraProjection.glsl.d.ts +2 -0
  105. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js +16 -0
  106. package/lib/renderer/glsl/chunks/cameraProjection.glsl.js.map +1 -0
  107. package/lib/renderer/glsl/chunks/cameraRay.glsl.d.ts +1 -1
  108. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -16
  109. package/lib/renderer/glsl/chunks/cameraRay.glsl.js.map +1 -1
  110. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +8 -8
  111. package/lib/renderer/glsl/chunks/envMap.glsl.js +67 -67
  112. package/lib/renderer/glsl/chunks/intersect.glsl.js +390 -375
  113. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  114. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +120 -120
  115. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +562 -562
  116. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  117. package/lib/renderer/glsl/chunks/random.glsl.js +4 -4
  118. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +37 -35
  119. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  120. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +70 -74
  121. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  122. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -1
  123. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +107 -88
  124. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  125. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +11 -11
  126. package/lib/renderer/glsl/chunks/sampling.glsl.js +77 -77
  127. package/lib/renderer/glsl/chunks/sobol.glsl.js +70 -70
  128. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.d.ts +6 -0
  129. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js +47 -0
  130. package/lib/renderer/glsl/chunks/spectralPrefix.glsl.js.map +1 -0
  131. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  132. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  133. package/lib/renderer/glsl/depthQuery.frag.js +12 -6
  134. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  135. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  136. package/lib/renderer/glsl/rayTrace.frag.js +233 -170
  137. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  138. package/lib/renderer/glsl/shadowCatcher.frag.js +10 -9
  139. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  140. package/lib/renderer/glsl/webglPipeline.frag.js +58 -58
  141. package/lib/renderer/gpuMemory.js +1 -1
  142. package/lib/renderer/gpuMemory.js.map +1 -1
  143. package/lib/renderer/openPbrEnergyLut.d.ts +2 -1
  144. package/lib/renderer/openPbrEnergyLut.js +18 -1
  145. package/lib/renderer/openPbrEnergyLut.js.map +1 -1
  146. package/lib/renderer/pathLimits.d.ts +5 -4
  147. package/lib/renderer/pathLimits.js +6 -5
  148. package/lib/renderer/pathLimits.js.map +1 -1
  149. package/lib/renderer/prepareMeshBVH.d.ts +2 -0
  150. package/lib/renderer/prepareMeshBVH.js +5 -3
  151. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  152. package/lib/renderer/progressiveScheduler.js +1 -1
  153. package/lib/renderer/progressiveScheduler.js.map +1 -1
  154. package/lib/renderer/renderPipeline.d.ts +4 -0
  155. package/lib/renderer/renderPipeline.js +1 -0
  156. package/lib/renderer/renderPipeline.js.map +1 -1
  157. package/lib/renderer/researchTransport.d.ts +1 -1
  158. package/lib/renderer/researchTransport.js.map +1 -1
  159. package/lib/renderer/sceneAssembly.d.ts +1 -1
  160. package/lib/renderer/sceneAssembly.js +4 -3
  161. package/lib/renderer/sceneAssembly.js.map +1 -1
  162. package/lib/renderer/sceneChangeDetector.d.ts +1 -1
  163. package/lib/renderer/sceneChangeDetector.js +3 -1
  164. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  165. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  166. package/lib/renderer/sceneLayoutSchema.js +2 -2
  167. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  168. package/lib/renderer/scenePreparation.d.ts +3 -2
  169. package/lib/renderer/scenePreparation.js +18 -2
  170. package/lib/renderer/scenePreparation.js.map +1 -1
  171. package/lib/renderer/scratchSampling.js +6 -6
  172. package/lib/renderer/spectrum.js +2 -2
  173. package/lib/renderer/staticBvhPreparation.d.ts +9 -0
  174. package/lib/renderer/staticBvhPreparation.js +8 -2
  175. package/lib/renderer/staticBvhPreparation.js.map +1 -1
  176. package/lib/renderer/surfaceHit.d.ts +10 -0
  177. package/lib/renderer/surfaceHit.js +22 -0
  178. package/lib/renderer/surfaceHit.js.map +1 -0
  179. package/lib/renderer/tangentRequirements.d.ts +2 -0
  180. package/lib/renderer/tangentRequirements.js +7 -0
  181. package/lib/renderer/tangentRequirements.js.map +1 -0
  182. package/lib/renderer/textureAtlas.d.ts +4 -0
  183. package/lib/renderer/textureAtlas.js +48 -2
  184. package/lib/renderer/textureAtlas.js.map +1 -1
  185. package/lib/renderer/webgl.js +4 -0
  186. package/lib/renderer/webgl.js.map +1 -1
  187. package/lib/renderer/webglVertexAttributes.d.ts +17 -0
  188. package/lib/renderer/webglVertexAttributes.js +44 -0
  189. package/lib/renderer/webglVertexAttributes.js.map +1 -0
  190. package/lib/renderer/wgpuBindlessSource.js +2 -2
  191. package/lib/renderer/wgpuMaterialConstants.js +4 -3
  192. package/lib/renderer/wgpuMaterialConstants.js.map +1 -1
  193. package/lib/renderer/wgpuSceneUniform.js +2 -2
  194. package/lib/renderer/wgpuSceneUniform.js.map +1 -1
  195. package/lib/renderer/wgpuShaderSource.d.ts +15 -0
  196. package/lib/renderer/wgpuShaderSource.js +1 -1
  197. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  198. package/lib/renderer/wgsl/aovCompact.wgsl.d.ts +4 -0
  199. package/lib/renderer/wgsl/aovCompact.wgsl.js +26 -0
  200. package/lib/renderer/wgsl/aovCompact.wgsl.js.map +1 -0
  201. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  202. package/lib/renderer/wgsl/aovReflectance.wgsl.js +39 -39
  203. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  204. package/lib/renderer/wgsl/aovResolve.wgsl.d.ts +4 -0
  205. package/lib/renderer/wgsl/aovResolve.wgsl.js +21 -2
  206. package/lib/renderer/wgsl/aovResolve.wgsl.js.map +1 -1
  207. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +2 -2
  208. package/lib/renderer/wgsl/aovSnapshot.wgsl.js.map +1 -1
  209. package/lib/renderer/wgsl/aovTrace.wgsl.js +31 -31
  210. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.d.ts +2 -0
  211. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js +56 -0
  212. package/lib/renderer/wgsl/aovTraceDisplay.wgsl.js.map +1 -0
  213. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  214. package/lib/renderer/wgsl/causticLight.compute.d.ts +1 -1
  215. package/lib/renderer/wgsl/causticLight.compute.js +121 -119
  216. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -1
  217. package/lib/renderer/wgsl/chunks/background.wgsl.js +46 -46
  218. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +4 -4
  219. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +3 -3
  220. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +3 -3
  221. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  222. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +30 -30
  223. package/lib/renderer/wgsl/chunks/intersect.wgsl.d.ts +6 -2
  224. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +550 -542
  225. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  226. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.d.ts +1 -1
  227. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +18 -16
  228. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js.map +1 -1
  229. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  230. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +70 -69
  231. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  232. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +593 -593
  233. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +118 -118
  234. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  235. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +4 -1
  236. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +32 -26
  237. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  238. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +114 -114
  239. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  240. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +159 -137
  241. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  242. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +8 -8
  243. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +74 -74
  244. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +74 -74
  245. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.d.ts +6 -0
  246. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js +66 -0
  247. package/lib/renderer/wgsl/chunks/spectralPrefix.wgsl.js.map +1 -0
  248. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  249. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.d.ts +2 -0
  250. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js +61 -0
  251. package/lib/renderer/wgsl/chunks/vertexAttributes.wgsl.js.map +1 -0
  252. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -0
  253. package/lib/renderer/wgsl/compose.frag.wgsl.js +99 -97
  254. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  255. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  256. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  257. package/lib/renderer/wgsl/depthQuery.wgsl.js +11 -2
  258. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  259. package/lib/renderer/wgsl/easu.wgsl.d.ts +2 -0
  260. package/lib/renderer/wgsl/easu.wgsl.js +80 -0
  261. package/lib/renderer/wgsl/easu.wgsl.js.map +1 -0
  262. package/lib/renderer/wgsl/easuDetail.wgsl.d.ts +21 -0
  263. package/lib/renderer/wgsl/easuDetail.wgsl.js +230 -0
  264. package/lib/renderer/wgsl/easuDetail.wgsl.js.map +1 -0
  265. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  266. package/lib/renderer/wgsl/jnlm.compute.js.map +1 -1
  267. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  268. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  269. package/lib/renderer/wgsl/photonMap.compute.js +89 -89
  270. package/lib/renderer/wgsl/proceduralSky.compute.js +61 -61
  271. package/lib/renderer/wgsl/rayTrace.compute.d.ts +14 -0
  272. package/lib/renderer/wgsl/rayTrace.compute.js +395 -333
  273. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  274. package/lib/scene/Scene.js.map +1 -1
  275. package/lib/settings/render.d.ts +11 -0
  276. package/lib/settings/render.js +1 -0
  277. package/lib/settings/render.js.map +1 -1
  278. package/lib/util/fromTHREE.js +21 -14
  279. package/lib/util/fromTHREE.js.map +1 -1
  280. package/lib/version.d.ts +1 -1
  281. package/lib/version.js +1 -1
  282. package/lib/version.js.map +1 -1
  283. package/package.json +5 -2
  284. package/lib/oidnBundledWeights.cdn.d.ts +0 -2
  285. package/lib/oidnBundledWeights.cdn.js +0 -5
  286. package/lib/oidnBundledWeights.cdn.js.map +0 -1
  287. package/lib/renderer/bvh.worker.d.ts +0 -1
  288. package/lib/renderer/bvh.worker.js +0 -16
  289. package/lib/renderer/bvh.worker.js.map +0 -1
  290. package/lib/renderer/bvhWorkerBuild.d.ts +0 -13
  291. package/lib/renderer/bvhWorkerBuild.js +0 -17
  292. package/lib/renderer/bvhWorkerBuild.js.map +0 -1
  293. package/lib/renderer/lightCore.d.ts +0 -12
  294. package/lib/renderer/lightCore.js +0 -13
  295. package/lib/renderer/lightCore.js.map +0 -1
  296. package/lib/renderer/materialCore.d.ts +0 -8
  297. package/lib/renderer/materialCore.js +0 -9
  298. package/lib/renderer/materialCore.js.map +0 -1
  299. package/lib/scene/PixelTexture.d.ts +0 -6
  300. package/lib/scene/PixelTexture.js +0 -10
  301. package/lib/scene/PixelTexture.js.map +0 -1
  302. package/lib/util/studioLighting.d.ts +0 -18
  303. package/lib/util/studioLighting.js +0 -36
  304. package/lib/util/studioLighting.js.map +0 -1
@@ -12,25 +12,25 @@ int triangleIndex = primitiveOffset + k;
12
12
  ${skipTriangleCode}
13
13
  vec4 r3 = fetchBVH(triangleIndex);
14
14
  ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
15
- fw tri = fw(
15
+ fL tri = fL(
16
16
  fetchData(positionBuffer, index.x, vertexColumns).xyz,
17
17
  fetchData(positionBuffer, index.y, vertexColumns).xyz,
18
18
  fetchData(positionBuffer, index.z, vertexColumns).xyz
19
19
  );
20
- ev hit = fM(o, d, tri, dZ, gH, 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 ku = int(af(
27
+ int lc = int(af(
28
28
  floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)
29
29
  ).x);
30
- bool iL = fetchMatData(
31
- ku * 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 && !iL && dot(faceNormal, d) > 0.0) {
33
+ if (!doubleSided && !jm && dot(faceNormal, d) > 0.0) {
34
34
  continue;
35
35
  }
36
36
 
@@ -41,31 +41,31 @@ ${handleHitCode}
41
41
  return glsl `
42
42
  ivec2 stack[STACK_SIZE];
43
43
  int top = -1;
44
- int ug = -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 sd = false;
51
- vec3 hz;
50
+ bool tD = false;
51
+ vec3 hU;
52
52
  vec3 aw;
53
- ivec3 hr;
53
+ ivec3 hL;
54
54
 
55
- fw lR;
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
66
  int bK = node.y;
67
67
 
68
- if (bK != ug) {
68
+ if (bK != vQ) {
69
69
  if (bK < 0) {
70
70
  o = ray.o;
71
71
  d = ray.d;
@@ -80,111 +80,111 @@ fetchIns(bK * ${INSTANCE_VEC4_STRIDE} + 4)
80
80
  o = (w2l * vec4(ray.o, 1.0)).xyz;
81
81
  d = (w2l * vec4(ray.d, 0.0)).xyz;
82
82
  }
83
- dZ = maxDimension(abs(d));
84
- gH = mU(d, dZ);
85
- ug = bK;
83
+ ei = maxDimension(abs(d));
84
+ gZ = nV(d, ei);
85
+ vQ = bK;
86
86
  }
87
87
 
88
88
  int bufferOff = bK < 0 ? 0 : blasOffset;
89
- uint fK = bK < 0 ? 0u : floatBitsToUint(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).x);
90
- int gN = int(fK >> 30u);
91
- int eQ = int(fK & 0x3fffffffu);
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 (gN == 3) {
96
- uint hT = uint(node.x);
97
- if ((hT & 0x80000000u) != 0u) {
98
- primitiveCount = int((hT >> 23u) & 0xffu);
99
- primitiveOffset = bufferOff + eQ + int(hT & 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
102
  int i = node.x + bufferOff;
103
- vec4 jF = fetchBVH(i);
104
- vec4 fF = fetchBVH(i + 1);
105
- vec4 nI = fetchBVH(i + 2);
106
- vec4 nJ = fetchBVH(i + 3);
107
- vec4 nK = fetchBVH(i + 4);
108
- uint header = floatBitsToUint(jF.w);
109
- int sD = int(header << 24u) >> 24;
110
- int sE = int((header >> 8u) << 24u) >> 24;
111
- int sF = int((header >> 16u) << 24u) >> 24;
112
- vec3 hG = vec3(
113
- uintBitsToFloat(uint(sD + 127) << 23u),
114
- uintBitsToFloat(uint(sE + 127) << 23u),
115
- uintBitsToFloat(uint(sF + 127) << 23u)
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(fF.x);
118
- uint ps = floatBitsToUint(fF.y);
117
+ uint childBase = floatBitsToUint(fR.x);
118
+ uint qE = floatBitsToUint(fR.y);
119
119
  uint internalMask = header >> 24u;
120
- uint wm = (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 gF[12] = uint[12](
124
- floatBitsToUint(nI.x), floatBitsToUint(nI.y),
125
- floatBitsToUint(nI.z), floatBitsToUint(nI.w),
126
- floatBitsToUint(nJ.x), floatBitsToUint(nJ.y),
127
- floatBitsToUint(nJ.z), floatBitsToUint(nJ.w),
128
- floatBitsToUint(nK.x), floatBitsToUint(nK.y),
129
- floatBitsToUint(nK.z), floatBitsToUint(nK.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) ^ wm;
134
- uint tW = slot >= 4u
135
- ? floatBitsToUint(fF.w)
136
- : floatBitsToUint(fF.z);
137
- uint meta = (tW >> ((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 mt = (slot & 3u) * 8u;
140
- uint lh = slot >> 2u;
141
- vec3 ve = vec3(
142
- float((gF[lh] >> mt) & 0xffu),
143
- float((gF[2u + lh] >> mt) & 0xffu),
144
- float((gF[4u + lh] >> mt) & 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 vd = vec3(
147
- float((gF[6u + lh] >> mt) & 0xffu),
148
- float((gF[8u + lh] >> mt) & 0xffu),
149
- float((gF[10u + lh] >> mt) & 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 xn = jF.xyz + ve * hG;
152
- vec3 xm = jF.xyz + vd * hG;
153
- if (cH(o, d, xn, xm, tMax) <= 0.0) continue;
154
- uint jH = meta & 0x1fu;
155
- if (jH >= 24u) {
156
- uint oa = internalMask & ((1u << slot) - 1u);
157
- uint ur = childBase + rT(oa);
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
- eQ + int(ur * 5u), bK
159
+ fc + int(wb * 5u), bK
160
160
  );
161
161
  }
162
162
  else {
163
- uint triangleCount = rT(meta >> 5u);
164
- uint sT = ps + jH;
165
- uint xC = 0x80000000u |
163
+ uint triangleCount = tl(meta >> 5u);
164
+ uint ut = qE + kl;
165
+ uint zC = 0x80000000u |
166
166
  (triangleCount << 23u) |
167
- (sT & 0x007fffffu);
168
- stack[++top] = ivec2(int(xC), bK);
167
+ (ut & 0x007fffffu);
168
+ stack[++top] = ivec2(int(zC), bK);
169
169
  }
170
170
  }
171
171
  }
172
172
  }
173
- else if (gN == 2) {
173
+ else if (hj == 2) {
174
174
  int i = node.x + bufferOff;
175
- vec4 xq = fetchBVH(i);
176
- vec4 xr = fetchBVH(i + 1);
177
- vec4 xs = fetchBVH(i + 2);
178
- vec4 xt = fetchBVH(i + 3);
179
- primitiveCount = int(floatBitsToUint(xs.w));
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 = bufferOff + eQ + int(floatBitsToUint(xt.w));
181
+ primitiveOffset = bufferOff + fc + int(floatBitsToUint(zu.w));
182
182
  }
183
183
  else {
184
- int left = eQ + int(floatBitsToUint(xq.w) * 4u);
185
- int right = eQ + int(floatBitsToUint(xr.w) * 4u);
186
- float d0 = cH(o, d, xq.xyz, xr.xyz, tMax);
187
- float d1 = cH(o, d, xs.xyz, xt.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
189
  if (d0 > 0.0) stack[++top] = ivec2(left, bK);
190
190
  if (d1 > 0.0) stack[++top] = ivec2(right, bK);
@@ -195,62 +195,62 @@ if (d0 > 0.0) stack[++top] = ivec2(left, bK);
195
195
  }
196
196
  }
197
197
  }
198
- else if (gN == 1) {
199
- uint hT = uint(node.x);
200
- if ((hT & 0x80000000u) != 0u) {
201
- primitiveCount = int((hT >> 23u) & 0xffu);
202
- primitiveOffset = bufferOff + eQ + int(hT & 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
205
  int i = node.x + bufferOff;
206
- vec4 vW = fetchBVH(i);
207
- vec4 sq = fetchBVH(i + 1);
208
- vec4 qI = fetchBVH(i + 2);
209
- vec4 oF = fetchBVH(i + 3);
210
- vec3 nodeMin = vW.xyz;
211
- vec3 ea = vec3(vW.w, sq.x, sq.y);
212
- uint mF[4] = uint[4](
213
- floatBitsToUint(sq.z), floatBitsToUint(sq.w),
214
- floatBitsToUint(qI.x), floatBitsToUint(qI.y)
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 wV = eX(floatBitsToUint(qI.z));
217
- vec4 wW = eX(floatBitsToUint(qI.w));
218
- vec4 wX = eX(floatBitsToUint(oF.x));
219
- vec4 wR = eX(floatBitsToUint(oF.y));
220
- vec4 wS = eX(floatBitsToUint(oF.z));
221
- vec4 wU = eX(floatBitsToUint(oF.w));
222
- vec3 gb = eW(d);
223
- vec3 padding = eU(gb, o);
224
- vec4 tx0 = (nodeMin.x + wV * ea.x - o.x) * gb.x;
225
- vec4 tx1 = (nodeMin.x + wR * ea.x - o.x) * gb.x;
226
- vec4 ty0 = (nodeMin.y + wW * ea.y - o.y) * gb.y;
227
- vec4 ty1 = (nodeMin.y + wS * ea.y - o.y) * gb.y;
228
- vec4 tz0 = (nodeMin.z + wX * ea.z - o.z) * gb.z;
229
- vec4 tz1 = (nodeMin.z + wU * ea.z - o.z) * gb.z;
230
- vec4 ns = max(max((min(tx0, tx1) - vec4(padding.x)), (min(ty0, ty1) - vec4(padding.y))), (min(tz0, tz1) - vec4(padding.z)));
231
- vec4 sW = min(min((max(tx0, tx1) + vec4(padding.x)), (max(ty0, ty1) + vec4(padding.y))), (max(tz0, tz1) + vec4(padding.z)));
232
- vec4 distance = mix(sW, ns, greaterThan(ns, vec4(0.0)));
233
- distance = mix(distance, vec4(-1.0), greaterThan(ns, min(sW, vec4(tMax))));
234
- float eY[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 dW = -1.0;
239
- int ej = -1;
238
+ float ee = -1.0;
239
+ int eq = -1;
240
240
  for (int child = 0; child < 4; child++) {
241
- if (mF[child] != 0u && eY[child] > dW) {
242
- dW = eY[child];
243
- ej = child;
241
+ if (nH[child] != 0u && fi[child] > ee) {
242
+ ee = fi[child];
243
+ eq = child;
244
244
  }
245
245
  }
246
- if (ej >= 0 && dW > 0.0) {
247
- uint ol = mF[ej];
248
- int jO = int(ol);
249
- if ((ol & 0x80000000u) == 0u) {
250
- jO += eQ;
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(jO, bK);
253
- eY[ej] = -1.0;
252
+ stack[++top] = ivec2(kv, bK);
253
+ fi[eq] = -1.0;
254
254
  }
255
255
  }
256
256
  }
@@ -258,14 +258,14 @@ eY[ej] = -1.0;
258
258
  else {
259
259
  int i = node.x + bufferOff;
260
260
  vec4 r1 = fetchBVH(i);
261
- int bf = floatBitsToInt(r1.w);
261
+ int bh = floatBitsToInt(r1.w);
262
262
 
263
- if (bf >= 0) {
263
+ if (bh >= 0) {
264
264
  int left = node.x + 2;
265
- int right = bf + eQ;
265
+ int right = bh + fc;
266
266
 
267
- float d0 = cH(o, d, fetchBVH(left + bufferOff).xyz, fetchBVH(left + 1 + bufferOff).xyz, tMax);
268
- float d1 = cH(o, d, fetchBVH(right + bufferOff).xyz, fetchBVH(right + 1 + bufferOff).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
271
  stack[++top] = ivec2(left, bK);
@@ -285,13 +285,16 @@ stack[++top] = ivec2(left, bK);
285
285
  }
286
286
  else {
287
287
  if (bK < 0) {
288
- for (int k = 0; k < -bf; k++) {
288
+ for (int k = 0; k < -bh; k++) {
289
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 = -bf;
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 fw {
327
+ struct fL {
325
328
  vec3 p0;
326
329
  vec3 p1;
327
330
  vec3 p2;
328
331
  };
329
332
  #ifdef NUM_LIGHTS
330
- float hs(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 nV(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
 
@@ -376,7 +379,7 @@ float oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
376
379
  return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
377
380
  }
378
381
 
379
- float mX(Ray r, Light light, out LightSampleRec lightSample) {
382
+ float iB(Ray r, Light light, out LightSampleRec lightSample) {
380
383
 
381
384
 
382
385
 
@@ -393,15 +396,15 @@ vec3 normal = normalize(cross(u, v));
393
396
  if (dot(normal, r.d) > 0.)
394
397
  return INF;
395
398
 
396
- d = nV(pos, u, v, normal, r);
399
+ d = oU(pos, u, v, normal, r);
397
400
  if (d < 0.) {
398
401
  d = INF;
399
402
  }
400
403
  else {
401
- float ct = dot(-r.d, normal);
404
+ float cv = dot(-r.d, normal);
402
405
  float spread = light.spread;
403
- if (ct >= cos(spread * PI / 2.0)) {
404
- lightSample.pdf = (d * d) / (light.area * ct);
406
+ if (cv >= cos(spread * PI / 2.0)) {
407
+ lightSample.pdf = (d * d) / (light.area * cv);
405
408
  lightSample.emission = light.emission;
406
409
  }
407
410
  }
@@ -410,10 +413,10 @@ lightSample.emission = light.emission;
410
413
  #ifdef HAS_SPHERE_LIGHTS
411
414
  if (type == SPHERE_LIGHT) {
412
415
  if (light.radius <= 0.0) {
413
- vec3 kz = light.position - r.o;
414
- float projection = dot(kz, r.d);
415
- vec3 bd = kz - projection * r.d;
416
- if (projection <= EPS || dot(bd, bd) > 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;
417
420
  d = projection;
418
421
  lightSample.direction = r.d;
419
422
  lightSample.normal = -r.d;
@@ -421,7 +424,7 @@ lightSample.dist = d;
421
424
  lightSample.pdf = 1.0;
422
425
  lightSample.isDelta = true;
423
426
  } else {
424
- d = hs(light.radius, light.position, r);
427
+ d = hM(light.radius, light.position, r);
425
428
  lightSample.isDelta = false;
426
429
  }
427
430
  if (d < 0.) {
@@ -440,10 +443,10 @@ lightSample.emission = light.radius <= 0.0
440
443
  #ifdef HAS_SPOT_LIGHTS
441
444
  if (type == SPOT_LIGHT) {
442
445
  if (light.radius <= 0.0) {
443
- vec3 kz = light.position - r.o;
444
- float projection = dot(kz, r.d);
445
- vec3 bd = kz - projection * r.d;
446
- if (projection <= EPS || dot(bd, bd) > 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;
447
450
  d = projection;
448
451
  lightSample.direction = r.d;
449
452
  lightSample.normal = -r.d;
@@ -451,17 +454,17 @@ lightSample.dist = d;
451
454
  lightSample.pdf = 1.0;
452
455
  lightSample.isDelta = true;
453
456
  } else {
454
- d = hs(light.radius, light.position, r);
457
+ d = hM(light.radius, light.position, r);
455
458
  lightSample.isDelta = false;
456
459
  }
457
460
  if (d != INF) {
458
- vec3 xv = r.o + d * r.d;
459
- float ne = evaluateSpotEmissionMultiplier(light, normalize(r.o - xv));
460
- if (ne <= 0.0) return INF;
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
465
  lightSample.pdf = sphereSolidAnglePdf(r.o, light.position, light.radius);
463
466
  }
464
- lightSample.emission = light.emission * ne * (light.radius <= 0.0
467
+ lightSample.emission = light.emission * od * (light.radius <= 0.0
465
468
  ? 1.0 / max(d * d, 1e-8)
466
469
  : 1.0);
467
470
  }
@@ -472,7 +475,7 @@ return d;
472
475
  }
473
476
  #endif
474
477
 
475
- int fh(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
478
+ int fv(ivec4 m0, ivec4 m1, ivec4 m2, vec3 bary) {
476
479
  vec2 m00 = af(m0.x);
477
480
  vec2 m01 = af(m0.y);
478
481
  vec2 m02 = af(m0.z);
@@ -492,86 +495,102 @@ float w20 = m20.y * bary.z;
492
495
  float w21 = m21.y * bary.z;
493
496
  float w22 = m22.y * bary.z;
494
497
 
495
- float hd = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
498
+ float hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
496
499
 
497
- w00 = w00 / hd;
498
- w01 = w01 / hd + w00;
499
- w02 = w02 / hd + w01;
500
- w10 = w10 / hd + w02;
501
- w11 = w11 / hd + w10;
502
- w12 = w12 / hd + w11;
503
- w20 = w20 / hd + w12;
504
- w21 = w21 / hd + w20;
505
- w22 = w22 / hd + w21;
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;
506
509
 
507
- float rand = ek(0u);
508
- float nW;
510
+ float rand = cm(0u);
511
+ float oV;
509
512
  if (rand < w00) {
510
- nW = m00.x;
513
+ oV = m00.x;
511
514
  } else if (rand < w01) {
512
- nW = m01.x;
515
+ oV = m01.x;
513
516
  } else if (rand < w02) {
514
- nW = m02.x;
517
+ oV = m02.x;
515
518
  } else if (rand < w10) {
516
- nW = m10.x;
519
+ oV = m10.x;
517
520
  } else if (rand < w11) {
518
- nW = m11.x;
521
+ oV = m11.x;
519
522
  } else if (rand < w12) {
520
- nW = m12.x;
523
+ oV = m12.x;
521
524
  } else if (rand < w20) {
522
- nW = m20.x;
525
+ oV = m20.x;
523
526
  } else if (rand < w21) {
524
- nW = m21.x;
527
+ oV = m21.x;
525
528
  } else {
526
- nW = m22.x;
529
+ oV = m22.x;
527
530
  }
528
- return int(nW);
531
+ return int(oV);
529
532
  }
530
533
 
531
534
 
532
535
  vec4 fetchIns(int i);
533
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
534
555
 
535
- mat2x3 ez(vec3 normal, vec3 dp1, vec3 dp2, vec2 oM, vec2 oN, vec4 aS) {
536
- float determinant = oM.x * oN.y - oM.y * oN.x;
537
- vec3 t = aS.xyz;
556
+
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;
538
560
  vec3 b = vec3(0.0);
539
561
 
540
- float rw = abs(aS.w) > 1.5 ? 0.0 : aS.w;
562
+ float sO = abs(aT.w) > 1.5 ? 0.0 : aT.w;
541
563
  if (abs(determinant) > 1e-12) {
542
- vec3 dt = (dp1 * oN.y - dp2 * oM.y) / determinant;
543
- vec3 db = (dp2 * oM.x - dp1 * oN.x) / determinant;
564
+ vec3 dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
565
+ vec3 db = (dp2 * pU.x - dp1 * pV.x) / determinant;
544
566
  if (dot(t, t) < 1e-8) { t = dt; }
545
- if (rw == 0.0) { rw = (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); }
546
568
  }
547
569
  t -= normal * dot(normal, t);
548
570
  if (dot(t, t) < 1e-8) {
549
- float ik = (normal.z >= 0.0 ? 1.0 : -1.0);
550
- float cv = -1.0 / (ik + normal.z);
551
- float xy = normal.x * normal.y * cv;
552
- t = vec3(1.0 + ik * normal.x * normal.x * cv, ik * xy, -ik * normal.x);
553
- b = vec3(xy, ik + normal.y * normal.y * cv, -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);
554
576
  }
555
577
  else { t = normalize(t); b = normalize(cross(normal, t)); }
556
- return mat2x3(t, b * (rw < 0.0 ? -1.0 : 1.0));
578
+ return mat2x3(t, b * (sO < 0.0 ? -1.0 : 1.0));
557
579
  }
558
580
 
559
- void hn(inout SurfaceInteraction si, fw tri, vec3 barycentric, ivec3 index) {
581
+ void hI(inout SurfaceInteraction si, fL tri, vec3 barycentric, ivec3 index) {
560
582
  si.hit = true;
561
583
  si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
562
- ivec2 i0 = gM(index.x, vertexColumns);
563
- ivec2 i1 = gM(index.y, vertexColumns);
564
- ivec2 i2 = gM(index.z, vertexColumns);
565
584
  si.vertexColor = vec3(1.0);
566
585
  #ifdef USE_VERTEX_COLOR
567
- si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
568
- + barycentric.y * texelFetch(colorBuffer, i1, 0).rgb
569
- + 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;
570
589
  #endif
571
590
 
572
- vec3 n0 = texelFetch(normalBuffer, i0, 0).xyz;
573
- vec3 n1 = texelFetch(normalBuffer, i1, 0).xyz;
574
- 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);
575
594
  vec3 normal = normalize(barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2);
576
595
  si.vertexNormal = normal;
577
596
 
@@ -580,14 +599,14 @@ si.vertexNormal = normal;
580
599
 
581
600
 
582
601
  vec3 geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
583
- vec3 kw = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
602
+ vec3 le = barycentric.x * n0 + barycentric.y * n1 + barycentric.z * n2;
584
603
  float a = dot(n2 - n0, tri.p0 - tri.p2);
585
604
  float b = dot(n2 - n1, tri.p1 - tri.p2);
586
605
  float c = dot(n1 - n0, tri.p1 - tri.p0);
587
606
  float h = a * barycentric.x * (barycentric.x - 1.0)
588
607
  + (a + b + c) * barycentric.x * barycentric.y
589
608
  + b * barycentric.y * (barycentric.y - 1.0);
590
- if (dot(kw, geometricNormal) > 0.0) {
609
+ if (dot(le, geometricNormal) > 0.0) {
591
610
  float h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
592
611
  float h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
593
612
  float h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -605,120 +624,119 @@ h1 = max(dot(si.position - tri.p1, n1) + h1, 0.0);
605
624
  h2 = max(dot(si.position - tri.p2, n2) + h2, 0.0);
606
625
  h = min(-min(min(h0, h1), h2), h * 0.5);
607
626
  }
608
- si.shadowOffset = kw * h;
609
-
627
+ si.shadowOffset = le * h;
610
628
 
611
- ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
612
- ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
613
- 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);
614
632
 
615
633
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
616
- si.materialIndex = fh(m0, m1, m2, barycentric);
634
+ si.materialIndex = fv(m0, m1, m2, barycentric);
617
635
  }
618
636
 
619
- vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
620
- vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
621
- 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);
622
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)
623
641
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
624
- vec2 secondaryUv0 = texelFetch(uv1Buffer, i0, 0).xy;
625
- vec2 secondaryUv1 = texelFetch(uv1Buffer, i1, 0).xy;
626
- vec2 secondaryUv2 = texelFetch(uv1Buffer, i2, 0).xy;
627
- vec2 cQ = 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
628
646
  + barycentric.y * secondaryUv1
629
647
  + barycentric.z * secondaryUv2;
630
648
 
631
- vec4 mb = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
632
- int uvProjection = int(mb.r);
649
+ vec4 mU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
650
+ int uvProjection = int(mU.r);
633
651
  if (uvProjection > 0) {
634
- uv = gE(uvProjection, si.position, normal, mb.zw);
635
- cQ = uv;
652
+ uv = gW(uvProjection, si.position, normal, mU.zw);
653
+ cT = uv;
636
654
  } else {
637
- uv *= mb.zw;
638
- cQ *= mb.zw;
655
+ uv *= mU.zw;
656
+ cT *= mU.zw;
639
657
  }
640
658
  #else
641
659
  vec2 uv = vec2(0.0);
642
- vec2 cQ = vec2(0.0);
660
+ vec2 cT = vec2(0.0);
643
661
  #endif
644
662
 
645
663
  #ifdef USE_COAT_NORMAL_FRAMES
646
664
  si.coatNormal = normal;
647
665
  #ifdef NUM_COAT_NORMAL_MAPS
648
- float pH = 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;
649
667
  #endif
650
668
  #endif
651
669
  vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
652
- float uQ = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
653
- if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || uQ != 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
654
672
  #ifdef USE_COAT_NORMAL_FRAMES
655
673
  || fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
656
674
  #endif
657
675
  ) {
658
676
  vec3 dp1 = tri.p0 - tri.p2;
659
677
  vec3 dp2 = tri.p1 - tri.p2;
660
- vec4 aS = vec4(0.0);
678
+ vec4 aT = vec4(0.0);
661
679
  #ifdef USE_TANGENT
662
- aS = barycentric.x * texelFetch(tangentBuffer, i0, 0)
663
- + barycentric.y * texelFetch(tangentBuffer, i1, 0)
664
- + 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);
665
683
  #endif
666
- mat2x3 eL = ez(normal, dp1, dp2, uv0-uv2, uv1-uv2, aS);
667
- si.geometryTangent = eL[0];
668
- si.geometryBitangent = eL[1];
669
- mat2x3 fX = eL;
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;
670
688
  #ifdef NUM_ANISOTROPY_MAPS
671
689
  if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
672
- vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
673
- vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
674
- vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
675
- fX = ez(normal, dp1, dp2, a-c, b-c, (aS.w == 0.0 ? vec4(0.0) : aS));
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));
676
694
  }
677
695
  #endif
678
- si.directionTangent = fX[0];
679
- si.directionBitangent = fX[1];
696
+ si.directionTangent = gp[0];
697
+ si.directionBitangent = gp[1];
680
698
  #if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
681
- if (pH >= 0.0) {
682
- int kP = int(pH);
683
- mat2x3 mG = eL;
684
- if (mapUvChannel[kP] > 0.5) {
685
- vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
686
- vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
687
- vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
688
- mG = ez(normal, dp1, dp2, a-c, b-c,
689
- aS.w == 0.0 ? vec4(0.0) : aS);
690
- }
691
- vec3 decoded = sampleMap(kP, getMapUvSet(kP, uv, cQ)).rgb * 2.0 - 1.0;
692
- vec3 mapped = mG[0] * decoded.x * directionMaterial.z
693
- + mG[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;
694
712
  if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
695
713
  }
696
714
  #endif
697
715
  }
698
716
 
699
717
  si.uv = uv;
700
- si.uv1 = cQ;
718
+ si.uv1 = cT;
701
719
 
702
720
  #ifdef USE_TANGENT
703
- vec3 t0 = texelFetch(tangentBuffer, i0, 0).xyz;
704
- vec3 t1 = texelFetch(tangentBuffer, i1, 0).xyz;
705
- 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;
706
724
  si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z * t2);
707
725
  #endif
708
726
  #if defined(NUM_NORMAL_MAPS)
709
727
  vec3 dp1 = tri.p0 - tri.p2;
710
728
  vec3 dp2 = tri.p1 - tri.p2;
711
- vec2 oM = uv0 - uv2;
712
- vec2 oN = uv1 - uv2;
713
- si.normal = oS(
714
- si.materialIndex, uv, normal, dp1, dp2, oM, oN
729
+ vec2 pU = uv0 - uv2;
730
+ vec2 pV = uv1 - uv2;
731
+ si.normal = qa(
732
+ si.materialIndex, uv, normal, dp1, dp2, pU, pV
715
733
  );
716
734
  #else
717
735
  si.normal = normal;
718
736
  #endif
719
737
  }
720
738
 
721
- struct ev {
739
+ struct eF {
722
740
  float t;
723
741
  vec3 barycentric;
724
742
  };
@@ -728,32 +746,32 @@ return fetchData(bvhBuffer, i, bvhColumns);
728
746
  }
729
747
 
730
748
  vec4 fetchIns(int i) {
731
- return fetchData(instancesBuffer, i, instancesColumns);
749
+ return fetchData(bvhBuffer, instancesOffset + i, bvhColumns);
732
750
  }
733
751
 
734
752
 
735
753
 
736
- uint rT(uint value) {
754
+ uint tl(uint value) {
737
755
  value -= (value >> 1u) & 0x55555555u;
738
756
  value = (value & 0x33333333u) + ((value >> 2u) & 0x33333333u);
739
757
  value = (value + (value >> 4u)) & 0x0f0f0f0fu;
740
758
  return (value * 0x01010101u) >> 24u;
741
759
  }
742
760
 
743
- vec4 eX(uint mo) {
761
+ vec4 fh(uint nk) {
744
762
  return vec4(
745
- float(mo & 0xffu),
746
- float((mo >> 8u) & 0xffu),
747
- float((mo >> 16u) & 0xffu),
748
- float(mo >> 24u)
763
+ float(nk & 0xffu),
764
+ float((nk >> 8u) & 0xffu),
765
+ float((nk >> 16u) & 0xffu),
766
+ float(nk >> 24u)
749
767
  ) / 255.0;
750
768
  }
751
769
 
752
770
 
753
771
 
754
772
 
755
- ev fM(vec3 o, vec3 d, fw tri, int dZ, vec3 gH, float tMax) {
756
- ev ti;
773
+ eF fY(vec3 o, vec3 d, fL tri, int ei, vec3 gZ, float tMax) {
774
+ eF ti;
757
775
 
758
776
 
759
777
  vec3 p0t = tri.p0 - o;
@@ -761,20 +779,20 @@ vec3 p1t = tri.p1 - o;
761
779
  vec3 p2t = tri.p2 - o;
762
780
 
763
781
 
764
- if (dZ == 0) {
782
+ if (ei == 0) {
765
783
  p0t = p0t.yzx;
766
784
  p1t = p1t.yzx;
767
785
  p2t = p2t.yzx;
768
- } else if (dZ == 1) {
786
+ } else if (ei == 1) {
769
787
  p0t = p0t.zxy;
770
788
  p1t = p1t.zxy;
771
789
  p2t = p2t.zxy;
772
790
  }
773
791
 
774
792
 
775
- p0t.xy += gH.xy * p0t.z;
776
- p1t.xy += gH.xy * p1t.z;
777
- p2t.xy += gH.xy * p2t.z;
793
+ p0t.xy += gZ.xy * p0t.z;
794
+ p1t.xy += gZ.xy * p1t.z;
795
+ p2t.xy += gZ.xy * p2t.z;
778
796
 
779
797
 
780
798
  vec3 e = vec3(
@@ -784,9 +802,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
784
802
  );
785
803
 
786
804
  #ifdef DEPTH_QUERY_MODE
787
- vec3 sB = 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))
788
806
  + abs(vec3(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
789
- e = mix(e, vec3(0.0), lessThanEqual(abs(e), sB * 1e-6));
807
+ e = mix(e, vec3(0.0), lessThanEqual(abs(e), ua * 1e-6));
790
808
  #endif
791
809
 
792
810
 
@@ -799,19 +817,19 @@ float det = e.x + e.y + e.z;
799
817
  if (det == 0.0) return ti;
800
818
  #endif
801
819
 
802
- p0t.z *= gH.z;
803
- p1t.z *= gH.z;
804
- p2t.z *= gH.z;
805
- float sp = (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);
806
824
 
807
825
 
808
- if (abs(sp) > abs(tMax * det)) {
826
+ if (abs(tQ) > abs(tMax * det)) {
809
827
  return ti;
810
828
  }
811
829
 
812
- float tP = 1. / det;
813
- ti.t = sp * tP;
814
- ti.barycentric = e * tP;
830
+ float vu = 1. / det;
831
+ ti.t = tQ * vu;
832
+ ti.barycentric = e * vu;
815
833
 
816
834
  return ti;
817
835
  }
@@ -822,7 +840,7 @@ vec3 max;
822
840
  };
823
841
 
824
842
 
825
- vec3 eW(vec3 d) {
843
+ vec3 traversalInverse(vec3 d) {
826
844
  #ifdef DEPTH_QUERY_MODE
827
845
  vec3 ah = mix(d, mix(vec3(1e-20), vec3(-1e-20), lessThan(d, vec3(0.0))), lessThan(abs(d), vec3(1e-20)));
828
846
  return 1.0 / ah;
@@ -831,9 +849,9 @@ return 1.0 / d;
831
849
  #endif
832
850
  }
833
851
 
834
- vec3 eU(vec3 gb, vec3 o) {
852
+ vec3 ff(vec3 invD, vec3 o) {
835
853
  #ifdef DEPTH_QUERY_MODE
836
- return abs(gb) * max(vec3(1.0), abs(o)) * 1e-6;
854
+ return abs(invD) * max(vec3(1.0), abs(o)) * 1e-6;
837
855
  #else
838
856
  return vec3(0.0);
839
857
  #endif
@@ -841,21 +859,21 @@ return vec3(0.0);
841
859
 
842
860
 
843
861
 
844
- float cH(vec3 o, vec3 d, vec3 xU, vec3 xT, float tMax) {
862
+ float bP(vec3 o, vec3 d, vec3 zT, vec3 zS, float tMax) {
845
863
  #ifdef DEPTH_QUERY_MODE
846
- vec3 gb = eW(d);
847
- vec3 xg = (xU - o) * gb;
848
- vec3 xh = (xT - o) * gb;
849
- vec3 padding = eU(gb, o);
864
+ vec3 invD = traversalInverse(d);
865
+ vec3 zi = (zT - o) * invD;
866
+ vec3 zj = (zS - o) * invD;
867
+ vec3 padding = ff(invD, o);
850
868
  #else
851
- vec3 xg = (xU - o) / d;
852
- vec3 xh = (xT - o) / d;
869
+ vec3 zi = (zT - o) / d;
870
+ vec3 zj = (zS - o) / d;
853
871
  vec3 padding = vec3(0.0);
854
872
  #endif
855
- vec3 ns = min(xg, xh) - padding;
856
- vec3 sW = max(xg, xh) + padding;
857
- float t0 = max(ns.x, max(ns.y, ns.z));
858
- float t1 = min(sW.x, min(sW.y, sW.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));
859
877
 
860
878
  return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
861
879
  }
@@ -864,12 +882,12 @@ int maxDimension(vec3 v) {
864
882
  return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
865
883
  }
866
884
 
867
- vec3 mU(vec3 d, int dZ) {
885
+ vec3 nV(vec3 d, int ei) {
868
886
 
869
887
 
870
- if (dZ == 0) {
888
+ if (ei == 0) {
871
889
  return vec3(-d.y, -d.z, 1.0) / d.x;
872
- } else if (dZ == 1) {
890
+ } else if (ei == 1) {
873
891
  return vec3(-d.z, -d.x, 1.0) / d.y;
874
892
  } else {
875
893
  return vec3(-d.x, -d.y, 1.0) / d.z;
@@ -884,25 +902,25 @@ if (isEmptyScene) {
884
902
  return;
885
903
  }
886
904
 
887
- int dZ = maxDimension(abs(ray.d));
888
- vec3 gH = mU(ray.d, dZ);
905
+ int ei = maxDimension(abs(ray.d));
906
+ vec3 gZ = nV(ray.d, ei);
889
907
  int am;
890
908
 
891
909
  ${getBVHTraverseCode(glsl `
892
910
  si.triangleIndex = triangleIndex;
893
- lR = tri;
894
- hz = faceNormal;
911
+ mL = tri;
912
+ hU = faceNormal;
895
913
  aw = hit.barycentric;
896
- hr = index;
897
- sd = true;
914
+ hL = index;
915
+ tD = true;
898
916
  am = bK;
899
917
  `)}
900
918
 
901
- if (sd) {
919
+ if (tD) {
902
920
  si.instanceIndex = am;
903
921
  si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
904
922
 
905
- hn(si, lR, aw, hr);
923
+ hI(si, mL, aw, hL);
906
924
  mat4 l2w = mat4(
907
925
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
908
926
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
@@ -915,12 +933,12 @@ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
915
933
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
916
934
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
917
935
  );
918
- mat3 aG = transpose(mat3(w2l));
919
- si.faceNormal = normalize(aG * hz);
920
- si.vertexNormal = normalize(aG * si.vertexNormal);
921
- si.normal = normalize(aG * si.normal);
936
+ mat3 aH = transpose(mat3(w2l));
937
+ si.faceNormal = normalize(aH * hU);
938
+ si.vertexNormal = normalize(aH * si.vertexNormal);
939
+ si.normal = normalize(aH * si.normal);
922
940
  #ifdef USE_COAT_NORMAL_FRAMES
923
- si.coatNormal = normalize(aG * si.coatNormal);
941
+ si.coatNormal = normalize(aH * si.coatNormal);
924
942
  #endif
925
943
  #ifdef USE_TANGENT
926
944
  if (dot(si.tangent, si.tangent) > 0.0) {
@@ -945,17 +963,17 @@ return;
945
963
  }
946
964
 
947
965
  bool doubleSided = true;
948
- int dZ = maxDimension(abs(ray.d));
949
- vec3 gH = mU(ray.d, dZ);
966
+ int ei = maxDimension(abs(ray.d));
967
+ vec3 gZ = nV(ray.d, ei);
950
968
  int am;
951
969
 
952
970
  ${getBVHTraverseCode(glsl `
953
971
  si.triangleIndex = triangleIndex;
954
- lR = tri;
955
- hz = faceNormal;
972
+ mL = tri;
973
+ hU = faceNormal;
956
974
  aw = hit.barycentric;
957
- hr = index;
958
- sd = true;
975
+ hL = index;
976
+ tD = true;
959
977
  am = bK;
960
978
  `, glsl `
961
979
  if (bK != instanceIndex) {
@@ -963,10 +981,10 @@ continue;
963
981
  }
964
982
  `, 'maxDistance')}
965
983
 
966
- if (sd) {
984
+ if (tD) {
967
985
  si.instanceIndex = am;
968
986
  si.materialIndex = int(af(floatBitsToInt(fetchIns(am * ${INSTANCE_VEC4_STRIDE}).z)).x);
969
- hn(si, lR, aw, hr);
987
+ hI(si, mL, aw, hL);
970
988
  mat4 l2w = mat4(
971
989
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 5),
972
990
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 6),
@@ -979,12 +997,12 @@ fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 2),
979
997
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 3),
980
998
  fetchIns(am * ${INSTANCE_VEC4_STRIDE} + 4)
981
999
  );
982
- mat3 aG = transpose(mat3(w2l));
983
- si.faceNormal = normalize(aG * hz);
984
- si.vertexNormal = normalize(aG * si.vertexNormal);
985
- si.normal = normalize(aG * si.normal);
1000
+ mat3 aH = transpose(mat3(w2l));
1001
+ si.faceNormal = normalize(aH * hU);
1002
+ si.vertexNormal = normalize(aH * si.vertexNormal);
1003
+ si.normal = normalize(aH * si.normal);
986
1004
  #ifdef USE_COAT_NORMAL_FRAMES
987
- si.coatNormal = normalize(aG * si.coatNormal);
1005
+ si.coatNormal = normalize(aH * si.coatNormal);
988
1006
  #endif
989
1007
  #ifdef USE_TANGENT
990
1008
  if (dot(si.tangent, si.tangent) > 0.0) {
@@ -1000,35 +1018,32 @@ si.position = (l2w * vec4(si.position, 1.0)).xyz;
1000
1018
  }
1001
1019
  }
1002
1020
 
1003
- bool intersectSceneShadow(in Ray ray, float lightDistance, int jR) {
1021
+ bool intersectSceneShadow(in Ray ray, float lightDistance, int kx) {
1004
1022
 
1005
1023
  if (isEmptyScene) {
1006
1024
  return false;
1007
1025
  }
1008
1026
 
1009
1027
  bool doubleSided = true;
1010
- int dZ = maxDimension(abs(ray.d));
1011
- vec3 gH = mU(ray.d, dZ);
1028
+ int ei = maxDimension(abs(ray.d));
1029
+ vec3 gZ = nV(ray.d, ei);
1012
1030
 
1013
1031
  ${getBVHTraverseCode(glsl `
1014
1032
 
1015
1033
 
1016
- bool jA = true;
1034
+ bool kc = true;
1017
1035
  vec3 barycentric = hit.barycentric;
1018
1036
  vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
1019
1037
 
1020
- if (jA) {
1038
+ if (kc) {
1021
1039
  #ifdef HAS_ALPHA
1022
1040
  int materialIndex = int(af(floatBitsToInt(fetchIns(bK * ${INSTANCE_VEC4_STRIDE}).z)).x);
1023
- ivec2 i0 = gM(index.x, vertexColumns);
1024
- ivec2 i1 = gM(index.y, vertexColumns);
1025
- ivec2 i2 = gM(index.z, vertexColumns);
1026
- ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
1027
- ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
1028
- ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
1041
+ ivec4 m0 = dT(index.x);
1042
+ ivec4 m1 = dT(index.y);
1043
+ ivec4 m2 = dT(index.z);
1029
1044
 
1030
1045
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
1031
- materialIndex = fh(m0, m1, m2, barycentric);
1046
+ materialIndex = fv(m0, m1, m2, barycentric);
1032
1047
  }
1033
1048
 
1034
1049
  int ii = materialIndex * MAT_DATA_SIZE;
@@ -1038,16 +1053,16 @@ float alpha = fetchMatData(ii + MAT_ROW_ALPHA_FILM).r;
1038
1053
  if (mapAlphaUsage == ${mapAlphaUsageConstants.alpha + ''}) {
1039
1054
  int diffuseMapIndex = int(fetchMatData(ii + MAT_ROW_METALLIC_MAPS).z);
1040
1055
  if (diffuseMapIndex >= 0) {
1041
- vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1042
- vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1043
- 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);
1044
1059
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1045
- vec4 mb = fetchMatData(ii + MAT_ROW_UV);
1046
- int uvProjection = int(mb.r);
1060
+ vec4 mU = fetchMatData(ii + MAT_ROW_UV);
1061
+ int uvProjection = int(mU.r);
1047
1062
  if (uvProjection > 0) {
1048
- uv = gE(uvProjection, position, hz, mb.zw);
1063
+ uv = gW(uvProjection, position, hU, mU.zw);
1049
1064
  } else {
1050
- uv *= mb.zw;
1065
+ uv *= mU.zw;
1051
1066
  }
1052
1067
 
1053
1068
  alpha *= sampleMap(diffuseMapIndex, uv).a;
@@ -1057,36 +1072,36 @@ alpha *= sampleMap(diffuseMapIndex, uv).a;
1057
1072
  #ifdef NUM_ALPHA_MAPS
1058
1073
  int alphaMapIndex = int(fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).z);
1059
1074
  if (alphaMapIndex >= 0) {
1060
- vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1061
- vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1062
- 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);
1063
1078
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1064
- vec4 mb = fetchMatData(ii + MAT_ROW_UV);
1065
- int uvProjection = int(mb.r);
1079
+ vec4 mU = fetchMatData(ii + MAT_ROW_UV);
1080
+ int uvProjection = int(mU.r);
1066
1081
  if (uvProjection > 0) {
1067
- uv = gE(uvProjection, position, hz, mb.zw);
1082
+ uv = gW(uvProjection, position, hU, mU.zw);
1068
1083
  } else {
1069
- uv *= mb.zw;
1084
+ uv *= mU.zw;
1070
1085
  }
1071
1086
  alpha *= sampleMap(alphaMapIndex, uv).g;
1072
1087
  }
1073
1088
  #endif
1074
1089
  float alphaCutoff = fetchMatData(ii + MAT_ROW_STANDALONE_MAPS).a;
1075
- alpha = lJ(
1090
+ alpha = mB(
1076
1091
  alpha, int(fetchMatData(ii + MAT_ROW_ALPHA).w), alphaCutoff
1077
1092
  );
1078
- if (ek(0u) > alpha) {
1093
+ if (cm(0u) > alpha) {
1079
1094
 
1080
1095
  tMax = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1081
- jA = false;
1096
+ kc = false;
1082
1097
  }
1083
1098
  #endif
1084
1099
  }
1085
- if (jA) {
1100
+ if (kc) {
1086
1101
  return true;
1087
1102
  }
1088
1103
  `, glsl `
1089
- if (triangleIndex == jR) {
1104
+ if (triangleIndex == kx) {
1090
1105
  continue;
1091
1106
  }
1092
1107
  `, 'min(max(lightDistance, 0.0), RAY_MAX_DISTANCE)')}