@meimu/mutracer 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
@@ -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 = ga(o, d, tri, eq, gY, tMax);
11
+ let hit = fM(o, d, tri, dZ, gH, 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
- eL = normalize(cross(e1, e2));
16
- let kP = i32(ah(bitcast<i32>(pi.z)).x);
17
- let jd = materialsBuffer[kP].doubleSided > 0.5;
18
- if (!doubleSided && !jd && dot(eL, d) > 0.0) {
19
- eL = vec3f(0.0);
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);
20
20
  continue;
21
21
  }
22
22
 
23
23
  tMax = hit.t;
24
- sj = true;
25
- pl = true;
26
- fi = o + tMax * d;
27
- aC = hit.barycentric;
24
+ sd = true;
25
+ pa = true;
26
+ eS = o + tMax * d;
27
+ aw = hit.barycentric;
28
28
  }
29
29
  `;
30
30
  };
31
31
  function getPDMDisplacmentCode(anyHit) {
32
32
  return /*wgsl */ `
33
- let lH = pY(
33
+ let ll = pS(
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
- jO(displacementMapIndex),
39
+ jv(displacementMapIndex),
40
40
  minH, maxH,
41
41
  hScale,
42
42
  matData.displacementBias,
@@ -44,17 +44,17 @@ matData.displacementStepSize,
44
44
  i32(matData.displacementUvProjection),
45
45
  displacementUvProjectionScale,
46
46
  ${anyHit ? 'true' : 'false'},
47
- jA
47
+ jg
48
48
  );
49
49
  `;
50
50
  }
51
51
  const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
52
52
  return /* wgsl */ `
53
53
 
54
- let hScale = pi.w;
55
- let uQ = bitcast<i32>(r3.w);
54
+ let hScale = oX.w;
55
+ let uW = bitcast<i32>(r3.w);
56
56
 
57
- let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
57
+ let materialIndex = i32(af(bitcast<i32>(oX.z)).x);
58
58
  let matData = materialsBuffer[materialIndex];
59
59
  let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
60
60
  let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
@@ -64,9 +64,9 @@ 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 && uQ > 0) {
68
- let minH = f32(uQ >> 8) / 255.0;
69
- let maxH = f32(uQ & 0xff) / 255.0;
67
+ if (abs(hScale) > 0.0 && uW > 0) {
68
+ let minH = f32(uW >> 8) / 255.0;
69
+ let maxH = f32(uW & 0xff) / 255.0;
70
70
  let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
71
71
  let displacementMapIndex = i32(matData.displacementMapIndex);
72
72
 
@@ -77,18 +77,18 @@ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
77
77
 
78
78
  ${getPDMDisplacmentCode(anyHit)}
79
79
 
80
- if (lH.t < tMax) {
81
- eL = lH.normal;
80
+ if (ll.t < tMax) {
81
+ ex = ll.normal;
82
82
 
83
83
 
84
- tMax = lH.t;
84
+ tMax = ll.t;
85
85
 
86
- aC = lH.barycentric;
87
- fi = o + tMax * d;
86
+ aw = ll.barycentric;
87
+ eS = o + tMax * d;
88
88
 
89
- bZ = true;
90
- sj = true;
91
- pl = true;
89
+ bP = true;
90
+ sd = true;
91
+ pa = true;
92
92
  }
93
93
  }
94
94
  else {
@@ -97,7 +97,7 @@ ${flatIntersectCode()}
97
97
  `;
98
98
  };
99
99
  const cwbvhTraversalWgsl = /* wgsl */ `
100
- fn bA(value: u32) -> vec4f {
100
+ fn bm(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 lb(value: u32) -> u32 {
115
+ fn kI(value: u32) -> u32 {
116
116
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
117
117
  }
118
118
 
119
- fn oT(value: u32) -> u32 {
119
+ fn oJ(value: u32) -> u32 {
120
120
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
121
121
  }
122
122
 
123
- fn pj(
123
+ fn oY(
124
124
  node: i32,
125
- uJ: i32,
125
+ uN: i32,
126
126
  n0: vec4f,
127
127
  o: vec3f,
128
- gr: vec3f,
128
+ gb: vec3f,
129
129
  tMax: f32
130
130
  ) -> u32 {
131
- let i = node + uJ;
131
+ let i = node + uN;
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 sH = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
- let sI = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
- let sJ = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
- let hZ = vec3f(
140
- bitcast<f32>(u32(sH + 127) << 23u),
141
- bitcast<f32>(u32(sI + 127) << 23u),
142
- bitcast<f32>(u32(sJ + 127) << 23u)
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)
143
143
  );
144
- let padding = fk(gr, o);
145
- let eS = (n0.xyz - o) * gr;
146
- let dq = hZ * gr;
144
+ let padding = eU(gb, o);
145
+ let eD = (n0.xyz - o) * gb;
146
+ let cV = hG * gb;
147
147
 
148
148
 
149
149
 
150
- let vc = bitcast<vec4u>(n2);
151
- let vd = bitcast<vec4u>(n3);
152
- let ve = bitcast<vec4u>(n4);
153
- let negative = gr < vec3f(0.0);
154
- let wn = select(vc.xy, vd.zw, negative.x);
155
- let xt = select(vd.zw, vc.xy, negative.x);
156
- let wo = select(vc.zw, ve.xy, negative.y);
157
- let xu = select(ve.xy, vc.zw, negative.y);
158
- let wp = select(vd.xy, ve.zw, negative.z);
159
- let xv = select(ve.zw, vd.xy, negative.z);
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);
160
160
 
161
- let yl = max(
161
+ let yL = max(
162
162
  max(
163
- bA(wn.x) * dq.x + eS.x - vec4f(padding.x),
164
- bA(wo.x) * dq.y + eS.y - vec4f(padding.y)
163
+ bm(wK.x) * cV.x + eD.x - vec4f(padding.x),
164
+ bm(wL.x) * cV.y + eD.y - vec4f(padding.y)
165
165
  ),
166
- bA(wp.x) * dq.z + eS.z - vec4f(padding.z)
166
+ bm(wM.x) * cV.z + eD.z - vec4f(padding.z)
167
167
  );
168
- let yg = min(
168
+ let yH = min(
169
169
  min(
170
- bA(xt.x) * dq.x + eS.x + vec4f(padding.x),
171
- bA(xu.x) * dq.y + eS.y + vec4f(padding.y)
170
+ bm(xX.x) * cV.x + eD.x + vec4f(padding.x),
171
+ bm(xY.x) * cV.y + eD.y + vec4f(padding.y)
172
172
  ),
173
- bA(xv.x) * dq.z + eS.z + vec4f(padding.z)
173
+ bm(xZ.x) * cV.z + eD.z + vec4f(padding.z)
174
174
  );
175
- let ym = max(
175
+ let yM = max(
176
176
  max(
177
- bA(wn.y) * dq.x + eS.x - vec4f(padding.x),
178
- bA(wo.y) * dq.y + eS.y - vec4f(padding.y)
177
+ bm(wK.y) * cV.x + eD.x - vec4f(padding.x),
178
+ bm(wL.y) * cV.y + eD.y - vec4f(padding.y)
179
179
  ),
180
- bA(wp.y) * dq.z + eS.z - vec4f(padding.z)
180
+ bm(wM.y) * cV.z + eD.z - vec4f(padding.z)
181
181
  );
182
- let yh = min(
182
+ let yI = min(
183
183
  min(
184
- bA(xt.y) * dq.x + eS.x + vec4f(padding.x),
185
- bA(xu.y) * dq.y + eS.y + vec4f(padding.y)
184
+ bm(xX.y) * cV.x + eD.x + vec4f(padding.x),
185
+ bm(xY.y) * cV.y + eD.y + vec4f(padding.y)
186
186
  ),
187
- bA(xv.y) * dq.z + eS.z + vec4f(padding.z)
187
+ bm(xZ.y) * cV.z + eD.z + vec4f(padding.z)
188
188
  );
189
189
 
190
- let wl = (yl <= min(yg, vec4f(tMax))) & (yg > vec4f(0.0));
191
- let wm = (ym <= min(yh, vec4f(tMax))) & (yh > vec4f(0.0));
192
- return select(0u, 1u, wl.x)
193
- | select(0u, 2u, wl.y)
194
- | select(0u, 4u, wl.z)
195
- | select(0u, 8u, wl.w)
196
- | select(0u, 16u, wm.x)
197
- | select(0u, 32u, wm.y)
198
- | select(0u, 64u, wm.z)
199
- | select(0u, 128u, wm.w);
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);
200
200
  }
201
201
 
202
202
  `;
203
203
  function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
204
204
  const intersectTriangles = /* wgsl */ `
205
- let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
206
- let vertexOffset = vec3i(bitcast<i32>(pi.y));
205
+ let oX = instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE}];
206
+ let vertexOffset = vec3i(bitcast<i32>(oX.y));
207
207
  for (var k = 0; k < primitiveCount; k++) {
208
208
  let triangleIndex = primitiveOffset + k;
209
209
  ${skipTriangleCode}
210
- if (bounces > 0 && triangleIndex == fV) {
210
+ if (bounces > 0 && triangleIndex == fH && bK == fG) {
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 = fP(
216
+ var tri = fw(
217
217
  attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
218
218
  attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
219
219
  attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
220
220
  );
221
- var pl = false;
221
+ var pa = false;
222
222
 
223
223
  ${hasDisplacement
224
224
  ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
225
225
  : flatIntersectCode()}
226
- if (pl) {
226
+ if (pa) {
227
227
  ${handleHitCode}
228
228
  }
229
229
  }
@@ -231,285 +231,285 @@ ${handleHitCode}
231
231
  return /* wgsl */ `
232
232
  var d = ray.d;
233
233
  var o = ray.o;
234
- var jE = -1;
235
- var gr = fo(d);
236
- var bZ = false;
237
- var sj = false;
238
- var fi: vec3f;
239
- var eL: vec3f;
240
- var aC: vec3f;
241
-
242
-
243
- if (cU(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gr, tMax) > 0.0) {
244
- jE = 0;
245
- mK[0] = 0;
246
- }
247
- while (jE >= 0) {
248
- let ul = mK[jE];
249
- jE--;
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;
240
+ var aw: vec3f;
241
+
242
+
243
+ if (cH(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gb, tMax) > 0.0) {
244
+ jk = 0;
245
+ mw[0] = 0;
246
+ }
247
+ while (jk >= 0) {
248
+ let uo = mw[jk];
249
+ jk--;
250
250
  o = ray.o;
251
251
  d = ray.d;
252
- gr = fo(d);
253
-
254
- let xW = bvhBuffer[ul];
255
- let ff = bitcast<i32>(xW.w);
256
- if (ff >= 0) {
257
- let left = ul + 2;
258
- let right = ff;
259
- let d0 = cU(
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(
260
260
  o,
261
261
  bvhBuffer[left].xyz,
262
262
  bvhBuffer[left + 1].xyz,
263
- gr,
263
+ gb,
264
264
  tMax
265
265
  );
266
- let d1 = cU(
266
+ let d1 = cH(
267
267
  o,
268
268
  bvhBuffer[right].xyz,
269
269
  bvhBuffer[right + 1].xyz,
270
- gr,
270
+ gb,
271
271
  tMax
272
272
  );
273
273
 
274
274
  if (d0 > d1) {
275
- if (d0 > 0.0) { jE++; mK[jE] = left; }
276
- if (d1 > 0.0) { jE++; mK[jE] = right; }
275
+ if (d0 > 0.0) { jk++; mw[jk] = left; }
276
+ if (d1 > 0.0) { jk++; mw[jk] = right; }
277
277
  }
278
278
  else {
279
- if (d1 > 0.0) { jE++; mK[jE] = right; }
280
- if (d0 > 0.0) { jE++; mK[jE] = left; }
279
+ if (d1 > 0.0) { jk++; mw[jk] = right; }
280
+ if (d0 > 0.0) { jk++; mw[jk] = left; }
281
281
  }
282
282
  }
283
283
  else {
284
- let rQ = -ff;
284
+ let rN = -eP;
285
285
 
286
286
 
287
287
  for (
288
- var nq = rQ - 1;
289
- nq >= 0;
290
- nq--
288
+ var mW = rN - 1;
289
+ mW >= 0;
290
+ mW--
291
291
  ) {
292
- let qv = bvhBuffer[ul + 2 + nq];
293
- let bY = bitcast<i32>(qv.x);
294
- let wL = bitcast<i32>(qv.y);
295
- let pi = instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE}];
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}];
296
296
  let w2l = mat4x4<f32>(
297
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 1],
298
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 2],
299
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 3],
300
- instancesBuffer[bY * ${INSTANCE_VEC4_STRIDE} + 4]
297
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 1],
298
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 2],
299
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 3],
300
+ instancesBuffer[bK * ${INSTANCE_VEC4_STRIDE} + 4]
301
301
  );
302
302
  o = (w2l * vec4f(ray.o, 1.0)).xyz;
303
303
  d = (w2l * vec4f(ray.d, 0.0)).xyz;
304
- gr = fo(d);
305
- eq = maxDimension(abs(d));
306
- gY = nk(d, eq);
304
+ gb = eW(d);
305
+ dZ = maxDimension(abs(d));
306
+ gH = mU(d, dZ);
307
307
 
308
- let fY = bitcast<u32>(pi.x);
309
- let he = fY >> 30u;
310
- let blasOffset = i32(fY & 0x3fffffffu);
311
- let bw = rtUniform.blasOffset;
308
+ let fK = bitcast<u32>(oX.x);
309
+ let gN = fK >> 30u;
310
+ let blasOffset = i32(fK & 0x3fffffffu);
311
+ let bufferOff = rtUniform.blasOffset;
312
312
 
313
313
  ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
314
- if (he == 3u) {
314
+ if (gN == 3u) {
315
315
 
316
316
 
317
317
 
318
318
 
319
- var qj = -1;
320
- var td = 0u;
321
- var lJ = 0u;
319
+ var qc = -1;
320
+ var ta = 0u;
321
+ var ln = 0u;
322
322
 
323
- var eD = 0x80000000u;
324
- let vU = select(0u, 4u, d.x < 0.0)
323
+ var el = 0x80000000u;
324
+ let wm = select(0u, 4u, d.x < 0.0)
325
325
  | select(0u, 2u, d.y < 0.0)
326
326
  | select(0u, 1u, d.z < 0.0);
327
- let rn = 7u - vU;
327
+ let rc = 7u - wm;
328
328
 
329
329
 
330
330
 
331
331
 
332
- while (td < 4096u) {
333
- td++;
332
+ while (ta < 4096u) {
333
+ ta++;
334
334
 
335
- let internalMask = eD & 0xffu;
336
- let ri =
337
- lb(eD >> 24u) + 24u;
338
- eD &= ~(1u << ri);
339
- if ((eD & 0xff000000u) != 0u) {
340
- qj++;
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
341
 
342
- tD[qj] = vec2u(lJ, eD);
342
+ tE[qc] = vec2u(ln, el);
343
343
  }
344
344
 
345
- let slot = (ri - 24u) ^ rn;
346
- let om = (1u << slot) - 1u;
347
- let relativeIndex = countOneBits(internalMask & om);
348
- let tA = lJ + relativeIndex;
345
+ let slot = (qY - 24u) ^ rc;
346
+ let oa = (1u << slot) - 1u;
347
+ let relativeIndex = countOneBits(internalMask & oa);
348
+ let tA = ln + relativeIndex;
349
349
  let node = blasOffset + i32(tA * 5u);
350
- let jZ = bvhBuffer[node + bw];
351
- let vG = pj(
352
- node, bw, jZ, o, gr, tMax
350
+ let jF = bvhBuffer[node + bufferOff];
351
+ let vQ = oY(
352
+ node, bufferOff, jF, o, gb, tMax
353
353
  );
354
354
 
355
355
 
356
- eD = 0u;
357
- if (vG != 0u) {
358
- let fU = bvhBuffer[node + bw + 1];
359
- let sP = bitcast<u32>(jZ.w) >> 24u;
360
- var uO = 0u;
361
- var kM = vG;
362
- while (kM != 0u) {
363
- let sC = lb(kM);
364
- kM &= ~(1u << sC);
365
- let tT = select(
366
- bitcast<u32>(fU.z),
367
- bitcast<u32>(fU.w),
368
- sC >= 4u
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
369
369
  );
370
- let uB =
371
- (tT >> ((sC & 3u) * 8u)) & 0xffu;
372
- let kb = uB & 0x1fu;
373
- let wK = select(
374
- kb,
375
- kb ^ rn,
376
- kb >= 24u
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
377
377
  );
378
- let wt = (uB >> 5u) & 0x7u;
379
- uO |= wt << wK;
378
+ let wQ = (uF >> 5u) & 0x7u;
379
+ uT |= wQ << xk;
380
380
  }
381
381
 
382
- lJ = bitcast<u32>(fU.x);
383
- eD = (uO & 0xff000000u) | sP;
384
- let pM = bitcast<u32>(fU.y);
385
- var pN = uO & 0x00ffffffu;
386
- while (pN != 0u) {
387
- let oO = oT(pN);
388
- pN &= ~(1u << oO);
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);
389
389
  let primitiveCount = 1;
390
- let primitiveOffset = bw + blasOffset
391
- + i32(pM + oO);
390
+ let primitiveOffset = bufferOff + blasOffset
391
+ + i32(ps + oD);
392
392
  ${intersectTriangles}
393
393
  }
394
394
  }
395
395
 
396
- if ((eD & 0xff000000u) != 0u) { continue; }
397
- if (qj >= 0) {
398
- let ro = tD[qj];
399
- lJ = ro.x;
400
- eD = ro.y;
401
- qj--;
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
402
  }
403
403
  else { break; }
404
404
  }
405
405
  }
406
406
  ` : ''}
407
407
 
408
- var eh = -1;
409
- if (he != 3u) {
410
- eh = 0;
408
+ var dR = -1;
409
+ if (gN != 3u) {
410
+ dR = 0;
411
411
 
412
- gJ[0] = wL;
412
+ gs[0] = xl;
413
413
  }
414
414
 
415
- while (eh >= 0) {
415
+ while (dR >= 0) {
416
416
 
417
- let node = gJ[eh];
418
- eh--;
417
+ let node = gs[dR];
418
+ dR--;
419
419
  var primitiveCount = 0;
420
420
  var primitiveOffset = 0;
421
421
 
422
422
  ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
423
- if (he == 2u) {
424
- let i = node + bw;
425
- let wP = bvhBuffer[i];
426
- let wQ = bvhBuffer[i + 1];
427
- let wR = bvhBuffer[i + 2];
428
- let wS = bvhBuffer[i + 3];
429
- primitiveCount = i32(bitcast<u32>(wR.w));
423
+ if (gN == 2u) {
424
+ 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));
430
430
  if (primitiveCount > 0) {
431
- primitiveOffset = bw + blasOffset
432
- + i32(bitcast<u32>(wS.w));
431
+ primitiveOffset = bufferOff + blasOffset
432
+ + i32(bitcast<u32>(xt.w));
433
433
  }
434
434
  else {
435
- let left = blasOffset + i32(bitcast<u32>(wP.w) * 4u);
436
- let right = blasOffset + i32(bitcast<u32>(wQ.w) * 4u);
437
- let pm = cU(
438
- o, wP.xyz, wQ.xyz, gr, tMax
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
439
439
  );
440
- let oq = cU(
441
- o, wR.xyz, wS.xyz, gr, tMax
440
+ let oc = cH(
441
+ o, xs.xyz, xt.xyz, gb, tMax
442
442
  );
443
- if (pm > oq) {
444
- if (pm > 0.0) {
445
- eh++; gJ[eh] = left;
443
+ if (pb > oc) {
444
+ if (pb > 0.0) {
445
+ dR++; gs[dR] = left;
446
446
  }
447
- if (oq > 0.0) {
448
- eh++; gJ[eh] = right;
447
+ if (oc > 0.0) {
448
+ dR++; gs[dR] = right;
449
449
  }
450
450
  }
451
451
  else {
452
- if (oq > 0.0) {
453
- eh++; gJ[eh] = right;
452
+ if (oc > 0.0) {
453
+ dR++; gs[dR] = right;
454
454
  }
455
- if (pm > 0.0) {
456
- eh++; gJ[eh] = left;
455
+ if (pb > 0.0) {
456
+ dR++; gs[dR] = left;
457
457
  }
458
458
  }
459
459
  }
460
460
  }
461
461
  ` : ''}
462
462
  ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
463
- if (he == 1u) {
464
- let iw = bitcast<u32>(node);
465
- if ((iw & 0x80000000u) != 0u) {
466
- primitiveCount = i32((iw >> 23u) & 0xffu);
467
- primitiveOffset = bw + blasOffset
468
- + i32(iw & 0x007fffffu);
463
+ if (gN == 1u) {
464
+ let hT = bitcast<u32>(node);
465
+ if ((hT & 0x80000000u) != 0u) {
466
+ primitiveCount = i32((hT >> 23u) & 0xffu);
467
+ primitiveOffset = bufferOff + blasOffset
468
+ + i32(hT & 0x007fffffu);
469
469
  }
470
470
  else {
471
- let i = node + bw;
472
- let vJ = bvhBuffer[i];
473
- let sz = bvhBuffer[i + 1];
474
- let qR = bvhBuffer[i + 2];
475
- let oQ = bvhBuffer[i + 3];
476
- let nodeMin = vJ.xyz;
477
- let er = vec3f(vJ.w, sz.x, sz.y);
478
- let mT = array<u32, 4>(
479
- bitcast<u32>(sz.z), bitcast<u32>(sz.w),
480
- bitcast<u32>(qR.x), bitcast<u32>(qR.y)
471
+ 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)
481
481
  );
482
482
 
483
483
 
484
- let negative = gr < vec3f(0.0);
485
- let wn = unpack4x8unorm(bitcast<u32>(select(qR.z, oQ.y, negative.x)));
486
- let xt = unpack4x8unorm(bitcast<u32>(select(oQ.y, qR.z, negative.x)));
487
- let wo = unpack4x8unorm(bitcast<u32>(select(qR.w, oQ.z, negative.y)));
488
- let xu = unpack4x8unorm(bitcast<u32>(select(oQ.z, qR.w, negative.y)));
489
- let wp = unpack4x8unorm(bitcast<u32>(select(oQ.x, oQ.w, negative.z)));
490
- let xv = unpack4x8unorm(bitcast<u32>(select(oQ.w, oQ.x, negative.z)));
491
- let padding = fk(gr, o);
492
- let nJ = max(
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(
493
493
  max(
494
- (nodeMin.x + wn * er.x - o.x) * gr.x - vec4f(padding.x),
495
- (nodeMin.y + wo * er.y - o.y) * gr.y - vec4f(padding.y)
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)
496
496
  ),
497
- (nodeMin.z + wp * er.z - o.z) * gr.z - vec4f(padding.z)
497
+ (nodeMin.z + wM * ea.z - o.z) * gb.z - vec4f(padding.z)
498
498
  );
499
- let sY = min(
499
+ let sW = min(
500
500
  min(
501
- (nodeMin.x + xt * er.x - o.x) * gr.x + vec4f(padding.x),
502
- (nodeMin.y + xu * er.y - o.y) * gr.y + vec4f(padding.y)
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)
503
503
  ),
504
- (nodeMin.z + xv * er.z - o.z) * gr.z + vec4f(padding.z)
504
+ (nodeMin.z + xZ * ea.z - o.z) * gb.z + vec4f(padding.z)
505
505
  );
506
- var distance = select(sY, nJ, nJ > vec4f(0.0));
506
+ var distance = select(sW, ns, ns > vec4f(0.0));
507
507
  distance = select(
508
508
  distance,
509
509
  vec4f(-1.0),
510
- nJ > min(sY, vec4f(tMax))
510
+ ns > min(sW, vec4f(tMax))
511
511
  );
512
- var fq = array<f32, 4>(
512
+ var eY = array<f32, 4>(
513
513
  distance.x,
514
514
  distance.y,
515
515
  distance.z,
@@ -518,78 +518,78 @@ distance.w
518
518
 
519
519
 
520
520
  for (var order = 0; order < 4; order++) {
521
- var em = -1.0;
522
- var eB = -1;
521
+ var dW = -1.0;
522
+ var ej = -1;
523
523
  for (var child = 0; child < 4; child++) {
524
524
  if (
525
- mT[child] != 0u &&
526
- fq[child] > em
525
+ mF[child] != 0u &&
526
+ eY[child] > dW
527
527
  ) {
528
- em = fq[child];
529
- eB = child;
528
+ dW = eY[child];
529
+ ej = child;
530
530
  }
531
531
  }
532
- if (eB >= 0 && em > 0.0) {
533
- let oy = mT[eB];
534
- var ki = bitcast<i32>(oy);
535
- if ((oy & 0x80000000u) == 0u) {
536
- ki += blasOffset;
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;
537
537
  }
538
- eh++;
539
- gJ[eh] = ki;
540
- fq[eB] = -1.0;
538
+ dR++;
539
+ gs[dR] = jO;
540
+ eY[ej] = -1.0;
541
541
  }
542
542
  }
543
543
  }
544
544
  }
545
545
  ` : ''}
546
546
  ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
547
- if (he == 0u) {
548
- let i = node + bw;
547
+ if (gN == 0u) {
548
+ let i = node + bufferOff;
549
549
  let r1 = bvhBuffer[i];
550
- let bl = bitcast<i32>(r1.w);
550
+ let bf = bitcast<i32>(r1.w);
551
551
 
552
- if (bl >= 0) {
552
+ if (bf >= 0) {
553
553
  let left = node + 2;
554
- let right = bl + blasOffset;
555
- let d0 = cU(
554
+ let right = bf + blasOffset;
555
+ let d0 = cH(
556
556
  o,
557
- bvhBuffer[left + bw].xyz,
558
- bvhBuffer[left + 1 + bw].xyz,
559
- gr,
557
+ bvhBuffer[left + bufferOff].xyz,
558
+ bvhBuffer[left + 1 + bufferOff].xyz,
559
+ gb,
560
560
  tMax
561
561
  );
562
- let d1 = cU(
562
+ let d1 = cH(
563
563
  o,
564
- bvhBuffer[right + bw].xyz,
565
- bvhBuffer[right + 1 + bw].xyz,
566
- gr,
564
+ bvhBuffer[right + bufferOff].xyz,
565
+ bvhBuffer[right + 1 + bufferOff].xyz,
566
+ gb,
567
567
  tMax
568
568
  );
569
569
 
570
570
  if (d0 > d1) {
571
571
  if (d0 > 0.0) {
572
- eh++; gJ[eh] = left;
572
+ dR++; gs[dR] = left;
573
573
 
574
574
  }
575
575
  if (d1 > 0.0) {
576
- eh++; gJ[eh] = right;
576
+ dR++; gs[dR] = right;
577
577
 
578
578
  }
579
579
  }
580
580
  else {
581
581
  if (d1 > 0.0) {
582
- eh++; gJ[eh] = right;
582
+ dR++; gs[dR] = right;
583
583
 
584
584
  }
585
585
  if (d0 > 0.0) {
586
- eh++; gJ[eh] = left;
586
+ dR++; gs[dR] = left;
587
587
 
588
588
  }
589
589
  }
590
590
  }
591
591
  else {
592
- primitiveCount = -bl;
592
+ primitiveCount = -bf;
593
593
  primitiveOffset = i + 2;
594
594
  }
595
595
  }
@@ -608,23 +608,24 @@ ${intersectTriangles}
608
608
  // triangle tests without surface completion or any integrator/alpha sampling.
609
609
  export function createSceneHitQueryWgsl(hasAnisotropyDirections = false) {
610
610
  return /* wgsl */ `
611
- struct rd {
611
+ struct qV {
612
612
  hit: bool, instance: i32, record: i32, t: f32, barycentric: vec3f,
613
613
  }
614
- fn vW(ray: Ray) -> rd {
615
- var result: rd;
614
+ fn wq(ray: Ray) -> qV {
615
+ var result: qV;
616
616
  result.instance = -1; result.record = -1; result.t = RAY_MAX_DISTANCE;
617
617
  if (rtUniform.isEmpty > 0) { return result; }
618
618
  let bounces = 0;
619
619
  let doubleSided = false;
620
- let jA = false;
621
- let fV = -1;
620
+ let jg = false;
621
+ let fH = -1;
622
+ let fG = -1;
622
623
  var tMax = RAY_MAX_DISTANCE;
623
- var eq: i32;
624
- var gY: vec3f;
624
+ var dZ: i32;
625
+ var gH: vec3f;
625
626
  ${getBVHTraverseCode(`
626
- result.hit = true; result.instance = bY; result.record = triangleIndex;
627
- result.t = tMax; result.barycentric = aC;
627
+ result.hit = true; result.instance = bK; result.record = triangleIndex;
628
+ result.t = tMax; result.barycentric = aw;
628
629
  `, false, false, 1, hasAnisotropyDirections)}
629
630
  return result;
630
631
  }
@@ -632,7 +633,7 @@ return result;
632
633
  }
633
634
  export function createSceneIntersectionsWgsl({ hasDisplacement, hasAnisotropyDirections = true, hasCoatNormals = false, blasLayoutMask = 1, closestName = 'intersectScene', shadowName = 'intersectSceneShadow', bevelName = 'intersectSceneBevel', closestHitHook = '' }) {
634
635
  return /* wgsl */ `
635
- fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jA: bool) {
636
+ fn ${closestName}(ray: Ray, si: ptr<function, SurfaceInteraction>, bounces: i32, doubleSided: bool, jg: bool) {
636
637
 
637
638
  (*si).hit = false;
638
639
 
@@ -641,31 +642,32 @@ return;
641
642
  }
642
643
 
643
644
  var tMax = RAY_MAX_DISTANCE;
644
- var eq: i32;
645
- var gY: vec3f;
645
+ var dZ: i32;
646
+ var gH: vec3f;
646
647
 
647
- var hK: vec3i;
648
- var mk: fP;
649
- var ap: i32;
650
- var fV: i32 = (*si).triangleIndex;
648
+ var hr: vec3i;
649
+ var lR: fw;
650
+ var am: i32;
651
+ var fH: i32 = (*si).triangleIndex;
652
+ let fG = (*si).instanceIndex;
651
653
 
652
654
  ${getBVHTraverseCode(`
653
655
  (*si).triangleIndex = triangleIndex;
654
- mk = tri;
655
- hK = index;
656
- ap = bY;
656
+ lR = tri;
657
+ hr = index;
658
+ am = bK;
657
659
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
658
660
 
659
- ${closestHitHook} if (sj) {
660
- mV(
661
+ ${closestHitHook} if (sd) {
662
+ mH(
661
663
  si,
662
- mk,
663
- aC,
664
- hK,
665
- bZ,
666
- ap,
667
- eL,
668
- fi,
664
+ lR,
665
+ aw,
666
+ hr,
667
+ bP,
668
+ am,
669
+ ex,
670
+ eS,
669
671
  -1
670
672
  );
671
673
  }
@@ -681,61 +683,62 @@ return;
681
683
 
682
684
  let bounces = 0;
683
685
  let doubleSided = true;
684
- let jA = false;
686
+ let jg = false;
685
687
  var tMax = maxDistance;
686
- var eq: i32;
687
- var gY: vec3f;
688
- var hK: vec3i;
689
- var mk: fP;
690
- var ap: i32;
691
- var fV: i32 = -1;
688
+ var dZ: i32;
689
+ var gH: vec3f;
690
+ var hr: vec3i;
691
+ var lR: fw;
692
+ var am: i32;
693
+ var fH: i32 = -1;
694
+ let fG = instanceIndex;
692
695
 
693
696
  ${getBVHTraverseCode(`
694
697
  (*si).triangleIndex = triangleIndex;
695
- mk = tri;
696
- hK = index;
697
- ap = bY;
698
+ lR = tri;
699
+ hr = index;
700
+ am = bK;
698
701
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
699
- if (bY != instanceIndex) {
702
+ if (bK != instanceIndex) {
700
703
  continue;
701
704
  }
702
705
  `)}
703
706
 
704
- if (sj) {
705
- (*si).instanceIndex = ap;
706
- (*si).normal = eL;
707
- (*si).position = fi;
708
- (*si).materialIndex = i32(ah(bitcast<i32>(instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE}].z)).x);
709
- hH(
707
+ if (sd) {
708
+ (*si).instanceIndex = am;
709
+ (*si).normal = ex;
710
+ (*si).position = eS;
711
+ (*si).materialIndex = i32(af(bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)).x);
712
+ hn(
710
713
  si,
711
- mk,
712
- aC,
713
- hK,
714
- bZ,
714
+ lR,
715
+ aw,
716
+ hr,
717
+ bP,
715
718
  -1
716
719
  );
717
720
 
718
721
  let l2w = mat4x4<f32>(
719
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 5],
720
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 6],
721
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 7],
722
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 8]
722
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
723
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
724
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
725
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
723
726
  );
724
727
  let w2l = mat4x4<f32>(
725
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 1],
726
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 2],
727
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 3],
728
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 4]
728
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
729
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
730
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
731
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
729
732
  );
730
- let aH = transpose(mat3x3<f32>(
733
+ let aG = transpose(mat3x3<f32>(
731
734
  w2l[0].xyz,
732
735
  w2l[1].xyz,
733
736
  w2l[2].xyz
734
737
  ));
735
- (*si).faceNormal = normalize(aH * eL);
736
- (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
737
- (*si).normal = normalize(aH * (*si).normal);
738
- ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
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);` : ''}
739
742
  if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
740
743
  (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
741
744
  }
@@ -750,45 +753,46 @@ ${hasAnisotropyDirections ? /* wgsl */ `
750
753
  }
751
754
  }
752
755
 
753
- fn ${shadowName}(ray: Ray, lightDistance: f32, kn: i32) -> bool {
756
+ fn ${shadowName}(ray: Ray, lightDistance: f32, jR: i32, rU:i32) -> bool {
754
757
  if (rtUniform.isEmpty > 0) {
755
758
  return false;
756
759
  }
757
760
 
758
761
  let doubleSided = true;
759
- let rq = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
760
- var tMax = rq;
761
- var eq: i32;
762
- var gY: vec3f;
762
+ let rj = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
763
+ var tMax = rj;
764
+ var dZ: i32;
765
+ var gH: vec3f;
763
766
 
764
767
  let bounces = 1;
765
- var jA = false;
766
- var fV: i32 = kn;
768
+ var jg = false;
769
+ var fH: i32 = jR;
770
+ let fG = rU;
767
771
 
768
772
  ${getBVHTraverseCode(
769
773
  /*wgsl */ `
770
774
 
771
775
 
772
776
 
773
- var jS = true;
777
+ var jA = true;
774
778
 
775
- if (jS) {
779
+ if (jA) {
776
780
  if (HAS_ALPHA) {
777
- let materialIndex = i32(ah(bitcast<i32>(pi.z)).x);
778
- if (!oC(
781
+ let materialIndex = i32(af(bitcast<i32>(oX.z)).x);
782
+ if (!ou(
779
783
  materialIndex,
780
784
  index,
781
- aC,
782
- fi,
783
- eL
785
+ aw,
786
+ eS,
787
+ ex
784
788
  )) {
785
789
 
786
- tMax = rq;
787
- jS = false;
790
+ tMax = rj;
791
+ jA = false;
788
792
  }
789
793
  }
790
794
  }
791
- if (jS) {
795
+ if (jA) {
792
796
  return true;
793
797
  }
794
798
  `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}
@@ -805,20 +809,20 @@ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirecti
805
809
 
806
810
 
807
811
 
808
- var<private> mK: array<i32, TLAS_STACK_SIZE>;
809
- var<private> gJ: array<i32, BLAS_STACK_SIZE>;
810
- ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `var<private> tD: array<vec2u, BLAS_STACK_SIZE>;` : ''}
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>;` : ''}
811
815
 
812
816
  ${hasDisplacement ? displacementWgsl : ''}
813
817
  ${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
814
818
 
815
- struct fP {
819
+ struct fw {
816
820
  p0: vec3f,
817
821
  p1: vec3f,
818
822
  p2: vec3f,
819
823
  };
820
824
 
821
- fn hL(rad: f32, pos: vec3f, r: Ray) -> f32 {
825
+ fn hs(rad: f32, pos: vec3f, r: Ray) -> f32 {
822
826
  let op: vec3f = pos - r.o;
823
827
  let eps: f32 = 0.001;
824
828
  let b: f32 = dot(op, r.d);
@@ -841,7 +845,7 @@ return t2;
841
845
  return INF;
842
846
  }
843
847
 
844
- fn og(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
848
+ fn nV(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
845
849
  let dt: f32 = dot(r.d, n);
846
850
  let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
847
851
 
@@ -861,14 +865,16 @@ return INF;
861
865
  }
862
866
 
863
867
  fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
864
- let ak = distance(origin, center);
865
- if (ak <= radius) { return INV4PI; }
866
- let jV = min(1.0, radius * radius / (ak * ak));
867
- let cosThetaMax = sqrt(max(0.0, 1.0 - jV));
868
- return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
868
+ let ao = distance(origin, center);
869
+ if (ao <= radius) { return INV4PI; }
870
+ let sinThetaMaxSquared = min(1.0, radius * radius / (ao * ao));
871
+ let cosThetaMax = sqrt(max(0.0, 1.0 - sinThetaMaxSquared));
872
+
873
+ let oneMinusCosThetaMax = sinThetaMaxSquared / (1.0 + cosThetaMax);
874
+ return 1.0 / max(TWOPI * oneMinusCosThetaMax, 1e-8);
869
875
  }
870
876
 
871
- fn nr(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
877
+ fn mX(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
872
878
 
873
879
 
874
880
  var d: f32 = INF;
@@ -880,9 +886,9 @@ var d: f32 = INF;
880
886
  (*lightSample).isDelta = false;
881
887
  var u = light.u;
882
888
  var v = light.v;
883
- var ec = i32(light.litType);
889
+ var dO = i32(light.litType);
884
890
 
885
- if (HAS_SCENE_RECT_LIGHT && ec == RECT_LIGHT) {
891
+ if (HAS_SCENE_RECT_LIGHT && dO == RECT_LIGHT) {
886
892
 
887
893
  var pos = light.position - u * 0.5 - v * 0.5;
888
894
  var normal = normalize(cross(u, v));
@@ -890,18 +896,18 @@ if (dot(normal, r.d) > 0.0) {
890
896
  return INF;
891
897
  }
892
898
 
893
- d = og(pos, u, v, normal, r);
899
+ d = nV(pos, u, v, normal, r);
894
900
  if (d < 0.0) {
895
901
  d = INF;
896
902
  }
897
903
  else {
898
- var ci: f32 = dot(-r.d, normal);
904
+ var ct: f32 = dot(-r.d, normal);
899
905
  let spread = light.radiusOrSpread;
900
- if (ci >= cos(spread * PI / 2.0)) {
906
+ if (ct >= cos(spread * PI / 2.0)) {
901
907
  (*lightSample).direction = r.d;
902
908
  (*lightSample).normal = normal;
903
909
  (*lightSample).dist = d;
904
- (*lightSample).pdf = (d * d) / (light.area * ci);
910
+ (*lightSample).pdf = (d * d) / (light.area * ct);
905
911
  (*lightSample).emission = light.emission;
906
912
  (*lightSample).isDelta = false;
907
913
  }
@@ -911,12 +917,12 @@ d = INF;
911
917
  }
912
918
  }
913
919
 
914
- else if (HAS_SCENE_SPHERE_LIGHT && ec == SPHERE_LIGHT) {
920
+ else if (HAS_SCENE_SPHERE_LIGHT && dO == SPHERE_LIGHT) {
915
921
  if (light.radiusOrSpread <= 0.0) {
916
- let kT = light.position - r.o;
917
- let projection = dot(kT, r.d);
918
- let bk = kT - projection * r.d;
919
- if (projection <= EPS || dot(bk, bk) > 1e-8) {
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) {
920
926
  return INF;
921
927
  }
922
928
  d = projection;
@@ -927,7 +933,7 @@ d = projection;
927
933
  (*lightSample).isDelta = true;
928
934
  }
929
935
  else {
930
- d = hL(light.radiusOrSpread, light.position, r);
936
+ d = hs(light.radiusOrSpread, light.position, r);
931
937
  (*lightSample).isDelta = false;
932
938
  if (d > 0.0 && d != INF) {
933
939
  (*lightSample).direction = r.d;
@@ -956,12 +962,12 @@ light.radiusOrSpread <= 0.0
956
962
  }
957
963
  }
958
964
 
959
- else if (HAS_SCENE_SPOT_LIGHT && ec == SPOT_LIGHT) {
965
+ else if (HAS_SCENE_SPOT_LIGHT && dO == SPOT_LIGHT) {
960
966
  if (light.radiusOrSpread <= 0.0) {
961
- let kT = light.position - r.o;
962
- let projection = dot(kT, r.d);
963
- let bk = kT - projection * r.d;
964
- if (projection <= EPS || dot(bk, bk) > 1e-8) {
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) {
965
971
  return INF;
966
972
  }
967
973
  d = projection;
@@ -972,13 +978,13 @@ d = projection;
972
978
  (*lightSample).isDelta = true;
973
979
  }
974
980
  else {
975
- d = hL(light.radiusOrSpread, light.position, r);
981
+ d = hs(light.radiusOrSpread, light.position, r);
976
982
  (*lightSample).isDelta = false;
977
983
  }
978
984
  if (d != INF) {
979
- let wW = r.o + d * r.d;
980
- let nv = bP(light, normalize(r.o - wW));
981
- if (nv <= 0.0) { return 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; }
982
988
  if (light.radiusOrSpread > 0.0) {
983
989
  (*lightSample).direction = r.d;
984
990
  (*lightSample).dist = d;
@@ -987,7 +993,7 @@ r.o + r.d * d - light.position
987
993
  );
988
994
  (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
989
995
  }
990
- (*lightSample).emission = light.emission * nv * select(
996
+ (*lightSample).emission = light.emission * ne * select(
991
997
  1.0,
992
998
  1.0 / max(d * d, 1e-8),
993
999
  light.radiusOrSpread <= 0.0
@@ -995,7 +1001,7 @@ light.radiusOrSpread <= 0.0
995
1001
  }
996
1002
  }
997
1003
 
998
- else if (ec != RECT_LIGHT && ec != SPHERE_LIGHT && ec != SPOT_LIGHT) {
1004
+ else if (dO != RECT_LIGHT && dO != SPHERE_LIGHT && dO != SPOT_LIGHT) {
999
1005
 
1000
1006
  d = INF;
1001
1007
  }
@@ -1003,111 +1009,111 @@ d = INF;
1003
1009
  return d;
1004
1010
  }
1005
1011
 
1006
- fn fF(m0: vec3i, m1: vec3i, m2: vec3i, eU: vec3f) -> i32 {
1007
- let m00 = ah(m0.x);
1008
- let m01 = ah(m0.y);
1009
- let m02 = ah(m0.z);
1010
- let m10 = ah(m1.x);
1011
- let m11 = ah(m1.y);
1012
- let m12 = ah(m1.z);
1013
- let m20 = ah(m2.x);
1014
- let m21 = ah(m2.y);
1015
- let m22 = ah(m2.z);
1016
- var w00 = m00.y * eU.x;
1017
- var w01 = m01.y * eU.x;
1018
- var w02 = m02.y * eU.x;
1019
- var w10 = m10.y * eU.y;
1020
- var w11 = m11.y * eU.y;
1021
- var w12 = m12.y * eU.y;
1022
- var w20 = m20.y * eU.z;
1023
- var w21 = m21.y * eU.z;
1024
- var w22 = m22.y * eU.z;
1025
-
1026
- var hy = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
1027
-
1028
- w00 = w00 / hy;
1029
- w01 = w01 / hy + w00;
1030
- w02 = w02 / hy + w01;
1031
- w10 = w10 / hy + w02;
1032
- w11 = w11 / hy + w10;
1033
- w12 = w12 / hy + w11;
1034
- w20 = w20 / hy + w12;
1035
- w21 = w21 / hy + w20;
1036
- w22 = w22 / hy + w21;
1037
-
1038
- let rand = eC(0u);
1039
- var oh: f32;
1012
+ fn fh(m0: vec3i, m1: vec3i, m2: vec3i, bary: vec3f) -> i32 {
1013
+ let m00 = af(m0.x);
1014
+ let m01 = af(m0.y);
1015
+ let m02 = af(m0.z);
1016
+ let m10 = af(m1.x);
1017
+ let m11 = af(m1.y);
1018
+ let m12 = af(m1.z);
1019
+ let m20 = af(m2.x);
1020
+ let m21 = af(m2.y);
1021
+ let m22 = af(m2.z);
1022
+ var w00 = m00.y * bary.x;
1023
+ var w01 = m01.y * bary.x;
1024
+ var w02 = m02.y * bary.x;
1025
+ var w10 = m10.y * bary.y;
1026
+ var w11 = m11.y * bary.y;
1027
+ var w12 = m12.y * bary.y;
1028
+ var w20 = m20.y * bary.z;
1029
+ var w21 = m21.y * bary.z;
1030
+ var w22 = m22.y * bary.z;
1031
+
1032
+ var hd = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
1033
+
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;
1043
+
1044
+ let rand = ek(0u);
1045
+ var nW: f32;
1040
1046
  if (rand < w00) {
1041
- oh = m00.x;
1047
+ nW = m00.x;
1042
1048
  } else if (rand < w01) {
1043
- oh = m01.x;
1049
+ nW = m01.x;
1044
1050
  } else if (rand < w02) {
1045
- oh = m02.x;
1051
+ nW = m02.x;
1046
1052
  } else if (rand < w10) {
1047
- oh = m10.x;
1053
+ nW = m10.x;
1048
1054
  } else if (rand < w11) {
1049
- oh = m11.x;
1055
+ nW = m11.x;
1050
1056
  } else if (rand < w12) {
1051
- oh = m12.x;
1057
+ nW = m12.x;
1052
1058
  } else if (rand < w20) {
1053
- oh = m20.x;
1059
+ nW = m20.x;
1054
1060
  } else if (rand < w21) {
1055
- oh = m21.x;
1061
+ nW = m21.x;
1056
1062
  } else {
1057
- oh = m22.x;
1063
+ nW = m22.x;
1058
1064
  }
1059
- return i32(oh);
1065
+ return i32(nW);
1060
1066
  }
1061
1067
 
1062
- fn mF(
1063
- pW: i32,
1068
+ fn mp(
1069
+ pQ: i32,
1064
1070
  index: vec3i,
1065
- eU: vec3f
1071
+ bary: vec3f
1066
1072
  ) -> i32 {
1067
1073
  let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1068
1074
  let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1069
1075
  let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
1070
1076
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
1071
- return fF(m0, m1, m2, eU);
1077
+ return fh(m0, m1, m2, bary);
1072
1078
  }
1073
- return pW;
1079
+ return pQ;
1074
1080
  }
1075
1081
 
1076
1082
 
1077
1083
 
1078
1084
  ${hasAnisotropyDirections ? /* wgsl */ `
1079
- fn eP(normal: vec3f, dp1: vec3f, dp2: vec3f, oW: vec2f, oX: vec2f, input: vec4f) -> mat2x3f {
1080
- let determinant = oW.x * oX.y - oW.y * oX.x;
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;
1081
1087
  var t = input.xyz;
1082
1088
  var b = vec3f(0.0);
1083
1089
 
1084
1090
  var sign = select(input.w, 0.0, abs(input.w) > 1.5);
1085
1091
  if (abs(determinant) > 1e-12) {
1086
- let dt = (dp1 * oX.y - dp2 * oW.y) / determinant;
1087
- let db = (dp2 * oW.x - dp1 * oX.x) / determinant;
1092
+ let dt = (dp1 * oN.y - dp2 * oM.y) / determinant;
1093
+ let db = (dp2 * oM.x - dp1 * oN.x) / determinant;
1088
1094
  if (dot(t, t) < 1e-8) { t = dt; }
1089
1095
  if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
1090
1096
  }
1091
1097
  t -= normal * dot(normal, t);
1092
1098
  if (dot(t, t) < 1e-8) {
1093
- let iI = select(-1.0, 1.0, normal.z >= 0.0);
1094
- let cL = -1.0 / (iI + normal.z);
1095
- let xy = normal.x * normal.y * cL;
1096
- t = vec3f(1.0 + iI * normal.x * normal.x * cL, iI * xy, -iI * normal.x);
1097
- b = vec3f(xy, iI + normal.y * normal.y * cL, -normal.y);
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);
1098
1104
  }
1099
1105
  else { t = normalize(t); b = normalize(cross(normal, t)); }
1100
1106
  return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
1101
1107
  }
1102
1108
 
1103
1109
  ` : /* wgsl */ ``}
1104
- fn hH(
1110
+ fn hn(
1105
1111
  si: ptr<function, SurfaceInteraction>,
1106
- tri: fP,
1107
- eU: vec3f,
1112
+ tri: fw,
1113
+ bary: vec3f,
1108
1114
  index: vec3i,
1109
- bZ: bool,
1110
- fM: i32
1115
+ bP: bool,
1116
+ fq: i32
1111
1117
  ) {
1112
1118
  (*si).hit = true;
1113
1119
 
@@ -1119,26 +1125,26 @@ let i1 = index.y;
1119
1125
  let i2 = index.z;
1120
1126
  (*si).vertexColor = vec3f(1.0);
1121
1127
  if (USE_VERTEX_COLOR) {
1122
- (*si).vertexColor = eU.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
1123
- + eU.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
1124
- + eU.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
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;
1125
1131
  }
1126
- let pU = uvProjection == ${uvProjectionConstants.spherical};
1132
+ let pL = uvProjection == ${uvProjectionConstants.spherical};
1127
1133
 
1128
1134
  var normal: vec3f = (*si).normal;
1129
- var hq: vec3f;
1135
+ var gW: vec3f;
1130
1136
  var n0 = vec3f(0.0);
1131
1137
  var n1 = vec3f(0.0);
1132
1138
  var n2 = vec3f(0.0);
1133
1139
 
1134
1140
 
1135
- if (!bZ || pU) {
1141
+ if (!bP || pL) {
1136
1142
  n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1137
1143
  n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1138
1144
  n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1139
- hq = normalize(eU.x * n0 + eU.y * n1 + eU.z * n2);
1140
- if (!bZ) {
1141
- normal = hq;
1145
+ gW = normalize(bary.x * n0 + bary.y * n1 + bary.z * n2);
1146
+ if (!bP) {
1147
+ normal = gW;
1142
1148
  }
1143
1149
  }
1144
1150
 
@@ -1146,19 +1152,19 @@ var uv: vec2f;
1146
1152
  var uv0: vec2f;
1147
1153
  var uv1: vec2f;
1148
1154
  var uv2: vec2f;
1149
- var dj = vec2f(0.0);
1155
+ var cQ = vec2f(0.0);
1150
1156
  if (USE_UV) {
1151
1157
  uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
1152
1158
  uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
1153
1159
  uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
1154
- uv = eU.x * uv0 + eU.y * uv1 + eU.z * uv2;
1160
+ uv = bary.x * uv0 + bary.y * uv1 + bary.z * uv2;
1155
1161
  if (USE_UV1) {
1156
1162
  let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1157
1163
  let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1158
1164
  let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1159
- dj = eU.x * secondaryUv0
1160
- + eU.y * secondaryUv1
1161
- + eU.z * secondaryUv2;
1165
+ cQ = bary.x * secondaryUv0
1166
+ + bary.y * secondaryUv1
1167
+ + bary.z * secondaryUv2;
1162
1168
  }
1163
1169
  }
1164
1170
 
@@ -1166,28 +1172,28 @@ if (USE_TANGENT) {
1166
1172
  let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1167
1173
  let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1168
1174
  let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
1169
- (*si).tangent = normalize(eU.x * t0 + eU.y * t1 + eU.z * t2);
1175
+ (*si).tangent = normalize(bary.x * t0 + bary.y * t1 + bary.z * t2);
1170
1176
  }
1171
1177
 
1172
- if (fM >= 0) {
1173
- (*si).materialIndex = fM;
1178
+ if (fq >= 0) {
1179
+ (*si).materialIndex = fq;
1174
1180
  }
1175
1181
  else {
1176
- (*si).materialIndex = mF(
1182
+ (*si).materialIndex = mp(
1177
1183
  (*si).materialIndex,
1178
1184
  index,
1179
- eU
1185
+ bary
1180
1186
  );
1181
1187
  }
1182
1188
 
1183
1189
  if (uvProjection > 0) {
1184
1190
 
1185
- uv = gU(uvProjection, (*si).position, select(normal, hq, pU));
1186
- dj = uv;
1191
+ uv = gE(uvProjection, (*si).position, select(normal, gW, pL));
1192
+ cQ = uv;
1187
1193
  }
1188
1194
 
1189
1195
  uv = uv * material.uvScale;
1190
- dj = dj * material.uvScale;
1196
+ cQ = cQ * material.uvScale;
1191
1197
 
1192
1198
 
1193
1199
  if (uvProjection == ${uvProjectionConstants.triplanar}) {
@@ -1200,41 +1206,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
1200
1206
  if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || directionMaterial.coatWeight > 0.0" : ""}) {
1201
1207
  let dp1 = tri.p0 - tri.p2;
1202
1208
  let dp2 = tri.p1 - tri.p2;
1203
- var aX = vec4f(0.0);
1209
+ var aS = vec4f(0.0);
1204
1210
  if (USE_TANGENT) {
1205
- aX = eU.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
1206
- + eU.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
1207
- + eU.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1208
- }
1209
- let fc = eP(normal, dp1, dp2, uv0-uv2, uv1-uv2, aX);
1210
- (*si).geometryTangent = fc[0];
1211
- (*si).geometryBitangent = fc[1];
1212
- var gm = fc;
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;
1213
1219
  if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
1214
1220
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1215
1221
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1216
1222
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1217
- gm = eP(normal, dp1, dp2, a-c, b-c, select(aX, vec4f(0.0), aX.w == 0.0));
1223
+ fX = ez(normal, dp1, dp2, a-c, b-c, select(aS, vec4f(0.0), aS.w == 0.0));
1218
1224
  }
1219
- (*si).directionTangent = gm[0];
1220
- (*si).directionBitangent = gm[1];
1225
+ (*si).directionTangent = fX[0];
1226
+ (*si).directionBitangent = fX[1];
1221
1227
  ${hasCoatNormals ? /* wgsl */ `
1222
1228
  if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1223
- let lg = i32(directionMaterial.coatNormalMapIndex);
1224
- var mU = fc;
1225
- if (USE_UV1 && mapInfo[lg + NUM_MAPS * 2].x > 0.5) {
1229
+ let kP = i32(directionMaterial.coatNormalMapIndex);
1230
+ var mG = eL;
1231
+ if (USE_UV1 && mapInfo[kP + NUM_MAPS * 2].x > 0.5) {
1226
1232
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1227
1233
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1228
1234
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1229
- mU = eP(normal, dp1, dp2, a-c, b-c,
1230
- select(aX, vec4f(0.0), aX.w == 0.0));
1235
+ mG = ez(normal, dp1, dp2, a-c, b-c,
1236
+ select(aS, vec4f(0.0), aS.w == 0.0));
1231
1237
  }
1232
1238
 
1233
1239
 
1234
- let decoded = sampleMap(lg, getMapUvSet(lg, uv,
1235
- select(dj, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1236
- let mapped = mU[0] * decoded.x * directionMaterial.coatNormalScale.x
1237
- + mU[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
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;
1238
1244
  if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1239
1245
  }
1240
1246
  ` : ''}
@@ -1244,19 +1250,19 @@ if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1244
1250
  (*si).normal = normal;
1245
1251
  (*si).vertexNormal = normal;
1246
1252
  (*si).shadowOffset = vec3f(0.0);
1247
- if (!bZ) {
1253
+ if (!bP) {
1248
1254
 
1249
1255
 
1250
1256
 
1251
1257
  let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1252
- let kR = eU.x * n0 + eU.y * n1 + eU.z * n2;
1258
+ let kw = bary.x * n0 + bary.y * n1 + bary.z * n2;
1253
1259
  let a = dot(n2 - n0, tri.p0 - tri.p2);
1254
1260
  let b = dot(n2 - n1, tri.p1 - tri.p2);
1255
1261
  let c = dot(n1 - n0, tri.p1 - tri.p0);
1256
- var h = a * eU.x * (eU.x - 1.0)
1257
- + (a + b + c) * eU.x * eU.y
1258
- + b * eU.y * (eU.y - 1.0);
1259
- if (dot(kR, geometricNormal) > 0.0) {
1262
+ var h = a * bary.x * (bary.x - 1.0)
1263
+ + (a + b + c) * bary.x * bary.y
1264
+ + b * bary.y * (bary.y - 1.0);
1265
+ if (dot(kw, geometricNormal) > 0.0) {
1260
1266
  var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1261
1267
  var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1262
1268
  var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -1274,22 +1280,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1274
1280
  h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1275
1281
  h = min(-min(min(h0, h1), h2), h * 0.5);
1276
1282
  }
1277
- (*si).shadowOffset = kR * h;
1283
+ (*si).shadowOffset = kw * h;
1278
1284
  }
1279
1285
  (*si).uv = uv;
1280
- (*si).uv1 = dj;
1286
+ (*si).uv1 = cQ;
1281
1287
  if (USE_NORMAL_MAPS) {
1282
1288
  let dp1 = tri.p0 - tri.p2;
1283
1289
  let dp2 = tri.p1 - tri.p2;
1284
- let oW = uv0 - uv2;
1285
- let oX = uv1 - uv2;
1286
- (*si).normal = pd(
1287
- (*si).materialIndex, uv, normal, dp1, dp2, oW, oX
1290
+ let oM = uv0 - uv2;
1291
+ let oN = uv1 - uv2;
1292
+ (*si).normal = oS(
1293
+ (*si).materialIndex, uv, normal, dp1, dp2, oM, oN
1288
1294
  );
1289
1295
  }
1290
1296
  }
1291
1297
 
1292
- struct eK {
1298
+ struct ev {
1293
1299
  t: f32,
1294
1300
  barycentric: vec3f,
1295
1301
  };
@@ -1298,8 +1304,8 @@ barycentric: vec3f,
1298
1304
 
1299
1305
 
1300
1306
 
1301
- fn ga(o: vec3f, d: vec3f, tri: fP, eq: i32, gY: vec3f, tMax: f32) -> eK {
1302
- var ti: eK;
1307
+ fn fM(o: vec3f, d: vec3f, tri: fw, dZ: i32, gH: vec3f, tMax: f32) -> ev {
1308
+ var ti: ev;
1303
1309
 
1304
1310
 
1305
1311
  var p0t = tri.p0 - o;
@@ -1307,11 +1313,11 @@ var p1t = tri.p1 - o;
1307
1313
  var p2t = tri.p2 - o;
1308
1314
 
1309
1315
 
1310
- if (eq == 0) {
1316
+ if (dZ == 0) {
1311
1317
  p0t = p0t.yzx;
1312
1318
  p1t = p1t.yzx;
1313
1319
  p2t = p2t.yzx;
1314
- } else if (eq == 1) {
1320
+ } else if (dZ == 1) {
1315
1321
  p0t = p0t.zxy;
1316
1322
  p1t = p1t.zxy;
1317
1323
  p2t = p2t.zxy;
@@ -1319,9 +1325,9 @@ p2t = p2t.zxy;
1319
1325
 
1320
1326
 
1321
1327
 
1322
- p0t = vec3f(p0t.xy + gY.xy * p0t.z, p0t.z);
1323
- p1t = vec3f(p1t.xy + gY.xy * p1t.z, p1t.z);
1324
- p2t = vec3f(p2t.xy + gY.xy * p2t.z, p2t.z);
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);
1325
1331
 
1326
1332
 
1327
1333
  var e = vec3f(
@@ -1333,9 +1339,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
1333
1339
  if (DEPTH_QUERY_MODE) {
1334
1340
 
1335
1341
 
1336
- let sF = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1342
+ let sB = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1337
1343
  + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1338
- e = select(e, vec3f(0.0), abs(e) <= sF * 1e-6);
1344
+ e = select(e, vec3f(0.0), abs(e) <= sB * 1e-6);
1339
1345
  }
1340
1346
 
1341
1347
 
@@ -1346,19 +1352,19 @@ return ti;
1346
1352
  let det = e.x + e.y + e.z;
1347
1353
  if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1348
1354
 
1349
- p0t.z *= gY.z;
1350
- p1t.z *= gY.z;
1351
- p2t.z *= gY.z;
1352
- let sw = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
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);
1353
1359
 
1354
1360
 
1355
- if (abs(sw) > abs(tMax * det)) {
1361
+ if (abs(sp) > abs(tMax * det)) {
1356
1362
  return ti;
1357
1363
  }
1358
1364
 
1359
- let tN = 1. / det;
1360
- ti.t = sw * tN;
1361
- ti.barycentric = e * tN;
1365
+ let tP = 1. / det;
1366
+ ti.t = sp * tP;
1367
+ ti.barycentric = e * tP;
1362
1368
 
1363
1369
  return ti;
1364
1370
  }
@@ -1368,26 +1374,26 @@ return ti;
1368
1374
 
1369
1375
  override DEPTH_QUERY_MODE: bool = false;
1370
1376
 
1371
- fn fo(d: vec3f) -> vec3f {
1377
+ fn eW(d: vec3f) -> vec3f {
1372
1378
  if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1373
1379
  return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1374
1380
  }
1375
1381
 
1376
- fn fk(gr: vec3f, o: vec3f) -> vec3f {
1382
+ fn eU(gb: vec3f, o: vec3f) -> vec3f {
1377
1383
  if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1378
- return abs(gr) * max(vec3f(1.0), abs(o)) * 1e-6;
1384
+ return abs(gb) * max(vec3f(1.0), abs(o)) * 1e-6;
1379
1385
  }
1380
1386
 
1381
1387
 
1382
1388
 
1383
- fn cU(o: vec3f, xq: vec3f, xp: vec3f, gr: vec3f, tMax: f32) -> f32 {
1384
- let wG = (xq - o) * gr;
1385
- let wI = (xp - o) * gr;
1386
- let padding = fk(gr, o);
1387
- let nJ = min(wG, wI) - padding;
1388
- let sY = max(wG, wI) + padding;
1389
- let t0 = max(nJ.x, max(nJ.y, nJ.z));
1390
- let t1 = min(sY.x, min(sY.y, sY.z));
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));
1391
1397
  return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1392
1398
  }
1393
1399
 
@@ -1395,69 +1401,69 @@ fn maxDimension(v: vec3f) -> i32 {
1395
1401
  return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1396
1402
  }
1397
1403
 
1398
- fn nk(d: vec3f, eq: i32) -> vec3f {
1404
+ fn mU(d: vec3f, dZ: i32) -> vec3f {
1399
1405
 
1400
1406
 
1401
- if (eq == 0) {
1407
+ if (dZ == 0) {
1402
1408
  return vec3f(-d.y, -d.z, 1.0) / d.x;
1403
- } else if (eq == 1) {
1409
+ } else if (dZ == 1) {
1404
1410
  return vec3f(-d.z, -d.x, 1.0) / d.y;
1405
1411
  } else {
1406
1412
  return vec3f(-d.x, -d.y, 1.0) / d.z;
1407
1413
  }
1408
1414
  }
1409
1415
 
1410
- fn mV(
1416
+ fn mH(
1411
1417
  si: ptr<function, SurfaceInteraction>,
1412
- mk: fP,
1413
- aC: vec3f,
1414
- hK: vec3i,
1415
- bZ: bool,
1416
- ap: i32,
1417
- eL: vec3f,
1418
- fi: vec3f,
1419
- fM: i32
1418
+ lR: fw,
1419
+ aw: vec3f,
1420
+ hr: vec3i,
1421
+ bP: bool,
1422
+ am: i32,
1423
+ ex: vec3f,
1424
+ eS: vec3f,
1425
+ fq: i32
1420
1426
  ) {
1421
- (*si).instanceIndex = ap;
1422
- (*si).barycentrics = aC.xy;
1423
- (*si).normal = eL;
1424
- (*si).position = fi;
1425
- (*si).materialIndex = i32(ah(
1426
- bitcast<i32>(instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE}].z)
1427
+ (*si).instanceIndex = am;
1428
+ (*si).barycentrics = aw.xy;
1429
+ (*si).normal = ex;
1430
+ (*si).position = eS;
1431
+ (*si).materialIndex = i32(af(
1432
+ bitcast<i32>(instancesBuffer[am * ${INSTANCE_VEC4_STRIDE}].z)
1427
1433
  ).x);
1428
1434
 
1429
1435
 
1430
- hH(
1436
+ hn(
1431
1437
  si,
1432
- mk,
1433
- aC,
1434
- hK,
1435
- bZ,
1436
- fM
1438
+ lR,
1439
+ aw,
1440
+ hr,
1441
+ bP,
1442
+ fq
1437
1443
  );
1438
1444
 
1439
1445
  let l2w = mat4x4<f32>(
1440
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 5],
1441
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 6],
1442
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 7],
1443
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 8]
1446
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 5],
1447
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 6],
1448
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 7],
1449
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 8]
1444
1450
  );
1445
1451
  let w2l = mat4x4<f32>(
1446
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 1],
1447
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 2],
1448
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 3],
1449
- instancesBuffer[ap * ${INSTANCE_VEC4_STRIDE} + 4]
1452
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 1],
1453
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 2],
1454
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 3],
1455
+ instancesBuffer[am * ${INSTANCE_VEC4_STRIDE} + 4]
1450
1456
  );
1451
- let aH = transpose(mat3x3<f32>(
1457
+ let aG = transpose(mat3x3<f32>(
1452
1458
  w2l[0].xyz,
1453
1459
  w2l[1].xyz,
1454
1460
  w2l[2].xyz
1455
1461
  ));
1456
1462
 
1457
- (*si).faceNormal = normalize(aH * eL);
1458
- (*si).vertexNormal = normalize(aH * (*si).vertexNormal);
1459
- (*si).normal = normalize(aH * (*si).normal);
1460
- ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aH * (*si).coatNormal);` : ''}
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);` : ''}
1461
1467
  if (USE_TANGENT && dot((*si).tangent, (*si).tangent) > 0.0) {
1462
1468
  (*si).tangent = normalize((l2w * vec4f((*si).tangent, 0.0)).xyz);
1463
1469
  }