@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
@@ -8,35 +8,35 @@ import { createIntersectionAlphaWgsl } from './intersectionAlpha.wgsl.js';
8
8
  const displacementWgsl = pdm_displacementWgsl;
9
9
  const flatIntersectCode = function () {
10
10
  return /* wgsl */ `
11
- let hit = fM(o, d, tri, dZ, gH, tMax);
11
+ let hit = fY(o, d, tri, ei, gZ, tMax);
12
12
  if (hit.t > 0.0) {
13
13
  let e1 = tri.p1 - tri.p0;
14
14
  let e2 = tri.p2 - tri.p0;
15
- ex = normalize(cross(e1, e2));
16
- let ku = i32(af(bitcast<i32>(oX.z)).x);
17
- let iL = materialsBuffer[ku].doubleSided > 0.5;
18
- if (!doubleSided && !iL && dot(ex, d) > 0.0) {
19
- ex = vec3f(0.0);
15
+ hitNormal = normalize(cross(e1, e2));
16
+ let lc = i32(af(bitcast<i32>(qf.z)).x);
17
+ let jm = materialsBuffer[lc].doubleSided > 0.5;
18
+ if (!doubleSided && !jm && dot(hitNormal, d) > 0.0) {
19
+ hitNormal = vec3f(0.0);
20
20
  continue;
21
21
  }
22
22
 
23
23
  tMax = hit.t;
24
- sd = true;
25
- pa = true;
26
- eS = o + tMax * d;
24
+ tD = true;
25
+ qi = true;
26
+ fe = o + tMax * d;
27
27
  aw = hit.barycentric;
28
28
  }
29
29
  `;
30
30
  };
31
31
  function getPDMDisplacmentCode(anyHit) {
32
32
  return /*wgsl */ `
33
- let ll = pS(
33
+ let mh = qW(
34
34
  o, d, tMax,
35
35
  tri.p0, tri.p1, tri.p2,
36
36
  n0, n1, n2,
37
37
  uv0, uv1, uv2,
38
38
  displacementMapIndex,
39
- jv(displacementMapIndex),
39
+ getMapSize(displacementMapIndex),
40
40
  minH, maxH,
41
41
  hScale,
42
42
  matData.displacementBias,
@@ -44,51 +44,51 @@ matData.displacementStepSize,
44
44
  i32(matData.displacementUvProjection),
45
45
  displacementUvProjectionScale,
46
46
  ${anyHit ? 'true' : 'false'},
47
- jg
47
+ jK
48
48
  );
49
49
  `;
50
50
  }
51
51
  const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
52
52
  return /* wgsl */ `
53
53
 
54
- let hScale = oX.w;
55
- let uW = bitcast<i32>(r3.w);
54
+ let hScale = qf.w;
55
+ let wK = bitcast<i32>(r3.w);
56
56
 
57
- let materialIndex = i32(af(bitcast<i32>(oX.z)).x);
57
+ let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
58
58
  let matData = materialsBuffer[materialIndex];
59
- let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
60
- let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
61
- let n2 = normalize(attrBuffers[index.z * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
59
+ let n0 = normalize(vertexNormal(index.x));
60
+ let n1 = normalize(vertexNormal(index.y));
61
+ let n2 = normalize(vertexNormal(index.z));
62
62
  if (matData.displacementMapIndex >= 0.0 && matData.displacementBias != 0.0) {
63
63
  tri.p0 += n0 * matData.displacementBias;
64
64
  tri.p1 += n1 * matData.displacementBias;
65
65
  tri.p2 += n2 * matData.displacementBias;
66
66
  }
67
- if (abs(hScale) > 0.0 && uW > 0) {
68
- let minH = f32(uW >> 8) / 255.0;
69
- let maxH = f32(uW & 0xff) / 255.0;
67
+ if (abs(hScale) > 0.0 && wK > 0) {
68
+ let minH = f32(wK >> 8) / 255.0;
69
+ let maxH = f32(wK & 0xff) / 255.0;
70
70
  let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
71
71
  let displacementMapIndex = i32(matData.displacementMapIndex);
72
72
 
73
73
 
74
- var uv0 = attrBuffers[index.x * ATTR_STRIDE + UV_OFF].xy;
75
- var uv1 = attrBuffers[index.y * ATTR_STRIDE + UV_OFF].xy;
76
- var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
74
+ var uv0 = hd(index.x);
75
+ var uv1 = hd(index.y);
76
+ var uv2 = hd(index.z);
77
77
 
78
78
  ${getPDMDisplacmentCode(anyHit)}
79
79
 
80
- if (ll.t < tMax) {
81
- ex = ll.normal;
80
+ if (mh.t < tMax) {
81
+ hitNormal = mh.normal;
82
82
 
83
83
 
84
- tMax = ll.t;
84
+ tMax = mh.t;
85
85
 
86
- aw = ll.barycentric;
87
- eS = o + tMax * d;
86
+ aw = mh.barycentric;
87
+ fe = o + tMax * d;
88
88
 
89
- bP = true;
90
- sd = true;
91
- pa = true;
89
+ bQ = true;
90
+ tD = true;
91
+ qi = true;
92
92
  }
93
93
  }
94
94
  else {
@@ -97,7 +97,7 @@ ${flatIntersectCode()}
97
97
  `;
98
98
  };
99
99
  const cwbvhTraversalWgsl = /* wgsl */ `
100
- fn bm(value: u32) -> vec4f {
100
+ fn bn(value: u32) -> vec4f {
101
101
  return vec4f(
102
102
  f32(value & 0xffu),
103
103
  f32((value >> 8u) & 0xffu),
@@ -112,118 +112,118 @@ f32(value >> 24u)
112
112
 
113
113
 
114
114
 
115
- fn kI(value: u32) -> u32 {
115
+ fn lv(value: u32) -> u32 {
116
116
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
117
117
  }
118
118
 
119
- fn oJ(value: u32) -> u32 {
119
+ fn pR(value: u32) -> u32 {
120
120
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
121
121
  }
122
122
 
123
- fn oY(
123
+ fn qg(
124
124
  node: i32,
125
- uN: i32,
125
+ ww: i32,
126
126
  n0: vec4f,
127
127
  o: vec3f,
128
- gb: vec3f,
128
+ invD: vec3f,
129
129
  tMax: f32
130
130
  ) -> u32 {
131
- let i = node + uN;
131
+ let i = node + ww;
132
132
  let n2 = bvhBuffer[i + 2];
133
133
  let n3 = bvhBuffer[i + 3];
134
134
  let n4 = bvhBuffer[i + 4];
135
135
  let header = bitcast<u32>(n0.w);
136
- let sD = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
- let sE = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
- let sF = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
- let hG = vec3f(
140
- bitcast<f32>(u32(sD + 127) << 23u),
141
- bitcast<f32>(u32(sE + 127) << 23u),
142
- bitcast<f32>(u32(sF + 127) << 23u)
136
+ let uc = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
+ let ud = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
+ let ue = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
+ let ih = vec3f(
140
+ bitcast<f32>(u32(uc + 127) << 23u),
141
+ bitcast<f32>(u32(ud + 127) << 23u),
142
+ bitcast<f32>(u32(ue + 127) << 23u)
143
143
  );
144
- let padding = eU(gb, o);
145
- let eD = (n0.xyz - o) * gb;
146
- let cV = hG * gb;
144
+ let padding = ff(invD, o);
145
+ let eM = (n0.xyz - o) * invD;
146
+ let cW = ih * invD;
147
147
 
148
148
 
149
149
 
150
- let vm = bitcast<vec4u>(n2);
151
- let vn = bitcast<vec4u>(n3);
152
- let vo = bitcast<vec4u>(n4);
153
- let negative = gb < vec3f(0.0);
154
- let wK = select(vm.xy, vn.zw, negative.x);
155
- let xX = select(vn.zw, vm.xy, negative.x);
156
- let wL = select(vm.zw, vo.xy, negative.y);
157
- let xY = select(vo.xy, vm.zw, negative.y);
158
- let wM = select(vn.xy, vo.zw, negative.z);
159
- let xZ = select(vo.zw, vn.xy, negative.z);
150
+ let xd = bitcast<vec4u>(n2);
151
+ let xe = bitcast<vec4u>(n3);
152
+ let xf = bitcast<vec4u>(n4);
153
+ let negative = invD < vec3f(0.0);
154
+ let yK = select(xd.xy, xe.zw, negative.x);
155
+ let zV = select(xe.zw, xd.xy, negative.x);
156
+ let yL = select(xd.zw, xf.xy, negative.y);
157
+ let zW = select(xf.xy, xd.zw, negative.y);
158
+ let yM = select(xe.xy, xf.zw, negative.z);
159
+ let zX = select(xf.zw, xe.xy, negative.z);
160
160
 
161
- let yL = max(
161
+ let AL = max(
162
162
  max(
163
- bm(wK.x) * cV.x + eD.x - vec4f(padding.x),
164
- bm(wL.x) * cV.y + eD.y - vec4f(padding.y)
163
+ bn(yK.x) * cW.x + eM.x - vec4f(padding.x),
164
+ bn(yL.x) * cW.y + eM.y - vec4f(padding.y)
165
165
  ),
166
- bm(wM.x) * cV.z + eD.z - vec4f(padding.z)
166
+ bn(yM.x) * cW.z + eM.z - vec4f(padding.z)
167
167
  );
168
- let yH = min(
168
+ let AF = min(
169
169
  min(
170
- bm(xX.x) * cV.x + eD.x + vec4f(padding.x),
171
- bm(xY.x) * cV.y + eD.y + vec4f(padding.y)
170
+ bn(zV.x) * cW.x + eM.x + vec4f(padding.x),
171
+ bn(zW.x) * cW.y + eM.y + vec4f(padding.y)
172
172
  ),
173
- bm(xZ.x) * cV.z + eD.z + vec4f(padding.z)
173
+ bn(zX.x) * cW.z + eM.z + vec4f(padding.z)
174
174
  );
175
- let yM = max(
175
+ let AM = max(
176
176
  max(
177
- bm(wK.y) * cV.x + eD.x - vec4f(padding.x),
178
- bm(wL.y) * cV.y + eD.y - vec4f(padding.y)
177
+ bn(yK.y) * cW.x + eM.x - vec4f(padding.x),
178
+ bn(yL.y) * cW.y + eM.y - vec4f(padding.y)
179
179
  ),
180
- bm(wM.y) * cV.z + eD.z - vec4f(padding.z)
180
+ bn(yM.y) * cW.z + eM.z - vec4f(padding.z)
181
181
  );
182
- let yI = min(
182
+ let AG = min(
183
183
  min(
184
- bm(xX.y) * cV.x + eD.x + vec4f(padding.x),
185
- bm(xY.y) * cV.y + eD.y + vec4f(padding.y)
184
+ bn(zV.y) * cW.x + eM.x + vec4f(padding.x),
185
+ bn(zW.y) * cW.y + eM.y + vec4f(padding.y)
186
186
  ),
187
- bm(xZ.y) * cV.z + eD.z + vec4f(padding.z)
187
+ bn(zX.y) * cW.z + eM.z + vec4f(padding.z)
188
188
  );
189
189
 
190
- let wI = (yL <= min(yH, vec4f(tMax))) & (yH > vec4f(0.0));
191
- let wJ = (yM <= min(yI, vec4f(tMax))) & (yI > vec4f(0.0));
192
- return select(0u, 1u, wI.x)
193
- | select(0u, 2u, wI.y)
194
- | select(0u, 4u, wI.z)
195
- | select(0u, 8u, wI.w)
196
- | select(0u, 16u, wJ.x)
197
- | select(0u, 32u, wJ.y)
198
- | select(0u, 64u, wJ.z)
199
- | select(0u, 128u, wJ.w);
190
+ let yG = (AL <= min(AF, vec4f(tMax))) & (AF > vec4f(0.0));
191
+ let yH = (AM <= min(AG, vec4f(tMax))) & (AG > vec4f(0.0));
192
+ return select(0u, 1u, yG.x)
193
+ | select(0u, 2u, yG.y)
194
+ | select(0u, 4u, yG.z)
195
+ | select(0u, 8u, yG.w)
196
+ | select(0u, 16u, yH.x)
197
+ | select(0u, 32u, yH.y)
198
+ | select(0u, 64u, yH.z)
199
+ | select(0u, 128u, yH.w);
200
200
  }
201
201
 
202
202
  `;
203
- function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
203
+ function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '', perInstanceBounds = false) {
204
204
  const intersectTriangles = /* wgsl */ `
205
- let oX = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
206
- let vertexOffset = vec3i(bitcast<i32>(oX.y));
205
+ let qf = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
206
+ let vertexOffset = vec3i(bitcast<i32>(qf.y));
207
207
  for (var k = 0; k < primitiveCount; k++) {
208
208
  let triangleIndex = primitiveOffset + k;
209
209
  ${skipTriangleCode}
210
- if (bounces > 0 && triangleIndex == fH && bK == fG) {
210
+ if (bounces > 0 && triangleIndex == fT && bK == fS) {
211
211
  continue;
212
212
  }
213
213
 
214
214
  let r3 = bvhBuffer[triangleIndex];
215
215
  let index = bitcast<vec3i>(r3.xyz) + vertexOffset;
216
- var tri = fw(
217
- attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
218
- attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
219
- attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
216
+ var tri = fL(
217
+ vertexPosition(index.x),
218
+ vertexPosition(index.y),
219
+ vertexPosition(index.z)
220
220
  );
221
- var pa = false;
221
+ var qi = false;
222
222
 
223
223
  ${hasDisplacement
224
224
  ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
225
225
  : flatIntersectCode()}
226
- if (pa) {
226
+ if (qi) {
227
227
  ${handleHitCode}
228
228
  }
229
229
  }
@@ -231,68 +231,74 @@ ${handleHitCode}
231
231
  return /* wgsl */ `
232
232
  var d = ray.d;
233
233
  var o = ray.o;
234
- var jk = -1;
235
- var gb = eW(d);
236
- var bP = false;
237
- var sd = false;
238
- var eS: vec3f;
239
- var ex: vec3f;
234
+ var jO = -1;
235
+ ${perInstanceBounds ? 'let worldInvD = traversalInverse(ray.d);\nvar invD = worldInvD;' : 'var invD = traversalInverse(d);'}
236
+ var bQ = false;
237
+ var tD = false;
238
+ var fe: vec3f;
239
+ var hitNormal: vec3f;
240
240
  var aw: vec3f;
241
241
 
242
242
 
243
- if (cH(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gb, tMax) > 0.0) {
244
- jk = 0;
245
- mw[0] = 0;
243
+ if (bP(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, invD, tMax) > 0.0) {
244
+ jO = 0;
245
+ nA[0] = 0;
246
246
  }
247
- while (jk >= 0) {
248
- let uo = mw[jk];
249
- jk--;
247
+ while (jO >= 0) {
248
+ let vY = nA[jO];
249
+ jO--;
250
250
  o = ray.o;
251
251
  d = ray.d;
252
- gb = eW(d);
253
-
254
- let yw = bvhBuffer[uo];
255
- let eP = bitcast<i32>(yw.w);
256
- if (eP >= 0) {
257
- let left = uo + 2;
258
- let right = eP;
259
- let d0 = cH(
252
+ invD = traversalInverse(d);
253
+
254
+ let Ax = bvhBuffer[vY];
255
+ let eZ = bitcast<i32>(Ax.w);
256
+ if (eZ >= 0) {
257
+ let left = vY + 2;
258
+ let right = eZ;
259
+ let d0 = bP(
260
260
  o,
261
261
  bvhBuffer[left].xyz,
262
262
  bvhBuffer[left + 1].xyz,
263
- gb,
263
+ invD,
264
264
  tMax
265
265
  );
266
- let d1 = cH(
266
+ let d1 = bP(
267
267
  o,
268
268
  bvhBuffer[right].xyz,
269
269
  bvhBuffer[right + 1].xyz,
270
- gb,
270
+ invD,
271
271
  tMax
272
272
  );
273
273
 
274
274
  if (d0 > d1) {
275
- if (d0 > 0.0) { jk++; mw[jk] = left; }
276
- if (d1 > 0.0) { jk++; mw[jk] = right; }
275
+ if (d0 > 0.0) { jO++; nA[jO] = left; }
276
+ if (d1 > 0.0) { jO++; nA[jO] = right; }
277
277
  }
278
278
  else {
279
- if (d1 > 0.0) { jk++; mw[jk] = right; }
280
- if (d0 > 0.0) { jk++; mw[jk] = left; }
279
+ if (d1 > 0.0) { jO++; nA[jO] = right; }
280
+ if (d0 > 0.0) { jO++; nA[jO] = left; }
281
281
  }
282
282
  }
283
283
  else {
284
- let rN = -eP;
284
+ let td = -eZ;
285
285
 
286
286
 
287
287
  for (
288
- var mW = rN - 1;
289
- mW >= 0;
290
- mW--
288
+ var nX = td - 1;
289
+ nX >= 0;
290
+ nX--
291
291
  ) {
292
- let qn = bvhBuffer[uo + 2 + mW];
293
- let bK = bitcast<i32>(qn.x);
294
- let xl = bitcast<i32>(qn.y);
295
- let oX = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
292
+ let nY = bvhBuffer[vY + 2 + nX];
293
+ let bK = bitcast<i32>(nY.x);
294
+ ${perInstanceBounds ? /* wgsl */ `
295
+
296
+ let box = bitcast<i32>(nY.w);
297
+ if (bP(ray.o, bvhBuffer[box].xyz, bvhBuffer[box + 1].xyz, worldInvD, tMax) <= 0.0) {
298
+ continue;
299
+ }
300
+ ` : ''} let zn = bitcast<i32>(nY.y);
301
+ let qf = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
296
302
  let w2l = mat4x4<f32>(
297
303
  instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 1],
298
304
  instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 2],
@@ -301,215 +307,215 @@ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 4]
301
307
  );
302
308
  o = (w2l * vec4f(ray.o, 1.0)).xyz;
303
309
  d = (w2l * vec4f(ray.d, 0.0)).xyz;
304
- gb = eW(d);
305
- dZ = maxDimension(abs(d));
306
- gH = mU(d, dZ);
310
+ invD = traversalInverse(d);
311
+ ei = maxDimension(abs(d));
312
+ gZ = nV(d, ei);
307
313
 
308
- let fK = bitcast<u32>(oX.x);
309
- let gN = fK >> 30u;
310
- let blasOffset = i32(fK & 0x3fffffffu);
314
+ let fW = bitcast<u32>(qf.x);
315
+ let hj = fW >> 30u;
316
+ let blasOffset = i32(fW & 0x3fffffffu);
311
317
  let bufferOff = rtUniform.blasOffset;
312
318
 
313
319
  ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
314
- if (gN == 3u) {
320
+ if (hj == 3u) {
315
321
 
316
322
 
317
323
 
318
324
 
319
- var qc = -1;
320
- var ta = 0u;
321
- var ln = 0u;
325
+ var rk = -1;
326
+ var uD = 0u;
327
+ var mj = 0u;
322
328
 
323
- var el = 0x80000000u;
324
- let wm = select(0u, 4u, d.x < 0.0)
329
+ var eu = 0x80000000u;
330
+ let yl = select(0u, 4u, d.x < 0.0)
325
331
  | select(0u, 2u, d.y < 0.0)
326
332
  | select(0u, 1u, d.z < 0.0);
327
- let rc = 7u - wm;
333
+ let su = 7u - yl;
328
334
 
329
335
 
330
336
 
331
337
 
332
- while (ta < 4096u) {
333
- ta++;
338
+ while (uD < 4096u) {
339
+ uD++;
334
340
 
335
- let internalMask = el & 0xffu;
336
- let qY =
337
- kI(el >> 24u) + 24u;
338
- el &= ~(1u << qY);
339
- if ((el & 0xff000000u) != 0u) {
340
- qc++;
341
+ let internalMask = eu & 0xffu;
342
+ let sp =
343
+ lv(eu >> 24u) + 24u;
344
+ eu &= ~(1u << sp);
345
+ if ((eu & 0xff000000u) != 0u) {
346
+ rk++;
341
347
 
342
- tE[qc] = vec2u(ln, el);
348
+ ve[rk] = vec2u(mj, eu);
343
349
  }
344
350
 
345
- let slot = (qY - 24u) ^ rc;
346
- let oa = (1u << slot) - 1u;
347
- let relativeIndex = countOneBits(internalMask & oa);
348
- let tA = ln + relativeIndex;
349
- let node = blasOffset + i32(tA * 5u);
350
- let jF = bvhBuffer[node + bufferOff];
351
- let vQ = oY(
352
- node, bufferOff, jF, o, gb, tMax
351
+ let slot = (sp - 24u) ^ su;
352
+ let oZ = (1u << slot) - 1u;
353
+ let relativeIndex = countOneBits(internalMask & oZ);
354
+ let va = mj + relativeIndex;
355
+ let node = blasOffset + i32(va * 5u);
356
+ let kj = bvhBuffer[node + bufferOff];
357
+ let xK = qg(
358
+ node, bufferOff, kj, o, invD, tMax
353
359
  );
354
360
 
355
361
 
356
- el = 0u;
357
- if (vQ != 0u) {
358
- let fF = bvhBuffer[node + bufferOff + 1];
359
- let sM = bitcast<u32>(jF.w) >> 24u;
360
- var uT = 0u;
361
- var kp = vQ;
362
- while (kp != 0u) {
363
- let sw = kI(kp);
364
- kp &= ~(1u << sw);
365
- let tW = select(
366
- bitcast<u32>(fF.z),
367
- bitcast<u32>(fF.w),
368
- sw >= 4u
362
+ eu = 0u;
363
+ if (xK != 0u) {
364
+ let fR = bvhBuffer[node + bufferOff + 1];
365
+ let ul = bitcast<u32>(kj.w) >> 24u;
366
+ var wG = 0u;
367
+ var kW = xK;
368
+ while (kW != 0u) {
369
+ let tW = lv(kW);
370
+ kW &= ~(1u << tW);
371
+ let vF = select(
372
+ bitcast<u32>(fR.z),
373
+ bitcast<u32>(fR.w),
374
+ tW >= 4u
369
375
  );
370
- let uF =
371
- (tW >> ((sw & 3u) * 8u)) & 0xffu;
372
- let jH = uF & 0x1fu;
373
- let xk = select(
374
- jH,
375
- jH ^ rc,
376
- jH >= 24u
376
+ let wn =
377
+ (vF >> ((tW & 3u) * 8u)) & 0xffu;
378
+ let kl = wn & 0x1fu;
379
+ let zm = select(
380
+ kl,
381
+ kl ^ su,
382
+ kl >= 24u
377
383
  );
378
- let wQ = (uF >> 5u) & 0x7u;
379
- uT |= wQ << xk;
384
+ let yR = (wn >> 5u) & 0x7u;
385
+ wG |= yR << zm;
380
386
  }
381
387
 
382
- ln = bitcast<u32>(fF.x);
383
- el = (uT & 0xff000000u) | sM;
384
- let ps = bitcast<u32>(fF.y);
385
- var pv = uT & 0x00ffffffu;
386
- while (pv != 0u) {
387
- let oD = oJ(pv);
388
- pv &= ~(1u << oD);
388
+ mj = bitcast<u32>(fR.x);
389
+ eu = (wG & 0xff000000u) | ul;
390
+ let qE = bitcast<u32>(fR.y);
391
+ var qF = wG & 0x00ffffffu;
392
+ while (qF != 0u) {
393
+ let pI = pR(qF);
394
+ qF &= ~(1u << pI);
389
395
  let primitiveCount = 1;
390
396
  let primitiveOffset = bufferOff + blasOffset
391
- + i32(ps + oD);
397
+ + i32(qE + pI);
392
398
  ${intersectTriangles}
393
399
  }
394
400
  }
395
401
 
396
- if ((el & 0xff000000u) != 0u) { continue; }
397
- if (qc >= 0) {
398
- let rf = tE[qc];
399
- ln = rf.x;
400
- el = rf.y;
401
- qc--;
402
+ if ((eu & 0xff000000u) != 0u) { continue; }
403
+ if (rk >= 0) {
404
+ let sw = ve[rk];
405
+ mj = sw.x;
406
+ eu = sw.y;
407
+ rk--;
402
408
  }
403
409
  else { break; }
404
410
  }
405
411
  }
406
412
  ` : ''}
407
413
 
408
- var dR = -1;
409
- if (gN != 3u) {
410
- dR = 0;
414
+ var dX = -1;
415
+ if (hj != 3u) {
416
+ dX = 0;
411
417
 
412
- gs[0] = xl;
418
+ gL[0] = zn;
413
419
  }
414
420
 
415
- while (dR >= 0) {
421
+ while (dX >= 0) {
416
422
 
417
- let node = gs[dR];
418
- dR--;
423
+ let node = gL[dX];
424
+ dX--;
419
425
  var primitiveCount = 0;
420
426
  var primitiveOffset = 0;
421
427
 
422
428
  ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
423
- if (gN == 2u) {
429
+ if (hj == 2u) {
424
430
  let i = node + bufferOff;
425
- let xq = bvhBuffer[i];
426
- let xr = bvhBuffer[i + 1];
427
- let xs = bvhBuffer[i + 2];
428
- let xt = bvhBuffer[i + 3];
429
- primitiveCount = i32(bitcast<u32>(xs.w));
431
+ let zr = bvhBuffer[i];
432
+ let zs = bvhBuffer[i + 1];
433
+ let zt = bvhBuffer[i + 2];
434
+ let zu = bvhBuffer[i + 3];
435
+ primitiveCount = i32(bitcast<u32>(zt.w));
430
436
  if (primitiveCount > 0) {
431
437
  primitiveOffset = bufferOff + blasOffset
432
- + i32(bitcast<u32>(xt.w));
438
+ + i32(bitcast<u32>(zu.w));
433
439
  }
434
440
  else {
435
- let left = blasOffset + i32(bitcast<u32>(xq.w) * 4u);
436
- let right = blasOffset + i32(bitcast<u32>(xr.w) * 4u);
437
- let pb = cH(
438
- o, xq.xyz, xr.xyz, gb, tMax
441
+ let left = blasOffset + i32(bitcast<u32>(zr.w) * 4u);
442
+ let right = blasOffset + i32(bitcast<u32>(zs.w) * 4u);
443
+ let qj = bP(
444
+ o, zr.xyz, zs.xyz, invD, tMax
439
445
  );
440
- let oc = cH(
441
- o, xs.xyz, xt.xyz, gb, tMax
446
+ let pb = bP(
447
+ o, zt.xyz, zu.xyz, invD, tMax
442
448
  );
443
- if (pb > oc) {
444
- if (pb > 0.0) {
445
- dR++; gs[dR] = left;
449
+ if (qj > pb) {
450
+ if (qj > 0.0) {
451
+ dX++; gL[dX] = left;
446
452
  }
447
- if (oc > 0.0) {
448
- dR++; gs[dR] = right;
453
+ if (pb > 0.0) {
454
+ dX++; gL[dX] = right;
449
455
  }
450
456
  }
451
457
  else {
452
- if (oc > 0.0) {
453
- dR++; gs[dR] = right;
454
- }
455
458
  if (pb > 0.0) {
456
- dR++; gs[dR] = left;
459
+ dX++; gL[dX] = right;
460
+ }
461
+ if (qj > 0.0) {
462
+ dX++; gL[dX] = left;
457
463
  }
458
464
  }
459
465
  }
460
466
  }
461
467
  ` : ''}
462
468
  ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
463
- if (gN == 1u) {
464
- let hT = bitcast<u32>(node);
465
- if ((hT & 0x80000000u) != 0u) {
466
- primitiveCount = i32((hT >> 23u) & 0xffu);
469
+ if (hj == 1u) {
470
+ let iE = bitcast<u32>(node);
471
+ if ((iE & 0x80000000u) != 0u) {
472
+ primitiveCount = i32((iE >> 23u) & 0xffu);
467
473
  primitiveOffset = bufferOff + blasOffset
468
- + i32(hT & 0x007fffffu);
474
+ + i32(iE & 0x007fffffu);
469
475
  }
470
476
  else {
471
477
  let i = node + bufferOff;
472
- let vW = bvhBuffer[i];
473
- let sq = bvhBuffer[i + 1];
474
- let qI = bvhBuffer[i + 2];
475
- let oF = bvhBuffer[i + 3];
476
- let nodeMin = vW.xyz;
477
- let ea = vec3f(vW.w, sq.x, sq.y);
478
- let mF = array<u32, 4>(
479
- bitcast<u32>(sq.z), bitcast<u32>(sq.w),
480
- bitcast<u32>(qI.x), bitcast<u32>(qI.y)
478
+ let xS = bvhBuffer[i];
479
+ let tR = bvhBuffer[i + 1];
480
+ let rW = bvhBuffer[i + 2];
481
+ let pL = bvhBuffer[i + 3];
482
+ let nodeMin = xS.xyz;
483
+ let ej = vec3f(xS.w, tR.x, tR.y);
484
+ let nH = array<u32, 4>(
485
+ bitcast<u32>(tR.z), bitcast<u32>(tR.w),
486
+ bitcast<u32>(rW.x), bitcast<u32>(rW.y)
481
487
  );
482
488
 
483
489
 
484
- let negative = gb < vec3f(0.0);
485
- let wK = unpack4x8unorm(bitcast<u32>(select(qI.z, oF.y, negative.x)));
486
- let xX = unpack4x8unorm(bitcast<u32>(select(oF.y, qI.z, negative.x)));
487
- let wL = unpack4x8unorm(bitcast<u32>(select(qI.w, oF.z, negative.y)));
488
- let xY = unpack4x8unorm(bitcast<u32>(select(oF.z, qI.w, negative.y)));
489
- let wM = unpack4x8unorm(bitcast<u32>(select(oF.x, oF.w, negative.z)));
490
- let xZ = unpack4x8unorm(bitcast<u32>(select(oF.w, oF.x, negative.z)));
491
- let padding = eU(gb, o);
492
- let ns = max(
490
+ let negative = invD < vec3f(0.0);
491
+ let yK = unpack4x8unorm(bitcast<u32>(select(rW.z, pL.y, negative.x)));
492
+ let zV = unpack4x8unorm(bitcast<u32>(select(pL.y, rW.z, negative.x)));
493
+ let yL = unpack4x8unorm(bitcast<u32>(select(rW.w, pL.z, negative.y)));
494
+ let zW = unpack4x8unorm(bitcast<u32>(select(pL.z, rW.w, negative.y)));
495
+ let yM = unpack4x8unorm(bitcast<u32>(select(pL.x, pL.w, negative.z)));
496
+ let zX = unpack4x8unorm(bitcast<u32>(select(pL.w, pL.x, negative.z)));
497
+ let padding = ff(invD, o);
498
+ let ot = max(
493
499
  max(
494
- (nodeMin.x + wK * ea.x - o.x) * gb.x - vec4f(padding.x),
495
- (nodeMin.y + wL * ea.y - o.y) * gb.y - vec4f(padding.y)
500
+ (nodeMin.x + yK * ej.x - o.x) * invD.x - vec4f(padding.x),
501
+ (nodeMin.y + yL * ej.y - o.y) * invD.y - vec4f(padding.y)
496
502
  ),
497
- (nodeMin.z + wM * ea.z - o.z) * gb.z - vec4f(padding.z)
503
+ (nodeMin.z + yM * ej.z - o.z) * invD.z - vec4f(padding.z)
498
504
  );
499
- let sW = min(
505
+ let uA = min(
500
506
  min(
501
- (nodeMin.x + xX * ea.x - o.x) * gb.x + vec4f(padding.x),
502
- (nodeMin.y + xY * ea.y - o.y) * gb.y + vec4f(padding.y)
507
+ (nodeMin.x + zV * ej.x - o.x) * invD.x + vec4f(padding.x),
508
+ (nodeMin.y + zW * ej.y - o.y) * invD.y + vec4f(padding.y)
503
509
  ),
504
- (nodeMin.z + xZ * ea.z - o.z) * gb.z + vec4f(padding.z)
510
+ (nodeMin.z + zX * ej.z - o.z) * invD.z + vec4f(padding.z)
505
511
  );
506
- var distance = select(sW, ns, ns > vec4f(0.0));
512
+ var distance = select(uA, ot, ot > vec4f(0.0));
507
513
  distance = select(
508
514
  distance,
509
515
  vec4f(-1.0),
510
- ns > min(sW, vec4f(tMax))
516
+ ot > min(uA, vec4f(tMax))
511
517
  );
512
- var eY = array<f32, 4>(
518
+ var fi = array<f32, 4>(
513
519
  distance.x,
514
520
  distance.y,
515
521
  distance.z,
@@ -518,78 +524,78 @@ distance.w
518
524
 
519
525
 
520
526
  for (var order = 0; order < 4; order++) {
521
- var dW = -1.0;
522
- var ej = -1;
527
+ var ee = -1.0;
528
+ var eq = -1;
523
529
  for (var child = 0; child < 4; child++) {
524
530
  if (
525
- mF[child] != 0u &&
526
- eY[child] > dW
531
+ nH[child] != 0u &&
532
+ fi[child] > ee
527
533
  ) {
528
- dW = eY[child];
529
- ej = child;
534
+ ee = fi[child];
535
+ eq = child;
530
536
  }
531
537
  }
532
- if (ej >= 0 && dW > 0.0) {
533
- let ol = mF[ej];
534
- var jO = bitcast<i32>(ol);
535
- if ((ol & 0x80000000u) == 0u) {
536
- jO += blasOffset;
538
+ if (eq >= 0 && ee > 0.0) {
539
+ let ph = nH[eq];
540
+ var kv = bitcast<i32>(ph);
541
+ if ((ph & 0x80000000u) == 0u) {
542
+ kv += blasOffset;
537
543
  }
538
- dR++;
539
- gs[dR] = jO;
540
- eY[ej] = -1.0;
544
+ dX++;
545
+ gL[dX] = kv;
546
+ fi[eq] = -1.0;
541
547
  }
542
548
  }
543
549
  }
544
550
  }
545
551
  ` : ''}
546
552
  ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
547
- if (gN == 0u) {
553
+ if (hj == 0u) {
548
554
  let i = node + bufferOff;
549
555
  let r1 = bvhBuffer[i];
550
- let bf = bitcast<i32>(r1.w);
556
+ let bh = bitcast<i32>(r1.w);
551
557
 
552
- if (bf >= 0) {
558
+ if (bh >= 0) {
553
559
  let left = node + 2;
554
- let right = bf + blasOffset;
555
- let d0 = cH(
560
+ let right = bh + blasOffset;
561
+ let d0 = bP(
556
562
  o,
557
563
  bvhBuffer[left + bufferOff].xyz,
558
564
  bvhBuffer[left + 1 + bufferOff].xyz,
559
- gb,
565
+ invD,
560
566
  tMax
561
567
  );
562
- let d1 = cH(
568
+ let d1 = bP(
563
569
  o,
564
570
  bvhBuffer[right + bufferOff].xyz,
565
571
  bvhBuffer[right + 1 + bufferOff].xyz,
566
- gb,
572
+ invD,
567
573
  tMax
568
574
  );
569
575
 
570
576
  if (d0 > d1) {
571
577
  if (d0 > 0.0) {
572
- dR++; gs[dR] = left;
578
+ dX++; gL[dX] = left;
573
579
 
574
580
  }
575
581
  if (d1 > 0.0) {
576
- dR++; gs[dR] = right;
582
+ dX++; gL[dX] = right;
577
583
 
578
584
  }
579
585
  }
580
586
  else {
581
587
  if (d1 > 0.0) {
582
- dR++; gs[dR] = right;
588
+ dX++; gL[dX] = right;
583
589
 
584
590
  }
585
591
  if (d0 > 0.0) {
586
- dR++; gs[dR] = left;
592
+ dX++; gL[dX] = left;
587
593
 
588
594
  }
589
595
  }
590
596
  }
591
597
  else {
592
- primitiveCount = -bf;
598
+ primitiveCount = -bh;
593
599
  primitiveOffset = i + 2;
594
600
  }
595
601
  }
@@ -608,21 +614,21 @@ ${intersectTriangles}
608
614
  // triangle tests without surface completion or any integrator/alpha sampling.
609
615
  export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
610
616
  return /* wgsl */ `
611
- struct qV {
617
+ struct sl {
612
618
  hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
613
619
  }
614
- fn wq(ray: Ray) -> qV {
615
- var result: qV;
620
+ fn yn(ray: Ray) -> sl {
621
+ var result: sl;
616
622
  result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
617
623
  if (rtUniform.isEmpty > 0) { return result; }
618
624
  let bounces = 0;
619
625
  let doubleSided = false;
620
- let jg = false;
621
- let fH = -1;
622
- let fG = -1;
626
+ let jK = false;
627
+ let fT = -1;
628
+ let fS = -1;
623
629
  var tMax = RAY_MAX_DISTANCE;
624
- var dZ: i32;
625
- var gH: vec3f;
630
+ var ei: i32;
631
+ var gZ: vec3f;
626
632
  ${getBVHTraverseCode(`
627
633
  result.hit = true; result.instance = bK; result.record = triangleIndex;
628
634
  result.t = tMax; result.barycentric = aw;
@@ -631,9 +637,9 @@ return result;
631
637
  }
632
638
  `;
633
639
  }
634
- export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
640
+ export function createSceneIntersectionsWgsl({ perInstanceBounds = false, compactVertices = false, hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
635
641
  return /* wgsl */ `
636
- fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jg: bool) {
642
+ fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jK: bool) {
637
643
 
638
644
  (*si).hit = false;
639
645
 
@@ -642,32 +648,32 @@ return;
642
648
  }
643
649
 
644
650
  var tMax = RAY_MAX_DISTANCE;
645
- var dZ: i32;
646
- var gH: vec3f;
651
+ var ei: i32;
652
+ var gZ: vec3f;
647
653
 
648
- var hr: vec3i;
649
- var lR: fw;
654
+ var hL: vec3i;
655
+ var mL: fL;
650
656
  var am: i32;
651
- var fH: i32 = (*si).triangleIndex;
652
- let fG = (*si).instanceIndex;
657
+ var fT: i32 = (*si).triangleIndex;
658
+ let fS = (*si).instanceIndex;
653
659
 
654
660
  ${getBVHTraverseCode(`
655
661
  (*si).triangleIndex = triangleIndex;
656
- lR = tri;
657
- hr = index;
662
+ mL = tri;
663
+ hL = index;
658
664
  am = bK;
659
- `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
665
+ `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
660
666
 
661
- ${closestHitHook} if (sd) {
662
- mH(
667
+ ${closestHitHook} if (tD) {
668
+ nJ(
663
669
  si,
664
- lR,
670
+ mL,
665
671
  aw,
666
- hr,
667
- bP,
672
+ hL,
673
+ bQ,
668
674
  am,
669
- ex,
670
- eS,
675
+ hitNormal,
676
+ fe,
671
677
  -1
672
678
  );
673
679
  }
@@ -683,38 +689,38 @@ return;
683
689
 
684
690
  let bounces = 0;
685
691
  let doubleSided = true;
686
- let jg = false;
692
+ let jK = false;
687
693
  var tMax = maxDistance;
688
- var dZ: i32;
689
- var gH: vec3f;
690
- var hr: vec3i;
691
- var lR: fw;
694
+ var ei: i32;
695
+ var gZ: vec3f;
696
+ var hL: vec3i;
697
+ var mL: fL;
692
698
  var am: i32;
693
- var fH: i32 = -1;
694
- let fG = instanceIndex;
699
+ var fT: i32 = -1;
700
+ let fS = instanceIndex;
695
701
 
696
702
  ${getBVHTraverseCode(`
697
703
  (*si).triangleIndex = triangleIndex;
698
- lR = tri;
699
- hr = index;
704
+ mL = tri;
705
+ hL = index;
700
706
  am = bK;
701
707
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
702
708
  if (bK != instanceIndex) {
703
709
  continue;
704
710
  }
705
- `)}
711
+ `, perInstanceBounds)}
706
712
 
707
- if (sd) {
713
+ if (tD) {
708
714
  (*si).instanceIndex = am;
709
- (*si).normal = ex;
710
- (*si).position = eS;
715
+ (*si).normal = hitNormal;
716
+ (*si).position = fe;
711
717
  (*si).materialIndex = i32(af(bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)).x);
712
- hn(
718
+ hI(
713
719
  si,
714
- lR,
720
+ mL,
715
721
  aw,
716
- hr,
717
- bP,
722
+ hL,
723
+ bQ,
718
724
  -1
719
725
  );
720
726
 
@@ -730,15 +736,15 @@ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
730
736
  instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
731
737
  instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
732
738
  );
733
- let aG = transpose(mat3x3<f32>(
739
+ let aH = transpose(mat3x3<f32>(
734
740
  w2l[0].xyz,
735
741
  w2l[1].xyz,
736
742
  w2l[2].xyz
737
743
  ));
738
- (*si).faceNormal = normalize(aG * ex);
739
- (*si).vertexNormal = normalize(aG * (*si).vertexNormal);
740
- (*si).normal = normalize(aG * (*si).normal);
741
- ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aG * (*si).coatNormal);` : ''}
744
+ (*si).faceNormal = normalize(aH * hitNormal);
745
+ (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
746
+ (*si).normal = normalize(aH * (*si).normal);
747
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
742
748
  if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
743
749
  (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
744
750
  }
@@ -753,76 +759,76 @@ ${hasAnisotropyDirections ? /* wgsl */ `
753
759
  }
754
760
  }
755
761
 
756
- fn ${shadowName}(ray: Ray, lightDistance: f32, jR: i32, rU:i32) -> bool {
762
+ fn ${shadowName}(ray: Ray, lightDistance: f32, kx: i32, tm:i32) -> bool {
757
763
  if (rtUniform.isEmpty > 0) {
758
764
  return false;
759
765
  }
760
766
 
761
767
  let doubleSided = true;
762
- let rj = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
763
- var tMax = rj;
764
- var dZ: i32;
765
- var gH: vec3f;
768
+ let sA = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
769
+ var tMax = sA;
770
+ var ei: i32;
771
+ var gZ: vec3f;
766
772
 
767
773
  let bounces = 1;
768
- var jg = false;
769
- var fH: i32 = jR;
770
- let fG = rU;
774
+ var jK = false;
775
+ var fT: i32 = kx;
776
+ let fS = tm;
771
777
 
772
778
  ${getBVHTraverseCode(
773
779
  /*wgsl */ `
774
780
 
775
781
 
776
782
 
777
- var jA = true;
783
+ var kc = true;
778
784
 
779
- if (jA) {
785
+ if (kc) {
780
786
  if (HAS_ALPHA) {
781
- let materialIndex = i32(af(bitcast<i32>(oX.z)).x);
782
- if (!ou(
787
+ let materialIndex = i32(af(bitcast<i32>(qf.z)).x);
788
+ if (!po(
783
789
  materialIndex,
784
790
  index,
785
791
  aw,
786
- eS,
787
- ex
792
+ fe,
793
+ hitNormal${compactVertices ? ', triangleIndex' : ''}
788
794
  )) {
789
795
 
790
- tMax = rj;
791
- jA = false;
796
+ tMax = sA;
797
+ kc = false;
792
798
  }
793
799
  }
794
800
  }
795
- if (jA) {
801
+ if (kc) {
796
802
  return true;
797
803
  }
798
- `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
804
+ `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections, '', perInstanceBounds)}
799
805
 
800
806
  return false;
801
807
  }
802
808
 
803
809
  `;
804
810
  }
805
- export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
811
+ export default function getIntersectCode({ perInstanceBounds = false, compactVertices = false, hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, sceneIntersections = '' }) {
806
812
  return /*wgsl*/ `
807
813
 
808
814
 
809
815
 
810
816
 
811
817
 
812
- var<private> mw: array<i32, TLAS_STACK_SIZE>;
813
- var<private> gs: array<i32, BLAS_STACK_SIZE>;
814
- ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> tE: array<vec2u, BLAS_STACK_SIZE>;` : ''}
818
+ var<private> nA: array<i32, TLAS_STACK_SIZE>;
819
+ var<private> gL: array<i32, BLAS_STACK_SIZE>;
820
+ ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> ve: array<vec2u, BLAS_STACK_SIZE>;` : ''}
815
821
 
816
822
  ${hasDisplacement ? displacementWgsl : ''}
817
823
  ${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
818
824
 
819
- struct fw {
825
+ struct fL {
820
826
  p0: vec3f,
821
827
  p1: vec3f,
822
828
  p2: vec3f,
823
829
  };
824
830
 
825
- fn hs(rad: f32, pos: vec3f, r: Ray) -> f32 {
831
+ fn hM(rad: f32, pos: vec3f, r: Ray) -> f32 {
826
832
  let op: vec3f = pos - r.o;
827
833
  let eps: f32 = 0.001;
828
834
  let b: f32 = dot(op, r.d);
@@ -845,7 +851,7 @@ return t2;
845
851
  return INF;
846
852
  }
847
853
 
848
- fn nV(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
854
+ fn oU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
849
855
  let dt: f32 = dot(r.d, n);
850
856
  let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
851
857
 
@@ -874,7 +880,7 @@ let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
874
880
  return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
875
881
  }
876
882
 
877
- fn mX(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
883
+ fn iB(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
878
884
 
879
885
 
880
886
  var d: f32 = INF;
@@ -886,9 +892,9 @@ var d: f32 = INF;
886
892
  (*lightSample).isDelta = false;
887
893
  var u = light.u;
888
894
  var v = light.v;
889
- var dO = i32(light.litType);
895
+ var dU = i32(light.litType);
890
896
 
891
- if (HAS_SCENE_RECT_LIGHT && dO == RECT_LIGHT) {
897
+ if (HAS_SCENE_RECT_LIGHT && dU == RECT_LIGHT) {
892
898
 
893
899
  var pos = light.position - u * 0.5 - v * 0.5;
894
900
  var normal = normalize(cross(u, v));
@@ -896,18 +902,18 @@ if (dot(normal, r.d) > 0.0) {
896
902
  return INF;
897
903
  }
898
904
 
899
- d = nV(pos, u, v, normal, r);
905
+ d = oU(pos, u, v, normal, r);
900
906
  if (d < 0.0) {
901
907
  d = INF;
902
908
  }
903
909
  else {
904
- var ct: f32 = dot(-r.d, normal);
910
+ var cv: f32 = dot(-r.d, normal);
905
911
  let spread = light.radiusOrSpread;
906
- if (ct >= cos(spread * PI / 2.0)) {
912
+ if (cv >= cos(spread * PI / 2.0)) {
907
913
  (*lightSample).direction = r.d;
908
914
  (*lightSample).normal = normal;
909
915
  (*lightSample).dist = d;
910
- (*lightSample).pdf = (d * d) / (light.area * ct);
916
+ (*lightSample).pdf = (d * d) / (light.area * cv);
911
917
  (*lightSample).emission = light.emission;
912
918
  (*lightSample).isDelta = false;
913
919
  }
@@ -917,12 +923,12 @@ d = INF;
917
923
  }
918
924
  }
919
925
 
920
- else if (HAS_SCENE_SPHERE_LIGHT && dO == SPHERE_LIGHT) {
926
+ else if (HAS_SCENE_SPHERE_LIGHT && dU == SPHERE_LIGHT) {
921
927
  if (light.radiusOrSpread <= 0.0) {
922
- let kz = light.position - r.o;
923
- let projection = dot(kz, r.d);
924
- let bd = kz - projection * r.d;
925
- if (projection <= EPS || dot(bd, bd) > 1e-8) {
928
+ let lj = light.position - r.o;
929
+ let projection = dot(lj, r.d);
930
+ let bf = lj - projection * r.d;
931
+ if (projection <= EPS || dot(bf, bf) > 1e-8) {
926
932
  return INF;
927
933
  }
928
934
  d = projection;
@@ -933,7 +939,7 @@ d = projection;
933
939
  (*lightSample).isDelta = true;
934
940
  }
935
941
  else {
936
- d = hs(light.radiusOrSpread, light.position, r);
942
+ d = hM(light.radiusOrSpread, light.position, r);
937
943
  (*lightSample).isDelta = false;
938
944
  if (d > 0.0 && d != INF) {
939
945
  (*lightSample).direction = r.d;
@@ -962,12 +968,12 @@ light.radiusOrSpread <= 0.0
962
968
  }
963
969
  }
964
970
 
965
- else if (HAS_SCENE_SPOT_LIGHT && dO == SPOT_LIGHT) {
971
+ else if (HAS_SCENE_SPOT_LIGHT && dU == SPOT_LIGHT) {
966
972
  if (light.radiusOrSpread <= 0.0) {
967
- let kz = light.position - r.o;
968
- let projection = dot(kz, r.d);
969
- let bd = kz - projection * r.d;
970
- if (projection <= EPS || dot(bd, bd) > 1e-8) {
973
+ let lj = light.position - r.o;
974
+ let projection = dot(lj, r.d);
975
+ let bf = lj - projection * r.d;
976
+ if (projection <= EPS || dot(bf, bf) > 1e-8) {
971
977
  return INF;
972
978
  }
973
979
  d = projection;
@@ -978,13 +984,13 @@ d = projection;
978
984
  (*lightSample).isDelta = true;
979
985
  }
980
986
  else {
981
- d = hs(light.radiusOrSpread, light.position, r);
987
+ d = hM(light.radiusOrSpread, light.position, r);
982
988
  (*lightSample).isDelta = false;
983
989
  }
984
990
  if (d != INF) {
985
- let xv = r.o + d * r.d;
986
- let ne = evaluateSpotEmissionMultiplier(light, normalize(r.o - xv));
987
- if (ne <= 0.0) { return INF; }
991
+ let zA = r.o + d * r.d;
992
+ let od = evaluateSpotEmissionMultiplier(light, normalize(r.o - zA));
993
+ if (od <= 0.0) { return INF; }
988
994
  if (light.radiusOrSpread > 0.0) {
989
995
  (*lightSample).direction = r.d;
990
996
  (*lightSample).dist = d;
@@ -993,7 +999,7 @@ r.o + r.d * d - light.position
993
999
  );
994
1000
  (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
995
1001
  }
996
- (*lightSample).emission = light.emission * ne * select(
1002
+ (*lightSample).emission = light.emission * od * select(
997
1003
  1.0,
998
1004
  1.0 / max(d * d, 1e-8),
999
1005
  light.radiusOrSpread <= 0.0
@@ -1001,7 +1007,7 @@ light.radiusOrSpread <= 0.0
1001
1007
  }
1002
1008
  }
1003
1009
 
1004
- else if (dO != RECT_LIGHT && dO != SPHERE_LIGHT && dO != SPOT_LIGHT) {
1010
+ else if (dU != RECT_LIGHT && dU != SPHERE_LIGHT && dU != SPOT_LIGHT) {
1005
1011
 
1006
1012
  d = INF;
1007
1013
  }
@@ -1009,7 +1015,7 @@ d = INF;
1009
1015
  return d;
1010
1016
  }
1011
1017
 
1012
- fn fh(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
1018
+ fn fv(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
1013
1019
  let m00 = af(m0.x);
1014
1020
  let m01 = af(m0.y);
1015
1021
  let m02 = af(m0.z);
@@ -1029,91 +1035,93 @@ var w20 = m20.y * bary.z;
1029
1035
  var w21 = m21.y * bary.z;
1030
1036
  var w22 = m22.y * bary.z;
1031
1037
 
1032
- var hd = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
1038
+ var hB = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
1033
1039
 
1034
- w00 = w00 / hd;
1035
- w01 = w01 / hd + w00;
1036
- w02 = w02 / hd + w01;
1037
- w10 = w10 / hd + w02;
1038
- w11 = w11 / hd + w10;
1039
- w12 = w12 / hd + w11;
1040
- w20 = w20 / hd + w12;
1041
- w21 = w21 / hd + w20;
1042
- w22 = w22 / hd + w21;
1040
+ w00 = w00 / hB;
1041
+ w01 = w01 / hB + w00;
1042
+ w02 = w02 / hB + w01;
1043
+ w10 = w10 / hB + w02;
1044
+ w11 = w11 / hB + w10;
1045
+ w12 = w12 / hB + w11;
1046
+ w20 = w20 / hB + w12;
1047
+ w21 = w21 / hB + w20;
1048
+ w22 = w22 / hB + w21;
1043
1049
 
1044
- let rand = ek(0u);
1045
- var nW: f32;
1050
+ let rand = cm(0u);
1051
+ var oV: f32;
1046
1052
  if (rand < w00) {
1047
- nW = m00.x;
1053
+ oV = m00.x;
1048
1054
  } else if (rand < w01) {
1049
- nW = m01.x;
1055
+ oV = m01.x;
1050
1056
  } else if (rand < w02) {
1051
- nW = m02.x;
1057
+ oV = m02.x;
1052
1058
  } else if (rand < w10) {
1053
- nW = m10.x;
1059
+ oV = m10.x;
1054
1060
  } else if (rand < w11) {
1055
- nW = m11.x;
1061
+ oV = m11.x;
1056
1062
  } else if (rand < w12) {
1057
- nW = m12.x;
1063
+ oV = m12.x;
1058
1064
  } else if (rand < w20) {
1059
- nW = m20.x;
1065
+ oV = m20.x;
1060
1066
  } else if (rand < w21) {
1061
- nW = m21.x;
1067
+ oV = m21.x;
1062
1068
  } else {
1063
- nW = m22.x;
1069
+ oV = m22.x;
1064
1070
  }
1065
- return i32(nW);
1071
+ return i32(oV);
1066
1072
  }
1067
1073
 
1068
- fn mp(
1069
- pQ: i32,
1074
+ fn nl(
1075
+ lw: i32,
1070
1076
  index: vec3i,
1071
- bary: vec3f
1077
+ bary: vec3f${compactVertices ? ', record: i32' : ''}
1072
1078
  ) -> i32 {
1079
+ ${compactVertices ? /* wgsl */ `return pJ(lw, record);` : /* wgsl */ `
1073
1080
  let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1074
1081
  let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1075
1082
  let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1076
1083
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
1077
- return fh(m0, m1, m2, bary);
1084
+ return fv(m0, m1, m2, bary);
1078
1085
  }
1079
- return pQ;
1086
+ return lw;
1087
+ `}
1080
1088
  }
1081
1089
 
1082
1090
 
1083
1091
 
1084
1092
  ${hasAnisotropyDirections ? /* wgsl */ `
1085
- fn ez(normal: vec3f, dp1: vec3f, dp2: vec3f, oM: vec2f, oN: vec2f, input: vec4f) -> mat2x3f {
1086
- let determinant = oM.x * oN.y - oM.y * oN.x;
1093
+ fn eI(normal: vec3f, dp1: vec3f, dp2: vec3f, pU: vec2f, pV: vec2f, input: vec4f) -> mat2x3f {
1094
+ let determinant = pU.x * pV.y - pU.y * pV.x;
1087
1095
  var t = input.xyz;
1088
1096
  var b = vec3f(0.0);
1089
1097
 
1090
1098
  var sign = select(input.w, 0.0, abs(input.w) > 1.5);
1091
1099
  if (abs(determinant) > 1e-12) {
1092
- let dt = (dp1 * oN.y - dp2 * oM.y) / determinant;
1093
- let db = (dp2 * oM.x - dp1 * oN.x) / determinant;
1100
+ let dt = (dp1 * pV.y - dp2 * pU.y) / determinant;
1101
+ let db = (dp2 * pU.x - dp1 * pV.x) / determinant;
1094
1102
  if (dot(t, t) < 1e-8) { t = dt; }
1095
1103
  if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
1096
1104
  }
1097
1105
  t -= normal * dot(normal, t);
1098
1106
  if (dot(t, t) < 1e-8) {
1099
- let ik = select(-1.0, 1.0, normal.z >= 0.0);
1100
- let cv = -1.0 / (ik + normal.z);
1101
- let xy = normal.x * normal.y * cv;
1102
- t = vec3f(1.0 + ik * normal.x * normal.x * cv, ik * xy, -ik * normal.x);
1103
- b = vec3f(xy, ik + normal.y * normal.y * cv, -normal.y);
1107
+ let iP = select(-1.0, 1.0, normal.z >= 0.0);
1108
+ let cA = -1.0 / (iP + normal.z);
1109
+ let xy = normal.x * normal.y * cA;
1110
+ t = vec3f(1.0 + iP * normal.x * normal.x * cA, iP * xy, -iP * normal.x);
1111
+ b = vec3f(xy, iP + normal.y * normal.y * cA, -normal.y);
1104
1112
  }
1105
1113
  else { t = normalize(t); b = normalize(cross(normal, t)); }
1106
1114
  return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
1107
1115
  }
1108
1116
 
1109
1117
  ` : /* wgsl */ ``}
1110
- fn hn(
1118
+ fn hI(
1111
1119
  si: ptr<function, SurfaceInteraction>,
1112
- tri: fw,
1120
+ tri: fL,
1113
1121
  bary: vec3f,
1114
1122
  index: vec3i,
1115
- bP: bool,
1116
- fq: i32
1123
+ bQ: bool,
1124
+ fH: i32
1117
1125
  ) {
1118
1126
  (*si).hit = true;
1119
1127
 
@@ -1125,26 +1133,26 @@ let i1 = index.y;
1125
1133
  let i2 = index.z;
1126
1134
  (*si).vertexColor = vec3f(1.0);
1127
1135
  if (USE_VERTEX_COLOR) {
1128
- (*si).vertexColor = bary.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
1129
- + bary.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
1130
- + bary.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
1136
+ (*si).vertexColor = bary.x * vertexColor(i0)
1137
+ + bary.y * vertexColor(i1)
1138
+ + bary.z * vertexColor(i2);
1131
1139
  }
1132
- let pL = uvProjection == ${uvProjectionConstants.spherical};
1140
+ let qP = uvProjection == ${uvProjectionConstants.spherical};
1133
1141
 
1134
1142
  var normal: vec3f = (*si).normal;
1135
- var gW: vec3f;
1143
+ var hu: vec3f;
1136
1144
  var n0 = vec3f(0.0);
1137
1145
  var n1 = vec3f(0.0);
1138
1146
  var n2 = vec3f(0.0);
1139
1147
 
1140
1148
 
1141
- if (!bP || pL) {
1142
- n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1143
- n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1144
- n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1145
- gW = normalize(bary.x * n0 + bary.y * n1 + bary.z * n2);
1146
- if (!bP) {
1147
- normal = gW;
1149
+ if (!bQ || qP) {
1150
+ n0 = vertexNormal(i0);
1151
+ n1 = vertexNormal(i1);
1152
+ n2 = vertexNormal(i2);
1153
+ hu = normalize(bary.x * n0 + bary.y * n1 + bary.z * n2);
1154
+ if (!bQ) {
1155
+ normal = hu;
1148
1156
  }
1149
1157
  }
1150
1158
 
@@ -1152,48 +1160,48 @@ var uv: vec2f;
1152
1160
  var uv0: vec2f;
1153
1161
  var uv1: vec2f;
1154
1162
  var uv2: vec2f;
1155
- var cQ = vec2f(0.0);
1163
+ var cT = vec2f(0.0);
1156
1164
  if (USE_UV) {
1157
- uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
1158
- uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
1159
- uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
1165
+ uv0 = hd(i0);
1166
+ uv1 = hd(i1);
1167
+ uv2 = hd(i2);
1160
1168
  uv = bary.x * uv0 + bary.y * uv1 + bary.z * uv2;
1161
1169
  if (USE_UV1) {
1162
- let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1163
- let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1164
- let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1165
- cQ = bary.x * secondaryUv0
1170
+ let secondaryUv0 = hV(i0);
1171
+ let secondaryUv1 = hV(i1);
1172
+ let secondaryUv2 = hV(i2);
1173
+ cT = bary.x * secondaryUv0
1166
1174
  + bary.y * secondaryUv1
1167
1175
  + bary.z * secondaryUv2;
1168
1176
  }
1169
1177
  }
1170
1178
 
1171
1179
  if (USE_TANGENT) {
1172
- let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1173
- let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1174
- let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1180
+ let t0 = gC(i0).xyz;
1181
+ let t1 = gC(i1).xyz;
1182
+ let t2 = gC(i2).xyz;
1175
1183
  (*si).tangent = normalize(bary.x * t0 + bary.y * t1 + bary.z * t2);
1176
1184
  }
1177
1185
 
1178
- if (fq >= 0) {
1179
- (*si).materialIndex = fq;
1186
+ if (fH >= 0) {
1187
+ (*si).materialIndex = fH;
1180
1188
  }
1181
1189
  else {
1182
- (*si).materialIndex = mp(
1190
+ (*si).materialIndex = nl(
1183
1191
  (*si).materialIndex,
1184
1192
  index,
1185
- bary
1193
+ bary${compactVertices ? ', (*si).triangleIndex' : ''}
1186
1194
  );
1187
1195
  }
1188
1196
 
1189
1197
  if (uvProjection > 0) {
1190
1198
 
1191
- uv = gE(uvProjection, (*si).position, select(normal, gW, pL));
1192
- cQ = uv;
1199
+ uv = gW(uvProjection, (*si).position, select(normal, hu, qP));
1200
+ cT = uv;
1193
1201
  }
1194
1202
 
1195
1203
  uv = uv * material.uvScale;
1196
- cQ = cQ * material.uvScale;
1204
+ cT = cT * material.uvScale;
1197
1205
 
1198
1206
 
1199
1207
  if (uvProjection == ${uvProjectionConstants.triplanar}) {
@@ -1206,41 +1214,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
1206
1214
  if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
1207
1215
  let dp1 = tri.p0 - tri.p2;
1208
1216
  let dp2 = tri.p1 - tri.p2;
1209
- var aS = vec4f(0.0);
1217
+ var aT = vec4f(0.0);
1210
1218
  if (USE_TANGENT) {
1211
- aS = bary.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
1212
- + bary.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
1213
- + bary.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1214
- }
1215
- let eL = ez(normal, dp1, dp2, uv0-uv2, uv1-uv2, aS);
1216
- (*si).geometryTangent = eL[0];
1217
- (*si).geometryBitangent = eL[1];
1218
- var fX = eL;
1219
+ aT = bary.x * gC(i0)
1220
+ + bary.y * gC(i1)
1221
+ + bary.z * gC(i2);
1222
+ }
1223
+ let eV = eI(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
1224
+ (*si).geometryTangent = eV[0];
1225
+ (*si).geometryBitangent = eV[1];
1226
+ var gp = eV;
1219
1227
  if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
1220
- let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1221
- let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1222
- let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1223
- fX = ez(normal, dp1, dp2, a-c, b-c, select(aS, vec4f(0.0), aS.w == 0.0));
1228
+ let a = hV(i0);
1229
+ let b = hV(i1);
1230
+ let c = hV(i2);
1231
+ gp = eI(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
1224
1232
  }
1225
- (*si).directionTangent = fX[0];
1226
- (*si).directionBitangent = fX[1];
1233
+ (*si).directionTangent = gp[0];
1234
+ (*si).directionBitangent = gp[1];
1227
1235
  ${hasCoatNormals ? /* wgsl */ `
1228
1236
  if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1229
- let kP = i32(directionMaterial.coatNormalMapIndex);
1230
- var mG = eL;
1231
- if (USE_UV1 && mapInfo[kP + NUM_MAPS * 2].x > 0.5) {
1232
- let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1233
- let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1234
- let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1235
- mG = ez(normal, dp1, dp2, a-c, b-c,
1236
- select(aS, vec4f(0.0), aS.w == 0.0));
1237
+ let lI = i32(directionMaterial.coatNormalMapIndex);
1238
+ var nI = eV;
1239
+ if (USE_UV1 && mapInfo[lI + NUM_MAPS * 2].x > 0.5) {
1240
+ let a = hV(i0);
1241
+ let b = hV(i1);
1242
+ let c = hV(i2);
1243
+ nI = eI(normal, dp1, dp2, a-c, b-c,
1244
+ select(aT, vec4f(0.0), aT.w == 0.0));
1237
1245
  }
1238
1246
 
1239
1247
 
1240
- let decoded = sampleMap(kP, getMapUvSet(kP, uv,
1241
- select(cQ, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1242
- let mapped = mG[0] * decoded.x * directionMaterial.coatNormalScale.x
1243
- + mG[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1248
+ let decoded = sampleMap(lI, getMapUvSet(lI, uv,
1249
+ select(cT, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1250
+ let mapped = nI[0] * decoded.x * directionMaterial.coatNormalScale.x
1251
+ + nI[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1244
1252
  if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1245
1253
  }
1246
1254
  ` : ''}
@@ -1250,19 +1258,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1250
1258
  (*si).normal = normal;
1251
1259
  (*si).vertexNormal = normal;
1252
1260
  (*si).shadowOffset = vec3f(0.0);
1253
- if (!bP) {
1261
+ if (!bQ) {
1254
1262
 
1255
1263
 
1256
1264
 
1257
1265
  let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1258
- let kw = bary.x * n0 + bary.y * n1 + bary.z * n2;
1266
+ let le = bary.x * n0 + bary.y * n1 + bary.z * n2;
1259
1267
  let a = dot(n2 - n0, tri.p0 - tri.p2);
1260
1268
  let b = dot(n2 - n1, tri.p1 - tri.p2);
1261
1269
  let c = dot(n1 - n0, tri.p1 - tri.p0);
1262
1270
  var h = a * bary.x * (bary.x - 1.0)
1263
1271
  + (a + b + c) * bary.x * bary.y
1264
1272
  + b * bary.y * (bary.y - 1.0);
1265
- if (dot(kw, geometricNormal) > 0.0) {
1273
+ if (dot(le, geometricNormal) > 0.0) {
1266
1274
  var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1267
1275
  var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1268
1276
  var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -1280,22 +1288,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1280
1288
  h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1281
1289
  h = min(-min(min(h0, h1), h2), h * 0.5);
1282
1290
  }
1283
- (*si).shadowOffset = kw * h;
1291
+ (*si).shadowOffset = le * h;
1284
1292
  }
1285
1293
  (*si).uv = uv;
1286
- (*si).uv1 = cQ;
1294
+ (*si).uv1 = cT;
1287
1295
  if (USE_NORMAL_MAPS) {
1288
1296
  let dp1 = tri.p0 - tri.p2;
1289
1297
  let dp2 = tri.p1 - tri.p2;
1290
- let oM = uv0 - uv2;
1291
- let oN = uv1 - uv2;
1292
- (*si).normal = oS(
1293
- (*si).materialIndex, uv, normal, dp1, dp2, oM, oN
1298
+ let pU = uv0 - uv2;
1299
+ let pV = uv1 - uv2;
1300
+ (*si).normal = qa(
1301
+ (*si).materialIndex, uv, normal, dp1, dp2, pU, pV
1294
1302
  );
1295
1303
  }
1296
1304
  }
1297
1305
 
1298
- struct ev {
1306
+ struct eF {
1299
1307
  t: f32,
1300
1308
  barycentric: vec3f,
1301
1309
  };
@@ -1304,8 +1312,8 @@ barycentric: vec3f,
1304
1312
 
1305
1313
 
1306
1314
 
1307
- fn fM(o: vec3f, d: vec3f, tri: fw, dZ: i32, gH: vec3f, tMax: f32) -> ev {
1308
- var ti: ev;
1315
+ fn fY(o: vec3f, d: vec3f, tri: fL, ei: i32, gZ: vec3f, tMax: f32) -> eF {
1316
+ var ti: eF;
1309
1317
 
1310
1318
 
1311
1319
  var p0t = tri.p0 - o;
@@ -1313,11 +1321,11 @@ var p1t = tri.p1 - o;
1313
1321
  var p2t = tri.p2 - o;
1314
1322
 
1315
1323
 
1316
- if (dZ == 0) {
1324
+ if (ei == 0) {
1317
1325
  p0t = p0t.yzx;
1318
1326
  p1t = p1t.yzx;
1319
1327
  p2t = p2t.yzx;
1320
- } else if (dZ == 1) {
1328
+ } else if (ei == 1) {
1321
1329
  p0t = p0t.zxy;
1322
1330
  p1t = p1t.zxy;
1323
1331
  p2t = p2t.zxy;
@@ -1325,9 +1333,9 @@ p2t = p2t.zxy;
1325
1333
 
1326
1334
 
1327
1335
 
1328
- p0t = vec3f(p0t.xy + gH.xy * p0t.z, p0t.z);
1329
- p1t = vec3f(p1t.xy + gH.xy * p1t.z, p1t.z);
1330
- p2t = vec3f(p2t.xy + gH.xy * p2t.z, p2t.z);
1336
+ p0t = vec3f(p0t.xy + gZ.xy * p0t.z, p0t.z);
1337
+ p1t = vec3f(p1t.xy + gZ.xy * p1t.z, p1t.z);
1338
+ p2t = vec3f(p2t.xy + gZ.xy * p2t.z, p2t.z);
1331
1339
 
1332
1340
 
1333
1341
  var e = vec3f(
@@ -1339,9 +1347,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
1339
1347
  if (DEPTH_QUERY_MODE) {
1340
1348
 
1341
1349
 
1342
- let sB = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1350
+ let ua = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1343
1351
  + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1344
- e = select(e, vec3f(0.0), abs(e) <= sB * 1e-6);
1352
+ e = select(e, vec3f(0.0), abs(e) <= ua * 1e-6);
1345
1353
  }
1346
1354
 
1347
1355
 
@@ -1352,19 +1360,19 @@ return ti;
1352
1360
  let det = e.x + e.y + e.z;
1353
1361
  if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1354
1362
 
1355
- p0t.z *= gH.z;
1356
- p1t.z *= gH.z;
1357
- p2t.z *= gH.z;
1358
- let sp = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1363
+ p0t.z *= gZ.z;
1364
+ p1t.z *= gZ.z;
1365
+ p2t.z *= gZ.z;
1366
+ let tQ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1359
1367
 
1360
1368
 
1361
- if (abs(sp) > abs(tMax * det)) {
1369
+ if (abs(tQ) > abs(tMax * det)) {
1362
1370
  return ti;
1363
1371
  }
1364
1372
 
1365
- let tP = 1. / det;
1366
- ti.t = sp * tP;
1367
- ti.barycentric = e * tP;
1373
+ let vu = 1. / det;
1374
+ ti.t = tQ * vu;
1375
+ ti.barycentric = e * vu;
1368
1376
 
1369
1377
  return ti;
1370
1378
  }
@@ -1374,26 +1382,26 @@ return ti;
1374
1382
 
1375
1383
  override DEPTH_QUERY_MODE: bool = false;
1376
1384
 
1377
- fn eW(d: vec3f) -> vec3f {
1385
+ fn traversalInverse(d: vec3f) -> vec3f {
1378
1386
  if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1379
1387
  return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1380
1388
  }
1381
1389
 
1382
- fn eU(gb: vec3f, o: vec3f) -> vec3f {
1390
+ fn ff(invD: vec3f, o: vec3f) -> vec3f {
1383
1391
  if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1384
- return abs(gb) * max(vec3f(1.0), abs(o)) * 1e-6;
1392
+ return abs(invD) * max(vec3f(1.0), abs(o)) * 1e-6;
1385
1393
  }
1386
1394
 
1387
1395
 
1388
1396
 
1389
- fn cH(o: vec3f, xU: vec3f, xT: vec3f, gb: vec3f, tMax: f32) -> f32 {
1390
- let xg = (xU - o) * gb;
1391
- let xh = (xT - o) * gb;
1392
- let padding = eU(gb, o);
1393
- let ns = min(xg, xh) - padding;
1394
- let sW = max(xg, xh) + padding;
1395
- let t0 = max(ns.x, max(ns.y, ns.z));
1396
- let t1 = min(sW.x, min(sW.y, sW.z));
1397
+ fn bP(o: vec3f, zT: vec3f, zS: vec3f, invD: vec3f, tMax: f32) -> f32 {
1398
+ let zi = (zT - o) * invD;
1399
+ let zj = (zS - o) * invD;
1400
+ let padding = ff(invD, o);
1401
+ let ot = min(zi, zj) - padding;
1402
+ let uA = max(zi, zj) + padding;
1403
+ let t0 = max(ot.x, max(ot.y, ot.z));
1404
+ let t1 = min(uA.x, min(uA.y, uA.z));
1397
1405
  return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1398
1406
  }
1399
1407
 
@@ -1401,45 +1409,45 @@ fn maxDimension(v: vec3f) -> i32 {
1401
1409
  return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1402
1410
  }
1403
1411
 
1404
- fn mU(d: vec3f, dZ: i32) -> vec3f {
1412
+ fn nV(d: vec3f, ei: i32) -> vec3f {
1405
1413
 
1406
1414
 
1407
- if (dZ == 0) {
1415
+ if (ei == 0) {
1408
1416
  return vec3f(-d.y, -d.z, 1.0) / d.x;
1409
- } else if (dZ == 1) {
1417
+ } else if (ei == 1) {
1410
1418
  return vec3f(-d.z, -d.x, 1.0) / d.y;
1411
1419
  } else {
1412
1420
  return vec3f(-d.x, -d.y, 1.0) / d.z;
1413
1421
  }
1414
1422
  }
1415
1423
 
1416
- fn mH(
1424
+ fn nJ(
1417
1425
  si: ptr<function, SurfaceInteraction>,
1418
- lR: fw,
1426
+ mL: fL,
1419
1427
  aw: vec3f,
1420
- hr: vec3i,
1421
- bP: bool,
1428
+ hL: vec3i,
1429
+ bQ: bool,
1422
1430
  am: i32,
1423
- ex: vec3f,
1424
- eS: vec3f,
1425
- fq: i32
1431
+ hitNormal: vec3f,
1432
+ fe: vec3f,
1433
+ fH: i32
1426
1434
  ) {
1427
1435
  (*si).instanceIndex = am;
1428
1436
  (*si).barycentrics = aw.xy;
1429
- (*si).normal = ex;
1430
- (*si).position = eS;
1437
+ (*si).normal = hitNormal;
1438
+ (*si).position = fe;
1431
1439
  (*si).materialIndex = i32(af(
1432
1440
  bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)
1433
1441
  ).x);
1434
1442
 
1435
1443
 
1436
- hn(
1444
+ hI(
1437
1445
  si,
1438
- lR,
1446
+ mL,
1439
1447
  aw,
1440
- hr,
1441
- bP,
1442
- fq
1448
+ hL,
1449
+ bQ,
1450
+ fH
1443
1451
  );
1444
1452
 
1445
1453
  let l2w = mat4x4<f32>(
@@ -1454,16 +1462,16 @@ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
1454
1462
  instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
1455
1463
  instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
1456
1464
  );
1457
- let aG = transpose(mat3x3<f32>(
1465
+ let aH = transpose(mat3x3<f32>(
1458
1466
  w2l[0].xyz,
1459
1467
  w2l[1].xyz,
1460
1468
  w2l[2].xyz
1461
1469
  ));
1462
1470
 
1463
- (*si).faceNormal = normalize(aG * ex);
1464
- (*si).vertexNormal = normalize(aG * (*si).vertexNormal);
1465
- (*si).normal = normalize(aG * (*si).normal);
1466
- ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aG * (*si).coatNormal);` : ''}
1471
+ (*si).faceNormal = normalize(aH * hitNormal);
1472
+ (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
1473
+ (*si).normal = normalize(aH * (*si).normal);
1474
+ ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
1467
1475
  if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
1468
1476
  (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
1469
1477
  }
@@ -1478,10 +1486,10 @@ ${hasAnisotropyDirections ? /* wgsl */ `
1478
1486
  }
1479
1487
 
1480
1488
 
1481
- ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
1489
+ ${createIntersectionAlphaWgsl(hasAnisotropyDirections, compactVertices)}
1482
1490
 
1483
1491
 
1484
1492
 
1485
- ${sceneIntersections || createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
1493
+ ${sceneIntersections || createSceneIntersectionsWgsl({ perInstanceBounds, compactVertices, hasDisplacement, hasAnisotropyDirections, hasCoatNormals, blasLayoutMask })}`;
1486
1494
  }
1487
1495
  //# sourceMappingURL=intersect.wgsl.js.map