@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
@@ -43,50 +43,50 @@ ${createOpenPbrBsdfWgsl(hasAnisotropyDirections, hasCoatNormals)}
43
43
  ${sampleLightWgsl}
44
44
 
45
45
 
46
- var<private> tw: u32 = 0u;
46
+ var<private> tE: u32 = 0u;
47
47
 
48
48
 
49
49
 
50
- fn jO() -> u32 {
50
+ fn jQ() -> u32 {
51
51
  return u32(max(rtUniform.directLightCandidates, 1));
52
52
  }
53
53
 
54
54
 
55
55
 
56
56
 
57
- fn po(wy: u32) -> f32 {
57
+ fn ps(wI: u32) -> f32 {
58
58
 
59
59
 
60
60
 
61
61
 
62
62
  if (SAMPLING_PATTERN == 2) { _ = rand(); }
63
- let jU = bc.x + bc.y * u32(rtUniform.outputSize.x);
64
- let key = aq(aq(jU, bd), rtUniform.sequenceSeed);
65
- let dimension = aq(cE, wy) ^ 0xa511e9b3u;
63
+ let jW = bc.x + bc.y * u32(rtUniform.outputSize.x);
64
+ let key = aq(aq(jW, bd), rtUniform.sequenceSeed);
65
+ let dimension = aq(cF, wI) ^ 0xa511e9b3u;
66
66
  return f32(eg(key ^ dimension) >> 8u) * (1.0 / 16777216.0);
67
67
  }
68
68
 
69
69
 
70
70
 
71
- fn tk(fd: f32, scatteringPdf: f32) -> f32 {
72
- let aW = jO();
71
+ fn tq(fd: f32, scatteringPdf: f32) -> f32 {
72
+ let aW = jQ();
73
73
  if (aW <= 1u) {
74
- return aF(fd, scatteringPdf);
74
+ return aG(fd, scatteringPdf);
75
75
  }
76
- let iE = f32(aW) * fd;
77
- return iE /
78
- max(iE + scatteringPdf, 1e-20);
76
+ let iF = f32(aW) * fd;
77
+ return iF /
78
+ max(iF + scatteringPdf, 1e-20);
79
79
  }
80
80
 
81
81
 
82
82
  fn fS(scatteringPdf: f32, fd: f32) -> f32 {
83
- let aW = jO();
83
+ let aW = jQ();
84
84
  if (aW <= 1u) {
85
- return aF(scatteringPdf, fd);
85
+ return aG(scatteringPdf, fd);
86
86
  }
87
- let iE = f32(aW) * fd;
87
+ let iF = f32(aW) * fd;
88
88
  return scatteringPdf /
89
- max(scatteringPdf + iE, 1e-20);
89
+ max(scatteringPdf + iF, 1e-20);
90
90
  }
91
91
 
92
92
  ${createSampleMaterialWgsl(hasAnisotropyDirections, hasCoatNormals)}
@@ -101,24 +101,24 @@ ${shadowCatcherAccumulationWGSL}
101
101
  @group(3) @binding(3) var<storage, read_write> outShadowCatcher: array<ShadowCatcherAccumulation>;
102
102
 
103
103
 
104
- fn hH(
105
- gZ: u32,
106
- vh: vec3f,
104
+ fn hG(
105
+ ha: u32,
106
+ vp: vec3f,
107
107
  normal: vec3f
108
108
  ) {
109
109
  if (rtUniform.varianceMoments != 0) {
110
- let value = dot(vh, luminance);
111
- outNormal[gZ] += vec4f(value * value, 0.0, 0.0, 1.0);
110
+ let value = dot(vp, luminance);
111
+ outNormal[ha] += vec4f(value * value, 0.0, 0.0, 1.0);
112
112
  }
113
113
  else {
114
- outNormal[gZ] += vec4f(normal, 1.0);
114
+ outNormal[ha] += vec4f(normal, 1.0);
115
115
  }
116
116
  }
117
117
 
118
118
 
119
119
 
120
- fn iM(gZ: u32, value: f32) {
121
- outShadowCatcher[gZ].moments += vec4f(value, value * value, 0.0, 0.0);
120
+ fn iN(ha: u32, value: f32) {
121
+ outShadowCatcher[ha].moments += vec4f(value, value * value, 0.0, 0.0);
122
122
  }
123
123
 
124
124
 
@@ -130,24 +130,24 @@ normal: vec3f,
130
130
  isBlank: bool,
131
131
  }
132
132
 
133
- fn dq(sA: vec3f, height: f32, radius: f32) -> f32 {
134
- let fN = length(sA);
133
+ fn dq(sF: vec3f, height: f32, radius: f32) -> f32 {
134
+ let fN = length(sF);
135
135
  if (fN < 0.00001) {
136
136
  return -radius;
137
137
  }
138
138
 
139
- let iC = radius * sA.y / fN;
140
- let ik = -1.5 * height;
139
+ let iC = radius * sF.y / fN;
140
+ let ij = -1.5 * height;
141
141
  var ev: f32;
142
142
  if (iC >= 0.0) {
143
143
  ev = radius;
144
144
  }
145
- else if (iC < ik) {
146
- ev = -height * fN / sA.y;
145
+ else if (iC < ij) {
146
+ ev = -height * fN / sF.y;
147
147
  }
148
148
  else {
149
149
  let dW = 1.0
150
- - iC * iC / (3.0 * ik * ik);
150
+ - iC * iC / (3.0 * ij * ij);
151
151
  ev = radius * dW;
152
152
  }
153
153
  return fN - ev;
@@ -175,46 +175,46 @@ ej <= 0.0
175
175
  return direction;
176
176
  }
177
177
 
178
- var cB = -eI + sqrt(ej);
179
- if (cB <= 0.0) {
178
+ var cC = -eI + sqrt(ej);
179
+ if (cC <= 0.0) {
180
180
  return direction;
181
181
  }
182
182
 
183
- let nB = bB + bY * cB;
184
- if (nB.y >= 0.0) {
185
- return normalize(nB);
183
+ let nE = bB + bY * cC;
184
+ if (nE.y >= 0.0) {
185
+ return normalize(nE);
186
186
  }
187
187
 
188
188
  if (bY.y < -0.00001 && params.y > 1.5 * params.x) {
189
- let hQ = (-params.x - bB.y) / bY.y;
190
- let nk = bB + bY * hQ;
191
- let nZ = (2.0 / 3.0)
189
+ let hP = (-params.x - bB.y) / bY.y;
190
+ let nq = bB + bY * hP;
191
+ let oc = (2.0 / 3.0)
192
192
  * sqrt(params.y * params.y - 2.25 * params.x * params.x);
193
- if (hQ > 0.0 && length(nk.xz) <= nZ) {
194
- return normalize(nk);
193
+ if (hP > 0.0 && length(nq.xz) <= oc) {
194
+ return normalize(nq);
195
195
  }
196
196
  }
197
197
 
198
198
  var cN = 0.0;
199
199
  for (var i = 0; i < 14; i++) {
200
- let fe = (cN + cB) * 0.5;
201
- let pp = bB + bY * fe;
202
- if (dq(pp, params.x, params.y) > 0.0) {
203
- cB = fe;
200
+ let fe = (cN + cC) * 0.5;
201
+ let pt = bB + bY * fe;
202
+ if (dq(pt, params.x, params.y) > 0.0) {
203
+ cC = fe;
204
204
  }
205
205
  else {
206
206
  cN = fe;
207
207
  }
208
208
  }
209
- let hit = bB + bY * ((cN + cB) * 0.5);
209
+ let hit = bB + bY * ((cN + cC) * 0.5);
210
210
  return normalize(hit);
211
211
  }
212
212
 
213
- fn hE(ray: Ray) -> vec4f {
213
+ fn hD(ray: Ray) -> vec4f {
214
214
  var bg = vec4f(0.0);
215
215
  if (USE_BACKGROUND_MAP) {
216
- let pP = eQ(ray.o, ray.d);
217
- bg = textureLinear(backgroundMap, aS(pP));
216
+ let pT = eQ(ray.o, ray.d);
217
+ bg = textureLinear(backgroundMap, aS(pT));
218
218
  }
219
219
  else if (USE_BACKGROUND) {
220
220
  bg = rtUniform.backgroundColor;
@@ -226,7 +226,7 @@ return bg;
226
226
  }
227
227
 
228
228
  fn cW(ray: Ray, wavelength: f32) -> vec4f {
229
- let bg = hE(ray);
229
+ let bg = hD(ray);
230
230
  if (SPECTRAL) {
231
231
  return vec4f(ai(bg.rgb, wavelength), bg.a);
232
232
  }
@@ -234,7 +234,7 @@ return bg;
234
234
  }
235
235
 
236
236
  fn bounce(uv: vec2f, aa: ptr<function, Path>, depth: ptr<function, i32>, si: ptr<function, ad>, ma: ptr<function, J>, outAux: ptr<function, RayTraceAuxiliary>) {
237
- cE = u32(max(*depth, 0));
237
+ cF = u32(max(*depth, 0));
238
238
  let matType = (*ma).materialType;
239
239
  let isShadowCatcher = matType == SHADOW_CATCHER;
240
240
  if (isShadowCatcher) {
@@ -260,13 +260,13 @@ iv(aS((*aa).ray.d)) * rtUniform.envLightPmf),
260
260
  (*aa).alpha = max((*aa).alpha, bg.a);
261
261
  }
262
262
  else {
263
- let tE = aS((*aa).ray.d);
264
- var emission = textureLinear(envMap, tE).rgb;
263
+ let tJ = aS((*aa).ray.d);
264
+ var emission = textureLinear(envMap, tJ).rgb;
265
265
  if (SPECTRAL) {
266
266
  emission = ai(emission, (*si).wavelength);
267
267
  }
268
268
  (*aa).li += (*aa).beta * emission *
269
- fS((*aa).scatteringPdf, iv(tE));
269
+ fS((*aa).scatteringPdf, iv(tJ));
270
270
  }
271
271
  }
272
272
  else {
@@ -297,10 +297,10 @@ if ((*aa).fromEye) {
297
297
  (USE_BACKGROUND && !USE_BACKGROUND_MAP);
298
298
  }
299
299
  else {
300
- let cam = hz(uv);
301
- let mz = dot(cam.d, (*aa).ray.d) > 0.0;
300
+ let cam = hy(uv);
301
+ let mC = dot(cam.d, (*aa).ray.d) > 0.0;
302
302
  if (rtUniform.transmissiveOutputAlphaMin < 1.0) {
303
- if (mz) {
303
+ if (mC) {
304
304
  (*aa).alpha = max((*aa).alpha, bg.a);
305
305
  } else {
306
306
  (*aa).alpha = 1.0;
@@ -309,7 +309,7 @@ if (mz) {
309
309
  if (!USE_ENVMAP) {
310
310
 
311
311
 
312
- if (mz) {
312
+ if (mC) {
313
313
 
314
314
 
315
315
  (*aa).li += (*aa).beta *
@@ -321,7 +321,7 @@ fS((*aa).scatteringPdf, 1.0) * bg.rgb;
321
321
  return;
322
322
  }
323
323
 
324
- var cG = false;
324
+ var cH = false;
325
325
  if ((matType == STANDARD || matType == UNLIT)) {
326
326
  let alpha = clamp((*ma).alpha, 0.0, 1.0);
327
327
 
@@ -329,18 +329,18 @@ if (alpha < 1.0) {
329
329
 
330
330
 
331
331
  if (alpha <= 0.0 || eo(3u) > alpha) {
332
- cG = true;
332
+ cH = true;
333
333
  }
334
334
  }
335
- if (!cG && rtUniform.transmissiveOutputAlphaMin < 1.0) {
335
+ if (!cH && rtUniform.transmissiveOutputAlphaMin < 1.0) {
336
336
 
337
337
 
338
- let tK = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
339
- (*aa).alpha = max(tK, (*aa).alpha);
338
+ let tP = max(1.0 - (*ma).transmissionWeight, 1.0 - pow(1.0 - rtUniform.transmissiveOutputAlphaMin, f32(*depth)));
339
+ (*aa).alpha = max(tP, (*aa).alpha);
340
340
  }
341
- if (!cG) {
342
- tw = u32(max(*depth, 0));
343
- lO(si, ma, aa);
341
+ if (!cH) {
342
+ tE = u32(max(*depth, 0));
343
+ lR(si, ma, aa);
344
344
  }
345
345
  else {
346
346
 
@@ -349,7 +349,7 @@ else {
349
349
  }
350
350
  }
351
351
 
352
- if (!(*si).albedoSampled && !cG) {
352
+ if (!(*si).albedoSampled && !cH) {
353
353
 
354
354
  if ((matType == STANDARD || matType == UNLIT)) {
355
355
  if (!((*ma).transmissionWeight > 0.5 ||
@@ -374,12 +374,12 @@ if (*depth > 4) {
374
374
 
375
375
 
376
376
  if (USE_RR) {
377
- if (*depth >= RR_MAX && !cG) {
378
- let ow = (*aa).beta;
377
+ if (*depth >= RR_MAX && !cH) {
378
+ let oz = (*aa).beta;
379
379
 
380
- let oj = max(max(ow.x, ow.y), ow.z);
381
- let q: f32 = max(0.0, 1.0 - oj);
382
- if (dz(cv(RUSSIAN_ROULETTE)) < q) {
380
+ let oo = max(max(oz.x, oz.y), oz.z);
381
+ let q: f32 = max(0.0, 1.0 - oo);
382
+ if (dz(cw(RUSSIAN_ROULETTE)) < q) {
383
383
 
384
384
 
385
385
  (*aa).alpha = 1.0;
@@ -409,7 +409,7 @@ if ((*ma).transmissionWeight > 0.001) {
409
409
  }
410
410
  }
411
411
 
412
- if (cG) {
412
+ if (cH) {
413
413
  return;
414
414
  }
415
415
 
@@ -419,10 +419,10 @@ let hu = eo(3u) < (*ma).alpha;
419
419
  for (var i = 0; i < rtUniform.lightsCount; i++) {
420
420
 
421
421
  let light: Light = analyticLights[i];
422
- let d = mk((*aa).ray, light, &lightSample);
422
+ let d = mo((*aa).ray, light, &lightSample);
423
423
  lightSample.pdf *= light.selectionPmf;
424
- let mp = (*si).hit && d > distance((*si).position, (*aa).ray.o);
425
- if (d != INF && !(mp && hu)) {
424
+ let mt = (*si).hit && d > distance((*si).position, (*aa).ray.o);
425
+ if (d != INF && !(mt && hu)) {
426
426
  let eW = fS((*aa).scatteringPdf, lightSample.pdf);
427
427
  if (SPECTRAL) {
428
428
  lightSample.emission = ai(lightSample.emission, (*si).wavelength);
@@ -472,7 +472,7 @@ if (!USE_BACKGROUND) {
472
472
  *depth = *depth + 1;
473
473
  }
474
474
 
475
- fn hz(fD: vec2f) -> Ray {
475
+ fn hy(fD: vec2f) -> Ray {
476
476
  let origin = cameraUniform.viewProjectionInv * vec4f(fD * 2.0 - 1.0, -1.0, 1.0);
477
477
  let center = cameraUniform.viewProjectionInv * vec4f(fD * 2.0 - 1.0, 1.0, 1.0);
478
478
  var cam: Ray;
@@ -482,104 +482,104 @@ return cam;
482
482
  }
483
483
 
484
484
 
485
- fn kn(radius: f32, xi: f32) -> vec2f {
485
+ fn kp(radius: f32, xi: f32) -> vec2f {
486
486
  var x = 0.25;
487
- for (var np = 0; np < 10; np++) {
487
+ for (var ns = 0; ns < 10; ns++) {
488
488
  let x2 = x * x;
489
489
  let x3 = x2 * x;
490
- let kD = 1.0 - x;
490
+ let kG = 1.0 - x;
491
491
  let value = 10.0 * x2 - 20.0 * x3 + 15.0 * x2 * x2 -
492
492
  4.0 * x2 * x3 - xi;
493
- let lV = 20.0 * x * kD * kD * kD;
494
- if (abs(value) < 1e-6 || lV == 0.0) { break; }
495
- x = clamp(x - value / lV, 0.0, 1.0);
493
+ let lY = 20.0 * x * kG * kG * kG;
494
+ if (abs(value) < 1e-6 || lY == 0.0) { break; }
495
+ x = clamp(x - value / lY, 0.0, 1.0);
496
496
  }
497
- let jh = x * radius;
498
- return vec2f(jh, sqrt(max(radius * radius - jh * jh, 0.0)));
497
+ let jj = x * radius;
498
+ return vec2f(jj, sqrt(max(radius * radius - jj * jj, 0.0)));
499
499
  }
500
500
 
501
- fn iN(radius: f32, gr: f32) -> f32 {
502
- if (gr >= radius) { return 0.0; }
503
- let nS = radius - gr;
504
- return nS * nS * nS;
501
+ fn iO(radius: f32, gs: f32) -> f32 {
502
+ if (gs >= radius) { return 0.0; }
503
+ let nV = radius - gs;
504
+ return nV * nV * nV;
505
505
  }
506
506
 
507
507
 
508
- fn mf(source: ad, radius: f32) -> vec3f {
508
+ fn mi(source: ad, radius: f32) -> vec3f {
509
509
  var geometricNormal = source.faceNormal;
510
510
  if (dot(geometricNormal, source.vertexNormal) < 0.0) {
511
511
  geometricNormal = -geometricNormal;
512
512
  }
513
513
  var tangent: vec3f;
514
514
  var bitangent: vec3f;
515
- aK(geometricNormal, &tangent, &bitangent);
515
+ aL(geometricNormal, &tangent, &bitangent);
516
516
  var iB = vec3f(0.0);
517
517
 
518
- for (var ib = 0; ib < BEVEL_SAMPLES; ib++) {
519
- let oU = fk(CAMERA_BEVEL_BASE + u32(ib));
520
- var cz = oU.x;
521
- let ou = oU.y;
518
+ for (var ia = 0; ia < BEVEL_SAMPLES; ia++) {
519
+ let oY = fk(CAMERA_BEVEL_BASE + u32(ia));
520
+ var cA = oY.x;
521
+ let ox = oY.y;
522
522
  var di = geometricNormal;
523
523
  var fE = tangent;
524
524
  var ek = bitangent;
525
- var fZ = 0.5;
526
- var hV = 0.25;
527
- var gy = 0.25;
528
- if (cz < 0.5) {
529
- cz *= 2.0;
530
- }
531
- else if (cz < 0.75) {
532
- let mx = di;
525
+ var ga = 0.5;
526
+ var hU = 0.25;
527
+ var gA = 0.25;
528
+ if (cA < 0.5) {
529
+ cA *= 2.0;
530
+ }
531
+ else if (cA < 0.75) {
532
+ let mA = di;
533
533
  di = fE;
534
- fE = mx;
535
- fZ = 0.25;
536
- hV = 0.5;
537
- cz = (cz - 0.5) * 4.0;
534
+ fE = mA;
535
+ ga = 0.25;
536
+ hU = 0.5;
537
+ cA = (cA - 0.5) * 4.0;
538
538
  }
539
539
  else {
540
- let mx = di;
540
+ let mA = di;
541
541
  di = ek;
542
- ek = mx;
543
- fZ = 0.25;
544
- gy = 0.5;
545
- cz = (cz - 0.75) * 4.0;
542
+ ek = mA;
543
+ ga = 0.25;
544
+ gA = 0.5;
545
+ cA = (cA - 0.75) * 4.0;
546
546
  }
547
547
 
548
- let gO = kn(radius, ou);
549
- let phi = TWOPI * cz;
550
- let qj = gO.x *
548
+ let gQ = kp(radius, ox);
549
+ let phi = TWOPI * cA;
550
+ let qn = gQ.x *
551
551
  (cos(phi) * fE + sin(phi) * ek);
552
552
  var ray: Ray;
553
553
  iw(
554
554
  &ray,
555
- source.position + di * gO.y + qj,
555
+ source.position + di * gQ.y + qn,
556
556
  -di
557
557
  );
558
558
  var hit: ad;
559
- iG(
559
+ iH(
560
560
  ray,
561
561
  &hit,
562
562
  source.instanceIndex,
563
- max(2.0 * gO.y, EPS)
563
+ max(2.0 * gQ.y, EPS)
564
564
  );
565
565
  if (!hit.hit) { continue; }
566
566
 
567
- let kE = fZ * abs(dot(di, hit.faceNormal));
568
- let mt = hV * abs(dot(fE, hit.faceNormal));
569
- let jS = gy * abs(dot(ek, hit.faceNormal));
570
- var weight = kE / max(
571
- kE * kE + mt * mt +
572
- jS * jS,
567
+ let kH = ga * abs(dot(di, hit.faceNormal));
568
+ let mw = hU * abs(dot(fE, hit.faceNormal));
569
+ let jU = gA * abs(dot(ek, hit.faceNormal));
570
+ var weight = kH / max(
571
+ kH * kH + mw * mw +
572
+ jU * jU,
573
573
  1e-8
574
574
  );
575
- weight *= iN(radius, distance(hit.position, source.position)) /
576
- max(iN(radius, gO.x), 1e-8);
575
+ weight *= iO(radius, distance(hit.position, source.position)) /
576
+ max(iO(radius, gQ.x), 1e-8);
577
577
  iB += weight * hit.vertexNormal;
578
578
  }
579
579
 
580
580
  if (dot(iB, iB) <= 1e-12) { return source.normal; }
581
- let jA = normalize(iB);
582
- let result = source.normal + jA - source.vertexNormal;
581
+ let jC = normalize(iB);
582
+ let result = source.normal + jC - source.vertexNormal;
583
583
  if (dot(result, result) > 1e-12) { return normalize(result); }
584
584
  return source.normal;
585
585
  }
@@ -596,12 +596,12 @@ aa.scatteringIsDelta = false;
596
596
  aa.isNextRefraction = false;
597
597
  aa.abort = false;
598
598
 
599
- let rt = (*ma).transmissionWeight < 0.001 && (*ma).subsurfaceWeight < 0.001 && (*ma).alpha > 0.99;
599
+ let rB = (*ma).transmissionWeight < 0.001 && (*ma).subsurfaceWeight < 0.001 && (*ma).alpha > 0.99;
600
600
  let bounceLimit = max(rtUniform.bounces, 0);
601
601
  var depth = 0;
602
602
 
603
603
  for (var idx: i32 = 0; idx < min(bounceLimit * 3, ${MAX_PATH_EVENTS}); idx = idx + 1) {
604
- if (rt && idx > bounceLimit) {
604
+ if (rB && idx > bounceLimit) {
605
605
  aa.abort = true;
606
606
  }
607
607
  if (aa.abort) {
@@ -623,21 +623,21 @@ return bw(uv, si, ray, ma, outAux);
623
623
 
624
624
 
625
625
 
626
- var nK = ray;
627
- nK.o = (*si).position + ray.d * (EPS * 0.02);
626
+ var nN = ray;
627
+ nN.o = (*si).position + ray.d * (EPS * 0.02);
628
628
  var dU = *si;
629
629
  dU.albedoSampled = false;
630
- cY(nK, &dU, 0, false, false);
631
- var rd: J;
632
- eT(&rd, dU.materialIndex, dU.uv, dU.uv1, dU.instanceIndex);
633
- var gg = *outAux;
634
- if (dU.hit && rd.materialType == STANDARD) {
635
- gg.albedo = select(
636
- rd.baseColor,
630
+ cY(nN, &dU, 0, false, false);
631
+ var rj: J;
632
+ eT(&rj, dU.materialIndex, dU.uv, dU.uv1, dU.instanceIndex);
633
+ var gh = *outAux;
634
+ if (dU.hit && rj.materialType == STANDARD) {
635
+ gh.albedo = select(
636
+ rj.baseColor,
637
637
  vec3f(1.0),
638
- rd.transmissionWeight > 0.5
638
+ rj.transmissionWeight > 0.5
639
639
  );
640
- gg.normal = select(
640
+ gh.normal = select(
641
641
  dU.normal,
642
642
  -dU.normal,
643
643
  dot(
@@ -645,38 +645,38 @@ dU.normal,
645
645
  dU.position - cameraUniform.viewInv[3].xyz
646
646
  ) > 0.0
647
647
  );
648
- dU.albedoSampled = rd.transmissionWeight > 0.5;
648
+ dU.albedoSampled = rj.transmissionWeight > 0.5;
649
649
  }
650
650
  let back = bw(
651
- uv, &dU, nK, &rd, &gg
651
+ uv, &dU, nN, &rj, &gh
652
652
  );
653
653
  if (coverage <= 0.0) {
654
- *outAux = gg;
654
+ *outAux = gh;
655
655
  return back;
656
656
  }
657
657
 
658
- var te = *si;
659
- var ut = *ma;
660
- ut.alpha = 1.0;
661
- var iQ = *outAux;
662
- let qL = bw(
663
- uv, &te, ray, &ut, &iQ
658
+ var tk = *si;
659
+ var uB = *ma;
660
+ uB.alpha = 1.0;
661
+ var iR = *outAux;
662
+ let qQ = bw(
663
+ uv, &tk, ray, &uB, &iR
664
664
  );
665
- (*outAux).albedo = mix(gg.albedo, iQ.albedo, coverage);
666
- let fR = mix(gg.normal, iQ.normal, coverage);
665
+ (*outAux).albedo = mix(gh.albedo, iR.albedo, coverage);
666
+ let fR = mix(gh.normal, iR.normal, coverage);
667
667
  (*outAux).normal = select(
668
668
  vec3f(0.0),
669
669
  normalize(fR),
670
670
  dot(fR, fR) > 1e-12
671
671
  );
672
- (*outAux).isBlank = gg.isBlank && iQ.isBlank;
673
- (*outAux).isShadowCatcher = gg.isShadowCatcher && iQ.isShadowCatcher;
674
- return mix(back, qL, coverage);` : /* wgsl */ `return bw(uv, si, ray, ma, outAux);`}
672
+ (*outAux).isBlank = gh.isBlank && iR.isBlank;
673
+ (*outAux).isShadowCatcher = gh.isShadowCatcher && iR.isShadowCatcher;
674
+ return mix(back, qQ, coverage);` : /* wgsl */ `return bw(uv, si, ray, ma, outAux);`}
675
675
  }
676
676
 
677
677
 
678
678
 
679
- fn mj(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
679
+ fn mn(uv: vec2f, ray: Ray, outAux: ptr<function, RayTraceAuxiliary>) -> vec4f {
680
680
  var si: ad;
681
681
  var ma: J;
682
682
  si.albedoSampled = false;
@@ -690,7 +690,7 @@ si.barycentrics = vec2f(0.0);
690
690
  cY(ray, &si, 0, false, false);
691
691
  eT(&ma, si.materialIndex, si.uv, si.uv1, si.instanceIndex);
692
692
 
693
- if (ma.materialType == SHADOW_CATCHER) {
693
+ if (si.hit && ma.materialType == SHADOW_CATCHER) {
694
694
  (*outAux).isShadowCatcher = true;
695
695
 
696
696
 
@@ -708,7 +708,7 @@ return vec4f(vec3f(1.0), aa.alpha);
708
708
  else {
709
709
  if (HAS_BEVEL && rtUniform.bevel != 0) {
710
710
  if (ma.bevel > 0.0) {
711
- si.normal = mf(si, ma.bevel);
711
+ si.normal = mi(si, ma.bevel);
712
712
  }
713
713
  }
714
714
 
@@ -734,39 +734,39 @@ if (SPECTRAL) {
734
734
 
735
735
 
736
736
 
737
- let sD = array<f32, 3>(650.0, 510.0, 475.0);
738
- var tC = vec3f(0.0);
737
+ let sI = array<f32, 3>(650.0, 510.0, 475.0);
738
+ var tH = vec3f(0.0);
739
739
  var alpha = 0.0;
740
- var jw = vec3f(0.0);
741
- var jx = vec3f(0.0);
742
- var rS = true;
740
+ var jz = vec3f(0.0);
741
+ var jA = vec3f(0.0);
742
+ var rX = true;
743
743
  var si2 = si;
744
744
  var ma2 = ma;
745
- let qz = s0;
746
- let nG = em;
745
+ let qD = s0;
746
+ let nJ = em;
747
747
  let eh = rtUniform.dispersionWavelengths == 1;
748
- let jF = si.hit &&
748
+ let jH = si.hit &&
749
749
  ma.transmissionWeight > 0.001 &&
750
750
  ma.transmissionDispersionScale > 0.001;
751
- let rR = select(3, 1, eh);
752
- var lC = 0;
753
- if (eh && jF) {
751
+ let rW = select(3, 1, eh);
752
+ var lF = 0;
753
+ if (eh && jH) {
754
754
 
755
755
 
756
- lC = min(i32(floor(dz(CAMERA_WAVELENGTH) * 3.0)), 2);
756
+ lF = min(i32(floor(dz(CAMERA_WAVELENGTH) * 3.0)), 2);
757
757
  }
758
- for (var i = 0; i < rR; i++) {
758
+ for (var i = 0; i < rW; i++) {
759
759
 
760
760
 
761
761
 
762
762
  if (!eh) {
763
- s0 = qz;
764
- em = nG;
765
- cE = 0u;
763
+ s0 = qD;
764
+ em = nJ;
765
+ cF = 0u;
766
766
  }
767
767
  si.wavelength = 0.0;
768
- if (!eh || jF) {
769
- si.wavelength = sD[select(i, lC, eh)];
768
+ if (!eh || jH) {
769
+ si.wavelength = sI[select(i, lF, eh)];
770
770
  ma.specularIor = eK(
771
771
  si.wavelength,
772
772
  ma.specularIor,
@@ -786,21 +786,21 @@ dD.isShadowCatcher = false;
786
786
  let res = iz(uv, &si, ray, &ma, &dD);
787
787
  if (eh) {
788
788
  *outAux = dD;
789
- let scale = select(1.0, 3.0, jF);
789
+ let scale = select(1.0, 3.0, jH);
790
790
  return vec4f(res.rgb * scale, res.a);
791
791
  }
792
- tC += res.rgb;
792
+ tH += res.rgb;
793
793
  alpha = max(alpha, res.a);
794
- jw += dD.albedo;
795
- jx += dD.normal;
796
- rS = rS && dD.isBlank;
794
+ jz += dD.albedo;
795
+ jA += dD.normal;
796
+ rX = rX && dD.isBlank;
797
797
  si = si2;
798
798
  ma = ma2;
799
799
  }
800
- (*outAux).albedo = jw / 3.0;
801
- (*outAux).normal = jx / 3.0;
802
- (*outAux).isBlank = rS;
803
- return vec4f(tC, alpha);
800
+ (*outAux).albedo = jz / 3.0;
801
+ (*outAux).normal = jA / 3.0;
802
+ (*outAux).isBlank = rX;
803
+ return vec4f(tH, alpha);
804
804
  }
805
805
  else {
806
806
  return iz(uv, &si, ray, &ma, outAux);
@@ -808,7 +808,7 @@ return iz(uv, &si, ray, &ma, outAux);
808
808
  }
809
809
  }
810
810
 
811
- fn oz(ip: vec2f) -> vec2f {
811
+ fn oC(ip: vec2f) -> vec2f {
812
812
  let p = 2.0 * ip - 1.0;
813
813
  let greater = abs(p.x) > abs(p.y);
814
814
  let r = select(p.y, p.x, greater);
@@ -847,21 +847,21 @@ let uv = (vec2<f32>(f32(fD.x), f32(fD.y)) + vec2f(0.5)) / outputSize;
847
847
 
848
848
  bc = fD;
849
849
  bd = u32(outNormal[idx].a) + rtUniform.sampleSequenceOffset;
850
- cE = 0u; em = 0u;
850
+ cF = 0u; em = 0u;
851
851
  if (SAMPLING_PATTERN == 0 || SAMPLING_PATTERN == 1) {
852
852
  jitter = (fk(CAMERA_PIXEL) - 0.5) / outputSize;
853
853
  }
854
- jY(fD, i32(bd ^ eg(rtUniform.sequenceSeed)));
855
- var cam = hz(uv + jitter);
854
+ ka(fD, i32(bd ^ eg(rtUniform.sequenceSeed)));
855
+ var cam = hy(uv + jitter);
856
856
 
857
857
  if (cameraUniform.apertureRadius > 0.0) {
858
858
 
859
859
  let eye = cameraUniform.viewInv[3].xyz;
860
- let nV = -normalize(cameraUniform.viewInv[2].xyz);
861
- let qm = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, nV));
862
- let ru = cameraUniform.apertureRadius * oz(fk(CAMERA_LENS));
863
- let origin = (cameraUniform.viewInv * vec4f(ru, 0.0, 1.0)).xyz;
864
- let dir = normalize(qm - origin);
860
+ let nY = -normalize(cameraUniform.viewInv[2].xyz);
861
+ let qq = eye + cam.d * (cameraUniform.focusDistance / dot(cam.d, nY));
862
+ let rC = cameraUniform.apertureRadius * oC(fk(CAMERA_LENS));
863
+ let origin = (cameraUniform.viewInv * vec4f(rC, 0.0, 1.0)).xyz;
864
+ let dir = normalize(qq - origin);
865
865
  iw(&cam, origin, dir);
866
866
  }
867
867
 
@@ -870,43 +870,52 @@ outAux.albedo = vec3f(0.0);
870
870
  outAux.normal = vec3f(0.0);
871
871
  outAux.isBlank = false;
872
872
  outAux.isShadowCatcher = false;
873
- var aN = mj(uv + jitter, cam, &outAux);
873
+ var aF = mn(uv + jitter, cam, &outAux);
874
874
 
875
875
 
876
876
 
877
877
  if (rtUniform.clamping > 0.0) {
878
878
  let clamping = rtUniform.clamping;
879
- aN = vec4(clamp(aN.rgb, -vec3f(clamping), vec3f(clamping)), aN.a);
879
+ aF = vec4(clamp(aF.rgb, -vec3f(clamping), vec3f(clamping)), aF.a);
880
880
  }
881
- if (!(aN.x < INF && aN.x > -EPS)) {
882
- aN = vec4f(0.0, 0.0, 0.0, 1.0);
881
+ if (!(aF.x < INF && aF.x > -EPS)) {
882
+ aF = vec4f(0.0, 0.0, 0.0, 1.0);
883
883
  }
884
884
 
885
885
  if (outAux.isShadowCatcher) {
886
886
 
887
887
 
888
- let dn = hE(cam);
889
- let pU = select(0.0, 1.0, dn.a >= 0.01);
890
- let jo = vec4f(dn.rgb * dn.a, dn.a);
888
+ let dn = hD(cam);
889
+ let pY = select(0.0, 1.0, dn.a >= 0.01);
890
+ let jq = vec4f(dn.rgb * dn.a, dn.a);
891
891
 
892
892
 
893
- outShadowCatcher[idx].mask += vec4f(1.0, dn.a, pU, aN.a);
894
- outShadowCatcher[idx].background += jo;
895
- outColor[idx] += jo;
896
- outAlbedo[idx] += vec4f(outAux.albedo, pU);
897
- hH(idx, dn.rgb, outAux.normal);
893
+ outShadowCatcher[idx].mask += vec4f(1.0, dn.a, pY, aF.a);
894
+ outShadowCatcher[idx].background += jq;
895
+ outColor[idx] += jq;
896
+ outAlbedo[idx] += vec4f(outAux.albedo, pY);
897
+ hG(idx, dn.rgb, outAux.normal);
898
898
 
899
899
 
900
- let visibility = 1.0 - aN.a;
901
- iM(idx, visibility * select(
900
+ let visibility = 1.0 - aF.a;
901
+ iN(idx, visibility * select(
902
902
  1.0, dot(dn.rgb, luminance), dn.a >= 0.01
903
903
  ));
904
904
  }
905
905
  else {
906
- outColor[idx] += aN;
906
+ if (HAS_SHADOW_CATCHER && outAux.isBlank && USE_BACKGROUND && !USE_BACKGROUND_MAP && rtUniform.backgroundColor.a >= 0.99999) {
907
+
908
+
909
+
910
+
911
+
912
+ outShadowCatcher[idx].background += aF;
913
+ outShadowCatcher[idx].mask.g += aF.a;
914
+ }
915
+ outColor[idx] += aF;
907
916
  outAlbedo[idx] += vec4f(outAux.albedo, select(1.0, 0.0, outAux.isBlank));
908
- hH(idx, aN.rgb, outAux.normal);
909
- iM(idx, dot(aN.rgb, luminance));
917
+ hG(idx, aF.rgb, outAux.normal);
918
+ iN(idx, dot(aF.rgb, luminance));
910
919
  }
911
920
  }
912
921
  `;