@meimu/mutracer 0.1.4 → 0.1.5

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 (67) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +1425 -1421
  3. package/docs/api.md +2 -1
  4. package/docs/materials.md +17 -26
  5. package/docs/threejs.md +5 -5
  6. package/docs/viewer.md +36 -3
  7. package/lib/oidn.d.ts +1 -1
  8. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  9. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  10. package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
  11. package/lib/renderer/WGPURayTraceOutput.js +4 -4
  12. package/lib/renderer/WGPURayTracePass.js +5 -3
  13. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  14. package/lib/renderer/WGPURenderingPipeline.js +7 -7
  15. package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
  16. package/lib/renderer/WebGLRayTracePass.js +1 -0
  17. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  18. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
  19. package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
  20. package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
  21. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  22. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
  23. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  24. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
  25. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
  26. package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
  27. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
  28. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  29. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
  30. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
  31. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  32. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
  33. package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
  34. package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
  35. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
  36. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  37. package/lib/renderer/glsl/rayTrace.frag.js +67 -67
  38. package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
  39. package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
  40. package/lib/renderer/scratchSampling.js +16 -16
  41. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
  42. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
  43. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  44. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
  45. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
  46. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  47. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
  48. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
  49. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
  50. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
  51. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
  52. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
  53. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
  54. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
  55. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
  56. package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
  57. package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
  58. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  59. package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
  60. package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
  61. package/lib/scene/OpenPBRMaterial.d.ts +1 -1
  62. package/lib/scene/OpenPBRMaterial.js +1 -1
  63. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  64. package/lib/version.d.ts +1 -1
  65. package/lib/version.js +1 -1
  66. package/lib/version.js.map +1 -1
  67. package/package.json +1 -1
@@ -94,20 +94,20 @@ bS: ptr<function, f32>
94
94
  *bS = -INF;
95
95
 
96
96
  let wd = maxDimension(abs(iO));
97
- let gP = mv(iO, wd);
97
+ let gQ = mu(iO, wd);
98
98
  var tt: f32;
99
99
 
100
- tt = fL(
100
+ tt = fM(
101
101
  pP, iO,
102
- fA(pC, pB, pA), wd, gP, INF
102
+ fB(pC, pB, pA), wd, gQ, INF
103
103
  ).t;
104
104
  if (tt > 0.0) {
105
105
  *bT = min(*bT, tt);
106
106
  *bS = max(*bS, tt);
107
107
  }
108
- tt = fL(
108
+ tt = fM(
109
109
  pP, iO,
110
- fA(pD, pE, pF), wd, gP, INF
110
+ fB(pD, pE, pF), wd, gQ, INF
111
111
  ).t;
112
112
  if (tt > 0.0) {
113
113
  *bT = min(*bT, tt);
@@ -145,7 +145,7 @@ export default /* wgsl */ `
145
145
 
146
146
  ${displacementCommon}
147
147
 
148
- fn lQ(p: vec3f, p0: vec3f, p1: vec3f, p2: vec3f) -> vec3f {
148
+ fn lP(p: vec3f, p0: vec3f, p1: vec3f, p2: vec3f) -> vec3f {
149
149
  let v0 = p1 - p0;
150
150
  let v1 = p2 - p0;
151
151
  let v2 = p - p0;
@@ -265,7 +265,7 @@ var step = 0;
265
265
 
266
266
  while (true) {
267
267
 
268
- let b = lQ(s, c0, c1, c2);
268
+ let b = lP(s, c0, c1, c2);
269
269
 
270
270
  tF = _pA * b.x + _pB * b.y + _pC * b.z;
271
271
 
@@ -274,7 +274,7 @@ tS = distance(tF, s);
274
274
  var uv: vec2f;
275
275
  if (uvProjection > 0) {
276
276
  let n = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
277
- uv = gH(uvProjection, tF - (_nA * b.x + _nB * b.y + _nC * b.z) * uJ, n) * uvScale;
277
+ uv = gI(uvProjection, tF - (_nA * b.x + _nB * b.y + _nC * b.z) * uJ, n) * uvScale;
278
278
  }
279
279
  else {
280
280
  uv = vG * b.x + vH * b.y + vI * b.z;
@@ -309,7 +309,7 @@ let dtt = dt * (abs(qZ) / (abs(pY) + abs(qZ) + EPS));
309
309
  t = t - dtt;
310
310
 
311
311
  let wO = qr + qM * t;
312
- let b = lQ(wO, c0, c1, c2);
312
+ let b = lP(wO, c0, c1, c2);
313
313
 
314
314
  let N = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
315
315
 
@@ -325,9 +325,9 @@ if (uvProjection > 0) {
325
325
  let NA = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
326
326
  let NB = normalize(_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx));
327
327
  let NC = normalize(_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby));
328
- wg = gH(uvProjection, p_a - (_nA * b.x + _nB * b.y + _nC * b.z) * uJ, NA) * uvScale;
329
- wh = gH(uvProjection, p_b - (_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx)) * uJ, NB) * uvScale;
330
- wi = gH(uvProjection, p_c - (_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby)) * uJ, NC) * uvScale;
328
+ wg = gI(uvProjection, p_a - (_nA * b.x + _nB * b.y + _nC * b.z) * uJ, NA) * uvScale;
329
+ wh = gI(uvProjection, p_b - (_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx)) * uJ, NB) * uvScale;
330
+ wi = gI(uvProjection, p_c - (_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby)) * uJ, NC) * uvScale;
331
331
  }
332
332
  else {
333
333
  wg = vG * b.x + vH * b.y + vI * b.z;
@@ -282,11 +282,11 @@ return packed[ls % 4];
282
282
 
283
283
  fn kR(dV: i32, uv: vec2f) -> f32 {
284
284
  if (dV < 0) { return 1.0; }
285
- let fP = fract(uv) * 128.0 - vec2f(0.5);
286
- let x0 = i32(floor(fP.x));
287
- let y0 = i32(floor(fP.y));
288
- let fx = fract(fP.x);
289
- let fy = fract(fP.y);
285
+ let fQ = fract(uv) * 128.0 - vec2f(0.5);
286
+ let x0 = i32(floor(fQ.x));
287
+ let y0 = i32(floor(fQ.y));
288
+ let fx = fract(fQ.x);
289
+ let fy = fract(fQ.y);
290
290
  let xa = select(x0, 127, x0 < 0);
291
291
  let xb = select(x0 + 1, 0, x0 >= 127);
292
292
  let ya = select(y0, 127, y0 < 0);
@@ -1,7 +1,7 @@
1
1
  import { LIGHT_CHOICE_ANALYTIC, LIGHT_CHOICE_EMISSIVE_TRIANGLE, LIGHT_CHOICE_ENVIRONMENT } from '../../lightSampling.js';
2
2
  export default /*wgsl */ `
3
- fn eM(light: Light, fq: vec3f, iZ: vec2f, lightSample: ptr<function, LightSampleRec>) {
4
- let iw = light.position - fq;
3
+ fn eM(light: Light, ft: vec3f, iZ: vec2f, lightSample: ptr<function, LightSampleRec>) {
4
+ let iw = light.position - ft;
5
5
  let aj = length(iw);
6
6
  if (light.radiusOrSpread <= 0.0) {
7
7
 
@@ -27,13 +27,13 @@ return;
27
27
  }
28
28
  let radius = max(light.radiusOrSpread, 1e-6);
29
29
  (*lightSample).isDelta = false;
30
- var gJ: vec3f;
30
+ var gK: vec3f;
31
31
 
32
32
  if (aj <= radius) {
33
33
  let z = 1.0 - 2.0 * iZ.x;
34
34
  let fl = sqrt(max(0.0, 1.0 - z * z));
35
35
  let br = TWOPI * iZ.y;
36
- gJ = vec3f(
36
+ gK = vec3f(
37
37
  fl * cos(br),
38
38
  fl * sin(br),
39
39
  z
@@ -53,7 +53,7 @@ let br = TWOPI * iZ.y;
53
53
  var tangent: vec3f;
54
54
  var bitangent: vec3f;
55
55
  aL(sS, &tangent, &bitangent);
56
- gJ = sS * cc
56
+ gK = sS * cc
57
57
  + tangent * (sinTheta * cos(br))
58
58
  + bitangent * (sinTheta * sin(br));
59
59
  (*lightSample).pdf = 1.0 / max(
@@ -62,15 +62,15 @@ TWOPI * (1.0 - cosThetaMax),
62
62
  );
63
63
  }
64
64
 
65
- let iz = dot(gJ, iw);
65
+ let iz = dot(gK, iw);
66
66
  let qc = dot(iw, iw);
67
67
  let ej = iz * iz
68
68
  - qc + radius * radius;
69
69
  let cN = iz - sqrt(max(0.0, ej));
70
70
  let cC = iz + sqrt(max(0.0, ej));
71
71
  (*lightSample).dist = select(cC, cN, cN > 1e-6);
72
- (*lightSample).direction = gJ;
73
- let sd = fq + gJ * (*lightSample).dist;
72
+ (*lightSample).direction = gK;
73
+ let sd = ft + gK * (*lightSample).dist;
74
74
  (*lightSample).normal = normalize(sd - light.position);
75
75
  (*lightSample).emission = light.emission;
76
76
  }
@@ -105,8 +105,8 @@ let lowerLeft = light.position - 0.5 * (light.u + light.v);
105
105
  let spread = clamp(light.radiusOrSpread, 0.0, 1.0);
106
106
 
107
107
  if (spread <= 0.001) {
108
- let gf = dot(normal, shadingPoint - light.position);
109
- let surfacePoint = shadingPoint - normal * gf;
108
+ let gg = dot(normal, shadingPoint - light.position);
109
+ let surfacePoint = shadingPoint - normal * gg;
110
110
  let ib = surfacePoint - lowerLeft;
111
111
  let width = length(light.u);
112
112
  let height = length(light.v);
@@ -114,13 +114,13 @@ let uv = vec2f(
114
114
  dot(ib, light.u / width) / width,
115
115
  dot(ib, light.v / height) / height
116
116
  );
117
- if (gf <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
117
+ if (gg <= 0.0 || any(uv < vec2f(0.0)) || any(uv > vec2f(1.0))) {
118
118
  (*result).emission = vec3f(0.0);
119
119
  (*result).pdf = 0.0;
120
120
  return;
121
121
  }
122
122
  (*result).direction = -normal;
123
- (*result).dist = gf;
123
+ (*result).dist = gg;
124
124
  (*result).normal = normal;
125
125
  (*result).emission = light.emission;
126
126
  (*result).pdf = 1.0;
@@ -137,19 +137,19 @@ let hq = dot(offset, offset);
137
137
  (*result).dist = sqrt(hq);
138
138
  (*result).direction = offset / (*result).dist;
139
139
  (*result).normal = normal;
140
- let fZ = dot(-(*result).direction, normal);
141
- let oO = cos(0.5 * PI * spread);
142
- if (fZ <= 0.0 || fZ < oO) {
140
+ let ga = dot(-(*result).direction, normal);
141
+ let oN = cos(0.5 * PI * spread);
142
+ if (ga <= 0.0 || ga < oN) {
143
143
  (*result).emission = vec3f(0.0);
144
144
  (*result).pdf = 0.0;
145
145
  return;
146
146
  }
147
147
  (*result).emission = light.emission;
148
- (*result).pdf = hq / max(light.area * fZ, 1e-8);
148
+ (*result).pdf = hq / max(light.area * ga, 1e-8);
149
149
  da(light, surfacePoint, lowerLeft, result);
150
150
  }
151
151
 
152
- fn gc(
152
+ fn gd(
153
153
  light: Light,
154
154
  result: ptr<function, LightSampleRec>
155
155
  ) {
@@ -193,13 +193,13 @@ jT(light, shadingPoint, samplePoint, result);
193
193
  return;
194
194
  }
195
195
  if (dP == DIRECTIONAL_LIGHT) {
196
- gc(light, result);
196
+ gd(light, result);
197
197
  }
198
198
  }
199
199
 
200
- fn mH(iZ: vec2f, lightSample: ptr<function, LightSampleRec>) {
200
+ fn mG(iZ: vec2f, lightSample: ptr<function, LightSampleRec>) {
201
201
  var uv: vec2f;
202
- (*lightSample).direction = oM(iZ, &uv, &(*lightSample).pdf);
202
+ (*lightSample).direction = oL(iZ, &uv, &(*lightSample).pdf);
203
203
  (*lightSample).emission = textureLinear(envMap, uv).rgb;
204
204
  (*lightSample).dist = INF;
205
205
  }
@@ -240,11 +240,11 @@ bitcast<i32>(data.w)
240
240
  );
241
241
  }
242
242
 
243
- fn jB(ne: i32, index: i32) -> pe {
244
- return sp(ne + index);
243
+ fn jB(nd: i32, index: i32) -> pe {
244
+ return sp(nd + index);
245
245
  }
246
246
 
247
- fn mT(
247
+ fn mS(
248
248
  rnd: vec3f,
249
249
  ca: u32,
250
250
  aV: u32
@@ -256,9 +256,9 @@ f32(count);
256
256
  return sU;
257
257
  }
258
258
 
259
- fn lX(
259
+ fn lW(
260
260
  triangle: EmissiveTriangle,
261
- fq: vec3f,
261
+ ft: vec3f,
262
262
  iZ: vec2f,
263
263
  lightSample: ptr<function, LightSampleRec>
264
264
  ) {
@@ -281,7 +281,7 @@ barycentric.x * triangle.secondaryUv0 +
281
281
  barycentric.y * triangle.secondaryUv1 +
282
282
  barycentric.z * triangle.secondaryUv2;
283
283
  let normal = normalize(cross(triangle.p1 - triangle.p0, triangle.p2 - triangle.p0));
284
- (*lightSample).direction = sZ - fq;
284
+ (*lightSample).direction = sZ - ft;
285
285
  (*lightSample).dist = length((*lightSample).direction);
286
286
  if ((*lightSample).dist <= EPS) {
287
287
  (*lightSample).emission = vec3f(0.0);
@@ -296,7 +296,7 @@ if (pm <= 0.0) {
296
296
  (*lightSample).pdf = 0.0;
297
297
  return;
298
298
  }
299
- (*lightSample).emission = lO(
299
+ (*lightSample).emission = lN(
300
300
  i32(triangle.materialIndex), uv, cX
301
301
  );
302
302
  (*lightSample).selectionPmf = triangle.selectionPmf;
@@ -306,11 +306,11 @@ max(triangle.area * pm, 1e-8);
306
306
  }
307
307
 
308
308
  fn ki(
309
- fq: vec3f,
309
+ ft: vec3f,
310
310
  rnd: vec3f,
311
- ne: i32,
311
+ nd: i32,
312
312
  pl: i32,
313
- nd: f32,
313
+ mZ: f32,
314
314
  lightSample: ptr<function, LightSampleRec>
315
315
  ) {
316
316
  (*lightSample).emission = vec3f(0.0);
@@ -326,17 +326,17 @@ return;
326
326
 
327
327
  let rj = rnd.z * f32(pl);
328
328
  let column = min(i32(rj), pl - 1);
329
- let qS = jB(ne, column);
329
+ let qS = jB(nd, column);
330
330
  let lc = select(
331
331
  qS.aliasIndex,
332
332
  column,
333
333
  fract(rj) < qS.probability
334
334
  );
335
- let pk = jB(ne, lc);
335
+ let pk = jB(nd, lc);
336
336
  if (pk.sourceType == ${LIGHT_CHOICE_ENVIRONMENT}) {
337
337
  (*lightSample).sourceType = 0u;
338
338
  (*lightSample).sourceIndex = u32(pk.sourceIndex);
339
- mH(rnd.xy, lightSample);
339
+ mG(rnd.xy, lightSample);
340
340
  (*lightSample).selectionPmf = rtUniform.envLightPmf;
341
341
  (*lightSample).pdf *= rtUniform.envLightPmf;
342
342
  }
@@ -344,32 +344,32 @@ else if (pk.sourceType == ${LIGHT_CHOICE_ANALYTIC}) {
344
344
  (*lightSample).sourceType = 2u;
345
345
  (*lightSample).sourceIndex = u32(pk.sourceIndex);
346
346
  let light = analyticLights[pk.sourceIndex];
347
- iQ(light, fq, rnd.xy, lightSample);
347
+ iQ(light, ft, rnd.xy, lightSample);
348
348
  (*lightSample).selectionPmf = light.selectionPmf;
349
349
  (*lightSample).pdf *= light.selectionPmf;
350
350
  }
351
351
  else if (pk.sourceType == ${LIGHT_CHOICE_EMISSIVE_TRIANGLE}) {
352
352
  (*lightSample).sourceType = 1u;
353
353
  (*lightSample).sourceIndex = u32(pk.sourceIndex);
354
- lX(
354
+ lW(
355
355
  qd(pk.sourceIndex),
356
- fq,
356
+ ft,
357
357
  rnd.xy,
358
358
  lightSample
359
359
  );
360
360
  }
361
- (*lightSample).selectionPmf *= nd;
362
- (*lightSample).pdf *= nd;
361
+ (*lightSample).selectionPmf *= mZ;
362
+ (*lightSample).pdf *= mZ;
363
363
  }
364
364
 
365
365
  fn sampleLight(
366
- fq: vec3f,
366
+ ft: vec3f,
367
367
  rnd: vec3f,
368
368
  lightSample: ptr<function, LightSampleRec>,
369
369
  sc: bool
370
370
  ) {
371
371
  ki(
372
- fq,
372
+ ft,
373
373
  rnd,
374
374
  0,
375
375
  rtUniform.lightChoiceCount,
@@ -380,16 +380,16 @@ lightSample
380
380
 
381
381
 
382
382
 
383
- fn mI(
384
- fq: vec3f,
383
+ fn mH(
384
+ ft: vec3f,
385
385
  rnd: vec3f,
386
386
  ca: u32,
387
387
  aV: u32,
388
388
  lightSample: ptr<function, LightSampleRec>
389
389
  ) {
390
390
  ki(
391
- fq,
392
- mT(rnd, ca, aV),
391
+ ft,
392
+ mS(rnd, ca, aV),
393
393
  0,
394
394
  rtUniform.lightChoiceCount,
395
395
  1.0,
@@ -4,7 +4,7 @@
4
4
  export function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
5
5
  return /* wgsl */ `
6
6
 
7
- struct nf {
7
+ struct ne {
8
8
  ray: Ray,
9
9
  maxDistance: f32,
10
10
  triangleIndex: i32,
@@ -22,18 +22,18 @@ ma: J,
22
22
  prepared: ag,
23
23
  aa: ptr<function, Path>,
24
24
  ffnormal: vec3f,
25
- gE: bool,
25
+ gF: bool,
26
26
  ca: u32,
27
27
  aV: u32,
28
- gi: ptr<function, nf>
28
+ gj: ptr<function, ne>
29
29
  ) -> bool {
30
- (*gi).valid = false;
31
- (*gi).lightSelectionPmf = 0.0;
32
- (*gi).risTarget = 0.0;
33
- let ln = vec3f(fo(rd(ca, 1u)), dz(rd(ca, 0u)));
30
+ (*gj).valid = false;
31
+ (*gj).lightSelectionPmf = 0.0;
32
+ (*gj).risTarget = 0.0;
33
+ let ln = vec3f(fp(rd(ca, 1u)), dz(rd(ca, 0u)));
34
34
 
35
35
  var lightSample: LightSampleRec;
36
- mI(
36
+ mH(
37
37
  (*si).position,
38
38
  ln,
39
39
  ca,
@@ -43,13 +43,13 @@ aV,
43
43
  var Li = lightSample.emission;
44
44
 
45
45
  let lightDir = lightSample.direction;
46
- let oT = -(*aa).ray.d;
46
+ let oS = -(*aa).ray.d;
47
47
  let fg = lightSample.pdf;
48
48
  let lightSelectionPmf = lightSample.selectionPmf;
49
49
 
50
50
 
51
51
  ${hasCoatNormals ? /* wgsl */ `var cosThetaL = dot(ffnormal, lightDir);
52
- if (gE && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}
52
+ if (gF && ma.coatNormalEnabled) { cosThetaL = dot(ma.geometricNormal, lightDir); }` : 'let cosThetaL = dot(ffnormal, lightDir);'}
53
53
 
54
54
  if (fg <= 0.0 || lightSelectionPmf <= 0.0 ||
55
55
  max(max(Li.x, Li.y), Li.z) <= 0.0) {
@@ -58,7 +58,7 @@ return false;
58
58
 
59
59
  var scatteringPdf = 0.0;
60
60
  var f = vec3f(0.0);
61
- if (gE) {
61
+ if (gF) {
62
62
 
63
63
 
64
64
  if (cosThetaL <= 0.0 && ma.transmissionWeight <= 0.0 && ma.subsurfaceWeight <= 0.0) {
@@ -68,7 +68,7 @@ f = bI(prepared, lightDir, &scatteringPdf);
68
68
  }
69
69
  else {
70
70
  scatteringPdf = bD(
71
- dot(oT, lightDir),
71
+ dot(oS, lightDir),
72
72
  (*si).mediumAnisotropy
73
73
  );
74
74
  f = vec3f(scatteringPdf);
@@ -78,9 +78,9 @@ if (scatteringPdf <= 0.0 || max(max(f.x, f.y), f.z) <= 0.0) {
78
78
  return false;
79
79
  }
80
80
 
81
- var mA: Ray;
81
+ var mz: Ray;
82
82
  var hi = (*si).position + EPS * lightDir;
83
- if (gE) {
83
+ if (gF) {
84
84
  hi = rQ((*si).position, (*si).faceNormal, lightDir);
85
85
  let bZ = 0.1;
86
86
  var dr = dot((*si).normal, lightDir);
@@ -92,7 +92,7 @@ dr < 0.0
92
92
  );
93
93
  dr = abs(dr);
94
94
  let hS = dot(geometricNormal, lightDir);
95
- let oC = select(
95
+ let oB = select(
96
96
  clamp(1.0 - hS / bZ, 0.0, 1.0),
97
97
  clamp(
98
98
  2.0 - (hS + dr) / bZ,
@@ -101,29 +101,29 @@ clamp(
101
101
  ),
102
102
  dr < bZ
103
103
  );
104
- hi += (*si).shadowOffset * oC;
104
+ hi += (*si).shadowOffset * oB;
105
105
  }
106
106
 
107
107
 
108
108
 
109
109
 
110
- var lR = lightDir;
111
- var mP = lightSample.dist - EPS;
110
+ var lQ = lightDir;
111
+ var mO = lightSample.dist - EPS;
112
112
  if (lightSample.sourceType == 1u) {
113
113
  let sY =
114
114
  (*si).position + lightSample.direction * lightSample.dist;
115
115
  let qe = sY + EPS * lightSample.normal;
116
116
  let qp = qe - hi;
117
- mP = length(qp);
118
- lR = normalize(qp);
117
+ mO = length(qp);
118
+ lQ = normalize(qp);
119
119
  }
120
- iC(&mA, hi, lR);
120
+ iC(&mz, hi, lQ);
121
121
 
122
122
 
123
123
 
124
124
 
125
- if (gE && cosThetaL < 0.0 && lightSample.sourceType == 0u) {
126
- let background = hH(mA);
125
+ if (gF && cosThetaL < 0.0 && lightSample.sourceType == 0u) {
126
+ let background = hH(mz);
127
127
  Li = background.rgb * background.a;
128
128
  }
129
129
  if (SPECTRAL) {
@@ -139,40 +139,40 @@ lightSample.isDelta
139
139
  );
140
140
  if (fa > 0.0) {
141
141
  let kq = Li * f / fg * (*aa).beta;
142
- (*gi).risTarget = max(
142
+ (*gj).risTarget = max(
143
143
  dot(max(kq * lightSelectionPmf, vec3f(0.0)), luminance),
144
144
  0.0
145
145
  );
146
- (*gi).ray = mA;
147
- (*gi).maxDistance = mP;
148
- (*gi).triangleIndex = (*si).triangleIndex;
149
- (*gi).contribution = fa * kq;
150
- (*gi).lightSelectionPmf = lightSelectionPmf;
151
- (*gi).valid = true;
146
+ (*gj).ray = mz;
147
+ (*gj).maxDistance = mO;
148
+ (*gj).triangleIndex = (*si).triangleIndex;
149
+ (*gj).contribution = fa * kq;
150
+ (*gj).lightSelectionPmf = lightSelectionPmf;
151
+ (*gj).valid = true;
152
152
  return true;
153
153
  }
154
154
  return false;
155
155
  }
156
156
 
157
- fn mU(
157
+ fn mT(
158
158
  si: ptr<function, ad>,
159
159
  ma: J,
160
160
  prepared: ag,
161
161
  aa: ptr<function, Path>,
162
162
  ffnormal: vec3f,
163
- gE: bool
163
+ gF: bool
164
164
  ) {
165
165
  let aV = jX();
166
- var selected: nf;
166
+ var selected: ne;
167
167
  selected.valid = false;
168
- var mJ = 0.0;
169
- var lI = 0.0;
168
+ var mI = 0.0;
169
+ var lH = 0.0;
170
170
 
171
171
 
172
172
  for (var ca = 0u; ca < aV; ca++) {
173
- var candidate: nf;
173
+ var candidate: ne;
174
174
  let pj = qq(
175
- si, ma, prepared, aa, ffnormal, gE,
175
+ si, ma, prepared, aa, ffnormal, gF,
176
176
  ca, aV, &candidate);
177
177
  if (aV == 1u) {
178
178
  if (!pj) { return; }
@@ -182,20 +182,20 @@ break;
182
182
  if (!pj) { continue; }
183
183
  let kj = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
184
184
  if (!(kj > 0.0) || kj != kj) { continue; }
185
- lI += kj;
185
+ lH += kj;
186
186
  if (!selected.valid ||
187
- pK(ca) * lI <= kj) {
187
+ pK(ca) * lH <= kj) {
188
188
  selected = candidate;
189
- mJ = candidate.risTarget;
189
+ mI = candidate.risTarget;
190
190
  }
191
191
  }
192
192
  var qP = 1.0;
193
193
  if (aV > 1u) {
194
- if (!selected.valid || mJ <= 0.0) { return; }
194
+ if (!selected.valid || mI <= 0.0) { return; }
195
195
 
196
196
 
197
- qP = selected.lightSelectionPmf * lI /
198
- (f32(aV) * mJ);
197
+ qP = selected.lightSelectionPmf * lH /
198
+ (f32(aV) * mI);
199
199
  }
200
200
  if (selected.valid &&
201
201
  !ex(selected.ray, selected.maxDistance, selected.triangleIndex)) {
@@ -222,13 +222,13 @@ return 1.0;
222
222
  let rY = distance((*si).position, (*aa).ray.o);
223
223
  let fg = samplingLuminance / rtUniform.lightWeightTotal *
224
224
  rY * rY / max(pm, 1e-8);
225
- return fW((*aa).scatteringPdf, fg);
225
+ return fX((*aa).scatteringPdf, fg);
226
226
  }
227
227
 
228
228
  ${hasCoatNormals ? /* wgsl */ `
229
229
 
230
230
 
231
- fn fE(input: vec3f, tq: vec3f, view: vec3f) -> vec3f {
231
+ fn fF(input: vec3f, tq: vec3f, view: vec3f) -> vec3f {
232
232
  let qY = dot(tq, view) >= 0.0;
233
233
  let uo = select(-tq, tq, qY);
234
234
  let qX = select(-input, input, qY);
@@ -236,14 +236,14 @@ if (dot(input, tq) <= 0.0 || dot(qX, view) <= 1e-6) { return uo; }
236
236
  return qX;
237
237
  }
238
238
  ` : ''}
239
- fn mc(
239
+ fn mb(
240
240
  si: ptr<function, ad>,
241
241
  ma: ptr<function, J>,
242
242
  aa: ptr<function, Path>
243
243
  ) {
244
244
  ${hasCoatNormals ? /* wgsl */ `
245
245
  let bC = (*si).faceNormal;
246
- let mF = (*si).normal;
246
+ let mE = (*si).normal;
247
247
  ` : ''}
248
248
  var rN: f32 = -dot((*si).faceNormal, (*aa).ray.d);
249
249
  var sG: f32 = -dot((*si).normal, (*aa).ray.d);
@@ -271,12 +271,12 @@ var ffnormal = select(-N, N, ndv >= 0.0);
271
271
  ${hasCoatNormals ? /* wgsl */ `
272
272
  if ((*ma).coatNormalEnabled) {
273
273
  let view = -(*aa).ray.d;
274
- let ga = dot(bC, view);
275
- (*ma).geometricNormal = select(-bC, bC, ga >= 0.0);
276
- ffnormal = fE(mF, bC, view);
277
- (*ma).coatNormal = fE((*si).coatNormal, bC, view);
278
- (*ma).inside = ga <= 0.0 && !(*ma).thinWalled;
279
- (*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, ga > 0.0 || (*ma).thinWalled);
274
+ let gb = dot(bC, view);
275
+ (*ma).geometricNormal = select(-bC, bC, gb >= 0.0);
276
+ ffnormal = fF(mE, bC, view);
277
+ (*ma).coatNormal = fF((*si).coatNormal, bC, view);
278
+ (*ma).inside = gb <= 0.0 && !(*ma).thinWalled;
279
+ (*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, gb > 0.0 || (*ma).thinWalled);
280
280
  }
281
281
  ` : ''}
282
282
 
@@ -290,36 +290,36 @@ var cG: vec3f;
290
290
 
291
291
  if (HAS_MEDIUM) {
292
292
  let d = distance((*si).position, (*aa).ray.o);
293
- let nv = (*aa).ray.o;
293
+ let nu = (*aa).ray.o;
294
294
  let extinction = (*si).mediumExtinction;
295
295
  let scattering = min((*si).mediumScattering, extinction);
296
296
  let sC = max(max(extinction.x, extinction.y), extinction.z);
297
297
  if (mediumType > 0 && sC > 0.0) {
298
298
 
299
299
 
300
- let nk = min(i32(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
301
- let fD = extinction[nk];
300
+ let nj = min(i32(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
301
+ let fE = extinction[nj];
302
302
  let ih = select(
303
303
  d,
304
- min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fD, d),
305
- fD > 0.0
304
+ min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fE, d),
305
+ fE > 0.0
306
306
  );
307
307
  bl = ih < d;
308
308
  let ew = exp(-extinction * ih);
309
- let oa = select(
309
+ let nZ = select(
310
310
  ew,
311
311
  extinction * ew,
312
312
  bl
313
313
  );
314
- let nL = max((oa.x + oa.y + oa.z) / 3.0, 1e-8);
314
+ let nK = max((nZ.x + nZ.y + nZ.z) / 3.0, 1e-8);
315
315
  if (bl) {
316
- (*aa).beta *= ew * scattering / nL;
316
+ (*aa).beta *= ew * scattering / nK;
317
317
 
318
- (*aa).ray.o = nv + ih * (*aa).ray.d;
318
+ (*aa).ray.o = nu + ih * (*aa).ray.d;
319
319
  (*si).position = (*aa).ray.o;
320
320
  }
321
321
  else {
322
- (*aa).beta *= ew / nL;
322
+ (*aa).beta *= ew / nK;
323
323
  }
324
324
  }
325
325
  }
@@ -343,13 +343,13 @@ ${hasAnisotropyDirections ? /* wgsl */ `
343
343
  ` : /* wgsl */ ``}
344
344
  prepared = eH((*si).tangent, *ma, -(*aa).ray.d, ffnormal);
345
345
  }
346
- mU(si, *ma, prepared, aa, ffnormal, !bl);
346
+ mT(si, *ma, prepared, aa, ffnormal, !bl);
347
347
  if (bl) {
348
348
 
349
- cG = fp(
349
+ cG = fq(
350
350
  -(*aa).ray.d,
351
351
  (*si).mediumAnisotropy,
352
- fo(cw(PHASE_DIRECTION))
352
+ fp(cw(PHASE_DIRECTION))
353
353
  );
354
354
  scatteringPdf = bD(
355
355
  dot(cG, -(*aa).ray.d),
@@ -364,8 +364,8 @@ var aS = false;
364
364
  var bE = true;
365
365
  var aR = u32(OPENPBR_LOBE_DIFFUSE);
366
366
  var qI = 0.0;
367
- let ur = vec3f(fo(cw(BSDF_DIRECTION)), dz(cw(BSDF_LOBE)));
368
- var gX = vec3f(0.0);
367
+ let ur = vec3f(fp(cw(BSDF_DIRECTION)), dz(cw(BSDF_LOBE)));
368
+ var gY = vec3f(0.0);
369
369
  let f = dv(
370
370
  prepared,
371
371
  ur,
@@ -377,7 +377,7 @@ ur,
377
377
  &bE,
378
378
  &aR,
379
379
  &qI,
380
- &gX
380
+ &gY
381
381
  );
382
382
 
383
383