@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
@@ -12,12 +12,12 @@ int triangleIndex = primitiveOffset + k;
12
12
  ${skipTriangleCode}
13
13
  vec4 r3 = dp(triangleIndex);
14
14
  ivec3 index = floatBitsToInt(r3.xyz) + vertexOffset;
15
- fA tri = fA(
15
+ fB tri = fB(
16
16
  kG(positionBuffer, index.x, vertexColumns).xyz,
17
17
  kG(positionBuffer, index.y, vertexColumns).xyz,
18
18
  kG(positionBuffer, index.z, vertexColumns).xyz
19
19
  );
20
- eC hit = fL(o, d, tri, ey, gP, tMax);
20
+ eC hit = fM(o, d, tri, ey, gQ, tMax);
21
21
 
22
22
  if (hit.t > 0.0) {
23
23
  tMax = hit.t;
@@ -52,7 +52,7 @@ vec3 hB;
52
52
  vec3 aB;
53
53
  ivec3 hw;
54
54
 
55
- fA lC;
55
+ fB lB;
56
56
 
57
57
 
58
58
  top = 0;
@@ -81,18 +81,18 @@ o = (w2l * vec4(ray.o, 1.0)).xyz;
81
81
  d = (w2l * vec4(ray.d, 0.0)).xyz;
82
82
  }
83
83
  ey = maxDimension(abs(d));
84
- gP = mv(d, ey);
84
+ gQ = mu(d, ey);
85
85
  sO = cf;
86
86
  }
87
87
 
88
88
  int bo = cf < 0 ? 0 : blasOffset;
89
- uint fJ = cf < 0 ? 0u : floatBitsToUint(bv(cf * ${INSTANCE_VEC4_STRIDE}).x);
90
- int gR = int(fJ >> 30u);
91
- int eW = int(fJ & 0x3fffffffu);
89
+ uint fK = cf < 0 ? 0u : floatBitsToUint(bv(cf * ${INSTANCE_VEC4_STRIDE}).x);
90
+ int gS = int(fK >> 30u);
91
+ int eW = int(fK & 0x3fffffffu);
92
92
  int bh = 0;
93
93
  int primitiveOffset = 0;
94
94
 
95
- if (gR == 3) {
95
+ if (gS == 3) {
96
96
  uint hW = uint(node.x);
97
97
  if ((hW & 0x80000000u) != 0u) {
98
98
  bh = int((hW >> 23u) & 0xffu);
@@ -101,10 +101,10 @@ primitiveOffset = bo + eW + int(hW & 0x007fffffu);
101
101
  else {
102
102
  int i = node.x + bo;
103
103
  vec4 jA = dp(i);
104
- vec4 fF = dp(i + 1);
105
- vec4 mV = dp(i + 2);
106
- vec4 mW = dp(i + 3);
107
- vec4 mX = dp(i + 4);
104
+ vec4 fG = dp(i + 1);
105
+ vec4 mU = dp(i + 2);
106
+ vec4 mV = dp(i + 3);
107
+ vec4 mW = dp(i + 4);
108
108
  uint header = floatBitsToUint(jA.w);
109
109
  int rG = int(header << 24u) >> 24;
110
110
  int rH = int((header >> 8u) << 24u) >> 24;
@@ -114,54 +114,54 @@ uintBitsToFloat(uint(rG + 127) << 23u),
114
114
  uintBitsToFloat(uint(rH + 127) << 23u),
115
115
  uintBitsToFloat(uint(rI + 127) << 23u)
116
116
  );
117
- uint childBase = floatBitsToUint(fF.x);
118
- uint oQ = floatBitsToUint(fF.y);
117
+ uint childBase = floatBitsToUint(fG.x);
118
+ uint oP = floatBitsToUint(fG.y);
119
119
  uint internalMask = header >> 24u;
120
120
  uint ut = (d.x < 0.0 ? 4u : 0u) |
121
121
  (d.y < 0.0 ? 2u : 0u) |
122
122
  (d.z < 0.0 ? 1u : 0u);
123
- uint gI[12] = uint[12](
123
+ uint gJ[12] = uint[12](
124
+ floatBitsToUint(mU.x), floatBitsToUint(mU.y),
125
+ floatBitsToUint(mU.z), floatBitsToUint(mU.w),
124
126
  floatBitsToUint(mV.x), floatBitsToUint(mV.y),
125
127
  floatBitsToUint(mV.z), floatBitsToUint(mV.w),
126
128
  floatBitsToUint(mW.x), floatBitsToUint(mW.y),
127
- floatBitsToUint(mW.z), floatBitsToUint(mW.w),
128
- floatBitsToUint(mX.x), floatBitsToUint(mX.y),
129
- floatBitsToUint(mX.z), floatBitsToUint(mX.w)
129
+ floatBitsToUint(mW.z), floatBitsToUint(mW.w)
130
130
  );
131
131
 
132
132
  for (int order = 7; order >= 0; order--) {
133
133
  uint slot = uint(order) ^ ut;
134
134
  uint sE = slot >= 4u
135
- ? floatBitsToUint(fF.w)
136
- : floatBitsToUint(fF.z);
135
+ ? floatBitsToUint(fG.w)
136
+ : floatBitsToUint(fG.z);
137
137
  uint meta = (sE >> ((slot & 3u) * 8u)) & 0xffu;
138
138
  if (meta == 0u) continue;
139
- uint lY = (slot & 3u) * 8u;
139
+ uint lX = (slot & 3u) * 8u;
140
140
  uint kV = slot >> 2u;
141
141
  vec3 tH = vec3(
142
- float((gI[kV] >> lY) & 0xffu),
143
- float((gI[2u + kV] >> lY) & 0xffu),
144
- float((gI[4u + kV] >> lY) & 0xffu)
142
+ float((gJ[kV] >> lX) & 0xffu),
143
+ float((gJ[2u + kV] >> lX) & 0xffu),
144
+ float((gJ[4u + kV] >> lX) & 0xffu)
145
145
  );
146
146
  vec3 tG = vec3(
147
- float((gI[6u + kV] >> lY) & 0xffu),
148
- float((gI[8u + kV] >> lY) & 0xffu),
149
- float((gI[10u + kV] >> lY) & 0xffu)
147
+ float((gJ[6u + kV] >> lX) & 0xffu),
148
+ float((gJ[8u + kV] >> lX) & 0xffu),
149
+ float((gJ[10u + kV] >> lX) & 0xffu)
150
150
  );
151
151
  vec3 uW = jA.xyz + tH * hJ;
152
152
  vec3 uV = jA.xyz + tG * hJ;
153
153
  if (cM(o, d, uW, uV, tMax) <= 0.0) continue;
154
154
  uint jC = meta & 0x1fu;
155
155
  if (jC >= 24u) {
156
- uint ns = internalMask & ((1u << slot) - 1u);
157
- uint sX = childBase + qT(ns);
156
+ uint nr = internalMask & ((1u << slot) - 1u);
157
+ uint sX = childBase + qT(nr);
158
158
  stack[++top] = ivec2(
159
159
  eW + int(sX * 5u), cf
160
160
  );
161
161
  }
162
162
  else {
163
163
  uint triangleCount = qT(meta >> 5u);
164
- uint rS = oQ + jC;
164
+ uint rS = oP + jC;
165
165
  uint vh = 0x80000000u |
166
166
  (triangleCount << 23u) |
167
167
  (rS & 0x007fffffu);
@@ -170,7 +170,7 @@ stack[++top] = ivec2(int(vh), cf);
170
170
  }
171
171
  }
172
172
  }
173
- else if (gR == 2) {
173
+ else if (gS == 2) {
174
174
  int i = node.x + bo;
175
175
  vec4 uY = dp(i);
176
176
  vec4 uZ = dp(i + 1);
@@ -195,7 +195,7 @@ if (d0 > 0.0) stack[++top] = ivec2(left, cf);
195
195
  }
196
196
  }
197
197
  }
198
- else if (gR == 1) {
198
+ else if (gS == 1) {
199
199
  uint hW = uint(node.x);
200
200
  if ((hW & 0x80000000u) != 0u) {
201
201
  bh = int((hW >> 23u) & 0xffu);
@@ -209,7 +209,7 @@ vec4 rp = dp(i + 2);
209
209
  vec4 rq = dp(i + 3);
210
210
  vec3 nodeMin = ui.xyz;
211
211
  vec3 ec = vec3(ui.w, ro.x, ro.y);
212
- uint mh[4] = uint[4](
212
+ uint mg[4] = uint[4](
213
213
  floatBitsToUint(ro.z), floatBitsToUint(ro.w),
214
214
  floatBitsToUint(rp.x), floatBitsToUint(rp.y)
215
215
  );
@@ -219,18 +219,18 @@ vec4 rB = fc(floatBitsToUint(rq.x));
219
219
  vec4 rt = fc(floatBitsToUint(rq.y));
220
220
  vec4 ru = fc(floatBitsToUint(rq.z));
221
221
  vec4 rv = fc(floatBitsToUint(rq.w));
222
- vec3 gC = fb(d);
223
- vec3 bJ = eZ(gC, o);
224
- vec4 tx0 = (nodeMin.x + rw * ec.x - o.x) * gC.x;
225
- vec4 tx1 = (nodeMin.x + rt * ec.x - o.x) * gC.x;
226
- vec4 ty0 = (nodeMin.y + rA * ec.y - o.y) * gC.y;
227
- vec4 ty1 = (nodeMin.y + ru * ec.y - o.y) * gC.y;
228
- vec4 tz0 = (nodeMin.z + rB * ec.z - o.z) * gC.z;
229
- vec4 tz1 = (nodeMin.z + rv * ec.z - o.z) * gC.z;
230
- vec4 mL = max(max((min(tx0, tx1) - vec4(bJ.x)), (min(ty0, ty1) - vec4(bJ.y))), (min(tz0, tz1) - vec4(bJ.z)));
222
+ vec3 gE = fb(d);
223
+ vec3 bJ = eZ(gE, o);
224
+ vec4 tx0 = (nodeMin.x + rw * ec.x - o.x) * gE.x;
225
+ vec4 tx1 = (nodeMin.x + rt * ec.x - o.x) * gE.x;
226
+ vec4 ty0 = (nodeMin.y + rA * ec.y - o.y) * gE.y;
227
+ vec4 ty1 = (nodeMin.y + ru * ec.y - o.y) * gE.y;
228
+ vec4 tz0 = (nodeMin.z + rB * ec.z - o.z) * gE.z;
229
+ vec4 tz1 = (nodeMin.z + rv * ec.z - o.z) * gE.z;
230
+ vec4 mK = max(max((min(tx0, tx1) - vec4(bJ.x)), (min(ty0, ty1) - vec4(bJ.y))), (min(tz0, tz1) - vec4(bJ.z)));
231
231
  vec4 rU = min(min((max(tx0, tx1) + vec4(bJ.x)), (max(ty0, ty1) + vec4(bJ.y))), (max(tz0, tz1) + vec4(bJ.z)));
232
- vec4 distance = mix(rU, mL, greaterThan(mL, vec4(0.0)));
233
- distance = mix(distance, vec4(-1.0), greaterThan(mL, min(rU, vec4(tMax))));
232
+ vec4 distance = mix(rU, mK, greaterThan(mK, vec4(0.0)));
233
+ distance = mix(distance, vec4(-1.0), greaterThan(mK, min(rU, vec4(tMax))));
234
234
  float fd[4] = float[4](distance.x, distance.y, distance.z, distance.w);
235
235
 
236
236
 
@@ -238,15 +238,15 @@ for (int order = 0; order < 4; order++) {
238
238
  float dX = -1.0;
239
239
  int el = -1;
240
240
  for (int child = 0; child < 4; child++) {
241
- if (mh[child] != 0u && fd[child] > dX) {
241
+ if (mg[child] != 0u && fd[child] > dX) {
242
242
  dX = fd[child];
243
243
  el = child;
244
244
  }
245
245
  }
246
246
  if (el >= 0 && dX > 0.0) {
247
- uint nD = mh[el];
248
- int jI = int(nD);
249
- if ((nD & 0x80000000u) == 0u) {
247
+ uint nC = mg[el];
248
+ int jI = int(nC);
249
+ if ((nC & 0x80000000u) == 0u) {
250
250
  jI += eW;
251
251
  }
252
252
  stack[++top] = ivec2(jI, cf);
@@ -321,7 +321,7 @@ export default createShaderMixin({
321
321
  },
322
322
  main: glsl `
323
323
 
324
- struct fA {
324
+ struct fB {
325
325
  vec3 p0;
326
326
  vec3 p1;
327
327
  vec3 p2;
@@ -347,7 +347,7 @@ return t2;
347
347
  return INF;
348
348
  }
349
349
 
350
- float ni(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
350
+ float nh(vec3 pos, vec3 u, vec3 v, vec3 n, Ray r) {
351
351
  float dt = dot(r.d, n);
352
352
  float t = (dot(n, pos) - dot(n, r.o)) / dt;
353
353
 
@@ -366,7 +366,7 @@ return t;
366
366
  return INF;
367
367
  }
368
368
 
369
- float mz(Ray r, Light light, out LightSampleRec lightSample) {
369
+ float my(Ray r, Light light, out LightSampleRec lightSample) {
370
370
 
371
371
 
372
372
 
@@ -383,7 +383,7 @@ vec3 normal = normalize(cross(u, v));
383
383
  if (dot(normal, r.d) > 0.)
384
384
  return INF;
385
385
 
386
- d = ni(pos, u, v, normal, r);
386
+ d = nh(pos, u, v, normal, r);
387
387
  if (d < 0.) {
388
388
  d = INF;
389
389
  }
@@ -452,8 +452,8 @@ lightSample.isDelta = false;
452
452
  }
453
453
  if (d != INF) {
454
454
  vec3 ve = r.o + d * r.d;
455
- float mC = bL(light, normalize(r.o - ve));
456
- if (mC <= 0.0) return INF;
455
+ float mB = bL(light, normalize(r.o - ve));
456
+ if (mB <= 0.0) return INF;
457
457
  float aj = distance(r.o, light.position);
458
458
  float cosThetaMax = aj <= light.radius
459
459
  ? -1.0
@@ -463,7 +463,7 @@ lightSample.pdf = aj <= light.radius
463
463
  ? INV4PI
464
464
  : 1.0 / max(TWOPI * (1.0 - cosThetaMax), 1e-8);
465
465
  }
466
- lightSample.emission = light.emission * mC * (light.radius <= 0.0
466
+ lightSample.emission = light.emission * mB * (light.radius <= 0.0
467
467
  ? 1.0 / max(d * d, 1e-8)
468
468
  : 1.0);
469
469
  }
@@ -507,42 +507,42 @@ w21 = w21 / hk + w20;
507
507
  w22 = w22 / hk + w21;
508
508
 
509
509
  float rand = eo(0u);
510
- float nj;
510
+ float ni;
511
511
  if (rand < w00) {
512
- nj = m00.x;
512
+ ni = m00.x;
513
513
  } else if (rand < w01) {
514
- nj = m01.x;
514
+ ni = m01.x;
515
515
  } else if (rand < w02) {
516
- nj = m02.x;
516
+ ni = m02.x;
517
517
  } else if (rand < w10) {
518
- nj = m10.x;
518
+ ni = m10.x;
519
519
  } else if (rand < w11) {
520
- nj = m11.x;
520
+ ni = m11.x;
521
521
  } else if (rand < w12) {
522
- nj = m12.x;
522
+ ni = m12.x;
523
523
  } else if (rand < w20) {
524
- nj = m20.x;
524
+ ni = m20.x;
525
525
  } else if (rand < w21) {
526
- nj = m21.x;
526
+ ni = m21.x;
527
527
  } else {
528
- nj = m22.x;
528
+ ni = m22.x;
529
529
  }
530
- return int(nj);
530
+ return int(ni);
531
531
  }
532
532
 
533
533
 
534
534
  vec4 bv(int i);
535
535
 
536
536
 
537
- mat2x3 eE(vec3 normal, vec3 dp1, vec3 dp2, vec2 od, vec2 oe, vec4 aT) {
538
- float determinant = od.x * oe.y - od.y * oe.x;
537
+ mat2x3 eE(vec3 normal, vec3 dp1, vec3 dp2, vec2 oc, vec2 od, vec4 aT) {
538
+ float determinant = oc.x * od.y - oc.y * od.x;
539
539
  vec3 t = aT.xyz;
540
540
  vec3 b = vec3(0.0);
541
541
 
542
542
  float qC = abs(aT.w) > 1.5 ? 0.0 : aT.w;
543
543
  if (abs(determinant) > 1e-12) {
544
- vec3 dt = (dp1 * oe.y - dp2 * od.y) / determinant;
545
- vec3 db = (dp2 * od.x - dp1 * oe.x) / determinant;
544
+ vec3 dt = (dp1 * od.y - dp2 * oc.y) / determinant;
545
+ vec3 db = (dp2 * oc.x - dp1 * od.x) / determinant;
546
546
  if (dot(t, t) < 1e-8) { t = dt; }
547
547
  if (qC == 0.0) { qC = (dot(cross(normal, dt), db) < 0.0 ? -1.0 : 1.0); }
548
548
  }
@@ -558,12 +558,12 @@ else { t = normalize(t); b = normalize(cross(normal, t)); }
558
558
  return mat2x3(t, b * (qC < 0.0 ? -1.0 : 1.0));
559
559
  }
560
560
 
561
- void ht(inout ad si, fA tri, vec3 barycentric, ivec3 index) {
561
+ void ht(inout ad si, fB tri, vec3 barycentric, ivec3 index) {
562
562
  si.hit = true;
563
563
  si.position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z * tri.p2;
564
- ivec2 i0 = gQ(index.x, vertexColumns);
565
- ivec2 i1 = gQ(index.y, vertexColumns);
566
- ivec2 i2 = gQ(index.z, vertexColumns);
564
+ ivec2 i0 = gR(index.x, vertexColumns);
565
+ ivec2 i1 = gR(index.y, vertexColumns);
566
+ ivec2 i2 = gR(index.z, vertexColumns);
567
567
  si.vertexColor = vec3(1.0);
568
568
  #ifdef USE_VERTEX_COLOR
569
569
  si.vertexColor = barycentric.x * texelFetch(colorBuffer, i0, 0).rgb
@@ -630,29 +630,31 @@ vec2 cX = barycentric.x * secondaryUv0
630
630
  + barycentric.y * secondaryUv1
631
631
  + barycentric.z * secondaryUv2;
632
632
 
633
- vec4 lM = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
634
- int uvProjection = int(lM.r);
633
+ vec4 lL = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_UV);
634
+ int uvProjection = int(lL.r);
635
635
  if (uvProjection > 0) {
636
- uv = gH(uvProjection, si.position, normal, lM.zw);
636
+ uv = gI(uvProjection, si.position, normal, lL.zw);
637
637
  cX = uv;
638
638
  } else {
639
- uv *= lM.zw;
640
- cX *= lM.zw;
639
+ uv *= lL.zw;
640
+ cX *= lL.zw;
641
641
  }
642
642
  #else
643
643
  vec2 uv = vec2(0.0);
644
644
  vec2 cX = vec2(0.0);
645
645
  #endif
646
646
 
647
- #ifdef NUM_COAT_NORMAL_MAPS
647
+ #ifdef USE_COAT_NORMAL_FRAMES
648
648
  si.coatNormal = normal;
649
- float lw = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
649
+ #ifdef NUM_COAT_NORMAL_MAPS
650
+ float oU = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_LAYER_MAPS).z;
651
+ #endif
650
652
  #endif
651
653
  vec4 directionMaterial = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_DIRECTION_NORMAL);
652
654
  float tm = fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_FILM_TEXTURE).x;
653
655
  if (directionMaterial.x >= 0.0 || directionMaterial.y != 0.0 || tm != 0.0
654
- #ifdef NUM_COAT_NORMAL_MAPS
655
- || lw >= 0.0
656
+ #ifdef USE_COAT_NORMAL_FRAMES
657
+ || fetchMatData(si.materialIndex * MAT_DATA_SIZE + MAT_ROW_COAT).w > 0.0
656
658
  #endif
657
659
  ) {
658
660
  vec3 dp1 = tri.p0 - tri.p2;
@@ -666,31 +668,31 @@ aT = barycentric.x * texelFetch(tangentBuffer, i0, 0)
666
668
  mat2x3 eS = eE(normal, dp1, dp2, uv0-uv2, uv1-uv2, aT);
667
669
  si.geometryTangent = eS[0];
668
670
  si.geometryBitangent = eS[1];
669
- mat2x3 fY = eS;
671
+ mat2x3 fZ = eS;
670
672
  #ifdef NUM_ANISOTROPY_MAPS
671
673
  if (directionMaterial.x >= 0.0 && mapUvChannel[int(directionMaterial.x)] > 0.5) {
672
674
  vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
673
675
  vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
674
676
  vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
675
- fY = eE(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
677
+ fZ = eE(normal, dp1, dp2, a-c, b-c, (aT.w == 0.0 ? vec4(0.0) : aT));
676
678
  }
677
679
  #endif
678
- si.directionTangent = fY[0];
679
- si.directionBitangent = fY[1];
680
- #ifdef NUM_COAT_NORMAL_MAPS
681
- if (lw >= 0.0) {
682
- int kC = int(lw);
683
- mat2x3 mi = eS;
680
+ si.directionTangent = fZ[0];
681
+ si.directionBitangent = fZ[1];
682
+ #if defined(USE_COAT_NORMAL_FRAMES) && defined(NUM_COAT_NORMAL_MAPS)
683
+ if (oU >= 0.0) {
684
+ int kC = int(oU);
685
+ mat2x3 mh = eS;
684
686
  if (mapUvChannel[kC] > 0.5) {
685
687
  vec2 a = texelFetch(uv1Buffer, i0, 0).xy;
686
688
  vec2 b = texelFetch(uv1Buffer, i1, 0).xy;
687
689
  vec2 c = texelFetch(uv1Buffer, i2, 0).xy;
688
- mi = eE(normal, dp1, dp2, a-c, b-c,
690
+ mh = eE(normal, dp1, dp2, a-c, b-c,
689
691
  aT.w == 0.0 ? vec4(0.0) : aT);
690
692
  }
691
693
  vec3 decoded = sampleMap(kC, getMapUvSet(kC, uv, cX)).rgb * 2.0 - 1.0;
692
- vec3 mapped = mi[0] * decoded.x * directionMaterial.z
693
- + mi[1] * decoded.y * directionMaterial.w + normal * decoded.z;
694
+ vec3 mapped = mh[0] * decoded.x * directionMaterial.z
695
+ + mh[1] * decoded.y * directionMaterial.w + normal * decoded.z;
694
696
  if (dot(mapped, mapped) > 1e-12) { si.coatNormal = normalize(mapped); }
695
697
  }
696
698
  #endif
@@ -708,10 +710,10 @@ si.tangent = normalize(barycentric.x * t0 + barycentric.y * t1 + barycentric.z *
708
710
  #if defined(NUM_NORMAL_MAPS)
709
711
  vec3 dp1 = tri.p0 - tri.p2;
710
712
  vec3 dp2 = tri.p1 - tri.p2;
711
- vec2 od = uv0 - uv2;
712
- vec2 oe = uv1 - uv2;
713
- si.normal = om(
714
- si.materialIndex, uv, normal, dp1, dp2, od, oe
713
+ vec2 oc = uv0 - uv2;
714
+ vec2 od = uv1 - uv2;
715
+ si.normal = ol(
716
+ si.materialIndex, uv, normal, dp1, dp2, oc, od
715
717
  );
716
718
  #else
717
719
  si.normal = normal;
@@ -740,19 +742,19 @@ value = (value + (value >> 4u)) & 0x0f0f0f0fu;
740
742
  return (value * 0x01010101u) >> 24u;
741
743
  }
742
744
 
743
- vec4 fc(uint lV) {
745
+ vec4 fc(uint lU) {
744
746
  return vec4(
745
- float(lV & 0xffu),
746
- float((lV >> 8u) & 0xffu),
747
- float((lV >> 16u) & 0xffu),
748
- float(lV >> 24u)
747
+ float(lU & 0xffu),
748
+ float((lU >> 8u) & 0xffu),
749
+ float((lU >> 16u) & 0xffu),
750
+ float(lU >> 24u)
749
751
  ) / 255.0;
750
752
  }
751
753
 
752
754
 
753
755
 
754
756
 
755
- eC fL(vec3 o, vec3 d, fA tri, int ey, vec3 gP, float tMax) {
757
+ eC fM(vec3 o, vec3 d, fB tri, int ey, vec3 gQ, float tMax) {
756
758
  eC ti;
757
759
 
758
760
 
@@ -772,9 +774,9 @@ p2t = p2t.zxy;
772
774
  }
773
775
 
774
776
 
775
- p0t.xy += gP.xy * p0t.z;
776
- p1t.xy += gP.xy * p1t.z;
777
- p2t.xy += gP.xy * p2t.z;
777
+ p0t.xy += gQ.xy * p0t.z;
778
+ p1t.xy += gQ.xy * p1t.z;
779
+ p2t.xy += gQ.xy * p2t.z;
778
780
 
779
781
 
780
782
  vec3 e = vec3(
@@ -799,9 +801,9 @@ float det = e.x + e.y + e.z;
799
801
  if (det == 0.0) return ti;
800
802
  #endif
801
803
 
802
- p0t.z *= gP.z;
803
- p1t.z *= gP.z;
804
- p2t.z *= gP.z;
804
+ p0t.z *= gQ.z;
805
+ p1t.z *= gQ.z;
806
+ p2t.z *= gQ.z;
805
807
  float rn = (e.x * p0t.z + e.y * p1t.z + e.z * p2t.z);
806
808
 
807
809
 
@@ -831,9 +833,9 @@ return 1.0 / d;
831
833
  #endif
832
834
  }
833
835
 
834
- vec3 eZ(vec3 gC, vec3 o) {
836
+ vec3 eZ(vec3 gE, vec3 o) {
835
837
  #ifdef DEPTH_QUERY_MODE
836
- return abs(gC) * max(vec3(1.0), abs(o)) * 1e-6;
838
+ return abs(gE) * max(vec3(1.0), abs(o)) * 1e-6;
837
839
  #else
838
840
  return vec3(0.0);
839
841
  #endif
@@ -843,18 +845,18 @@ return vec3(0.0);
843
845
 
844
846
  float cM(vec3 o, vec3 d, vec3 vK, vec3 vJ, float tMax) {
845
847
  #ifdef DEPTH_QUERY_MODE
846
- vec3 gC = fb(d);
847
- vec3 uR = (vK - o) * gC;
848
- vec3 uS = (vJ - o) * gC;
849
- vec3 bJ = eZ(gC, o);
848
+ vec3 gE = fb(d);
849
+ vec3 uR = (vK - o) * gE;
850
+ vec3 uS = (vJ - o) * gE;
851
+ vec3 bJ = eZ(gE, o);
850
852
  #else
851
853
  vec3 uR = (vK - o) / d;
852
854
  vec3 uS = (vJ - o) / d;
853
855
  vec3 bJ = vec3(0.0);
854
856
  #endif
855
- vec3 mL = min(uR, uS) - bJ;
857
+ vec3 mK = min(uR, uS) - bJ;
856
858
  vec3 rU = max(uR, uS) + bJ;
857
- float t0 = max(mL.x, max(mL.y, mL.z));
859
+ float t0 = max(mK.x, max(mK.y, mK.z));
858
860
  float t1 = min(rU.x, min(rU.y, rU.z));
859
861
 
860
862
  return (t0 > t1 || t0 > tMax) ? -1.0 : (t0 > 0.0 ? t0 : t1);
@@ -864,7 +866,7 @@ int maxDimension(vec3 v) {
864
866
  return v.x > v.y ? (v.x > v.z ? 0 : 2) : (v.y > v.z ? 1 : 2);
865
867
  }
866
868
 
867
- vec3 mv(vec3 d, int ey) {
869
+ vec3 mu(vec3 d, int ey) {
868
870
 
869
871
 
870
872
  if (ey == 0) {
@@ -885,12 +887,12 @@ return;
885
887
  }
886
888
 
887
889
  int ey = maxDimension(abs(ray.d));
888
- vec3 gP = mv(ray.d, ey);
890
+ vec3 gQ = mu(ray.d, ey);
889
891
  int ao;
890
892
 
891
893
  ${getBVHTraverseCode(glsl `
892
894
  si.triangleIndex = triangleIndex;
893
- lC = tri;
895
+ lB = tri;
894
896
  hB = faceNormal;
895
897
  aB = hit.barycentric;
896
898
  hw = index;
@@ -902,7 +904,7 @@ if (rb) {
902
904
  si.instanceIndex = ao;
903
905
  si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
904
906
 
905
- ht(si, lC, aB, hw);
907
+ ht(si, lB, aB, hw);
906
908
  mat4 l2w = mat4(
907
909
  bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
908
910
  bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
@@ -919,7 +921,7 @@ mat3 aD = transpose(mat3(w2l));
919
921
  si.faceNormal = normalize(aD * hB);
920
922
  si.vertexNormal = normalize(aD * si.vertexNormal);
921
923
  si.normal = normalize(aD * si.normal);
922
- #ifdef NUM_COAT_NORMAL_MAPS
924
+ #ifdef USE_COAT_NORMAL_FRAMES
923
925
  si.coatNormal = normalize(aD * si.coatNormal);
924
926
  #endif
925
927
  #ifdef USE_TANGENT
@@ -946,12 +948,12 @@ return;
946
948
 
947
949
  bool doubleSided = true;
948
950
  int ey = maxDimension(abs(ray.d));
949
- vec3 gP = mv(ray.d, ey);
951
+ vec3 gQ = mu(ray.d, ey);
950
952
  int ao;
951
953
 
952
954
  ${getBVHTraverseCode(glsl `
953
955
  si.triangleIndex = triangleIndex;
954
- lC = tri;
956
+ lB = tri;
955
957
  hB = faceNormal;
956
958
  aB = hit.barycentric;
957
959
  hw = index;
@@ -966,7 +968,7 @@ continue;
966
968
  if (rb) {
967
969
  si.instanceIndex = ao;
968
970
  si.materialIndex = int(ae(floatBitsToInt(bv(ao * ${INSTANCE_VEC4_STRIDE}).z)).x);
969
- ht(si, lC, aB, hw);
971
+ ht(si, lB, aB, hw);
970
972
  mat4 l2w = mat4(
971
973
  bv(ao * ${INSTANCE_VEC4_STRIDE} + 5),
972
974
  bv(ao * ${INSTANCE_VEC4_STRIDE} + 6),
@@ -983,7 +985,7 @@ mat3 aD = transpose(mat3(w2l));
983
985
  si.faceNormal = normalize(aD * hB);
984
986
  si.vertexNormal = normalize(aD * si.vertexNormal);
985
987
  si.normal = normalize(aD * si.normal);
986
- #ifdef NUM_COAT_NORMAL_MAPS
988
+ #ifdef USE_COAT_NORMAL_FRAMES
987
989
  si.coatNormal = normalize(aD * si.coatNormal);
988
990
  #endif
989
991
  #ifdef USE_TANGENT
@@ -1008,7 +1010,7 @@ return false;
1008
1010
 
1009
1011
  bool doubleSided = true;
1010
1012
  int ey = maxDimension(abs(ray.d));
1011
- vec3 gP = mv(ray.d, ey);
1013
+ vec3 gQ = mu(ray.d, ey);
1012
1014
 
1013
1015
  ${getBVHTraverseCode(glsl `
1014
1016
 
@@ -1020,9 +1022,9 @@ vec3 position = barycentric.x * tri.p0 + barycentric.y * tri.p1 + barycentric.z
1020
1022
  if (jt) {
1021
1023
  #ifdef HAS_ALPHA
1022
1024
  int materialIndex = int(ae(floatBitsToInt(bv(cf * ${INSTANCE_VEC4_STRIDE}).z)).x);
1023
- ivec2 i0 = gQ(index.x, vertexColumns);
1024
- ivec2 i1 = gQ(index.y, vertexColumns);
1025
- ivec2 i2 = gQ(index.z, vertexColumns);
1025
+ ivec2 i0 = gR(index.x, vertexColumns);
1026
+ ivec2 i1 = gR(index.y, vertexColumns);
1027
+ ivec2 i2 = gR(index.z, vertexColumns);
1026
1028
  ivec4 m0 = ivec4(texelFetch(materialIndexBuffer, i0, 0));
1027
1029
  ivec4 m1 = ivec4(texelFetch(materialIndexBuffer, i1, 0));
1028
1030
  ivec4 m2 = ivec4(texelFetch(materialIndexBuffer, i2, 0));
@@ -1042,12 +1044,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1042
1044
  vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1043
1045
  vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
1044
1046
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1045
- vec4 lM = fetchMatData(ii + MAT_ROW_UV);
1046
- int uvProjection = int(lM.r);
1047
+ vec4 lL = fetchMatData(ii + MAT_ROW_UV);
1048
+ int uvProjection = int(lL.r);
1047
1049
  if (uvProjection > 0) {
1048
- uv = gH(uvProjection, position, hB, lM.zw);
1050
+ uv = gI(uvProjection, position, hB, lL.zw);
1049
1051
  } else {
1050
- uv *= lM.zw;
1052
+ uv *= lL.zw;
1051
1053
  }
1052
1054
 
1053
1055
  alpha *= sampleMap(diffuseMapIndex, uv).a;
@@ -1061,12 +1063,12 @@ vec2 uv0 = texelFetch(uvBuffer, i0, 0).xy;
1061
1063
  vec2 uv1 = texelFetch(uvBuffer, i1, 0).xy;
1062
1064
  vec2 uv2 = texelFetch(uvBuffer, i2, 0).xy;
1063
1065
  vec2 uv = barycentric.x * uv0 + barycentric.y * uv1 + barycentric.z * uv2;
1064
- vec4 lM = fetchMatData(ii + MAT_ROW_UV);
1065
- int uvProjection = int(lM.r);
1066
+ vec4 lL = fetchMatData(ii + MAT_ROW_UV);
1067
+ int uvProjection = int(lL.r);
1066
1068
  if (uvProjection > 0) {
1067
- uv = gH(uvProjection, position, hB, lM.zw);
1069
+ uv = gI(uvProjection, position, hB, lL.zw);
1068
1070
  } else {
1069
- uv *= lM.zw;
1071
+ uv *= lL.zw;
1070
1072
  }
1071
1073
  alpha *= sampleMap(alphaMapIndex, uv).g;
1072
1074
  }