@meimu/mutracer 0.1.1 → 0.1.3

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 (95) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +3525 -3484
  3. package/docs/materials.md +27 -7
  4. package/docs/threejs.md +13 -2
  5. package/docs/viewer.md +53 -0
  6. package/lib/oidn.d.ts +1 -1
  7. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  8. package/lib/renderer/MaterialTable.d.ts +1 -0
  9. package/lib/renderer/MaterialTable.js +2 -1
  10. package/lib/renderer/MaterialTable.js.map +1 -1
  11. package/lib/renderer/WGPUBloomPass.js +18 -18
  12. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  13. package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
  14. package/lib/renderer/WGPURayTraceOutput.js +14 -12
  15. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  16. package/lib/renderer/WGPURayTracePass.js +2 -2
  17. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  18. package/lib/renderer/WGPURenderingPipeline.js +20 -18
  19. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  20. package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
  21. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  22. package/lib/renderer/WebGLRayTracePass.js +3 -1
  23. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  24. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  25. package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
  26. package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
  27. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
  28. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
  29. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  30. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  31. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
  32. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
  33. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
  34. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
  36. package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
  37. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  38. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
  39. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  40. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  41. package/lib/renderer/glsl/rayTrace.frag.js +128 -128
  42. package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
  43. package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
  44. package/lib/renderer/lightsUtil.js +1 -1
  45. package/lib/renderer/lightsUtil.js.map +1 -1
  46. package/lib/renderer/materialComparison.generated.js +5 -0
  47. package/lib/renderer/materialComparison.generated.js.map +1 -1
  48. package/lib/renderer/materialLayout.js +2 -1
  49. package/lib/renderer/materialLayout.js.map +1 -1
  50. package/lib/renderer/prepareMeshBVH.d.ts +4 -2
  51. package/lib/renderer/prepareMeshBVH.js +44 -20
  52. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  53. package/lib/renderer/scratchSampling.js +6 -6
  54. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  55. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
  56. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +376 -379
  57. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  58. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
  59. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
  60. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
  61. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  62. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +122 -117
  63. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  64. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  65. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
  66. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
  67. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
  68. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
  69. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
  70. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  71. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  72. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  73. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
  74. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
  75. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  76. package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
  77. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  78. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  79. package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
  80. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  81. package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
  82. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  83. package/lib/scene/OpenPBRMaterial.d.ts +4 -2
  84. package/lib/scene/OpenPBRMaterial.js +4 -2
  85. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  86. package/lib/scene/openPbrSchema.d.ts +7 -2
  87. package/lib/scene/openPbrSchema.js +2 -1
  88. package/lib/scene/openPbrSchema.js.map +1 -1
  89. package/lib/util/fromTHREE.d.ts +1 -0
  90. package/lib/util/fromTHREE.js +24 -6
  91. package/lib/util/fromTHREE.js.map +1 -1
  92. package/lib/version.d.ts +1 -1
  93. package/lib/version.js +1 -1
  94. package/lib/version.js.map +1 -1
  95. package/package.json +5 -4
@@ -8,21 +8,21 @@ 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, gJ, tMax);
11
+ let hit = fI(o, d, tri, ey, gL, 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
15
  eC = normalize(cross(e1, e2));
16
- let kb = i32(ae(bitcast<i32>(od.z)).x);
17
- let iH = materialsBuffer[kb].doubleSided > 0.5;
18
- if (!doubleSided && !iH && dot(eC, d) > 0.0) {
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
19
  eC = vec3f(0.0);
20
20
  continue;
21
21
  }
22
22
 
23
23
  tMax = hit.t;
24
- qP = true;
25
- oh = true;
24
+ qT = true;
25
+ ol = true;
26
26
  eU = o + tMax * d;
27
27
  aB = hit.barycentric;
28
28
  }
@@ -30,46 +30,43 @@ aB = hit.barycentric;
30
30
  };
31
31
  function getPDMDisplacmentCode(anyHit) {
32
32
  return /*wgsl */ `
33
- let kL = oP(
33
+ let kO = oT(
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
- nX(displacementMapIndex),
39
+ oa(displacementMapIndex),
40
40
  minH, maxH,
41
41
  hScale,
42
+ matData.displacementBias,
42
43
  matData.displacementStepSize,
43
44
  i32(matData.displacementUvProjection),
44
45
  displacementUvProjectionScale,
45
46
  ${anyHit ? 'true' : 'false'},
46
- ln
47
+ lq
47
48
  );
48
49
  `;
49
50
  }
50
51
  const displacementIntersectCode = function (anyHit, hasAnisotropyDirections) {
51
52
  return /* wgsl */ `
52
53
 
53
- let hScale = od.w;
54
- let th = bitcast<i32>(r3.w);
55
- if (abs(hScale) > 0.0 && th > 0) {
54
+ let hScale = oh.w;
55
+ let tn = bitcast<i32>(r3.w);
56
56
 
57
+ let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
58
+ let matData = materialsBuffer[materialIndex];
57
59
  let n0 = normalize(attrBuffers[index.x * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
58
60
  let n1 = normalize(attrBuffers[index.y * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
59
61
  let n2 = normalize(attrBuffers[index.z * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''});
60
-
61
- let minH = f32(th >> 8) / 255.0;
62
- let maxH = f32(th & 0xff) / 255.0;
63
-
64
- let pA = tri.p0 + n0 * hScale * minH;
65
- let pB = tri.p1 + n1 * hScale * minH;
66
- let pC = tri.p2 + n2 * hScale * minH;
67
- let pD = tri.p0 + n0 * hScale * maxH;
68
- let pE = tri.p1 + n1 * hScale * maxH;
69
- let pF = tri.p2 + n2 * hScale * maxH;
70
-
71
- let materialIndex = i32(ae(bitcast<i32>(od.z)).x);
72
- let matData = materialsBuffer[materialIndex];
62
+ if (matData.displacementMapIndex >= 0.0 && matData.displacementBias != 0.0) {
63
+ tri.p0 += n0 * matData.displacementBias;
64
+ tri.p1 += n1 * matData.displacementBias;
65
+ tri.p2 += n2 * matData.displacementBias;
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;
73
70
  let displacementUvProjectionScale = vec2f(matData.displacementUvProjectionScale);
74
71
  let displacementMapIndex = i32(matData.displacementMapIndex);
75
72
 
@@ -80,18 +77,18 @@ var uv2 = attrBuffers[index.z * ATTR_STRIDE + UV_OFF].xy;
80
77
 
81
78
  ${getPDMDisplacmentCode(anyHit)}
82
79
 
83
- if (kL.t < tMax) {
84
- eC = kL.normal;
80
+ if (kO.t < tMax) {
81
+ eC = kO.normal;
85
82
 
86
83
 
87
- tMax = kL.t;
84
+ tMax = kO.t;
88
85
 
89
- aB = kL.barycentric;
86
+ aB = kO.barycentric;
90
87
  eU = o + tMax * d;
91
88
 
92
89
  bU = true;
93
- qP = true;
94
- oh = true;
90
+ qT = true;
91
+ ol = true;
95
92
  }
96
93
  }
97
94
  else {
@@ -115,102 +112,102 @@ f32(value >> 24u)
115
112
 
116
113
 
117
114
 
118
- fn kl(value: u32) -> u32 {
115
+ fn kn(value: u32) -> u32 {
119
116
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
120
117
  }
121
118
 
122
- fn nL(value: u32) -> u32 {
119
+ fn nO(value: u32) -> u32 {
123
120
  return (bitcast<u32>(f32(value)) >> 23u) - 127u;
124
121
  }
125
122
 
126
- fn oe(
123
+ fn oi(
127
124
  node: i32,
128
- sX: i32,
125
+ tc: i32,
129
126
  n0: vec4f,
130
127
  o: vec3f,
131
- gv: vec3f,
128
+ gx: vec3f,
132
129
  tMax: f32
133
130
  ) -> u32 {
134
- let i = node + sX;
131
+ let i = node + tc;
135
132
  let n2 = bvhBuffer[i + 2];
136
133
  let n3 = bvhBuffer[i + 3];
137
134
  let n4 = bvhBuffer[i + 4];
138
135
  let header = bitcast<u32>(n0.w);
139
- let rq = bitcast<i32>((header & 0xffu) << 24u) >> 24;
140
- let rr = bitcast<i32>(((header >> 8u) & 0xffu) << 24u) >> 24;
141
- let rs = bitcast<i32>(((header >> 16u) & 0xffu) << 24u) >> 24;
142
- let hG = vec3f(
143
- bitcast<f32>(u32(rq + 127) << 23u),
144
- bitcast<f32>(u32(rr + 127) << 23u),
145
- bitcast<f32>(u32(rs + 127) << 23u)
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)
146
143
  );
147
- let bJ = eV(gv, o);
148
- let eH = (n0.xyz - o) * gv;
149
- let da = hG * gv;
150
- let wl = bp(bitcast<u32>(n2.x));
151
- let wm = bp(bitcast<u32>(n2.y));
152
- let wn = bp(bitcast<u32>(n2.z));
153
- let wo = bp(bitcast<u32>(n2.w));
154
- let wp = bp(bitcast<u32>(n3.x));
155
- let wq = bp(bitcast<u32>(n3.y));
156
- let wf = bp(bitcast<u32>(n3.z));
157
- let wg = bp(bitcast<u32>(n3.w));
158
- let wh = bp(bitcast<u32>(n4.x));
159
- let wi = bp(bitcast<u32>(n4.y));
160
- let wj = bp(bitcast<u32>(n4.z));
161
- let wk = bp(bitcast<u32>(n4.w));
162
-
163
- let uZ = wl * da.x + eH.x;
164
- let vb = wn * da.y + eH.y;
165
- let vd = wp * da.z + eH.z;
166
- let uT = wf * da.x + eH.x;
167
- let uV = wh * da.y + eH.y;
168
- let uX = wj * da.z + eH.z;
169
- let wr = max(
170
- max((min(uZ, uT) - vec4f(bJ.x)), (min(vb, uV) - vec4f(bJ.y))),
171
- (min(vd, uX) - vec4f(bJ.z))
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))
172
169
  );
173
- let vZ = min(
174
- min((max(uZ, uT) + vec4f(bJ.x)), (max(vb, uV) + vec4f(bJ.y))),
175
- (max(vd, uX) + vec4f(bJ.z))
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))
176
173
  );
177
174
 
178
- let va = wm * da.x + eH.x;
179
- let vc = wo * da.y + eH.y;
180
- let ve = wq * da.z + eH.z;
181
- let uU = wg * da.x + eH.x;
182
- let uW = wi * da.y + eH.y;
183
- let uY = wk * da.z + eH.z;
184
- let ws = max(
185
- max((min(va, uU) - vec4f(bJ.x)), (min(vc, uW) - vec4f(bJ.y))),
186
- (min(ve, uY) - vec4f(bJ.z))
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))
187
184
  );
188
- let wa = min(
189
- min((max(va, uU) + vec4f(bJ.x)), (max(vc, uW) + vec4f(bJ.y))),
190
- (max(ve, uY) + vec4f(bJ.z))
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))
191
188
  );
192
189
 
193
- let uw = (wr <= min(vZ, vec4f(tMax))) & (vZ > vec4f(0.0));
194
- let ux = (ws <= min(wa, vec4f(tMax))) & (wa > vec4f(0.0));
195
- return select(0u, 1u, uw.x)
196
- | select(0u, 2u, uw.y)
197
- | select(0u, 4u, uw.z)
198
- | select(0u, 8u, uw.w)
199
- | select(0u, 16u, ux.x)
200
- | select(0u, 32u, ux.y)
201
- | select(0u, 64u, ux.z)
202
- | select(0u, 128u, ux.w);
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);
203
200
  }
204
201
 
205
202
  `;
206
203
  function getBVHTraverseCode(handleHitCode, hasDisplacement, anyHit, blasLayoutMask, hasAnisotropyDirections, skipTriangleCode = '') {
207
204
  const intersectTriangles = /* wgsl */ `
208
- let od = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
209
- let vertexOffset = vec3i(bitcast<i32>(od.y));
205
+ let oh = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
206
+ let vertexOffset = vec3i(bitcast<i32>(oh.y));
210
207
  for (var k = 0; k < bh; k++) {
211
208
  let triangleIndex = primitiveOffset + k;
212
209
  ${skipTriangleCode}
213
- if (bounces > 0 && triangleIndex == hL) {
210
+ if (bounces > 0 && triangleIndex == hK) {
214
211
  continue;
215
212
  }
216
213
 
@@ -221,12 +218,12 @@ attrBuffers[index.x * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.x
221
218
  attrBuffers[index.y * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''},
222
219
  attrBuffers[index.z * ATTR_STRIDE + POSITION_OFF]${hasAnisotropyDirections ? '.xyz' : ''}
223
220
  );
224
- var oh = false;
221
+ var ol = false;
225
222
 
226
223
  ${hasDisplacement
227
224
  ? displacementIntersectCode(anyHit, hasAnisotropyDirections)
228
225
  : flatIntersectCode()}
229
- if (oh) {
226
+ if (ol) {
230
227
  ${handleHitCode}
231
228
  }
232
229
  }
@@ -234,69 +231,69 @@ ${handleHitCode}
234
231
  return /* wgsl */ `
235
232
  var d = ray.d;
236
233
  var o = ray.o;
237
- var lN: array<i32, TLAS_STACK_SIZE>;
238
- var jb = -1;
239
- var gv = eX(d);
234
+ var lQ: array<i32, TLAS_STACK_SIZE>;
235
+ var jd = -1;
236
+ var gx = eX(d);
240
237
  var bU = false;
241
- var qP = false;
238
+ var qT = false;
242
239
  var eU: vec3f;
243
240
  var eC: vec3f;
244
241
  var aB: vec3f;
245
242
 
246
243
 
247
- if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gv, tMax) > 0.0) {
248
- jb = 0;
249
- lN[0] = 0;
244
+ if (cM(o, bvhBuffer[0].xyz, bvhBuffer[1].xyz, gx, tMax) > 0.0) {
245
+ jd = 0;
246
+ lQ[0] = 0;
250
247
  }
251
- while (jb >= 0) {
252
- let sI = lN[jb];
253
- jb--;
248
+ while (jd >= 0) {
249
+ let sN = lQ[jd];
250
+ jd--;
254
251
  o = ray.o;
255
252
  d = ray.d;
256
- gv = eX(d);
253
+ gx = eX(d);
257
254
 
258
- let vR = bvhBuffer[sI];
259
- let eR = bitcast<i32>(vR.w);
255
+ let vX = bvhBuffer[sN];
256
+ let eR = bitcast<i32>(vX.w);
260
257
  if (eR >= 0) {
261
- let left = sI + 2;
258
+ let left = sN + 2;
262
259
  let right = eR;
263
260
  let d0 = cM(
264
261
  o,
265
262
  bvhBuffer[left].xyz,
266
263
  bvhBuffer[left + 1].xyz,
267
- gv,
264
+ gx,
268
265
  tMax
269
266
  );
270
267
  let d1 = cM(
271
268
  o,
272
269
  bvhBuffer[right].xyz,
273
270
  bvhBuffer[right + 1].xyz,
274
- gv,
271
+ gx,
275
272
  tMax
276
273
  );
277
274
 
278
275
  if (d0 > d1) {
279
- if (d0 > 0.0) { jb++; lN[jb] = left; }
280
- if (d1 > 0.0) { jb++; lN[jb] = right; }
276
+ if (d0 > 0.0) { jd++; lQ[jd] = left; }
277
+ if (d1 > 0.0) { jd++; lQ[jd] = right; }
281
278
  }
282
279
  else {
283
- if (d1 > 0.0) { jb++; lN[jb] = right; }
284
- if (d0 > 0.0) { jb++; lN[jb] = left; }
280
+ if (d1 > 0.0) { jd++; lQ[jd] = right; }
281
+ if (d0 > 0.0) { jd++; lQ[jd] = left; }
285
282
  }
286
283
  }
287
284
  else {
288
- let qx = -eR;
285
+ let qB = -eR;
289
286
 
290
287
 
291
288
  for (
292
- var mi = qx - 1;
293
- mi >= 0;
294
- mi--
289
+ var ml = qB - 1;
290
+ ml >= 0;
291
+ ml--
295
292
  ) {
296
- let pm = bvhBuffer[sI + 2 + mi];
297
- let cf = bitcast<i32>(pm.x);
298
- let uG = bitcast<i32>(pm.y);
299
- let od = instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE}];
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}];
300
297
  let w2l = mat4x4<f32>(
301
298
  instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 1],
302
299
  instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 2],
@@ -305,212 +302,212 @@ instancesBuffer[cf * ${INSTANCE_VEC4_STRIDE} + 4]
305
302
  );
306
303
  o = (w2l * vec4f(ray.o, 1.0)).xyz;
307
304
  d = (w2l * vec4f(ray.d, 0.0)).xyz;
308
- gv = eX(d);
305
+ gx = eX(d);
309
306
  ey = maxDimension(abs(d));
310
- gJ = mg(d, ey);
307
+ gL = mj(d, ey);
311
308
 
312
- let fG = bitcast<u32>(od.x);
313
- let gL = fG >> 30u;
309
+ let fG = bitcast<u32>(oh.x);
310
+ let gN = fG >> 30u;
314
311
  let blasOffset = i32(fG & 0x3fffffffu);
315
312
  let bo = rtUniform.blasOffset;
316
313
 
317
314
  ${(blasLayoutMask & 8) !== 0 ? /* wgsl */ `
318
- if (gL == 3u) {
315
+ if (gN == 3u) {
319
316
 
320
317
 
321
318
 
322
319
 
323
- var rY: array<vec2u, BLAS_STACK_SIZE>;
324
- var pa = -1;
325
- var rK = 0u;
326
- var kN = 0u;
320
+ var sd: array<vec2u, BLAS_STACK_SIZE>;
321
+ var pe = -1;
322
+ var rP = 0u;
323
+ var kQ = 0u;
327
324
 
328
325
  var ep = 0x80000000u;
329
- let uf = select(0u, 4u, d.x < 0.0)
326
+ let ul = select(0u, 4u, d.x < 0.0)
330
327
  | select(0u, 2u, d.y < 0.0)
331
328
  | select(0u, 1u, d.z < 0.0);
332
- let pZ = 7u - uf;
329
+ let qd = 7u - ul;
333
330
 
334
331
 
335
332
 
336
333
 
337
- while (rK < 4096u) {
338
- rK++;
334
+ while (rP < 4096u) {
335
+ rP++;
339
336
 
340
337
  let internalMask = ep & 0xffu;
341
- let pV =
342
- kl(ep >> 24u) + 24u;
343
- ep &= ~(1u << pV);
338
+ let pZ =
339
+ kn(ep >> 24u) + 24u;
340
+ ep &= ~(1u << pZ);
344
341
  if ((ep & 0xff000000u) != 0u) {
345
- pa++;
342
+ pe++;
346
343
 
347
- rY[pa] = vec2u(kN, ep);
344
+ sd[pe] = vec2u(kQ, ep);
348
345
  }
349
346
 
350
- let slot = (pV - 24u) ^ pZ;
351
- let mY = (1u << slot) - 1u;
352
- let relativeIndex = countOneBits(internalMask & mY);
353
- let rW = kN + relativeIndex;
354
- let node = blasOffset + i32(rW * 5u);
355
- let jr = bvhBuffer[node + bo];
356
- let tS = oe(
357
- node, bo, jr, o, gv, tMax
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
358
355
  );
359
356
 
360
357
 
361
358
  ep = 0u;
362
- if (tS != 0u) {
359
+ if (tX != 0u) {
363
360
  let fC = bvhBuffer[node + bo + 1];
364
- let rB = bitcast<u32>(jr.w) >> 24u;
365
- var tf = 0u;
366
- var jX = tS;
367
- while (jX != 0u) {
368
- let rm = kl(jX);
369
- jX &= ~(1u << rm);
370
- let sn = select(
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(
371
368
  bitcast<u32>(fC.z),
372
369
  bitcast<u32>(fC.w),
373
- rm >= 4u
370
+ rr >= 4u
374
371
  );
375
- let sR =
376
- (sn >> ((rm & 3u) * 8u)) & 0xffu;
377
- let ju = sR & 0x1fu;
378
- let uF = select(
379
- ju,
380
- ju ^ pZ,
381
- ju >= 24u
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
382
379
  );
383
- let uA = (sR >> 5u) & 0x7u;
384
- tf |= uA << uF;
380
+ let uH = (sW >> 5u) & 0x7u;
381
+ tl |= uH << uM;
385
382
  }
386
383
 
387
- kN = bitcast<u32>(fC.x);
388
- ep = (tf & 0xff000000u) | rB;
389
- let oE = bitcast<u32>(fC.y);
390
- var oF = tf & 0x00ffffffu;
391
- while (oF != 0u) {
392
- let nF = nL(oF);
393
- oF &= ~(1u << nF);
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);
394
391
  let bh = 1;
395
392
  let primitiveOffset = bo + blasOffset
396
- + i32(oE + nF);
393
+ + i32(oH + nI);
397
394
  ${intersectTriangles}
398
395
  }
399
396
  }
400
397
 
401
398
  if ((ep & 0xff000000u) != 0u) { continue; }
402
- if (pa >= 0) {
403
- let qa = rY[pa];
404
- kN = qa.x;
405
- ep = qa.y;
406
- pa--;
399
+ if (pe >= 0) {
400
+ let qe = sd[pe];
401
+ kQ = qe.x;
402
+ ep = qe.y;
403
+ pe--;
407
404
  }
408
405
  else { break; }
409
406
  }
410
407
  }
411
408
  ` : ''}
412
409
 
413
- var gn: array<i32, BLAS_STACK_SIZE>;
410
+ var gp: array<i32, BLAS_STACK_SIZE>;
414
411
  var dR = -1;
415
- if (gL != 3u) {
412
+ if (gN != 3u) {
416
413
  dR = 0;
417
414
 
418
- gn[0] = uG;
415
+ gp[0] = uN;
419
416
  }
420
417
 
421
418
  while (dR >= 0) {
422
419
 
423
- let node = gn[dR];
420
+ let node = gp[dR];
424
421
  dR--;
425
422
  var bh = 0;
426
423
  var primitiveOffset = 0;
427
424
 
428
425
  ${(blasLayoutMask & 4) !== 0 ? /* wgsl */ `
429
- if (gL == 2u) {
426
+ if (gN == 2u) {
430
427
  let i = node + bo;
431
- let uK = bvhBuffer[i];
432
- let uL = bvhBuffer[i + 1];
433
- let uM = bvhBuffer[i + 2];
434
- let uN = bvhBuffer[i + 3];
435
- bh = i32(bitcast<u32>(uM.w));
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));
436
433
  if (bh > 0) {
437
434
  primitiveOffset = bo + blasOffset
438
- + i32(bitcast<u32>(uN.w));
435
+ + i32(bitcast<u32>(uU.w));
439
436
  }
440
437
  else {
441
- let left = blasOffset + i32(bitcast<u32>(uK.w) * 4u);
442
- let right = blasOffset + i32(bitcast<u32>(uL.w) * 4u);
443
- let oi = cM(
444
- o, uK.xyz, uL.xyz, gv, tMax
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
445
442
  );
446
- let nd = cM(
447
- o, uM.xyz, uN.xyz, gv, tMax
443
+ let ng = cM(
444
+ o, uT.xyz, uU.xyz, gx, tMax
448
445
  );
449
- if (oi > nd) {
450
- if (oi > 0.0) {
451
- dR++; gn[dR] = left;
446
+ if (om > ng) {
447
+ if (om > 0.0) {
448
+ dR++; gp[dR] = left;
452
449
  }
453
- if (nd > 0.0) {
454
- dR++; gn[dR] = right;
450
+ if (ng > 0.0) {
451
+ dR++; gp[dR] = right;
455
452
  }
456
453
  }
457
454
  else {
458
- if (nd > 0.0) {
459
- dR++; gn[dR] = right;
455
+ if (ng > 0.0) {
456
+ dR++; gp[dR] = right;
460
457
  }
461
- if (oi > 0.0) {
462
- dR++; gn[dR] = left;
458
+ if (om > 0.0) {
459
+ dR++; gp[dR] = left;
463
460
  }
464
461
  }
465
462
  }
466
463
  }
467
464
  ` : ''}
468
465
  ${(blasLayoutMask & 2) !== 0 ? /* wgsl */ `
469
- if (gL == 1u) {
470
- let hT = bitcast<u32>(node);
471
- if ((hT & 0x80000000u) != 0u) {
472
- bh = i32((hT >> 23u) & 0xffu);
466
+ if (gN == 1u) {
467
+ let hS = bitcast<u32>(node);
468
+ if ((hS & 0x80000000u) != 0u) {
469
+ bh = i32((hS >> 23u) & 0xffu);
473
470
  primitiveOffset = bo + blasOffset
474
- + i32(hT & 0x007fffffu);
471
+ + i32(hS & 0x007fffffu);
475
472
  }
476
473
  else {
477
474
  let i = node + bo;
478
- let tV = bvhBuffer[i];
479
- let ra = bvhBuffer[i + 1];
480
- let rb = bvhBuffer[i + 2];
481
- let rc = bvhBuffer[i + 3];
482
- let nodeMin = tV.xyz;
483
- let ec = vec3f(tV.w, ra.x, ra.y);
484
- let lS = array<u32, 4>(
485
- bitcast<u32>(ra.z), bitcast<u32>(ra.w),
486
- bitcast<u32>(rb.x), bitcast<u32>(rb.y)
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)
487
484
  );
488
- let rj = unpack4x8unorm(bitcast<u32>(rb.z));
489
- let rk = unpack4x8unorm(bitcast<u32>(rb.w));
490
- let rl = unpack4x8unorm(bitcast<u32>(rc.x));
491
- let rf = unpack4x8unorm(bitcast<u32>(rc.y));
492
- let rh = unpack4x8unorm(bitcast<u32>(rc.z));
493
- let ri = unpack4x8unorm(bitcast<u32>(rc.w));
494
- let tx0 = (nodeMin.x + rj * ec.x - o.x) * gv.x;
495
- let tx1 = (nodeMin.x + rf * ec.x - o.x) * gv.x;
496
- let ty0 = (nodeMin.y + rk * ec.y - o.y) * gv.y;
497
- let ty1 = (nodeMin.y + rh * ec.y - o.y) * gv.y;
498
- let tz0 = (nodeMin.z + rl * ec.z - o.z) * gv.z;
499
- let tz1 = (nodeMin.z + ri * ec.z - o.z) * gv.z;
500
- let bJ = eV(gv, o);
501
- let my = max(
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(
502
499
  max((min(tx0, tx1) - vec4f(bJ.x)), (min(ty0, ty1) - vec4f(bJ.y))),
503
500
  (min(tz0, tz1) - vec4f(bJ.z))
504
501
  );
505
- let rH = min(
502
+ let rM = min(
506
503
  min((max(tx0, tx1) + vec4f(bJ.x)), (max(ty0, ty1) + vec4f(bJ.y))),
507
504
  (max(tz0, tz1) + vec4f(bJ.z))
508
505
  );
509
- var distance = select(rH, my, my > vec4f(0.0));
506
+ var distance = select(rM, mB, mB > vec4f(0.0));
510
507
  distance = select(
511
508
  distance,
512
509
  vec4f(-1.0),
513
- my > min(rH, vec4f(tMax))
510
+ mB > min(rM, vec4f(tMax))
514
511
  );
515
512
  var fa = array<f32, 4>(
516
513
  distance.x,
@@ -525,7 +522,7 @@ var dX = -1.0;
525
522
  var el = -1;
526
523
  for (var child = 0; child < 4; child++) {
527
524
  if (
528
- lS[child] != 0u &&
525
+ lV[child] != 0u &&
529
526
  fa[child] > dX
530
527
  ) {
531
528
  dX = fa[child];
@@ -533,13 +530,13 @@ el = child;
533
530
  }
534
531
  }
535
532
  if (el >= 0 && dX > 0.0) {
536
- let ni = lS[el];
537
- var jB = bitcast<i32>(ni);
538
- if ((ni & 0x80000000u) == 0u) {
539
- jB += blasOffset;
533
+ let nl = lV[el];
534
+ var jD = bitcast<i32>(nl);
535
+ if ((nl & 0x80000000u) == 0u) {
536
+ jD += blasOffset;
540
537
  }
541
538
  dR++;
542
- gn[dR] = jB;
539
+ gp[dR] = jD;
543
540
  fa[el] = -1.0;
544
541
  }
545
542
  }
@@ -547,7 +544,7 @@ fa[el] = -1.0;
547
544
  }
548
545
  ` : ''}
549
546
  ${(blasLayoutMask & 1) !== 0 ? /* wgsl */ `
550
- if (gL == 0u) {
547
+ if (gN == 0u) {
551
548
  let i = node + bo;
552
549
  let r1 = bvhBuffer[i];
553
550
  let bb = bitcast<i32>(r1.w);
@@ -559,34 +556,34 @@ let d0 = cM(
559
556
  o,
560
557
  bvhBuffer[left + bo].xyz,
561
558
  bvhBuffer[left + 1 + bo].xyz,
562
- gv,
559
+ gx,
563
560
  tMax
564
561
  );
565
562
  let d1 = cM(
566
563
  o,
567
564
  bvhBuffer[right + bo].xyz,
568
565
  bvhBuffer[right + 1 + bo].xyz,
569
- gv,
566
+ gx,
570
567
  tMax
571
568
  );
572
569
 
573
570
  if (d0 > d1) {
574
571
  if (d0 > 0.0) {
575
- dR++; gn[dR] = left;
572
+ dR++; gp[dR] = left;
576
573
 
577
574
  }
578
575
  if (d1 > 0.0) {
579
- dR++; gn[dR] = right;
576
+ dR++; gp[dR] = right;
580
577
 
581
578
  }
582
579
  }
583
580
  else {
584
581
  if (d1 > 0.0) {
585
- dR++; gn[dR] = right;
582
+ dR++; gp[dR] = right;
586
583
 
587
584
  }
588
585
  if (d0 > 0.0) {
589
- dR++; gn[dR] = left;
586
+ dR++; gp[dR] = left;
590
587
 
591
588
  }
592
589
  }
@@ -642,7 +639,7 @@ return t2;
642
639
  return INF;
643
640
  }
644
641
 
645
- fn mR(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
642
+ fn mU(pos: vec3f, u: vec3f, v: vec3f, n: vec3f, r: Ray) -> f32 {
646
643
  let dt: f32 = dot(r.d, n);
647
644
  let t: f32 = (dot(n, pos) - dot(n, r.o)) / dt;
648
645
 
@@ -664,12 +661,12 @@ return INF;
664
661
  fn sphereSolidAnglePdf(origin: vec3f, center: vec3f, radius: f32) -> f32 {
665
662
  let aj = distance(origin, center);
666
663
  if (aj <= radius) { return INV4PI; }
667
- let jn = min(1.0, radius * radius / (aj * aj));
668
- let cosThetaMax = sqrt(max(0.0, 1.0 - jn));
664
+ let jp = min(1.0, radius * radius / (aj * aj));
665
+ let cosThetaMax = sqrt(max(0.0, 1.0 - jp));
669
666
  return 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
670
667
  }
671
668
 
672
- fn mk(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
669
+ fn mo(r: Ray, light: Light, lightSample: ptr<function, LightSampleRec>) -> f32 {
673
670
 
674
671
 
675
672
  var d: f32 = INF;
@@ -691,7 +688,7 @@ if (dot(normal, r.d) > 0.0) {
691
688
  return INF;
692
689
  }
693
690
 
694
- d = mR(pos, u, v, normal, r);
691
+ d = mU(pos, u, v, normal, r);
695
692
  if (d < 0.0) {
696
693
  d = INF;
697
694
  }
@@ -714,9 +711,9 @@ d = INF;
714
711
 
715
712
  else if (dO == SPHERE_LIGHT) {
716
713
  if (light.radiusOrSpread <= 0.0) {
717
- let kf = light.position - r.o;
718
- let projection = dot(kf, r.d);
719
- let ba = kf - projection * r.d;
714
+ let kh = light.position - r.o;
715
+ let projection = dot(kh, r.d);
716
+ let ba = kh - projection * r.d;
720
717
  if (projection <= EPS || dot(ba, ba) > 1e-8) {
721
718
  return INF;
722
719
  }
@@ -759,9 +756,9 @@ light.radiusOrSpread <= 0.0
759
756
 
760
757
  else if (dO == SPOT_LIGHT) {
761
758
  if (light.radiusOrSpread <= 0.0) {
762
- let kf = light.position - r.o;
763
- let projection = dot(kf, r.d);
764
- let ba = kf - projection * r.d;
759
+ let kh = light.position - r.o;
760
+ let projection = dot(kh, r.d);
761
+ let ba = kh - projection * r.d;
765
762
  if (projection <= EPS || dot(ba, ba) > 1e-8) {
766
763
  return INF;
767
764
  }
@@ -777,9 +774,9 @@ d = ht(light.radiusOrSpread, light.position, r);
777
774
  (*lightSample).isDelta = false;
778
775
  }
779
776
  if (d != INF) {
780
- let uQ = r.o + d * r.d;
781
- let mo = bL(light, normalize(r.o - uQ));
782
- if (mo <= 0.0) { return 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; }
783
780
  if (light.radiusOrSpread > 0.0) {
784
781
  (*lightSample).direction = r.d;
785
782
  (*lightSample).dist = d;
@@ -788,7 +785,7 @@ r.o + r.d * d - light.position
788
785
  );
789
786
  (*lightSample).pdf = sphereSolidAnglePdf(r.o, light.position, light.radiusOrSpread);
790
787
  }
791
- (*lightSample).emission = light.emission * mo * select(
788
+ (*lightSample).emission = light.emission * mr * select(
792
789
  1.0,
793
790
  1.0 / max(d * d, 1e-8),
794
791
  light.radiusOrSpread <= 0.0
@@ -824,44 +821,44 @@ var w20 = m20.y * eZ.z;
824
821
  var w21 = m21.y * eZ.z;
825
822
  var w22 = m22.y * eZ.z;
826
823
 
827
- var he = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
824
+ var hg = w00 + w01 + w02 + w10 + w11 + w12 + w20 + w21 + w22;
828
825
 
829
- w00 = w00 / he;
830
- w01 = w01 / he + w00;
831
- w02 = w02 / he + w01;
832
- w10 = w10 / he + w02;
833
- w11 = w11 / he + w10;
834
- w12 = w12 / he + w11;
835
- w20 = w20 / he + w12;
836
- w21 = w21 / he + w20;
837
- w22 = w22 / he + w21;
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;
838
835
 
839
836
  let rand = eo(0u);
840
- var mS: f32;
837
+ var mV: f32;
841
838
  if (rand < w00) {
842
- mS = m00.x;
839
+ mV = m00.x;
843
840
  } else if (rand < w01) {
844
- mS = m01.x;
841
+ mV = m01.x;
845
842
  } else if (rand < w02) {
846
- mS = m02.x;
843
+ mV = m02.x;
847
844
  } else if (rand < w10) {
848
- mS = m10.x;
845
+ mV = m10.x;
849
846
  } else if (rand < w11) {
850
- mS = m11.x;
847
+ mV = m11.x;
851
848
  } else if (rand < w12) {
852
- mS = m12.x;
849
+ mV = m12.x;
853
850
  } else if (rand < w20) {
854
- mS = m20.x;
851
+ mV = m20.x;
855
852
  } else if (rand < w21) {
856
- mS = m21.x;
853
+ mV = m21.x;
857
854
  } else {
858
- mS = m22.x;
855
+ mV = m22.x;
859
856
  }
860
- return i32(mS);
857
+ return i32(mV);
861
858
  }
862
859
 
863
- fn lJ(
864
- oN: i32,
860
+ fn lM(
861
+ oR: i32,
865
862
  index: vec3i,
866
863
  eZ: vec3f
867
864
  ) -> i32 {
@@ -871,31 +868,31 @@ let m2 = vec3i(attrBuffers[index.z * ATTR_STRIDE + MATERIALINDEX_OFF]${hasAnisot
871
868
  if (m0.x > 0 || m1.x > 0 || m2.x > 0) {
872
869
  return fj(m0, m1, m2, eZ);
873
870
  }
874
- return oN;
871
+ return oR;
875
872
  }
876
873
 
877
874
 
878
875
 
879
876
  ${hasAnisotropyDirections ? /* wgsl */ `
880
- fn eD(normal: vec3f, dp1: vec3f, dp2: vec3f, nP: vec2f, nQ: vec2f, input: vec4f) -> mat2x3f {
881
- let determinant = nP.x * nQ.y - nP.y * nQ.x;
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;
882
879
  var t = input.xyz;
883
880
  var b = vec3f(0.0);
884
881
 
885
882
  var sign = select(input.w, 0.0, abs(input.w) > 1.5);
886
883
  if (abs(determinant) > 1e-12) {
887
- let dt = (dp1 * nQ.y - dp2 * nP.y) / determinant;
888
- let db = (dp2 * nP.x - dp1 * nQ.x) / determinant;
884
+ let dt = (dp1 * nT.y - dp2 * nS.y) / determinant;
885
+ let db = (dp2 * nS.x - dp1 * nT.x) / determinant;
889
886
  if (dot(t, t) < 1e-8) { t = dt; }
890
887
  if (sign == 0.0) { sign = select(1.0, -1.0, dot(cross(normal, dt), db) < 0.0); }
891
888
  }
892
889
  t -= normal * dot(normal, t);
893
890
  if (dot(t, t) < 1e-8) {
894
- let ig = select(-1.0, 1.0, normal.z >= 0.0);
895
- let dW = -1.0 / (ig + normal.z);
891
+ let ie = select(-1.0, 1.0, normal.z >= 0.0);
892
+ let dW = -1.0 / (ie + normal.z);
896
893
  let xy = normal.x * normal.y * dW;
897
- t = vec3f(1.0 + ig * normal.x * normal.x * dW, ig * xy, -ig * normal.x);
898
- b = vec3f(xy, ig + normal.y * normal.y * dW, -normal.y);
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);
899
896
  }
900
897
  else { t = normalize(t); b = normalize(cross(normal, t)); }
901
898
  return mat2x3f(t, b * select(1.0, -1.0, sign < 0.0));
@@ -918,22 +915,22 @@ let uvProjection = i32(material.uvProjection);
918
915
  let i0 = index.x;
919
916
  let i1 = index.y;
920
917
  let i2 = index.z;
921
- let oL = uvProjection == ${uvProjectionConstants.spherical};
918
+ let oP = uvProjection == ${uvProjectionConstants.spherical};
922
919
 
923
920
  var normal: vec3f = (*si).normal;
924
- var gU: vec3f;
921
+ var gV: vec3f;
925
922
  var n0 = vec3f(0.0);
926
923
  var n1 = vec3f(0.0);
927
924
  var n2 = vec3f(0.0);
928
925
 
929
926
 
930
- if (!bU || oL) {
927
+ if (!bU || oP) {
931
928
  n0 = attrBuffers[i0 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
932
929
  n1 = attrBuffers[i1 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
933
930
  n2 = attrBuffers[i2 * ATTR_STRIDE + NORMAL_OFF]${hasAnisotropyDirections ? '.xyz' : ''};
934
- gU = normalize(eZ.x * n0 + eZ.y * n1 + eZ.z * n2);
931
+ gV = normalize(eZ.x * n0 + eZ.y * n1 + eZ.z * n2);
935
932
  if (!bU) {
936
- normal = gU;
933
+ normal = gV;
937
934
  }
938
935
  }
939
936
 
@@ -968,7 +965,7 @@ if (fq >= 0) {
968
965
  (*si).materialIndex = fq;
969
966
  }
970
967
  else {
971
- (*si).materialIndex = lJ(
968
+ (*si).materialIndex = lM(
972
969
  (*si).materialIndex,
973
970
  index,
974
971
  eZ
@@ -977,7 +974,7 @@ eZ
977
974
 
978
975
  if (uvProjection > 0) {
979
976
 
980
- uv = gz(uvProjection, (*si).position, select(normal, gU, oL));
977
+ uv = gC(uvProjection, (*si).position, select(normal, gV, oP));
981
978
  cX = uv;
982
979
  }
983
980
 
@@ -1015,21 +1012,21 @@ fU = eD(normal, dp1, dp2, a-c, b-c, select(aU, vec4f(0.0), aU.w == 0.0));
1015
1012
  (*si).directionBitangent = fU[1];
1016
1013
  ${hasCoatNormals ? /* wgsl */ `
1017
1014
  if (USE_COAT_NORMAL_MAPS && directionMaterial.coatNormalMapIndex >= 0.0) {
1018
- let kq = i32(directionMaterial.coatNormalMapIndex);
1019
- var lT = eP;
1020
- if (USE_UV1 && mapInfo[kq + NUM_MAPS * 2].x > 0.5) {
1015
+ let ku = i32(directionMaterial.coatNormalMapIndex);
1016
+ var lW = eP;
1017
+ if (USE_UV1 && mapInfo[ku + NUM_MAPS * 2].x > 0.5) {
1021
1018
  let a = attrBuffers[i0 * ATTR_STRIDE + UV1_OFF].xy;
1022
1019
  let b = attrBuffers[i1 * ATTR_STRIDE + UV1_OFF].xy;
1023
1020
  let c = attrBuffers[i2 * ATTR_STRIDE + UV1_OFF].xy;
1024
- lT = eD(normal, dp1, dp2, a-c, b-c,
1021
+ lW = eD(normal, dp1, dp2, a-c, b-c,
1025
1022
  select(aU, vec4f(0.0), aU.w == 0.0));
1026
1023
  }
1027
1024
 
1028
1025
 
1029
- let decoded = sampleMap(kq, getMapUvSet(kq, uv,
1026
+ let decoded = sampleMap(ku, getMapUvSet(ku, uv,
1030
1027
  select(cX, uv, uvProjection > 0))).rgb * 2.0 - 1.0;
1031
- let mapped = lT[0] * decoded.x * directionMaterial.coatNormalScale.x
1032
- + lT[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1028
+ let mapped = lW[0] * decoded.x * directionMaterial.coatNormalScale.x
1029
+ + lW[1] * decoded.y * directionMaterial.coatNormalScale.y + normal * decoded.z;
1033
1030
  if (dot(mapped, mapped) > 1e-12) { (*si).coatNormal = normalize(mapped); }
1034
1031
  }
1035
1032
  ` : ''}
@@ -1044,14 +1041,14 @@ if (!bU) {
1044
1041
 
1045
1042
 
1046
1043
  let geometricNormal = normalize(cross(tri.p1 - tri.p0, tri.p2 - tri.p0));
1047
- let kd = eZ.x * n0 + eZ.y * n1 + eZ.z * n2;
1044
+ let kf = eZ.x * n0 + eZ.y * n1 + eZ.z * n2;
1048
1045
  let a = dot(n2 - n0, tri.p0 - tri.p2);
1049
1046
  let b = dot(n2 - n1, tri.p1 - tri.p2);
1050
1047
  let c = dot(n1 - n0, tri.p1 - tri.p0);
1051
1048
  var h = a * eZ.x * (eZ.x - 1.0)
1052
1049
  + (a + b + c) * eZ.x * eZ.y
1053
1050
  + b * eZ.y * (eZ.y - 1.0);
1054
- if (dot(kd, geometricNormal) > 0.0) {
1051
+ if (dot(kf, geometricNormal) > 0.0) {
1055
1052
  var h0 = max(max(dot(tri.p1 - tri.p0, n0), dot(tri.p2 - tri.p0, n0)), 0.0);
1056
1053
  var h1 = max(max(dot(tri.p0 - tri.p1, n1), dot(tri.p2 - tri.p1, n1)), 0.0);
1057
1054
  var h2 = max(max(dot(tri.p0 - tri.p2, n2), dot(tri.p1 - tri.p2, n2)), 0.0);
@@ -1069,17 +1066,17 @@ h1 = max(dot((*si).position - tri.p1, n1) + h1, 0.0);
1069
1066
  h2 = max(dot((*si).position - tri.p2, n2) + h2, 0.0);
1070
1067
  h = min(-min(min(h0, h1), h2), h * 0.5);
1071
1068
  }
1072
- (*si).shadowOffset = kd * h;
1069
+ (*si).shadowOffset = kf * h;
1073
1070
  }
1074
1071
  (*si).uv = uv;
1075
1072
  (*si).uv1 = cX;
1076
1073
  if (USE_NORMAL_MAPS) {
1077
1074
  let dp1 = tri.p0 - tri.p2;
1078
1075
  let dp2 = tri.p1 - tri.p2;
1079
- let nP = uv0 - uv2;
1080
- let nQ = uv1 - uv2;
1081
- (*si).normal = nY(
1082
- (*si).materialIndex, uv, normal, dp1, dp2, nP, nQ
1076
+ let nS = uv0 - uv2;
1077
+ let nT = uv1 - uv2;
1078
+ (*si).normal = ob(
1079
+ (*si).materialIndex, uv, normal, dp1, dp2, nS, nT
1083
1080
  );
1084
1081
  }
1085
1082
  }
@@ -1093,7 +1090,7 @@ barycentric: vec3f,
1093
1090
 
1094
1091
 
1095
1092
 
1096
- fn fI(o: vec3f, d: vec3f, tri: fu, ey: i32, gJ: vec3f, tMax: f32) -> eB {
1093
+ fn fI(o: vec3f, d: vec3f, tri: fu, ey: i32, gL: vec3f, tMax: f32) -> eB {
1097
1094
  var ti: eB;
1098
1095
 
1099
1096
 
@@ -1114,9 +1111,9 @@ p2t = p2t.zxy;
1114
1111
 
1115
1112
 
1116
1113
 
1117
- p0t = vec3f(p0t.xy + gJ.xy * p0t.z, p0t.z);
1118
- p1t = vec3f(p1t.xy + gJ.xy * p1t.z, p1t.z);
1119
- p2t = vec3f(p2t.xy + gJ.xy * p2t.z, p2t.z);
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
1117
 
1121
1118
 
1122
1119
  var e = vec3f(
@@ -1128,9 +1125,9 @@ p0t.x * p1t.y - p0t.y * p1t.x
1128
1125
  if (DEPTH_QUERY_MODE) {
1129
1126
 
1130
1127
 
1131
- let ro = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1128
+ let rt = abs(vec3f(p1t.x * p2t.y, p2t.x * p0t.y, p0t.x * p1t.y))
1132
1129
  + abs(vec3f(p1t.y * p2t.x, p2t.y * p0t.x, p0t.y * p1t.x));
1133
- e = select(e, vec3f(0.0), abs(e) <= ro * 1e-6);
1130
+ e = select(e, vec3f(0.0), abs(e) <= rt * 1e-6);
1134
1131
  }
1135
1132
 
1136
1133
 
@@ -1141,19 +1138,19 @@ return ti;
1141
1138
  let det = e.x + e.y + e.z;
1142
1139
  if (DEPTH_QUERY_MODE && det == 0.0) { return ti; }
1143
1140
 
1144
- p0t.z *= gJ.z;
1145
- p1t.z *= gJ.z;
1146
- p2t.z *= gJ.z;
1147
- let qZ = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
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);
1148
1145
 
1149
1146
 
1150
- if (abs(qZ) > abs(tMax * det)) {
1147
+ if (abs(rd) > abs(tMax * det)) {
1151
1148
  return ti;
1152
1149
  }
1153
1150
 
1154
- let sg = 1. / det;
1155
- ti.t = qZ * sg;
1156
- ti.barycentric = e * sg;
1151
+ let sm = 1. / det;
1152
+ ti.t = rd * sm;
1153
+ ti.barycentric = e * sm;
1157
1154
 
1158
1155
  return ti;
1159
1156
  }
@@ -1168,21 +1165,21 @@ if (!DEPTH_QUERY_MODE) { return 1.0 / d; }
1168
1165
  return 1.0 / select(d, select(vec3f(1e-20), vec3f(-1e-20), d < vec3f(0.0)), abs(d) < vec3f(1e-20));
1169
1166
  }
1170
1167
 
1171
- fn eV(gv: vec3f, o: vec3f) -> vec3f {
1168
+ fn eV(gx: vec3f, o: vec3f) -> vec3f {
1172
1169
  if (!DEPTH_QUERY_MODE) { return vec3f(0.0); }
1173
- return abs(gv) * max(vec3f(1.0), abs(o)) * 1e-6;
1170
+ return abs(gx) * max(vec3f(1.0), abs(o)) * 1e-6;
1174
1171
  }
1175
1172
 
1176
1173
 
1177
1174
 
1178
- fn cM(o: vec3f, vw: vec3f, vu: vec3f, gv: vec3f, tMax: f32) -> f32 {
1179
- let uD = (vw - o) * gv;
1180
- let uE = (vu - o) * gv;
1181
- let bJ = eV(gv, o);
1182
- let my = min(uD, uE) - bJ;
1183
- let rH = max(uD, uE) + bJ;
1184
- let t0 = max(my.x, max(my.y, my.z));
1185
- let t1 = min(rH.x, min(rH.y, rH.z));
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));
1186
1183
  return select(select(t1, t0, t0 > 0.0), -1.0, (t0 > t1 || t0 > tMax));
1187
1184
  }
1188
1185
 
@@ -1190,7 +1187,7 @@ fn maxDimension(v: vec3f) -> i32 {
1190
1187
  return select(select(2, 1, v.y > v.z), select(2, 0, v.x > v.z), v.x > v.y);
1191
1188
  }
1192
1189
 
1193
- fn mg(d: vec3f, ey: i32) -> vec3f {
1190
+ fn mj(d: vec3f, ey: i32) -> vec3f {
1194
1191
 
1195
1192
 
1196
1193
  if (ey == 0) {
@@ -1202,9 +1199,9 @@ return vec3f(-d.x, -d.y, 1.0) / d.z;
1202
1199
  }
1203
1200
  }
1204
1201
 
1205
- fn lU(
1202
+ fn lX(
1206
1203
  si: ptr<function, ad>,
1207
- lm: fu,
1204
+ lp: fu,
1208
1205
  aB: vec3f,
1209
1206
  hs: vec3i,
1210
1207
  bU: bool,
@@ -1224,7 +1221,7 @@ bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)
1224
1221
 
1225
1222
  hp(
1226
1223
  si,
1227
- lm,
1224
+ lp,
1228
1225
  aB,
1229
1226
  hs,
1230
1227
  bU,
@@ -1272,7 +1269,7 @@ ${createIntersectionAlphaWgsl(hasAnisotropyDirections)}
1272
1269
 
1273
1270
 
1274
1271
 
1275
- fn cY(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, ln: bool) {
1272
+ fn cY(ray: Ray, si: ptr<function, ad>, bounces: i32, doubleSided: bool, lq: bool) {
1276
1273
 
1277
1274
  (*si).hit = false;
1278
1275
 
@@ -1282,24 +1279,24 @@ return;
1282
1279
 
1283
1280
  var tMax = RAY_MAX_DISTANCE;
1284
1281
  var ey: i32;
1285
- var gJ: vec3f;
1282
+ var gL: vec3f;
1286
1283
 
1287
1284
  var hs: vec3i;
1288
- var lm: fu;
1285
+ var lp: fu;
1289
1286
  var ao: i32;
1290
- var hL: i32 = (*si).triangleIndex;
1287
+ var hK: i32 = (*si).triangleIndex;
1291
1288
 
1292
1289
  ${getBVHTraverseCode(`
1293
1290
  (*si).triangleIndex = triangleIndex;
1294
- lm = tri;
1291
+ lp = tri;
1295
1292
  hs = index;
1296
1293
  ao = cf;
1297
1294
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections)}
1298
1295
 
1299
- if (qP) {
1300
- lU(
1296
+ if (qT) {
1297
+ lX(
1301
1298
  si,
1302
- lm,
1299
+ lp,
1303
1300
  aB,
1304
1301
  hs,
1305
1302
  bU,
@@ -1312,7 +1309,7 @@ eU,
1312
1309
  }
1313
1310
 
1314
1311
 
1315
- fn iG(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
1312
+ fn iH(ray: Ray, si: ptr<function, ad>, instanceIndex: i32, maxDistance: f32) {
1316
1313
  (*si).hit = false;
1317
1314
 
1318
1315
  if (rtUniform.isEmpty > 0) {
@@ -1321,18 +1318,18 @@ return;
1321
1318
 
1322
1319
  let bounces = 0;
1323
1320
  let doubleSided = true;
1324
- let ln = false;
1321
+ let lq = false;
1325
1322
  var tMax = maxDistance;
1326
1323
  var ey: i32;
1327
- var gJ: vec3f;
1324
+ var gL: vec3f;
1328
1325
  var hs: vec3i;
1329
- var lm: fu;
1326
+ var lp: fu;
1330
1327
  var ao: i32;
1331
- var hL: i32 = -1;
1328
+ var hK: i32 = -1;
1332
1329
 
1333
1330
  ${getBVHTraverseCode(`
1334
1331
  (*si).triangleIndex = triangleIndex;
1335
- lm = tri;
1332
+ lp = tri;
1336
1333
  hs = index;
1337
1334
  ao = cf;
1338
1335
  `, hasDisplacement, false, blasLayoutMask, hasAnisotropyDirections, `
@@ -1341,14 +1338,14 @@ continue;
1341
1338
  }
1342
1339
  `)}
1343
1340
 
1344
- if (qP) {
1341
+ if (qT) {
1345
1342
  (*si).instanceIndex = ao;
1346
1343
  (*si).normal = eC;
1347
1344
  (*si).position = eU;
1348
1345
  (*si).materialIndex = i32(ae(bitcast<i32>(instancesBuffer[ao * ${INSTANCE_VEC4_STRIDE}].z)).x);
1349
1346
  hp(
1350
1347
  si,
1351
- lm,
1348
+ lp,
1352
1349
  aB,
1353
1350
  hs,
1354
1351
  bU,
@@ -1390,32 +1387,32 @@ ${hasAnisotropyDirections ? /* wgsl */ `
1390
1387
  }
1391
1388
  }
1392
1389
 
1393
- fn ex(ray: Ray, lightDistance: f32, jE: i32) -> bool {
1390
+ fn ex(ray: Ray, lightDistance: f32, jG: i32) -> bool {
1394
1391
  if (rtUniform.isEmpty > 0) {
1395
1392
  return false;
1396
1393
  }
1397
1394
 
1398
1395
  let doubleSided = true;
1399
- let qc = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1400
- var tMax = qc;
1396
+ let qg = min(max(lightDistance, 0.0), RAY_MAX_DISTANCE);
1397
+ var tMax = qg;
1401
1398
  var ey: i32;
1402
- var gJ: vec3f;
1399
+ var gL: vec3f;
1403
1400
 
1404
1401
  let bounces = 1;
1405
- var ln = false;
1406
- var hL: i32 = jE;
1402
+ var lq = false;
1403
+ var hK: i32 = jG;
1407
1404
 
1408
1405
  ${getBVHTraverseCode(
1409
1406
  /*wgsl */ `
1410
1407
 
1411
1408
 
1412
1409
 
1413
- var jl = true;
1410
+ var jn = true;
1414
1411
 
1415
- if (jl) {
1412
+ if (jn) {
1416
1413
  if (HAS_ALPHA) {
1417
- let materialIndex = i32(ae(bitcast<i32>(od.z)).x);
1418
- if (!nl(
1414
+ let materialIndex = i32(ae(bitcast<i32>(oh.z)).x);
1415
+ if (!nr(
1419
1416
  materialIndex,
1420
1417
  index,
1421
1418
  aB,
@@ -1423,12 +1420,12 @@ eU,
1423
1420
  eC
1424
1421
  )) {
1425
1422
 
1426
- tMax = qc;
1427
- jl = false;
1423
+ tMax = qg;
1424
+ jn = false;
1428
1425
  }
1429
1426
  }
1430
1427
  }
1431
- if (jl) {
1428
+ if (jn) {
1432
1429
  return true;
1433
1430
  }
1434
1431
  `, hasDisplacement, true, blasLayoutMask, hasAnisotropyDirections)}