@meimu/mutracer 0.1.3 → 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 (125) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +4155 -4052
  3. package/docs/api.md +13 -10
  4. package/docs/materials.md +17 -26
  5. package/docs/threejs.md +35 -9
  6. package/docs/viewer.md +36 -3
  7. package/lib/Engine.js +18 -1
  8. package/lib/Engine.js.map +1 -1
  9. package/lib/main.d.ts +1 -1
  10. package/lib/main.js.map +1 -1
  11. package/lib/oidn.d.ts +1 -1
  12. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  13. package/lib/renderer/MaterialTable.d.ts +1 -0
  14. package/lib/renderer/MaterialTable.js +10 -4
  15. package/lib/renderer/MaterialTable.js.map +1 -1
  16. package/lib/renderer/WGPUBloomPass.js +18 -18
  17. package/lib/renderer/WGPUFullQuadPass.js +6 -6
  18. package/lib/renderer/WGPUJNLMDenoiser.js +69 -69
  19. package/lib/renderer/WGPURayTraceOutput.js +14 -14
  20. package/lib/renderer/WGPURayTracePass.d.ts +2 -0
  21. package/lib/renderer/WGPURayTracePass.js +17 -9
  22. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  23. package/lib/renderer/WGPURenderingPipeline.js +15 -15
  24. package/lib/renderer/WebGLJNLMDenoiser.js +69 -69
  25. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  26. package/lib/renderer/WebGLRayTracePass.d.ts +1 -0
  27. package/lib/renderer/WebGLRayTracePass.js +8 -1
  28. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  29. package/lib/renderer/envMapCreation.d.ts +5 -1
  30. package/lib/renderer/envMapCreation.js +42 -5
  31. package/lib/renderer/envMapCreation.js.map +1 -1
  32. package/lib/renderer/geometryUpdates.js +1 -1
  33. package/lib/renderer/geometryUpdates.js.map +1 -1
  34. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +12 -12
  35. package/lib/renderer/glsl/chunks/envMap.glsl.js +66 -54
  36. package/lib/renderer/glsl/chunks/envMap.glsl.js.map +1 -1
  37. package/lib/renderer/glsl/chunks/intersect.glsl.js +323 -315
  38. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  39. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +154 -121
  40. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  41. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +434 -434
  42. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
  43. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  44. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  45. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +42 -41
  46. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  47. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +69 -69
  48. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +84 -84
  49. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  50. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  51. package/lib/renderer/glsl/chunks/sampling.glsl.js +75 -75
  52. package/lib/renderer/glsl/chunks/sobol.glsl.js +61 -61
  53. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  54. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  55. package/lib/renderer/glsl/depthQuery.frag.js +5 -5
  56. package/lib/renderer/glsl/depthQuery.frag.js.map +1 -1
  57. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  58. package/lib/renderer/glsl/rayTrace.frag.js +133 -133
  59. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  60. package/lib/renderer/glsl/shadowCatcher.frag.js +9 -9
  61. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  62. package/lib/renderer/glsl/webglPipeline.frag.js +52 -52
  63. package/lib/renderer/lightsUtil.js +6 -4
  64. package/lib/renderer/lightsUtil.js.map +1 -1
  65. package/lib/renderer/materialChanges.js +1 -1
  66. package/lib/renderer/materialChanges.js.map +1 -1
  67. package/lib/renderer/materialComparison.generated.js +36 -18
  68. package/lib/renderer/materialComparison.generated.js.map +1 -1
  69. package/lib/renderer/prepareMeshBVH.js +2 -2
  70. package/lib/renderer/prepareMeshBVH.js.map +1 -1
  71. package/lib/renderer/sceneChangeDetector.js +4 -1
  72. package/lib/renderer/sceneChangeDetector.js.map +1 -1
  73. package/lib/renderer/sceneLightChanges.js +3 -2
  74. package/lib/renderer/sceneLightChanges.js.map +1 -1
  75. package/lib/renderer/scratchSampling.js +18 -18
  76. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  77. package/lib/renderer/wgsl/chunks/envMap.wgsl.d.ts +1 -1
  78. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +39 -31
  79. package/lib/renderer/wgsl/chunks/envMap.wgsl.js.map +1 -1
  80. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +476 -470
  81. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  82. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +8 -8
  83. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +95 -60
  84. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  85. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +469 -469
  86. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.d.ts +1 -1
  87. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +117 -120
  88. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js.map +1 -1
  89. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  90. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +25 -22
  91. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  92. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +127 -127
  93. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +136 -136
  94. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +6 -6
  95. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +73 -73
  96. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +62 -62
  97. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  98. package/lib/renderer/wgsl/compose.frag.wgsl.js +105 -105
  99. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  100. package/lib/renderer/wgsl/depthQuery.wgsl.d.ts +1 -1
  101. package/lib/renderer/wgsl/depthQuery.wgsl.js +5 -5
  102. package/lib/renderer/wgsl/depthQuery.wgsl.js.map +1 -1
  103. package/lib/renderer/wgsl/offlineAdaptive.compute.js +28 -28
  104. package/lib/renderer/wgsl/rayTrace.compute.js +251 -248
  105. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  106. package/lib/scene/EnvironmentLight.d.ts +9 -3
  107. package/lib/scene/EnvironmentLight.js +9 -2
  108. package/lib/scene/EnvironmentLight.js.map +1 -1
  109. package/lib/scene/OpenPBRMaterial.d.ts +1 -1
  110. package/lib/scene/OpenPBRMaterial.js +1 -1
  111. package/lib/scene/OpenPBRMaterial.js.map +1 -1
  112. package/lib/scene/Scene.d.ts +4 -0
  113. package/lib/scene/Scene.js.map +1 -1
  114. package/lib/scene/SpotLight.d.ts +2 -2
  115. package/lib/scene/SpotLight.js +1 -1
  116. package/lib/scene/SpotLight.js.map +1 -1
  117. package/lib/scene/Texture.d.ts +17 -6
  118. package/lib/scene/Texture.js +13 -4
  119. package/lib/scene/Texture.js.map +1 -1
  120. package/lib/util/fromTHREE.js +151 -29
  121. package/lib/util/fromTHREE.js.map +1 -1
  122. package/lib/version.d.ts +1 -1
  123. package/lib/version.js +1 -1
  124. package/lib/version.js.map +1 -1
  125. package/package.json +1 -1
@@ -4,7 +4,7 @@
4
4
  export function createSampleMaterialWgsl(hasAnisotropyDirections = true, hasCoatNormals = false) {
5
5
  return /* wgsl */ `
6
6
 
7
- struct mR {
7
+ struct ne {
8
8
  ray: Ray,
9
9
  maxDistance: f32,
10
10
  triangleIndex: i32,
@@ -16,49 +16,49 @@ lightSelectionPmf: f32,
16
16
  valid: bool,
17
17
  }
18
18
 
19
- fn qi(
19
+ fn qq(
20
20
  si: ptr<function, ad>,
21
21
  ma: J,
22
22
  prepared: ag,
23
23
  aa: ptr<function, Path>,
24
24
  ffnormal: vec3f,
25
- gy: bool,
25
+ gF: bool,
26
26
  ca: u32,
27
- aW: u32,
28
- ge: ptr<function, mR>
27
+ aV: u32,
28
+ gj: ptr<function, ne>
29
29
  ) -> bool {
30
- (*ge).valid = false;
31
- (*ge).lightSelectionPmf = 0.0;
32
- (*ge).risTarget = 0.0;
33
- let lc = vec3f(fk(qV(ca, 1u)), dz(qV(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
- my(
36
+ mH(
37
37
  (*si).position,
38
- lc,
38
+ ln,
39
39
  ca,
40
- aW,
40
+ aV,
41
41
  &lightSample
42
42
  );
43
43
  var Li = lightSample.emission;
44
44
 
45
45
  let lightDir = lightSample.direction;
46
- let oK = -(*aa).ray.d;
47
- let fd = lightSample.pdf;
46
+ let oS = -(*aa).ray.d;
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 (gy && 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
- if (fd <= 0.0 || lightSelectionPmf <= 0.0 ||
54
+ if (fg <= 0.0 || lightSelectionPmf <= 0.0 ||
55
55
  max(max(Li.x, Li.y), Li.z) <= 0.0) {
56
56
  return false;
57
57
  }
58
58
 
59
59
  var scatteringPdf = 0.0;
60
60
  var f = vec3f(0.0);
61
- if (gy) {
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(oK, lightDir),
71
+ dot(oS, lightDir),
72
72
  (*si).mediumAnisotropy
73
73
  );
74
74
  f = vec3f(scatteringPdf);
@@ -78,10 +78,10 @@ if (scatteringPdf <= 0.0 || max(max(f.x, f.y), f.z) <= 0.0) {
78
78
  return false;
79
79
  }
80
80
 
81
- var mp: Ray;
82
- var hd = (*si).position + EPS * lightDir;
83
- if (gy) {
84
- hd = rI((*si).position, (*si).faceNormal, lightDir);
81
+ var mz: Ray;
82
+ var hi = (*si).position + EPS * lightDir;
83
+ if (gF) {
84
+ hi = rQ((*si).position, (*si).faceNormal, lightDir);
85
85
  let bZ = 0.1;
86
86
  var dr = dot((*si).normal, lightDir);
87
87
  ${hasCoatNormals ? /* wgsl */ ` if (ma.coatNormalEnabled) { dr = dot((*si).faceNormal, lightDir); }` : ''}
@@ -91,39 +91,39 @@ let geometricNormal = select(
91
91
  dr < 0.0
92
92
  );
93
93
  dr = abs(dr);
94
- let hO = dot(geometricNormal, lightDir);
95
- let ot = select(
96
- clamp(1.0 - hO / bZ, 0.0, 1.0),
94
+ let hS = dot(geometricNormal, lightDir);
95
+ let oB = select(
96
+ clamp(1.0 - hS / bZ, 0.0, 1.0),
97
97
  clamp(
98
- 2.0 - (hO + dr) / bZ,
98
+ 2.0 - (hS + dr) / bZ,
99
99
  0.0,
100
100
  1.0
101
101
  ),
102
102
  dr < bZ
103
103
  );
104
- hd += (*si).shadowOffset * ot;
104
+ hi += (*si).shadowOffset * oB;
105
105
  }
106
106
 
107
107
 
108
108
 
109
109
 
110
- var lH = lightDir;
111
- var mF = lightSample.dist - EPS;
110
+ var lQ = lightDir;
111
+ var mO = lightSample.dist - EPS;
112
112
  if (lightSample.sourceType == 1u) {
113
- let sR =
113
+ let sY =
114
114
  (*si).position + lightSample.direction * lightSample.dist;
115
- let pW = sR + EPS * lightSample.normal;
116
- let qh = pW - hd;
117
- mF = length(qh);
118
- lH = normalize(qh);
115
+ let qe = sY + EPS * lightSample.normal;
116
+ let qp = qe - hi;
117
+ mO = length(qp);
118
+ lQ = normalize(qp);
119
119
  }
120
- iw(&mp, hd, lH);
120
+ iC(&mz, hi, lQ);
121
121
 
122
122
 
123
123
 
124
124
 
125
- if (gy && cosThetaL < 0.0 && lightSample.sourceType == 0u) {
126
- let background = hD(mp);
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) {
@@ -132,78 +132,78 @@ Li = ai(Li, (*si).wavelength);
132
132
 
133
133
 
134
134
 
135
- let eW = select(
136
- tq(fd, scatteringPdf),
135
+ let fa = select(
136
+ tC(fg, scatteringPdf),
137
137
  1.0,
138
138
  lightSample.isDelta
139
139
  );
140
- if (eW > 0.0) {
141
- let kj = Li * f / fd * (*aa).beta;
142
- (*ge).risTarget = max(
143
- dot(max(kj * lightSelectionPmf, vec3f(0.0)), luminance),
140
+ if (fa > 0.0) {
141
+ let kq = Li * f / fg * (*aa).beta;
142
+ (*gj).risTarget = max(
143
+ dot(max(kq * lightSelectionPmf, vec3f(0.0)), luminance),
144
144
  0.0
145
145
  );
146
- (*ge).ray = mp;
147
- (*ge).maxDistance = mF;
148
- (*ge).triangleIndex = (*si).triangleIndex;
149
- (*ge).contribution = eW * kj;
150
- (*ge).lightSelectionPmf = lightSelectionPmf;
151
- (*ge).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 mJ(
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
- gy: bool
163
+ gF: bool
164
164
  ) {
165
- let aW = jQ();
166
- var selected: mR;
165
+ let aV = jX();
166
+ var selected: ne;
167
167
  selected.valid = false;
168
- var mz = 0.0;
169
- var lv = 0.0;
168
+ var mI = 0.0;
169
+ var lH = 0.0;
170
170
 
171
171
 
172
- for (var ca = 0u; ca < aW; ca++) {
173
- var candidate: mR;
174
- let pa = qi(
175
- si, ma, prepared, aa, ffnormal, gy,
176
- ca, aW, &candidate);
177
- if (aW == 1u) {
178
- if (!pa) { return; }
172
+ for (var ca = 0u; ca < aV; ca++) {
173
+ var candidate: ne;
174
+ let pj = qq(
175
+ si, ma, prepared, aa, ffnormal, gF,
176
+ ca, aV, &candidate);
177
+ if (aV == 1u) {
178
+ if (!pj) { return; }
179
179
  selected = candidate;
180
180
  break;
181
181
  }
182
- if (!pa) { continue; }
183
- let kc = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
184
- if (!(kc > 0.0) || kc != kc) { continue; }
185
- lv += kc;
182
+ if (!pj) { continue; }
183
+ let kj = candidate.risTarget / max(candidate.lightSelectionPmf, 1e-20);
184
+ if (!(kj > 0.0) || kj != kj) { continue; }
185
+ lH += kj;
186
186
  if (!selected.valid ||
187
- ps(ca) * lv <= kc) {
187
+ pK(ca) * lH <= kj) {
188
188
  selected = candidate;
189
- mz = candidate.risTarget;
189
+ mI = candidate.risTarget;
190
190
  }
191
191
  }
192
- var qG = 1.0;
193
- if (aW > 1u) {
194
- if (!selected.valid || mz <= 0.0) { return; }
192
+ var qP = 1.0;
193
+ if (aV > 1u) {
194
+ if (!selected.valid || mI <= 0.0) { return; }
195
195
 
196
196
 
197
- qG = selected.lightSelectionPmf * lv /
198
- (f32(aW) * mz);
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)) {
202
- (*aa).li += selected.contribution * qG;
202
+ (*aa).li += selected.contribution * qP;
203
203
  }
204
204
  }
205
205
 
206
- fn pg(
206
+ fn pp(
207
207
  si: ptr<function, ad>,
208
208
  aa: ptr<function, Path>
209
209
  ) -> f32 {
@@ -215,54 +215,54 @@ let samplingLuminance = dot(
215
215
  materialsBuffer[(*si).materialIndex].emission,
216
216
  luminance
217
217
  );
218
- let pd = dot((*si).faceNormal, -(*aa).ray.d);
219
- if (samplingLuminance <= 0.0 || pd <= 0.0) {
218
+ let pm = dot((*si).faceNormal, -(*aa).ray.d);
219
+ if (samplingLuminance <= 0.0 || pm <= 0.0) {
220
220
  return 1.0;
221
221
  }
222
- let rQ = distance((*si).position, (*aa).ray.o);
223
- let fd = samplingLuminance / rtUniform.lightWeightTotal *
224
- rQ * rQ / max(pd, 1e-8);
225
- return fS((*aa).scatteringPdf, fd);
222
+ let rY = distance((*si).position, (*aa).ray.o);
223
+ let fg = samplingLuminance / rtUniform.lightWeightTotal *
224
+ rY * rY / max(pm, 1e-8);
225
+ return fX((*aa).scatteringPdf, fg);
226
226
  }
227
227
 
228
228
  ${hasCoatNormals ? /* wgsl */ `
229
229
 
230
230
 
231
- fn fB(input: vec3f, th: vec3f, view: vec3f) -> vec3f {
232
- let qQ = dot(th, view) >= 0.0;
233
- let uh = select(-th, th, qQ);
234
- let qP = select(-input, input, qQ);
235
- if (dot(input, th) <= 0.0 || dot(qP, view) <= 1e-6) { return uh; }
236
- return qP;
231
+ fn fF(input: vec3f, tq: vec3f, view: vec3f) -> vec3f {
232
+ let qY = dot(tq, view) >= 0.0;
233
+ let uo = select(-tq, tq, qY);
234
+ let qX = select(-input, input, qY);
235
+ if (dot(input, tq) <= 0.0 || dot(qX, view) <= 1e-6) { return uo; }
236
+ return qX;
237
237
  }
238
238
  ` : ''}
239
- fn lR(
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 mv = (*si).normal;
246
+ let mE = (*si).normal;
247
247
  ` : ''}
248
- var rF: f32 = -dot((*si).faceNormal, (*aa).ray.d);
249
- var sw: f32 = -dot((*si).normal, (*aa).ray.d);
248
+ var rN: f32 = -dot((*si).faceNormal, (*aa).ray.d);
249
+ var sG: f32 = -dot((*si).normal, (*aa).ray.d);
250
250
  if (((*ma).transmissionWeight > 0.0 || (*ma).subsurfaceWeight > 0.0) && (*ma).thinWalled) {
251
251
 
252
- if (rF < 0.0) {
252
+ if (rN < 0.0) {
253
253
  (*si).faceNormal = -(*si).faceNormal;
254
- rF = -rF;
254
+ rN = -rN;
255
255
  }
256
- if (sw < 0.0) {
256
+ if (sG < 0.0) {
257
257
  (*si).normal = -(*si).normal;
258
- sw = -sw;
258
+ sG = -sG;
259
259
  }
260
260
  }
261
261
 
262
262
 
263
- var pM: bool = rF >= 0.0 && sw < 0.0;
264
- var ndv: f32 = select(sw, rF, pM);
265
- var N: vec3f = select((*si).normal, (*si).faceNormal, pM);
263
+ var pU: bool = rN >= 0.0 && sG < 0.0;
264
+ var ndv: f32 = select(sG, rN, pU);
265
+ var N: vec3f = select((*si).normal, (*si).faceNormal, pU);
266
266
 
267
267
  (*ma).inside = ndv <= 0.0 && !(*ma).thinWalled;
268
268
 
@@ -271,18 +271,18 @@ 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 fW = dot(bC, view);
275
- (*ma).geometricNormal = select(-bC, bC, fW >= 0.0);
276
- ffnormal = fB(mv, bC, view);
277
- (*ma).coatNormal = fB((*si).coatNormal, bC, view);
278
- (*ma).inside = fW <= 0.0 && !(*ma).thinWalled;
279
- (*ma).relativeIor = select((*ma).specularIor, 1.0 / (*ma).specularIor, fW > 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
 
283
283
  (*aa).scatteringIsDelta = false;
284
284
  var bl = false;
285
- var hj = false;
285
+ var hn = false;
286
286
  let mediumType = (*si).mediumType;
287
287
 
288
288
  var scatteringPdf: f32;
@@ -290,42 +290,42 @@ var cG: vec3f;
290
290
 
291
291
  if (HAS_MEDIUM) {
292
292
  let d = distance((*si).position, (*aa).ray.o);
293
- let nh = (*aa).ray.o;
293
+ let nu = (*aa).ray.o;
294
294
  let extinction = (*si).mediumExtinction;
295
295
  let scattering = min((*si).mediumScattering, extinction);
296
- let sr = max(max(extinction.x, extinction.y), extinction.z);
297
- if (mediumType > 0 && sr > 0.0) {
296
+ let sC = max(max(extinction.x, extinction.y), extinction.z);
297
+ if (mediumType > 0 && sC > 0.0) {
298
298
 
299
299
 
300
- let mW = min(i32(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
301
- let fA = extinction[mW];
302
- let ib = select(
300
+ let nj = min(i32(dz(cw(MEDIUM_CHANNEL)) * 3.0), 2);
301
+ let fE = extinction[nj];
302
+ let ih = select(
303
303
  d,
304
- min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fA, d),
305
- fA > 0.0
304
+ min(-log(max(dz(cw(MEDIUM_DISTANCE)), 1e-7)) / fE, d),
305
+ fE > 0.0
306
306
  );
307
- bl = ib < d;
308
- let ew = exp(-extinction * ib);
309
- let nP = select(
307
+ bl = ih < d;
308
+ let ew = exp(-extinction * ih);
309
+ let nZ = select(
310
310
  ew,
311
311
  extinction * ew,
312
312
  bl
313
313
  );
314
- let nA = max((nP.x + nP.y + nP.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 / nA;
316
+ (*aa).beta *= ew * scattering / nK;
317
317
 
318
- (*aa).ray.o = nh + ib * (*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 / nA;
322
+ (*aa).beta *= ew / nK;
323
323
  }
324
324
  }
325
325
  }
326
326
 
327
327
  if (!bl) {
328
- (*aa).li += pg(si, aa) * (*ma).emission * (*aa).beta;
328
+ (*aa).li += pp(si, aa) * (*ma).emission * (*aa).beta;
329
329
  }
330
330
  if ((*ma).materialType == UNLIT) {
331
331
  (*aa).abort = true;
@@ -341,15 +341,15 @@ ${hasAnisotropyDirections ? /* wgsl */ `
341
341
  (*ma).geometryTangent = (*si).geometryTangent;
342
342
  (*ma).geometryBitangent = (*si).geometryBitangent;
343
343
  ` : /* wgsl */ ``}
344
- prepared = eG((*si).tangent, *ma, -(*aa).ray.d, ffnormal);
344
+ prepared = eH((*si).tangent, *ma, -(*aa).ray.d, ffnormal);
345
345
  }
346
- mJ(si, *ma, prepared, aa, ffnormal, !bl);
346
+ mT(si, *ma, prepared, aa, ffnormal, !bl);
347
347
  if (bl) {
348
348
 
349
- cG = fl(
349
+ cG = fq(
350
350
  -(*aa).ray.d,
351
351
  (*si).mediumAnisotropy,
352
- fk(cw(PHASE_DIRECTION))
352
+ fp(cw(PHASE_DIRECTION))
353
353
  );
354
354
  scatteringPdf = bD(
355
355
  dot(cG, -(*aa).ray.d),
@@ -360,24 +360,24 @@ else {
360
360
 
361
361
  var isNextRefraction: bool;
362
362
  var aA = 1.0;
363
- var aT = false;
363
+ var aS = false;
364
364
  var bE = true;
365
365
  var aR = u32(OPENPBR_LOBE_DIFFUSE);
366
- var qA = 0.0;
367
- let uj = vec3f(fk(cw(BSDF_DIRECTION)), dz(cw(BSDF_LOBE)));
368
- var gT = vec3f(0.0);
366
+ var qI = 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
- uj,
371
+ ur,
372
372
  &cG,
373
373
  &scatteringPdf,
374
374
  &isNextRefraction,
375
375
  &aA,
376
- &aT,
376
+ &aS,
377
377
  &bE,
378
378
  &aR,
379
- &qA,
380
- &gT
379
+ &qI,
380
+ &gY
381
381
  );
382
382
 
383
383
 
@@ -397,7 +397,7 @@ abs(prepared.material.relativeIor - 1.0) <= 1e-6 &&
397
397
  prepared.probabilities[OPENPBR_LOBE_TRANSMISSION] >= 1.0 - 1e-6;
398
398
  (*aa).beta *= f / scatteringPdf;
399
399
 
400
- hj = isNextRefraction && !(*ma).thinWalled;
400
+ hn = isNextRefraction && !(*ma).thinWalled;
401
401
  (*aa).isNextRefraction = isNextRefraction;
402
402
 
403
403
 
@@ -417,8 +417,8 @@ if (bl) {
417
417
  if (HAS_MEDIUM) {
418
418
 
419
419
 
420
- if (!bl && hj && (*ma).mediumType > 0) {
421
- if (rF >= 0.0) {
420
+ if (!bl && hn && (*ma).mediumType > 0) {
421
+ if (rN >= 0.0) {
422
422
  (*si).mediumType = (*ma).mediumType;
423
423
  (*si).mediumExtinction = (*ma).mediumExtinction;
424
424
  (*si).mediumScattering = (*ma).mediumScattering;
@@ -11,21 +11,21 @@ export default /*wgsl*/ `
11
11
  const SHADOW_CATCHER_LIGHT_SAMPLES = 4u;
12
12
 
13
13
  fn sampleShadowCatcher(si: ad, bounce: i32, aa: ptr<function, Path>) {
14
- let oK = -(*aa).ray.d;
14
+ let oS = -(*aa).ray.d;
15
15
 
16
16
 
17
17
  if (rtUniform.lightChoiceCount > 0) {
18
18
  var shadow = 0.0;
19
19
  for (var candidate = 0u; candidate < SHADOW_CATCHER_LIGHT_SAMPLES; candidate++) {
20
20
  var lightSample: LightSampleRec;
21
- let lc = vec3f(fk(qV(candidate, 1u)), dz(qV(candidate, 0u)));
22
- sampleLight(si.position, lc, &lightSample, false);
21
+ let ln = vec3f(fp(rd(candidate, 1u)), dz(rd(candidate, 0u)));
22
+ sampleLight(si.position, ln, &lightSample, false);
23
23
  let lightDir = lightSample.direction;
24
24
  let cosThetaL = dot(si.normal, lightDir);
25
- let pv = dot(si.normal, oK) * cosThetaL;
26
- if (lightSample.pdf > 0.0 && pv >= 0.0) {
25
+ let pM = dot(si.normal, oS) * cosThetaL;
26
+ if (lightSample.pdf > 0.0 && pM >= 0.0) {
27
27
  var ray: Ray;
28
- iw(&ray, si.position + EPS * lightDir, lightDir);
28
+ iC(&ray, si.position + EPS * lightDir, lightDir);
29
29
  if (ex(ray, lightSample.dist - EPS, si.triangleIndex)) {
30
30
  shadow += 1.0;
31
31
  }