@meimu/mutracer 0.1.3 → 0.1.4

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 (118) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +4114 -4015
  3. package/docs/api.md +11 -9
  4. package/docs/threejs.md +30 -4
  5. package/lib/Engine.js +18 -1
  6. package/lib/Engine.js.map +1 -1
  7. package/lib/main.d.ts +1 -1
  8. package/lib/main.js.map +1 -1
  9. package/lib/oidn.d.ts +1 -1
  10. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  11. package/lib/renderer/MaterialTable.d.ts +1 -0
  12. package/lib/renderer/MaterialTable.js +10 -4
  13. package/lib/renderer/MaterialTable.js.map +1 -1
  14. package/lib/renderer/WGPUBloomPass.js +18 -18
  15. package/lib/renderer/WGPUFullQuadPass.js +6 -6
  16. package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
  17. package/lib/renderer/WGPURayTraceOutput.js +14 -14
  18. package/lib/renderer/WGPURayTracePass.d.ts +2 -0
  19. package/lib/renderer/WGPURayTracePass.js +12 -6
  20. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  21. package/lib/renderer/WGPURenderingPipeline.js +15 -15
  22. package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
  23. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  24. package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
  25. package/lib/renderer/WebGLRayTracePass.js +7 -1
  26. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  27. package/lib/renderer/envMapCreation.d.ts +5 -1
  28. package/lib/renderer/envMapCreation.js +42 -5
  29. package/lib/renderer/envMapCreation.js.map +1 -1
  30. package/lib/renderer/geometryUpdates.js +1 -1
  31. package/lib/renderer/geometryUpdates.js.map +1 -1
  32. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  33. package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
  34. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  35. package/lib/renderer/glsl/chunks/intersect.glsl.js +316 -310
  36. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  37. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +151 -119
  38. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  39. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +414 -414
  40. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  41. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  42. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +40 -39
  43. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  44. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
  45. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +78 -78
  46. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  47. package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
  48. package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
  49. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  50. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  51. package/lib/renderer/glsl/depthQuery.frag.js +5 -5
  52. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  53. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  54. package/lib/renderer/glsl/rayTrace.frag.js +133 -133
  55. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  56. package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
  57. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  58. package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
  59. package/lib/renderer/lightsUtil.js +6 -4
  60. package/lib/renderer/lightsUtil.js.map +1 -1
  61. package/lib/renderer/materialChanges.js +1 -1
  62. package/lib/renderer/materialChanges.js.map +1 -1
  63. package/lib/renderer/materialComparison.generated.js +36 -18
  64. package/lib/renderer/materialComparison.generated.js.map +1 -1
  65. package/lib/renderer/prepareMeshBVH.js +2 -2
  66. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  67. package/lib/renderer/sceneChangeDetector.js +4 -1
  68. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  69. package/lib/renderer/sceneLightChanges.js +3 -2
  70. package/lib/renderer/sceneLightChanges.js.map +1 -1
  71. package/lib/renderer/scratchSampling.js +18 -18
  72. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  73. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  74. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
  75. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  76. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +475 -469
  77. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
  79. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +93 -59
  80. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  81. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
  82. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  83. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
  84. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  85. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  86. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
  87. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  88. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
  89. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
  90. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
  91. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
  92. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
  93. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  94. package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
  95. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  96. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  97. package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
  98. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  99. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  100. package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
  101. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  102. package/lib/scene/EnvironmentLight.d.ts +9 -3
  103. package/lib/scene/EnvironmentLight.js +9 -2
  104. package/lib/scene/EnvironmentLight.js.map +1 -1
  105. package/lib/scene/Scene.d.ts +4 -0
  106. package/lib/scene/Scene.js.map +1 -1
  107. package/lib/scene/SpotLight.d.ts +2 -2
  108. package/lib/scene/SpotLight.js +1 -1
  109. package/lib/scene/SpotLight.js.map +1 -1
  110. package/lib/scene/Texture.d.ts +17 -6
  111. package/lib/scene/Texture.js +13 -4
  112. package/lib/scene/Texture.js.map +1 -1
  113. package/lib/util/fromTHREE.js +151 -29
  114. package/lib/util/fromTHREE.js.map +1 -1
  115. package/lib/version.d.ts +1 -1
  116. package/lib/version.js +1 -1
  117. package/lib/version.js.map +1 -1
  118. package/package.json +1 -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 = fI(o, d, tri, ey, gL, tMax);
11
+ let hit = fL(o, d, tri, ey, gP, 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
- eC = normalize(cross(e1, e2));
16
- let kd = i32(ae(bitcast<i32>(oh.z)).x);
17
- let iI = materialsBuffer[kd].doubleSided > 0.5;
18
- if (!doubleSided && !iI && dot(eC, d) > 0.0) {
19
- eC = vec3f(0.0);
15
+ eD = normalize(cross(e1, e2));
16
+ let kk = i32(ae(bitcast<i32>(ou.z)).x);
17
+ let iN = materialsBuffer[kk].doubleSided > 0.5;
18
+ if (!doubleSided && !iN && dot(eD, d) > 0.0) {
19
+ eD = vec3f(0.0);
20
20
  continue;
21
21
  }
22
22
 
23
23
  tMax = hit.t;
24
- qT = true;
25
- ol = true;
26
- eU = o + tMax * d;
24
+ rb = true;
25
+ ox = true;
26
+ eY = o + tMax * d;
27
27
  aB = hit.barycentric;
28
28
  }
29
29
  `;
30
30
  };
31
31
  function getPDMDisplacmentCode(anyHit) {
32
32
  return /*wgsl */ `
33
- let kO = oT(
33
+ let kX = pc(
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
- oa(displacementMapIndex),
39
+ kJ(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
- lq
47
+ lD
48
48
  );
49
49
  `;
50
50
  }
51
51
  const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
52
52
  return /* wgsl */ `
53
53
 
54
- let hScale = oh.w;
55
- let tn = bitcast<i32>(r3.w);
54
+ let hScale = ou.w;
55
+ let tA = bitcast<i32>(r3.w);
56
56
 
57
- let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
57
+ let materialIndex = i32(ae(bitcast<i32>(ou.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 && tn > 0) {
68
- let minH = f32(tn >> 8) / 255.0;
69
- let maxH = f32(tn & 0xff) / 255.0;
67
+ if (abs(hScale) > 0.0 && tA > 0) {
68
+ let minH = f32(tA >> 8) / 255.0;
69
+ let maxH = f32(tA & 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 (kO.t < tMax) {
81
- eC = kO.normal;
80
+ if (kX.t < tMax) {
81
+ eD = kX.normal;
82
82
 
83
83
 
84
- tMax = kO.t;
84
+ tMax = kX.t;
85
85
 
86
- aB = kO.barycentric;
87
- eU = o + tMax * d;
86
+ aB = kX.barycentric;
87
+ eY = o + tMax * d;
88
88
 
89
89
  bU = true;
90
- qT = true;
91
- ol = true;
90
+ rb = true;
91
+ ox = true;
92
92
  }
93
93
  }
94
94
  else {
@@ -112,118 +112,118 @@ f32(value >> 24u)
112
112
 
113
113
 
114
114
 
115
- fn kn(value: u32) -> u32 {
115
+ fn kx(value: u32) -> u32 {
116
116
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
117
117
  }
118
118
 
119
- fn nO(value: u32) -> u32 {
119
+ fn nZ(value: u32) -> u32 {
120
120
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
121
121
  }
122
122
 
123
- fn oi(
123
+ fn ov(
124
124
  node: i32,
125
- tc: i32,
125
+ tk: i32,
126
126
  n0: vec4f,
127
127
  o: vec3f,
128
- gx: vec3f,
128
+ gC: vec3f,
129
129
  tMax: f32
130
130
  ) -> u32 {
131
- let i = node + tc;
131
+ let i = node + tk;
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 rv = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
- let rw = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
- let rA = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
- let hF = vec3f(
140
- bitcast<f32>(u32(rv + 127) << 23u),
141
- bitcast<f32>(u32(rw + 127) << 23u),
142
- bitcast<f32>(u32(rA + 127) << 23u)
136
+ let rG = bitcast<i32>((header & 0xffu) << 24u) >> 24;
137
+ let rH = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
138
+ let rI = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
139
+ let hJ = vec3f(
140
+ bitcast<f32>(u32(rG + 127) << 23u),
141
+ bitcast<f32>(u32(rH + 127) << 23u),
142
+ bitcast<f32>(u32(rI + 127) << 23u)
143
143
  );
144
- let bJ = eV(gx, o);
145
- let eH = (n0.xyz - o) * gx;
146
- let da = hF * gx;
147
- let wr = bp(bitcast<u32>(n2.x));
148
- let ws = bp(bitcast<u32>(n2.y));
149
- let wt = bp(bitcast<u32>(n2.z));
150
- let wu = bp(bitcast<u32>(n2.w));
151
- let wv = bp(bitcast<u32>(n3.x));
152
- let ww = bp(bitcast<u32>(n3.y));
153
- let wl = bp(bitcast<u32>(n3.z));
154
- let wm = bp(bitcast<u32>(n3.w));
155
- let wn = bp(bitcast<u32>(n4.x));
156
- let wo = bp(bitcast<u32>(n4.y));
157
- let wp = bp(bitcast<u32>(n4.z));
158
- let wq = bp(bitcast<u32>(n4.w));
159
-
160
- let vh = wr * da.x + eH.x;
161
- let vk = wt * da.y + eH.y;
162
- let vm = wv * da.z + eH.z;
163
- let va = wl * da.x + eH.x;
164
- let vc = wn * da.y + eH.y;
165
- let ve = wp * da.z + eH.z;
166
- let wx = max(
167
- max((min(vh, va) - vec4f(bJ.x)), (min(vk, vc) - vec4f(bJ.y))),
168
- (min(vm, ve) - vec4f(bJ.z))
144
+ let bJ = eZ(gC, o);
145
+ let eI = (n0.xyz - o) * gC;
146
+ let dc = hJ * gC;
147
+ let wy = bp(bitcast<u32>(n2.x));
148
+ let wB = bp(bitcast<u32>(n2.y));
149
+ let wC = bp(bitcast<u32>(n2.z));
150
+ let wE = bp(bitcast<u32>(n2.w));
151
+ let wF = bp(bitcast<u32>(n3.x));
152
+ let wG = bp(bitcast<u32>(n3.y));
153
+ let ws = bp(bitcast<u32>(n3.z));
154
+ let wt = bp(bitcast<u32>(n3.w));
155
+ let wu = bp(bitcast<u32>(n4.x));
156
+ let wv = bp(bitcast<u32>(n4.y));
157
+ let ww = bp(bitcast<u32>(n4.z));
158
+ let wx = bp(bitcast<u32>(n4.w));
159
+
160
+ let vp = wy * dc.x + eI.x;
161
+ let vs = wC * dc.y + eI.y;
162
+ let vu = wF * dc.z + eI.z;
163
+ let vj = ws * dc.x + eI.x;
164
+ let vl = wu * dc.y + eI.y;
165
+ let vn = ww * dc.z + eI.z;
166
+ let wI = max(
167
+ max((min(vp, vj) - vec4f(bJ.x)), (min(vs, vl) - vec4f(bJ.y))),
168
+ (min(vu, vn) - vec4f(bJ.z))
169
169
  );
170
- let wg = min(
171
- min((max(vh, va) + vec4f(bJ.x)), (max(vk, vc) + vec4f(bJ.y))),
172
- (max(vm, ve) + vec4f(bJ.z))
170
+ let wn = min(
171
+ min((max(vp, vj) + vec4f(bJ.x)), (max(vs, vl) + vec4f(bJ.y))),
172
+ (max(vu, vn) + vec4f(bJ.z))
173
173
  );
174
174
 
175
- let vj = ws * da.x + eH.x;
176
- let vl = wu * da.y + eH.y;
177
- let vn = ww * da.z + eH.z;
178
- let vb = wm * da.x + eH.x;
179
- let vd = wo * da.y + eH.y;
180
- let vg = wq * da.z + eH.z;
181
- let wy = max(
182
- max((min(vj, vb) - vec4f(bJ.x)), (min(vl, vd) - vec4f(bJ.y))),
183
- (min(vn, vg) - vec4f(bJ.z))
175
+ let vq = wB * dc.x + eI.x;
176
+ let vt = wE * dc.y + eI.y;
177
+ let vw = wG * dc.z + eI.z;
178
+ let vk = wt * dc.x + eI.x;
179
+ let vm = wv * dc.y + eI.y;
180
+ let vo = wx * dc.z + eI.z;
181
+ let wJ = max(
182
+ max((min(vq, vk) - vec4f(bJ.x)), (min(vt, vm) - vec4f(bJ.y))),
183
+ (min(vw, vo) - vec4f(bJ.z))
184
184
  );
185
- let wh = min(
186
- min((max(vj, vb) + vec4f(bJ.x)), (max(vl, vd) + vec4f(bJ.y))),
187
- (max(vn, vg) + vec4f(bJ.z))
185
+ let wo = min(
186
+ min((max(vq, vk) + vec4f(bJ.x)), (max(vt, vm) + vec4f(bJ.y))),
187
+ (max(vw, vo) + vec4f(bJ.z))
188
188
  );
189
189
 
190
- let uD = (wx <= min(wg, vec4f(tMax))) & (wg > vec4f(0.0));
191
- let uE = (wy <= min(wh, vec4f(tMax))) & (wh > vec4f(0.0));
192
- return select(0u, 1u, uD.x)
193
- | select(0u, 2u, uD.y)
194
- | select(0u, 4u, uD.z)
195
- | select(0u, 8u, uD.w)
196
- | select(0u, 16u, uE.x)
197
- | select(0u, 32u, uE.y)
198
- | select(0u, 64u, uE.z)
199
- | select(0u, 128u, uE.w);
190
+ let uK = (wI <= min(wn, vec4f(tMax))) & (wn > vec4f(0.0));
191
+ let uL = (wJ <= min(wo, vec4f(tMax))) & (wo > vec4f(0.0));
192
+ return select(0u, 1u, uK.x)
193
+ | select(0u, 2u, uK.y)
194
+ | select(0u, 4u, uK.z)
195
+ | select(0u, 8u, uK.w)
196
+ | select(0u, 16u, uL.x)
197
+ | select(0u, 32u, uL.y)
198
+ | select(0u, 64u, uL.z)
199
+ | select(0u, 128u, uL.w);
200
200
  }
201
201
 
202
202
  `;
203
203
  function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
204
204
  const intersectTriangles = /* wgsl */ `
205
- let oh = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
206
- let vertexOffset = vec3i(bitcast<i32>(oh.y));
205
+ let ou = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
206
+ let vertexOffset = vec3i(bitcast<i32>(ou.y));
207
207
  for (var k = 0; k < bh; k++) {
208
208
  let triangleIndex = primitiveOffset + k;
209
209
  ${skipTriangleCode}
210
- if (bounces > 0 && triangleIndex == hK) {
210
+ if (bounces > 0 && triangleIndex == hO) {
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 = fu(
216
+ var tri = fA(
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 ol = false;
221
+ var ox = false;
222
222
 
223
223
  ${hasDisplacement
224
224
  ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
225
225
  : flatIntersectCode()}
226
- if (ol) {
226
+ if (ox) {
227
227
  ${handleHitCode}
228
228
  }
229
229
  }
@@ -231,69 +231,69 @@ ${handleHitCode}
231
231
  return /* wgsl */ `
232
232
  var d = ray.d;
233
233
  var o = ray.o;
234
- var lQ: array<i32, TLAS_STACK_SIZE>;
235
- var jd = -1;
236
- var gx = eX(d);
234
+ var mb: array<i32, TLAS_STACK_SIZE>;
235
+ var jh = -1;
236
+ var gC = fb(d);
237
237
  var bU = false;
238
- var qT = false;
239
- var eU: vec3f;
240
- var eC: vec3f;
238
+ var rb = false;
239
+ var eY: vec3f;
240
+ var eD: vec3f;
241
241
  var aB: vec3f;
242
242
 
243
243
 
244
- if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gx, tMax) > 0.0) {
245
- jd = 0;
246
- lQ[0] = 0;
244
+ if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gC, tMax) > 0.0) {
245
+ jh = 0;
246
+ mb[0] = 0;
247
247
  }
248
- while (jd >= 0) {
249
- let sN = lQ[jd];
250
- jd--;
248
+ while (jh >= 0) {
249
+ let sV = mb[jh];
250
+ jh--;
251
251
  o = ray.o;
252
252
  d = ray.d;
253
- gx = eX(d);
253
+ gC = fb(d);
254
254
 
255
- let vX = bvhBuffer[sN];
256
- let eR = bitcast<i32>(vX.w);
257
- if (eR >= 0) {
258
- let left = sN + 2;
259
- let right = eR;
255
+ let wf = bvhBuffer[sV];
256
+ let eV = bitcast<i32>(wf.w);
257
+ if (eV >= 0) {
258
+ let left = sV + 2;
259
+ let right = eV;
260
260
  let d0 = cM(
261
261
  o,
262
262
  bvhBuffer[left].xyz,
263
263
  bvhBuffer[left + 1].xyz,
264
- gx,
264
+ gC,
265
265
  tMax
266
266
  );
267
267
  let d1 = cM(
268
268
  o,
269
269
  bvhBuffer[right].xyz,
270
270
  bvhBuffer[right + 1].xyz,
271
- gx,
271
+ gC,
272
272
  tMax
273
273
  );
274
274
 
275
275
  if (d0 > d1) {
276
- if (d0 > 0.0) { jd++; lQ[jd] = left; }
277
- if (d1 > 0.0) { jd++; lQ[jd] = right; }
276
+ if (d0 > 0.0) { jh++; mb[jh] = left; }
277
+ if (d1 > 0.0) { jh++; mb[jh] = right; }
278
278
  }
279
279
  else {
280
- if (d1 > 0.0) { jd++; lQ[jd] = right; }
281
- if (d0 > 0.0) { jd++; lQ[jd] = left; }
280
+ if (d1 > 0.0) { jh++; mb[jh] = right; }
281
+ if (d0 > 0.0) { jh++; mb[jh] = left; }
282
282
  }
283
283
  }
284
284
  else {
285
- let qB = -eR;
285
+ let qJ = -eV;
286
286
 
287
287
 
288
288
  for (
289
- var ml = qB - 1;
290
- ml >= 0;
291
- ml--
289
+ var mx = qJ - 1;
290
+ mx >= 0;
291
+ mx--
292
292
  ) {
293
- let pq = bvhBuffer[sN + 2 + ml];
294
- let cf = bitcast<i32>(pq.x);
295
- let uN = bitcast<i32>(pq.y);
296
- let oh = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
293
+ let pI = bvhBuffer[sV + 2 + mx];
294
+ let cf = bitcast<i32>(pI.x);
295
+ let uU = bitcast<i32>(pI.y);
296
+ let ou = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
297
297
  let w2l = mat4x4<f32>(
298
298
  instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
299
299
  instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
@@ -302,214 +302,214 @@ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 4]
302
302
  );
303
303
  o = (w2l * vec4f(ray.o, 1.0)).xyz;
304
304
  d = (w2l * vec4f(ray.d, 0.0)).xyz;
305
- gx = eX(d);
305
+ gC = fb(d);
306
306
  ey = maxDimension(abs(d));
307
- gL = mj(d, ey);
307
+ gP = mv(d, ey);
308
308
 
309
- let fG = bitcast<u32>(oh.x);
310
- let gN = fG >> 30u;
311
- let blasOffset = i32(fG & 0x3fffffffu);
309
+ let fJ = bitcast<u32>(ou.x);
310
+ let gR = fJ >> 30u;
311
+ let blasOffset = i32(fJ & 0x3fffffffu);
312
312
  let bo = rtUniform.blasOffset;
313
313
 
314
314
  ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
315
- if (gN == 3u) {
315
+ if (gR == 3u) {
316
316
 
317
317
 
318
318
 
319
319
 
320
- var sd: array<vec2u, BLAS_STACK_SIZE>;
321
- var pe = -1;
322
- var rP = 0u;
323
- var kQ = 0u;
320
+ var sm: array<vec2u, BLAS_STACK_SIZE>;
321
+ var pn = -1;
322
+ var rX = 0u;
323
+ var kZ = 0u;
324
324
 
325
325
  var ep = 0x80000000u;
326
- let ul = select(0u, 4u, d.x < 0.0)
326
+ let ut = select(0u, 4u, d.x < 0.0)
327
327
  | select(0u, 2u, d.y < 0.0)
328
328
  | select(0u, 1u, d.z < 0.0);
329
- let qd = 7u - ul;
329
+ let ql = 7u - ut;
330
330
 
331
331
 
332
332
 
333
333
 
334
- while (rP < 4096u) {
335
- rP++;
334
+ while (rX < 4096u) {
335
+ rX++;
336
336
 
337
337
  let internalMask = ep & 0xffu;
338
- let pZ =
339
- kn(ep >> 24u) + 24u;
340
- ep &= ~(1u << pZ);
338
+ let qh =
339
+ kx(ep >> 24u) + 24u;
340
+ ep &= ~(1u << qh);
341
341
  if ((ep & 0xff000000u) != 0u) {
342
- pe++;
342
+ pn++;
343
343
 
344
- sd[pe] = vec2u(kQ, ep);
344
+ sm[pn] = vec2u(kZ, ep);
345
345
  }
346
346
 
347
- let slot = (pZ - 24u) ^ qd;
348
- let ne = (1u << slot) - 1u;
349
- let relativeIndex = countOneBits(internalMask & ne);
350
- let sb = kQ + relativeIndex;
351
- let node = blasOffset + i32(sb * 5u);
352
- let ju = bvhBuffer[node + bo];
353
- let tX = oi(
354
- node, bo, ju, o, gx, tMax
347
+ let slot = (qh - 24u) ^ ql;
348
+ let ns = (1u << slot) - 1u;
349
+ let relativeIndex = countOneBits(internalMask & ns);
350
+ let sk = kZ + relativeIndex;
351
+ let node = blasOffset + i32(sk * 5u);
352
+ let jA = bvhBuffer[node + bo];
353
+ let ue = ov(
354
+ node, bo, jA, o, gC, tMax
355
355
  );
356
356
 
357
357
 
358
358
  ep = 0u;
359
- if (tX != 0u) {
360
- let fC = bvhBuffer[node + bo + 1];
361
- let rG = bitcast<u32>(ju.w) >> 24u;
362
- var tl = 0u;
363
- var jZ = tX;
364
- while (jZ != 0u) {
365
- let rr = kn(jZ);
366
- jZ &= ~(1u << rr);
367
- let su = select(
368
- bitcast<u32>(fC.z),
369
- bitcast<u32>(fC.w),
370
- rr >= 4u
359
+ if (ue != 0u) {
360
+ let fF = bvhBuffer[node + bo + 1];
361
+ let rO = bitcast<u32>(jA.w) >> 24u;
362
+ var tv = 0u;
363
+ var kg = ue;
364
+ while (kg != 0u) {
365
+ let rC = kx(kg);
366
+ kg &= ~(1u << rC);
367
+ let sE = select(
368
+ bitcast<u32>(fF.z),
369
+ bitcast<u32>(fF.w),
370
+ rC >= 4u
371
371
  );
372
- let sW =
373
- (su >> ((rr & 3u) * 8u)) & 0xffu;
374
- let jw = sW & 0x1fu;
375
- let uM = select(
376
- jw,
377
- jw ^ qd,
378
- jw >= 24u
372
+ let td =
373
+ (sE >> ((rC & 3u) * 8u)) & 0xffu;
374
+ let jC = td & 0x1fu;
375
+ let uT = select(
376
+ jC,
377
+ jC ^ ql,
378
+ jC >= 24u
379
379
  );
380
- let uH = (sW >> 5u) & 0x7u;
381
- tl |= uH << uM;
380
+ let uO = (td >> 5u) & 0x7u;
381
+ tv |= uO << uT;
382
382
  }
383
383
 
384
- kQ = bitcast<u32>(fC.x);
385
- ep = (tl & 0xff000000u) | rG;
386
- let oH = bitcast<u32>(fC.y);
387
- var oI = tl & 0x00ffffffu;
388
- while (oI != 0u) {
389
- let nI = nO(oI);
390
- oI &= ~(1u << nI);
384
+ kZ = bitcast<u32>(fF.x);
385
+ ep = (tv & 0xff000000u) | rO;
386
+ let oQ = bitcast<u32>(fF.y);
387
+ var oR = tv & 0x00ffffffu;
388
+ while (oR != 0u) {
389
+ let nT = nZ(oR);
390
+ oR &= ~(1u << nT);
391
391
  let bh = 1;
392
392
  let primitiveOffset = bo + blasOffset
393
- + i32(oH + nI);
393
+ + i32(oQ + nT);
394
394
  ${intersectTriangles}
395
395
  }
396
396
  }
397
397
 
398
398
  if ((ep & 0xff000000u) != 0u) { continue; }
399
- if (pe >= 0) {
400
- let qe = sd[pe];
401
- kQ = qe.x;
402
- ep = qe.y;
403
- pe--;
399
+ if (pn >= 0) {
400
+ let qm = sm[pn];
401
+ kZ = qm.x;
402
+ ep = qm.y;
403
+ pn--;
404
404
  }
405
405
  else { break; }
406
406
  }
407
407
  }
408
408
  ` : ''}
409
409
 
410
- var gp: array<i32, BLAS_STACK_SIZE>;
411
- var dR = -1;
412
- if (gN != 3u) {
413
- dR = 0;
410
+ var gt: array<i32, BLAS_STACK_SIZE>;
411
+ var dS = -1;
412
+ if (gR != 3u) {
413
+ dS = 0;
414
414
 
415
- gp[0] = uN;
415
+ gt[0] = uU;
416
416
  }
417
417
 
418
- while (dR >= 0) {
418
+ while (dS >= 0) {
419
419
 
420
- let node = gp[dR];
421
- dR--;
420
+ let node = gt[dS];
421
+ dS--;
422
422
  var bh = 0;
423
423
  var primitiveOffset = 0;
424
424
 
425
425
  ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
426
- if (gN == 2u) {
426
+ if (gR == 2u) {
427
427
  let i = node + bo;
428
- let uR = bvhBuffer[i];
429
- let uS = bvhBuffer[i + 1];
430
- let uT = bvhBuffer[i + 2];
431
- let uU = bvhBuffer[i + 3];
432
- bh = i32(bitcast<u32>(uT.w));
428
+ let uY = bvhBuffer[i];
429
+ let uZ = bvhBuffer[i + 1];
430
+ let va = bvhBuffer[i + 2];
431
+ let vb = bvhBuffer[i + 3];
432
+ bh = i32(bitcast<u32>(va.w));
433
433
  if (bh > 0) {
434
434
  primitiveOffset = bo + blasOffset
435
- + i32(bitcast<u32>(uU.w));
435
+ + i32(bitcast<u32>(vb.w));
436
436
  }
437
437
  else {
438
- let left = blasOffset + i32(bitcast<u32>(uR.w) * 4u);
439
- let right = blasOffset + i32(bitcast<u32>(uS.w) * 4u);
440
- let om = cM(
441
- o, uR.xyz, uS.xyz, gx, tMax
438
+ let left = blasOffset + i32(bitcast<u32>(uY.w) * 4u);
439
+ let right = blasOffset + i32(bitcast<u32>(uZ.w) * 4u);
440
+ let oy = cM(
441
+ o, uY.xyz, uZ.xyz, gC, tMax
442
442
  );
443
- let ng = cM(
444
- o, uT.xyz, uU.xyz, gx, tMax
443
+ let nu = cM(
444
+ o, va.xyz, vb.xyz, gC, tMax
445
445
  );
446
- if (om > ng) {
447
- if (om > 0.0) {
448
- dR++; gp[dR] = left;
446
+ if (oy > nu) {
447
+ if (oy > 0.0) {
448
+ dS++; gt[dS] = left;
449
449
  }
450
- if (ng > 0.0) {
451
- dR++; gp[dR] = right;
450
+ if (nu > 0.0) {
451
+ dS++; gt[dS] = right;
452
452
  }
453
453
  }
454
454
  else {
455
- if (ng > 0.0) {
456
- dR++; gp[dR] = right;
455
+ if (nu > 0.0) {
456
+ dS++; gt[dS] = right;
457
457
  }
458
- if (om > 0.0) {
459
- dR++; gp[dR] = left;
458
+ if (oy > 0.0) {
459
+ dS++; gt[dS] = left;
460
460
  }
461
461
  }
462
462
  }
463
463
  }
464
464
  ` : ''}
465
465
  ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
466
- if (gN == 1u) {
467
- let hS = bitcast<u32>(node);
468
- if ((hS & 0x80000000u) != 0u) {
469
- bh = i32((hS >> 23u) & 0xffu);
466
+ if (gR == 1u) {
467
+ let hW = bitcast<u32>(node);
468
+ if ((hW & 0x80000000u) != 0u) {
469
+ bh = i32((hW >> 23u) & 0xffu);
470
470
  primitiveOffset = bo + blasOffset
471
- + i32(hS & 0x007fffffu);
471
+ + i32(hW & 0x007fffffu);
472
472
  }
473
473
  else {
474
474
  let i = node + bo;
475
- let ub = bvhBuffer[i];
476
- let rf = bvhBuffer[i + 1];
477
- let rh = bvhBuffer[i + 2];
478
- let ri = bvhBuffer[i + 3];
479
- let nodeMin = ub.xyz;
480
- let ec = vec3f(ub.w, rf.x, rf.y);
481
- let lV = array<u32, 4>(
482
- bitcast<u32>(rf.z), bitcast<u32>(rf.w),
483
- bitcast<u32>(rh.x), bitcast<u32>(rh.y)
475
+ let ui = bvhBuffer[i];
476
+ let ro = bvhBuffer[i + 1];
477
+ let rp = bvhBuffer[i + 2];
478
+ let rq = bvhBuffer[i + 3];
479
+ let nodeMin = ui.xyz;
480
+ let ec = vec3f(ui.w, ro.x, ro.y);
481
+ let mh = array<u32, 4>(
482
+ bitcast<u32>(ro.z), bitcast<u32>(ro.w),
483
+ bitcast<u32>(rp.x), bitcast<u32>(rp.y)
484
484
  );
485
- let ro = unpack4x8unorm(bitcast<u32>(rh.z));
486
- let rp = unpack4x8unorm(bitcast<u32>(rh.w));
487
- let rq = unpack4x8unorm(bitcast<u32>(ri.x));
488
- let rl = unpack4x8unorm(bitcast<u32>(ri.y));
489
- let rm = unpack4x8unorm(bitcast<u32>(ri.z));
490
- let rn = unpack4x8unorm(bitcast<u32>(ri.w));
491
- let tx0 = (nodeMin.x + ro * ec.x - o.x) * gx.x;
492
- let tx1 = (nodeMin.x + rl * ec.x - o.x) * gx.x;
493
- let ty0 = (nodeMin.y + rp * ec.y - o.y) * gx.y;
494
- let ty1 = (nodeMin.y + rm * ec.y - o.y) * gx.y;
495
- let tz0 = (nodeMin.z + rq * ec.z - o.z) * gx.z;
496
- let tz1 = (nodeMin.z + rn * ec.z - o.z) * gx.z;
497
- let bJ = eV(gx, o);
498
- let mB = max(
485
+ let rw = unpack4x8unorm(bitcast<u32>(rp.z));
486
+ let rA = unpack4x8unorm(bitcast<u32>(rp.w));
487
+ let rB = unpack4x8unorm(bitcast<u32>(rq.x));
488
+ let rt = unpack4x8unorm(bitcast<u32>(rq.y));
489
+ let ru = unpack4x8unorm(bitcast<u32>(rq.z));
490
+ let rv = unpack4x8unorm(bitcast<u32>(rq.w));
491
+ let tx0 = (nodeMin.x + rw * ec.x - o.x) * gC.x;
492
+ let tx1 = (nodeMin.x + rt * ec.x - o.x) * gC.x;
493
+ let ty0 = (nodeMin.y + rA * ec.y - o.y) * gC.y;
494
+ let ty1 = (nodeMin.y + ru * ec.y - o.y) * gC.y;
495
+ let tz0 = (nodeMin.z + rB * ec.z - o.z) * gC.z;
496
+ let tz1 = (nodeMin.z + rv * ec.z - o.z) * gC.z;
497
+ let bJ = eZ(gC, o);
498
+ let mL = max(
499
499
  max((min(tx0, tx1) - vec4f(bJ.x)), (min(ty0, ty1) - vec4f(bJ.y))),
500
500
  (min(tz0, tz1) - vec4f(bJ.z))
501
501
  );
502
- let rM = min(
502
+ let rU = min(
503
503
  min((max(tx0, tx1) + vec4f(bJ.x)), (max(ty0, ty1) + vec4f(bJ.y))),
504
504
  (max(tz0, tz1) + vec4f(bJ.z))
505
505
  );
506
- var distance = select(rM, mB, mB > vec4f(0.0));
506
+ var distance = select(rU, mL, mL > vec4f(0.0));
507
507
  distance = select(
508
508
  distance,
509
509
  vec4f(-1.0),
510
- mB > min(rM, vec4f(tMax))
510
+ mL > min(rU, vec4f(tMax))
511
511
  );
512
- var fa = array<f32, 4>(
512
+ var fd = array<f32, 4>(
513
513
  distance.x,
514
514
  distance.y,
515
515
  distance.z,
@@ -522,29 +522,29 @@ var dX = -1.0;
522
522
  var el = -1;
523
523
  for (var child = 0; child < 4; child++) {
524
524
  if (
525
- lV[child] != 0u &&
526
- fa[child] > dX
525
+ mh[child] != 0u &&
526
+ fd[child] > dX
527
527
  ) {
528
- dX = fa[child];
528
+ dX = fd[child];
529
529
  el = child;
530
530
  }
531
531
  }
532
532
  if (el >= 0 && dX > 0.0) {
533
- let nl = lV[el];
534
- var jD = bitcast<i32>(nl);
535
- if ((nl & 0x80000000u) == 0u) {
536
- jD += blasOffset;
533
+ let nD = mh[el];
534
+ var jI = bitcast<i32>(nD);
535
+ if ((nD & 0x80000000u) == 0u) {
536
+ jI += blasOffset;
537
537
  }
538
- dR++;
539
- gp[dR] = jD;
540
- fa[el] = -1.0;
538
+ dS++;
539
+ gt[dS] = jI;
540
+ fd[el] = -1.0;
541
541
  }
542
542
  }
543
543
  }
544
544
  }
545
545
  ` : ''}
546
546
  ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
547
- if (gN == 0u) {
547
+ if (gR == 0u) {
548
548
  let i = node + bo;
549
549
  let r1 = bvhBuffer[i];
550
550
  let bb = bitcast<i32>(r1.w);
@@ -556,34 +556,34 @@ let d0 = cM(
556
556
  o,
557
557
  bvhBuffer[left + bo].xyz,
558
558
  bvhBuffer[left + 1 + bo].xyz,
559
- gx,
559
+ gC,
560
560
  tMax
561
561
  );
562
562
  let d1 = cM(
563
563
  o,
564
564
  bvhBuffer[right + bo].xyz,
565
565
  bvhBuffer[right + 1 + bo].xyz,
566
- gx,
566
+ gC,
567
567
  tMax
568
568
  );
569
569
 
570
570
  if (d0 > d1) {
571
571
  if (d0 > 0.0) {
572
- dR++; gp[dR] = left;
572
+ dS++; gt[dS] = left;
573
573
 
574
574
  }
575
575
  if (d1 > 0.0) {
576
- dR++; gp[dR] = right;
576
+ dS++; gt[dS] = right;
577
577
 
578
578
  }
579
579
  }
580
580
  else {
581
581
  if (d1 > 0.0) {
582
- dR++; gp[dR] = right;
582
+ dS++; gt[dS] = right;
583
583
 
584
584
  }
585
585
  if (d0 > 0.0) {
586
- dR++; gp[dR] = left;
586
+ dS++; gt[dS] = left;
587
587
 
588
588
  }
589
589
  }
@@ -610,13 +610,13 @@ export default function getIntersectCode({ hasDisplacement, hasAnisotropyDirecti
610
610
  ${hasDisplacement ? displacementWgsl : ''}
611
611
  ${(blasLayoutMask & 8) !== 0 ? cwbvhTraversalWgsl : ''}
612
612
 
613
- struct fu {
613
+ struct fA {
614
614
  p0: vec3f,
615
615
  p1: vec3f,
616
616
  p2: vec3f,
617
617
  };
618
618
 
619
- fn ht(rad: f32, pos: vec3f, r: Ray) -> f32 {
619
+ fn hx(rad: f32, pos: vec3f, r: Ray) -> f32 {
620
620
  let op: vec3f = pos - r.o;
621
621
  let eps: f32 = 0.001;
622
622
  let b: f32 = dot(op, r.d);
@@ -639,7 +639,7 @@ return t2;
639
639
  return INF;
640
640
  }
641
641
 
642
- fn mU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
642
+ fn ni(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
643
643
  let dt: f32 = dot(r.d, n);
644
644
  let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
645
645
 
@@ -661,12 +661,12 @@ return INF;
661
661
  fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
662
662
  let aj = distance(origin, center);
663
663
  if (aj <= radius) { return INV4PI; }
664
- let jp = min(1.0, radius * radius / (aj * aj));
665
- let cosThetaMax = sqrt(max(0.0, 1.0 - jp));
664
+ let jv = min(1.0, radius * radius / (aj * aj));
665
+ let cosThetaMax = sqrt(max(0.0, 1.0 - jv));
666
666
  return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
667
667
  }
668
668
 
669
- fn mo(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
669
+ fn mz(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
670
670
 
671
671
 
672
672
  var d: f32 = INF;
@@ -678,9 +678,9 @@ var d: f32 = INF;
678
678
  (*lightSample).isDelta = false;
679
679
  var u = light.u;
680
680
  var v = light.v;
681
- var dO = i32(light.litType);
681
+ var dP = i32(light.litType);
682
682
 
683
- if (dO == RECT_LIGHT) {
683
+ if (dP == RECT_LIGHT) {
684
684
 
685
685
  var pos = light.position - u * 0.5 - v * 0.5;
686
686
  var normal = normalize(cross(u, v));
@@ -688,7 +688,7 @@ if (dot(normal, r.d) > 0.0) {
688
688
  return INF;
689
689
  }
690
690
 
691
- d = mU(pos, u, v, normal, r);
691
+ d = ni(pos, u, v, normal, r);
692
692
  if (d < 0.0) {
693
693
  d = INF;
694
694
  }
@@ -709,11 +709,11 @@ d = INF;
709
709
  }
710
710
  }
711
711
 
712
- else if (dO == SPHERE_LIGHT) {
712
+ else if (dP == SPHERE_LIGHT) {
713
713
  if (light.radiusOrSpread <= 0.0) {
714
- let kh = light.position - r.o;
715
- let projection = dot(kh, r.d);
716
- let ba = kh - projection * r.d;
714
+ let ko = light.position - r.o;
715
+ let projection = dot(ko, r.d);
716
+ let ba = ko - projection * r.d;
717
717
  if (projection <= EPS || dot(ba, ba) > 1e-8) {
718
718
  return INF;
719
719
  }
@@ -725,7 +725,7 @@ d = projection;
725
725
  (*lightSample).isDelta = true;
726
726
  }
727
727
  else {
728
- d = ht(light.radiusOrSpread, light.position, r);
728
+ d = hx(light.radiusOrSpread, light.position, r);
729
729
  (*lightSample).isDelta = false;
730
730
  if (d > 0.0 && d != INF) {
731
731
  (*lightSample).direction = r.d;
@@ -754,11 +754,11 @@ light.radiusOrSpread <= 0.0
754
754
  }
755
755
  }
756
756
 
757
- else if (dO == SPOT_LIGHT) {
757
+ else if (dP == SPOT_LIGHT) {
758
758
  if (light.radiusOrSpread <= 0.0) {
759
- let kh = light.position - r.o;
760
- let projection = dot(kh, r.d);
761
- let ba = kh - projection * r.d;
759
+ let ko = light.position - r.o;
760
+ let projection = dot(ko, r.d);
761
+ let ba = ko - projection * r.d;
762
762
  if (projection <= EPS || dot(ba, ba) > 1e-8) {
763
763
  return INF;
764
764
  }
@@ -770,13 +770,13 @@ d = projection;
770
770
  (*lightSample).isDelta = true;
771
771
  }
772
772
  else {
773
- d = ht(light.radiusOrSpread, light.position, r);
773
+ d = hx(light.radiusOrSpread, light.position, r);
774
774
  (*lightSample).isDelta = false;
775
775
  }
776
776
  if (d != INF) {
777
- let uX = r.o + d * r.d;
778
- let mr = bL(light, normalize(r.o - uX));
779
- if (mr <= 0.0) { return INF; }
777
+ let ve = r.o + d * r.d;
778
+ let mC = bL(light, normalize(r.o - ve));
779
+ if (mC <= 0.0) { return INF; }
780
780
  if (light.radiusOrSpread > 0.0) {
781
781
  (*lightSample).direction = r.d;
782
782
  (*lightSample).dist = d;
@@ -785,7 +785,7 @@ r.o + r.d * d - light.position
785
785
  );
786
786
  (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
787
787
  }
788
- (*lightSample).emission = light.emission * mr * select(
788
+ (*lightSample).emission = light.emission * mC * select(
789
789
  1.0,
790
790
  1.0 / max(d * d, 1e-8),
791
791
  light.radiusOrSpread <= 0.0
@@ -793,7 +793,7 @@ light.radiusOrSpread <= 0.0
793
793
  }
794
794
  }
795
795
 
796
- else if (dO != RECT_LIGHT && dO != SPHERE_LIGHT && dO != SPOT_LIGHT) {
796
+ else if (dP != RECT_LIGHT && dP != SPHERE_LIGHT && dP != SPOT_LIGHT) {
797
797
 
798
798
  d = INF;
799
799
  }
@@ -801,7 +801,7 @@ d = INF;
801
801
  return d;
802
802
  }
803
803
 
804
- fn fj(m0: vec3i, m1: vec3i, m2: vec3i, eZ: vec3f) -> i32 {
804
+ fn fm(m0: vec3i, m1: vec3i, m2: vec3i, eK: vec3f) -> i32 {
805
805
  let m00 = ae(m0.x);
806
806
  let m01 = ae(m0.y);
807
807
  let m02 = ae(m0.z);
@@ -811,101 +811,101 @@ let m12 = ae(m1.z);
811
811
  let m20 = ae(m2.x);
812
812
  let m21 = ae(m2.y);
813
813
  let m22 = ae(m2.z);
814
- var w00 = m00.y * eZ.x;
815
- var w01 = m01.y * eZ.x;
816
- var w02 = m02.y * eZ.x;
817
- var w10 = m10.y * eZ.y;
818
- var w11 = m11.y * eZ.y;
819
- var w12 = m12.y * eZ.y;
820
- var w20 = m20.y * eZ.z;
821
- var w21 = m21.y * eZ.z;
822
- var w22 = m22.y * eZ.z;
823
-
824
- var hg = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
825
-
826
- w00 = w00 / hg;
827
- w01 = w01 / hg + w00;
828
- w02 = w02 / hg + w01;
829
- w10 = w10 / hg + w02;
830
- w11 = w11 / hg + w10;
831
- w12 = w12 / hg + w11;
832
- w20 = w20 / hg + w12;
833
- w21 = w21 / hg + w20;
834
- w22 = w22 / hg + w21;
814
+ var w00 = m00.y * eK.x;
815
+ var w01 = m01.y * eK.x;
816
+ var w02 = m02.y * eK.x;
817
+ var w10 = m10.y * eK.y;
818
+ var w11 = m11.y * eK.y;
819
+ var w12 = m12.y * eK.y;
820
+ var w20 = m20.y * eK.z;
821
+ var w21 = m21.y * eK.z;
822
+ var w22 = m22.y * eK.z;
823
+
824
+ var hk = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
825
+
826
+ w00 = w00 / hk;
827
+ w01 = w01 / hk + w00;
828
+ w02 = w02 / hk + w01;
829
+ w10 = w10 / hk + w02;
830
+ w11 = w11 / hk + w10;
831
+ w12 = w12 / hk + w11;
832
+ w20 = w20 / hk + w12;
833
+ w21 = w21 / hk + w20;
834
+ w22 = w22 / hk + w21;
835
835
 
836
836
  let rand = eo(0u);
837
- var mV: f32;
837
+ var nj: f32;
838
838
  if (rand < w00) {
839
- mV = m00.x;
839
+ nj = m00.x;
840
840
  } else if (rand < w01) {
841
- mV = m01.x;
841
+ nj = m01.x;
842
842
  } else if (rand < w02) {
843
- mV = m02.x;
843
+ nj = m02.x;
844
844
  } else if (rand < w10) {
845
- mV = m10.x;
845
+ nj = m10.x;
846
846
  } else if (rand < w11) {
847
- mV = m11.x;
847
+ nj = m11.x;
848
848
  } else if (rand < w12) {
849
- mV = m12.x;
849
+ nj = m12.x;
850
850
  } else if (rand < w20) {
851
- mV = m20.x;
851
+ nj = m20.x;
852
852
  } else if (rand < w21) {
853
- mV = m21.x;
853
+ nj = m21.x;
854
854
  } else {
855
- mV = m22.x;
855
+ nj = m22.x;
856
856
  }
857
- return i32(mV);
857
+ return i32(nj);
858
858
  }
859
859
 
860
- fn lM(
861
- oR: i32,
860
+ fn lW(
861
+ pa: i32,
862
862
  index: vec3i,
863
- eZ: vec3f
863
+ eK: vec3f
864
864
  ) -> i32 {
865
865
  let m0 = vec3i(attrBuffers[index.x * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
866
866
  let m1 = vec3i(attrBuffers[index.y * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
867
867
  let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
868
868
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
869
- return fj(m0, m1, m2, eZ);
869
+ return fm(m0, m1, m2, eK);
870
870
  }
871
- return oR;
871
+ return pa;
872
872
  }
873
873
 
874
874
 
875
875
 
876
876
  ${hasAnisotropyDirections ? /* wgsl */ `
877
- fn eD(normal: vec3f, dp1: vec3f, dp2: vec3f, nS: vec2f, nT: vec2f, input: vec4f) -> mat2x3f {
878
- let determinant = nS.x * nT.y - nS.y * nT.x;
877
+ fn eE(normal: vec3f, dp1: vec3f, dp2: vec3f, od: vec2f, oe: vec2f, input: vec4f) -> mat2x3f {
878
+ let determinant = od.x * oe.y - od.y * oe.x;
879
879
  var t = input.xyz;
880
880
  var b = vec3f(0.0);
881
881
 
882
882
  var sign = select(input.w, 0.0, abs(input.w) > 1.5);
883
883
  if (abs(determinant) > 1e-12) {
884
- let dt = (dp1 * nT.y - dp2 * nS.y) / determinant;
885
- let db = (dp2 * nS.x - dp1 * nT.x) / determinant;
884
+ let dt = (dp1 * oe.y - dp2 * od.y) / determinant;
885
+ let db = (dp2 * od.x - dp1 * oe.x) / determinant;
886
886
  if (dot(t, t) < 1e-8) { t = dt; }
887
887
  if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
888
888
  }
889
889
  t -= normal * dot(normal, t);
890
890
  if (dot(t, t) < 1e-8) {
891
- let ie = select(-1.0, 1.0, normal.z >= 0.0);
892
- let dW = -1.0 / (ie + normal.z);
891
+ let ik = select(-1.0, 1.0, normal.z >= 0.0);
892
+ let dW = -1.0 / (ik + normal.z);
893
893
  let xy = normal.x * normal.y * dW;
894
- t = vec3f(1.0 + ie * normal.x * normal.x * dW, ie * xy, -ie * normal.x);
895
- b = vec3f(xy, ie + normal.y * normal.y * dW, -normal.y);
894
+ t = vec3f(1.0 + ik * normal.x * normal.x * dW, ik * xy, -ik * normal.x);
895
+ b = vec3f(xy, ik + normal.y * normal.y * dW, -normal.y);
896
896
  }
897
897
  else { t = normalize(t); b = normalize(cross(normal, t)); }
898
898
  return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
899
899
  }
900
900
 
901
901
  ` : /* wgsl */ ``}
902
- fn hp(
902
+ fn ht(
903
903
  si: ptr<function, ad>,
904
- tri: fu,
905
- eZ: vec3f,
904
+ tri: fA,
905
+ eK: vec3f,
906
906
  index: vec3i,
907
907
  bU: bool,
908
- fq: i32
908
+ fv: i32
909
909
  ) {
910
910
  (*si).hit = true;
911
911
 
@@ -915,22 +915,28 @@ let uvProjection = i32(material.uvProjection);
915
915
  let i0 = index.x;
916
916
  let i1 = index.y;
917
917
  let i2 = index.z;
918
- let oP = uvProjection == ${uvProjectionConstants.spherical};
918
+ (*si).vertexColor = vec3f(1.0);
919
+ if (USE_VERTEX_COLOR) {
920
+ (*si).vertexColor = eK.x * attrBuffers[i0 * ATTR_STRIDE + COLOR_OFF].xyz
921
+ + eK.y * attrBuffers[i1 * ATTR_STRIDE + COLOR_OFF].xyz
922
+ + eK.z * attrBuffers[i2 * ATTR_STRIDE + COLOR_OFF].xyz;
923
+ }
924
+ let oY = uvProjection == ${uvProjectionConstants.spherical};
919
925
 
920
926
  var normal: vec3f = (*si).normal;
921
- var gV: vec3f;
927
+ var gZ: vec3f;
922
928
  var n0 = vec3f(0.0);
923
929
  var n1 = vec3f(0.0);
924
930
  var n2 = vec3f(0.0);
925
931
 
926
932
 
927
- if (!bU || oP) {
933
+ if (!bU || oY) {
928
934
  n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
929
935
  n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
930
936
  n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
931
- gV = normalize(eZ.x * n0 + eZ.y * n1 + eZ.z * n2);
937
+ gZ = normalize(eK.x * n0 + eK.y * n1 + eK.z * n2);
932
938
  if (!bU) {
933
- normal = gV;
939
+ normal = gZ;
934
940
  }
935
941
  }
936
942
 
@@ -943,14 +949,14 @@ if (USE_UV) {
943
949
  uv0 = attrBuffers[i0 * ATTR_STRIDE + UV_OFF].xy;
944
950
  uv1 = attrBuffers[i1 * ATTR_STRIDE + UV_OFF].xy;
945
951
  uv2 = attrBuffers[i2 * ATTR_STRIDE + UV_OFF].xy;
946
- uv = eZ.x * uv0 + eZ.y * uv1 + eZ.z * uv2;
952
+ uv = eK.x * uv0 + eK.y * uv1 + eK.z * uv2;
947
953
  if (USE_UV1) {
948
954
  let secondaryUv0 = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
949
955
  let secondaryUv1 = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
950
956
  let secondaryUv2 = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
951
- cX = eZ.x * secondaryUv0
952
- + eZ.y * secondaryUv1
953
- + eZ.z * secondaryUv2;
957
+ cX = eK.x * secondaryUv0
958
+ + eK.y * secondaryUv1
959
+ + eK.z * secondaryUv2;
954
960
  }
955
961
  }
956
962
 
@@ -958,23 +964,23 @@ if (USE_TANGENT) {
958
964
  let t0 = attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
959
965
  let t1 = attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
960
966
  let t2 = attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
961
- (*si).tangent = normalize(eZ.x * t0 + eZ.y * t1 + eZ.z * t2);
967
+ (*si).tangent = normalize(eK.x * t0 + eK.y * t1 + eK.z * t2);
962
968
  }
963
969
 
964
- if (fq >= 0) {
965
- (*si).materialIndex = fq;
970
+ if (fv >= 0) {
971
+ (*si).materialIndex = fv;
966
972
  }
967
973
  else {
968
- (*si).materialIndex = lM(
974
+ (*si).materialIndex = lW(
969
975
  (*si).materialIndex,
970
976
  index,
971
- eZ
977
+ eK
972
978
  );
973
979
  }
974
980
 
975
981
  if (uvProjection > 0) {
976
982
 
977
- uv = gC(uvProjection, (*si).position, select(normal, gV, oP));
983
+ uv = gH(uvProjection, (*si).position, select(normal, gZ, oY));
978
984
  cX = uv;
979
985
  }
980
986
 
@@ -992,41 +998,41 @@ let directionMaterial = materialsBuffer[(*si).materialIndex];
992
998
  if (directionMaterial.anisotropyMapIndex >= 0.0 || directionMaterial.specularAnisotropyRotation != 0.0 || directionMaterial.coatAnisotropyRotation != 0.0${hasCoatNormals ? " || (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0)" : ""}) {
993
999
  let dp1 = tri.p0 - tri.p2;
994
1000
  let dp2 = tri.p1 - tri.p2;
995
- var aU = vec4f(0.0);
1001
+ var aT = vec4f(0.0);
996
1002
  if (USE_TANGENT) {
997
- aU = eZ.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
998
- + eZ.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
999
- + eZ.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1000
- }
1001
- let eP = eD(normal, dp1, dp2, uv0-uv2, uv1-uv2, aU);
1002
- (*si).geometryTangent = eP[0];
1003
- (*si).geometryBitangent = eP[1];
1004
- var fU = eP;
1003
+ aT = eK.x * attrBuffers[i0 * ATTR_STRIDE + TANGENT_OFF]
1004
+ + eK.y * attrBuffers[i1 * ATTR_STRIDE + TANGENT_OFF]
1005
+ + eK.z * attrBuffers[i2 * ATTR_STRIDE + TANGENT_OFF];
1006
+ }
1007
+ let eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
1008
+ (*si).geometryTangent = eS[0];
1009
+ (*si).geometryBitangent = eS[1];
1010
+ var fY = eS;
1005
1011
  if (USE_UV1 && directionMaterial.anisotropyMapIndex >= 0.0 && mapInfo[i32(directionMaterial.anisotropyMapIndex) + NUM_MAPS * 2].x > 0.5) {
1006
1012
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1007
1013
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1008
1014
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1009
- fU = eD(normal, dp1, dp2, a-c, b-c, select(aU, vec4f(0.0), aU.w == 0.0));
1015
+ fY = eE(normal, dp1, dp2, a-c, b-c, select(aT, vec4f(0.0), aT.w == 0.0));
1010
1016
  }
1011
- (*si).directionTangent = fU[0];
1012
- (*si).directionBitangent = fU[1];
1017
+ (*si).directionTangent = fY[0];
1018
+ (*si).directionBitangent = fY[1];
1013
1019
  ${hasCoatNormals ? /* wgsl */ `
1014
1020
  if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1015
- let ku = i32(directionMaterial.coatNormalMapIndex);
1016
- var lW = eP;
1017
- if (USE_UV1 && mapInfo[ku + NUM_MAPS * 2].x > 0.5) {
1021
+ let kC = i32(directionMaterial.coatNormalMapIndex);
1022
+ var mi = eS;
1023
+ if (USE_UV1 && mapInfo[kC + NUM_MAPS * 2].x > 0.5) {
1018
1024
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1019
1025
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1020
1026
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1021
- lW = eD(normal, dp1, dp2, a-c, b-c,
1022
- select(aU, vec4f(0.0), aU.w == 0.0));
1027
+ mi = eE(normal, dp1, dp2, a-c, b-c,
1028
+ select(aT, vec4f(0.0), aT.w == 0.0));
1023
1029
  }
1024
1030
 
1025
1031
 
1026
- let decoded = sampleMap(ku, getMapUvSet(ku, uv,
1032
+ let decoded = sampleMap(kC, getMapUvSet(kC, uv,
1027
1033
  select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1028
- let mapped = lW[0] * decoded.x * directionMaterial.coatNormalScale.x
1029
- + lW[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1034
+ let mapped = mi[0] * decoded.x * directionMaterial.coatNormalScale.x
1035
+ + mi[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1030
1036
  if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1031
1037
  }
1032
1038
  ` : ''}
@@ -1041,14 +1047,14 @@ if (!bU) {
1041
1047
 
1042
1048
 
1043
1049
  let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1044
- let kf = eZ.x * n0 + eZ.y * n1 + eZ.z * n2;
1050
+ let km = eK.x * n0 + eK.y * n1 + eK.z * n2;
1045
1051
  let a = dot(n2 - n0, tri.p0 - tri.p2);
1046
1052
  let b = dot(n2 - n1, tri.p1 - tri.p2);
1047
1053
  let c = dot(n1 - n0, tri.p1 - tri.p0);
1048
- var h = a * eZ.x * (eZ.x - 1.0)
1049
- + (a + b + c) * eZ.x * eZ.y
1050
- + b * eZ.y * (eZ.y - 1.0);
1051
- if (dot(kf, geometricNormal) > 0.0) {
1054
+ var h = a * eK.x * (eK.x - 1.0)
1055
+ + (a + b + c) * eK.x * eK.y
1056
+ + b * eK.y * (eK.y - 1.0);
1057
+ if (dot(km, geometricNormal) > 0.0) {
1052
1058
  var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1053
1059
  var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1054
1060
  var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -1066,22 +1072,22 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1066
1072
  h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1067
1073
  h = min(-min(min(h0, h1), h2), h * 0.5);
1068
1074
  }
1069
- (*si).shadowOffset = kf * h;
1075
+ (*si).shadowOffset = km * h;
1070
1076
  }
1071
1077
  (*si).uv = uv;
1072
1078
  (*si).uv1 = cX;
1073
1079
  if (USE_NORMAL_MAPS) {
1074
1080
  let dp1 = tri.p0 - tri.p2;
1075
1081
  let dp2 = tri.p1 - tri.p2;
1076
- let nS = uv0 - uv2;
1077
- let nT = uv1 - uv2;
1078
- (*si).normal = ob(
1079
- (*si).materialIndex, uv, normal, dp1, dp2, nS, nT
1082
+ let od = uv0 - uv2;
1083
+ let oe = uv1 - uv2;
1084
+ (*si).normal = om(
1085
+ (*si).materialIndex, uv, normal, dp1, dp2, od, oe
1080
1086
  );
1081
1087
  }
1082
1088
  }
1083
1089
 
1084
- struct eB {
1090
+ struct eC {
1085
1091
  t: f32,
1086
1092
  barycentric: vec3f,
1087
1093
  };
@@ -1090,8 +1096,8 @@ barycentric: vec3f,
1090
1096
 
1091
1097
 
1092
1098
 
1093
- fn fI(o: vec3f, d: vec3f, tri: fu, ey: i32, gL: vec3f, tMax: f32) -> eB {
1094
- var ti: eB;
1099
+ fn fL(o: vec3f, d: vec3f, tri: fA, ey: i32, gP: vec3f, tMax: f32) -> eC {
1100
+ var ti: eC;
1095
1101
 
1096
1102
 
1097
1103
  var p0t = tri.p0 - o;
@@ -1111,9 +1117,9 @@ p2t = p2t.zxy;
1111
1117
 
1112
1118
 
1113
1119
 
1114
- p0t = vec3f(p0t.xy + gL.xy * p0t.z, p0t.z);
1115
- p1t = vec3f(p1t.xy + gL.xy * p1t.z, p1t.z);
1116
- p2t = vec3f(p2t.xy + gL.xy * p2t.z, p2t.z);
1120
+ p0t = vec3f(p0t.xy + gP.xy * p0t.z, p0t.z);
1121
+ p1t = vec3f(p1t.xy + gP.xy * p1t.z, p1t.z);
1122
+ p2t = vec3f(p2t.xy + gP.xy * p2t.z, p2t.z);
1117
1123
 
1118
1124
 
1119
1125
  var e = vec3f(
@@ -1125,9 +1131,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
1125
1131
  if (DEPTH_QUERY_MODE) {
1126
1132
 
1127
1133
 
1128
- let rt = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1134
+ let rE = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1129
1135
  + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1130
- e = select(e, vec3f(0.0), abs(e) <= rt * 1e-6);
1136
+ e = select(e, vec3f(0.0), abs(e) <= rE * 1e-6);
1131
1137
  }
1132
1138
 
1133
1139
 
@@ -1138,19 +1144,19 @@ return ti;
1138
1144
  let det = e.x + e.y + e.z;
1139
1145
  if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1140
1146
 
1141
- p0t.z *= gL.z;
1142
- p1t.z *= gL.z;
1143
- p2t.z *= gL.z;
1144
- let rd = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1147
+ p0t.z *= gP.z;
1148
+ p1t.z *= gP.z;
1149
+ p2t.z *= gP.z;
1150
+ let rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
1145
1151
 
1146
1152
 
1147
- if (abs(rd) > abs(tMax * det)) {
1153
+ if (abs(rn) > abs(tMax * det)) {
1148
1154
  return ti;
1149
1155
  }
1150
1156
 
1151
- let sm = 1. / det;
1152
- ti.t = rd * sm;
1153
- ti.barycentric = e * sm;
1157
+ let sw = 1. / det;
1158
+ ti.t = rn * sw;
1159
+ ti.barycentric = e * sw;
1154
1160
 
1155
1161
  return ti;
1156
1162
  }
@@ -1160,26 +1166,26 @@ return ti;
1160
1166
 
1161
1167
  override DEPTH_QUERY_MODE: bool = false;
1162
1168
 
1163
- fn eX(d: vec3f) -> vec3f {
1169
+ fn fb(d: vec3f) -> vec3f {
1164
1170
  if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1165
1171
  return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1166
1172
  }
1167
1173
 
1168
- fn eV(gx: vec3f, o: vec3f) -> vec3f {
1174
+ fn eZ(gC: vec3f, o: vec3f) -> vec3f {
1169
1175
  if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1170
- return abs(gx) * max(vec3f(1.0), abs(o)) * 1e-6;
1176
+ return abs(gC) * max(vec3f(1.0), abs(o)) * 1e-6;
1171
1177
  }
1172
1178
 
1173
1179
 
1174
1180
 
1175
- fn cM(o: vec3f, vD: vec3f, vC: vec3f, gx: vec3f, tMax: f32) -> f32 {
1176
- let uK = (vD - o) * gx;
1177
- let uL = (vC - o) * gx;
1178
- let bJ = eV(gx, o);
1179
- let mB = min(uK, uL) - bJ;
1180
- let rM = max(uK, uL) + bJ;
1181
- let t0 = max(mB.x, max(mB.y, mB.z));
1182
- let t1 = min(rM.x, min(rM.y, rM.z));
1181
+ fn cM(o: vec3f, vK: vec3f, vJ: vec3f, gC: vec3f, tMax: f32) -> f32 {
1182
+ let uR = (vK - o) * gC;
1183
+ let uS = (vJ - o) * gC;
1184
+ let bJ = eZ(gC, o);
1185
+ let mL = min(uR, uS) - bJ;
1186
+ let rU = max(uR, uS) + bJ;
1187
+ let t0 = max(mL.x, max(mL.y, mL.z));
1188
+ let t1 = min(rU.x, min(rU.y, rU.z));
1183
1189
  return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1184
1190
  }
1185
1191
 
@@ -1187,7 +1193,7 @@ fn maxDimension(v: vec3f) -> i32 {
1187
1193
  return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1188
1194
  }
1189
1195
 
1190
- fn mj(d: vec3f, ey: i32) -> vec3f {
1196
+ fn mv(d: vec3f, ey: i32) -> vec3f {
1191
1197
 
1192
1198
 
1193
1199
  if (ey == 0) {
@@ -1199,33 +1205,33 @@ return vec3f(-d.x, -d.y, 1.0) / d.z;
1199
1205
  }
1200
1206
  }
1201
1207
 
1202
- fn lX(
1208
+ fn mj(
1203
1209
  si: ptr<function, ad>,
1204
- lp: fu,
1210
+ lC: fA,
1205
1211
  aB: vec3f,
1206
- hs: vec3i,
1212
+ hw: vec3i,
1207
1213
  bU: bool,
1208
1214
  ao: i32,
1209
- eC: vec3f,
1210
- eU: vec3f,
1211
- fq: i32
1215
+ eD: vec3f,
1216
+ eY: vec3f,
1217
+ fv: i32
1212
1218
  ) {
1213
1219
  (*si).instanceIndex = ao;
1214
1220
  (*si).barycentrics = aB.xy;
1215
- (*si).normal = eC;
1216
- (*si).position = eU;
1221
+ (*si).normal = eD;
1222
+ (*si).position = eY;
1217
1223
  (*si).materialIndex = i32(ae(
1218
1224
  bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
1219
1225
  ).x);
1220
1226
 
1221
1227
 
1222
- hp(
1228
+ ht(
1223
1229
  si,
1224
- lp,
1230
+ lC,
1225
1231
  aB,
1226
- hs,
1232
+ hw,
1227
1233
  bU,
1228
- fq
1234
+ fv
1229
1235
  );
1230
1236
 
1231
1237
  let l2w = mat4x4<f32>(
@@ -1246,7 +1252,7 @@ w2l[1].xyz,
1246
1252
  w2l[2].xyz
1247
1253
  ));
1248
1254
 
1249
- (*si).faceNormal = normalize(aD * eC);
1255
+ (*si).faceNormal = normalize(aD * eD);
1250
1256
  (*si).vertexNormal = normalize(aD * (*si).vertexNormal);
1251
1257
  (*si).normal = normalize(aD * (*si).normal);
1252
1258
  ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
@@ -1269,7 +1275,7 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
1269
1275
 
1270
1276
 
1271
1277
 
1272
- fn cY(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lq: bool) {
1278
+ fn cZ(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lD: bool) {
1273
1279
 
1274
1280
  (*si).hit = false;
1275
1281
 
@@ -1279,37 +1285,37 @@ return;
1279
1285
 
1280
1286
  var tMax = RAY_MAX_DISTANCE;
1281
1287
  var ey: i32;
1282
- var gL: vec3f;
1288
+ var gP: vec3f;
1283
1289
 
1284
- var hs: vec3i;
1285
- var lp: fu;
1290
+ var hw: vec3i;
1291
+ var lC: fA;
1286
1292
  var ao: i32;
1287
- var hK: i32 = (*si).triangleIndex;
1293
+ var hO: i32 = (*si).triangleIndex;
1288
1294
 
1289
1295
  ${getBVHTraverseCode(`
1290
1296
  (*si).triangleIndex = triangleIndex;
1291
- lp = tri;
1292
- hs = index;
1297
+ lC = tri;
1298
+ hw = index;
1293
1299
  ao = cf;
1294
1300
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
1295
1301
 
1296
- if (qT) {
1297
- lX(
1302
+ if (rb) {
1303
+ mj(
1298
1304
  si,
1299
- lp,
1305
+ lC,
1300
1306
  aB,
1301
- hs,
1307
+ hw,
1302
1308
  bU,
1303
1309
  ao,
1304
- eC,
1305
- eU,
1310
+ eD,
1311
+ eY,
1306
1312
  -1
1307
1313
  );
1308
1314
  }
1309
1315
  }
1310
1316
 
1311
1317
 
1312
- fn iH(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
1318
+ fn iM(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
1313
1319
  (*si).hit = false;
1314
1320
 
1315
1321
  if (rtUniform.isEmpty > 0) {
@@ -1318,19 +1324,19 @@ return;
1318
1324
 
1319
1325
  let bounces = 0;
1320
1326
  let doubleSided = true;
1321
- let lq = false;
1327
+ let lD = false;
1322
1328
  var tMax = maxDistance;
1323
1329
  var ey: i32;
1324
- var gL: vec3f;
1325
- var hs: vec3i;
1326
- var lp: fu;
1330
+ var gP: vec3f;
1331
+ var hw: vec3i;
1332
+ var lC: fA;
1327
1333
  var ao: i32;
1328
- var hK: i32 = -1;
1334
+ var hO: i32 = -1;
1329
1335
 
1330
1336
  ${getBVHTraverseCode(`
1331
1337
  (*si).triangleIndex = triangleIndex;
1332
- lp = tri;
1333
- hs = index;
1338
+ lC = tri;
1339
+ hw = index;
1334
1340
  ao = cf;
1335
1341
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
1336
1342
  if (cf != instanceIndex) {
@@ -1338,16 +1344,16 @@ continue;
1338
1344
  }
1339
1345
  `)}
1340
1346
 
1341
- if (qT) {
1347
+ if (rb) {
1342
1348
  (*si).instanceIndex = ao;
1343
- (*si).normal = eC;
1344
- (*si).position = eU;
1349
+ (*si).normal = eD;
1350
+ (*si).position = eY;
1345
1351
  (*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
1346
- hp(
1352
+ ht(
1347
1353
  si,
1348
- lp,
1354
+ lC,
1349
1355
  aB,
1350
- hs,
1356
+ hw,
1351
1357
  bU,
1352
1358
  -1
1353
1359
  );
@@ -1369,7 +1375,7 @@ w2l[0].xyz,
1369
1375
  w2l[1].xyz,
1370
1376
  w2l[2].xyz
1371
1377
  ));
1372
- (*si).faceNormal = normalize(aD * eC);
1378
+ (*si).faceNormal = normalize(aD * eD);
1373
1379
  (*si).vertexNormal = normalize(aD * (*si).vertexNormal);
1374
1380
  (*si).normal = normalize(aD * (*si).normal);
1375
1381
  ${hasCoatNormals ? /* wgsl */ ` (*si).coatNormal = normalize(aD * (*si).coatNormal);` : ''}
@@ -1387,45 +1393,45 @@ ${hasAnisotropyDirections ? /* wgsl */ `
1387
1393
  }
1388
1394
  }
1389
1395
 
1390
- fn ex(ray: Ray, lightDistance: f32, jG: i32) -> bool {
1396
+ fn ex(ray: Ray, lightDistance: f32, jL: i32) -> bool {
1391
1397
  if (rtUniform.isEmpty > 0) {
1392
1398
  return false;
1393
1399
  }
1394
1400
 
1395
1401
  let doubleSided = true;
1396
- let qg = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1397
- var tMax = qg;
1402
+ let qo = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1403
+ var tMax = qo;
1398
1404
  var ey: i32;
1399
- var gL: vec3f;
1405
+ var gP: vec3f;
1400
1406
 
1401
1407
  let bounces = 1;
1402
- var lq = false;
1403
- var hK: i32 = jG;
1408
+ var lD = false;
1409
+ var hO: i32 = jL;
1404
1410
 
1405
1411
  ${getBVHTraverseCode(
1406
1412
  /*wgsl */ `
1407
1413
 
1408
1414
 
1409
1415
 
1410
- var jn = true;
1416
+ var jt = true;
1411
1417
 
1412
- if (jn) {
1418
+ if (jt) {
1413
1419
  if (HAS_ALPHA) {
1414
- let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
1415
- if (!nr(
1420
+ let materialIndex = i32(ae(bitcast<i32>(ou.z)).x);
1421
+ if (!nG(
1416
1422
  materialIndex,
1417
1423
  index,
1418
1424
  aB,
1419
- eU,
1420
- eC
1425
+ eY,
1426
+ eD
1421
1427
  )) {
1422
1428
 
1423
- tMax = qg;
1424
- jn = false;
1429
+ tMax = qo;
1430
+ jt = false;
1425
1431
  }
1426
1432
  }
1427
1433
  }
1428
- if (jn) {
1434
+ if (jt) {
1429
1435
  return true;
1430
1436
  }
1431
1437
  `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}