@meimu/mutracer 0.2.0 → 0.3.0

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 (211) hide show
  1. package/README.md +3 -0
  2. package/dist/assets/bvh.worker.js +1 -1
  3. package/dist/mutracer.umd.js +8949 -7915
  4. package/docs/api.md +42 -21
  5. package/docs/caustics.md +80 -0
  6. package/docs/materials.md +5 -4
  7. package/docs/progressive-rendering.md +50 -9
  8. package/docs/technical/continuous-spectrum.md +93 -0
  9. package/docs/updates.md +3 -1
  10. package/docs/viewer-checklist.md +65 -0
  11. package/docs/viewer.md +7 -5
  12. package/lib/Display.js +1 -1
  13. package/lib/Display.js.map +1 -1
  14. package/lib/Engine.d.ts +2 -0
  15. package/lib/Engine.js +47 -12
  16. package/lib/Engine.js.map +1 -1
  17. package/lib/Render.d.ts +61 -13
  18. package/lib/Render.js +169 -19
  19. package/lib/Render.js.map +1 -1
  20. package/lib/RenderLoop.d.ts +7 -3
  21. package/lib/RenderLoop.js +68 -44
  22. package/lib/RenderLoop.js.map +1 -1
  23. package/lib/main.d.ts +1 -1
  24. package/lib/main.js.map +1 -1
  25. package/lib/oidn.d.ts +1 -1
  26. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  27. package/lib/renderer/GPUTraceQueue.d.ts +2 -1
  28. package/lib/renderer/GPUTraceQueue.js +3 -1
  29. package/lib/renderer/GPUTraceQueue.js.map +1 -1
  30. package/lib/renderer/RenderingPipeline.d.ts +4 -0
  31. package/lib/renderer/RenderingPipeline.js.map +1 -1
  32. package/lib/renderer/WGPUCausticLightPass.d.ts +48 -0
  33. package/lib/renderer/WGPUCausticLightPass.js +217 -0
  34. package/lib/renderer/WGPUCausticLightPass.js.map +1 -0
  35. package/lib/renderer/WGPUEnvMapDistribution.js +18 -18
  36. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  37. package/lib/renderer/WGPUPhotonMap.d.ts +37 -0
  38. package/lib/renderer/WGPUPhotonMap.js +191 -0
  39. package/lib/renderer/WGPUPhotonMap.js.map +1 -0
  40. package/lib/renderer/WGPURayTraceOutput.d.ts +13 -1
  41. package/lib/renderer/WGPURayTraceOutput.js +122 -28
  42. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  43. package/lib/renderer/WGPURayTracePass.d.ts +48 -17
  44. package/lib/renderer/WGPURayTracePass.js +538 -340
  45. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  46. package/lib/renderer/WGPURenderingPipeline.js +83 -47
  47. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  48. package/lib/renderer/WebGLFullQuadPass.d.ts +2 -1
  49. package/lib/renderer/WebGLFullQuadPass.js +4 -0
  50. package/lib/renderer/WebGLFullQuadPass.js.map +1 -1
  51. package/lib/renderer/WebGLJNLMDenoiser.js +66 -66
  52. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  53. package/lib/renderer/WebGLRayTracePass.d.ts +6 -1
  54. package/lib/renderer/WebGLRayTracePass.js +43 -6
  55. package/lib/renderer/WebGLRayTracePass.js.map +1 -1
  56. package/lib/renderer/WebGLRenderingPipeline.js +10 -14
  57. package/lib/renderer/WebGLRenderingPipeline.js.map +1 -1
  58. package/lib/renderer/WebGLSkyBaker.js +60 -60
  59. package/lib/renderer/accumulationTarget.d.ts +2 -1
  60. package/lib/renderer/accumulationTarget.js.map +1 -1
  61. package/lib/renderer/causticDiagnostics.d.ts +31 -0
  62. package/lib/renderer/causticDiagnostics.js +5 -0
  63. package/lib/renderer/causticDiagnostics.js.map +1 -0
  64. package/lib/renderer/causticEmission.d.ts +10 -0
  65. package/lib/renderer/causticEmission.js +40 -0
  66. package/lib/renderer/causticEmission.js.map +1 -0
  67. package/lib/renderer/causticUniform.d.ts +12 -0
  68. package/lib/renderer/causticUniform.js +22 -0
  69. package/lib/renderer/causticUniform.js.map +1 -0
  70. package/lib/renderer/caustics.d.ts +16 -0
  71. package/lib/renderer/caustics.js +93 -0
  72. package/lib/renderer/caustics.js.map +1 -0
  73. package/lib/renderer/glsl/aovDisplay.frag.js +5 -5
  74. package/lib/renderer/glsl/aovReflectance.glsl.js +53 -53
  75. package/lib/renderer/glsl/aovReflectanceSamples.glsl.js +1 -1
  76. package/lib/renderer/glsl/aovTrace.frag.js +33 -33
  77. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  78. package/lib/renderer/glsl/chunks/emissiveLight.glsl.d.ts +2 -0
  79. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js +35 -0
  80. package/lib/renderer/glsl/chunks/emissiveLight.glsl.js.map +1 -0
  81. package/lib/renderer/glsl/chunks/envMap.glsl.js +73 -73
  82. package/lib/renderer/glsl/chunks/intersect.glsl.js +426 -428
  83. package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
  84. package/lib/renderer/glsl/chunks/materialBuffer.glsl.d.ts +1 -0
  85. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +156 -153
  86. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
  87. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +771 -771
  88. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  89. package/lib/renderer/glsl/chunks/random.glsl.js +6 -6
  90. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.d.ts +1 -0
  91. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +68 -63
  92. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
  93. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +94 -76
  94. package/lib/renderer/glsl/chunks/sampleLight.glsl.js.map +1 -1
  95. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.d.ts +1 -0
  96. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +140 -117
  97. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
  98. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +14 -14
  99. package/lib/renderer/glsl/chunks/sampling.glsl.js +89 -92
  100. package/lib/renderer/glsl/chunks/sampling.glsl.js.map +1 -1
  101. package/lib/renderer/glsl/chunks/sobol.glsl.js +79 -79
  102. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  103. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +11 -11
  104. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  105. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +10 -10
  106. package/lib/renderer/glsl/rayTrace.frag.d.ts +1 -1
  107. package/lib/renderer/glsl/rayTrace.frag.js +260 -237
  108. package/lib/renderer/glsl/rayTrace.frag.js.map +1 -1
  109. package/lib/renderer/glsl/shadowCatcher.frag.js +26 -26
  110. package/lib/renderer/glsl/shadowCatcher.frag.js.map +1 -1
  111. package/lib/renderer/glsl/webglPipeline.frag.js +59 -59
  112. package/lib/renderer/lightSampling.d.ts +3 -2
  113. package/lib/renderer/lightSampling.js +14 -8
  114. package/lib/renderer/lightSampling.js.map +1 -1
  115. package/lib/renderer/progressiveScheduler.js +4 -3
  116. package/lib/renderer/progressiveScheduler.js.map +1 -1
  117. package/lib/renderer/renderPipeline.d.ts +1 -0
  118. package/lib/renderer/renderPipeline.js.map +1 -1
  119. package/lib/renderer/researchTransport.d.ts +31 -0
  120. package/lib/renderer/researchTransport.js +5 -0
  121. package/lib/renderer/researchTransport.js.map +1 -0
  122. package/lib/renderer/sceneLayoutSchema.d.ts +1 -0
  123. package/lib/renderer/sceneLayoutSchema.js +2 -2
  124. package/lib/renderer/sceneLayoutSchema.js.map +1 -1
  125. package/lib/renderer/scratchSampling.js +6 -6
  126. package/lib/renderer/spectrum.d.ts +21 -0
  127. package/lib/renderer/spectrum.js +154 -0
  128. package/lib/renderer/spectrum.js.map +1 -0
  129. package/lib/renderer/webglLightSampling.d.ts +39 -0
  130. package/lib/renderer/webglLightSampling.js +15 -0
  131. package/lib/renderer/webglLightSampling.js.map +1 -0
  132. package/lib/renderer/wgpuBindlessSource.js +3 -3
  133. package/lib/renderer/wgpuShaderSource.d.ts +7 -0
  134. package/lib/renderer/wgpuShaderSource.js +2 -0
  135. package/lib/renderer/wgpuShaderSource.js.map +1 -1
  136. package/lib/renderer/wgsl/aovDisplay.wgsl.js +9 -9
  137. package/lib/renderer/wgsl/aovReflectance.wgsl.js +55 -55
  138. package/lib/renderer/wgsl/aovReflectanceSamples.wgsl.js +1 -1
  139. package/lib/renderer/wgsl/aovResolve.wgsl.js +2 -2
  140. package/lib/renderer/wgsl/aovSnapshot.wgsl.js +1 -1
  141. package/lib/renderer/wgsl/aovTrace.wgsl.js +33 -33
  142. package/lib/renderer/wgsl/bloom.wgsl.js +18 -18
  143. package/lib/renderer/wgsl/causticLight.compute.d.ts +6 -0
  144. package/lib/renderer/wgsl/causticLight.compute.js +537 -0
  145. package/lib/renderer/wgsl/causticLight.compute.js.map +1 -0
  146. package/lib/renderer/wgsl/chunks/background.wgsl.d.ts +2 -0
  147. package/lib/renderer/wgsl/chunks/background.wgsl.js +102 -0
  148. package/lib/renderer/wgsl/chunks/background.wgsl.js.map +1 -0
  149. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.d.ts +2 -0
  150. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js +12 -0
  151. package/lib/renderer/wgsl/chunks/causticAdjoint.wgsl.js.map +1 -0
  152. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.d.ts +2 -0
  153. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js +16 -0
  154. package/lib/renderer/wgsl/chunks/causticAtomic.wgsl.js.map +1 -0
  155. package/lib/renderer/wgsl/chunks/caustics.wgsl.d.ts +1 -0
  156. package/lib/renderer/wgsl/chunks/caustics.wgsl.js +62 -0
  157. package/lib/renderer/wgsl/chunks/caustics.wgsl.js.map +1 -0
  158. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  159. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +37 -37
  160. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +598 -592
  161. package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
  162. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +14 -14
  163. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.d.ts +2 -1
  164. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +75 -73
  165. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
  166. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +794 -794
  167. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +139 -139
  168. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  169. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.d.ts +2 -1
  170. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +35 -25
  171. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js.map +1 -1
  172. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.d.ts +1 -1
  173. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +142 -138
  174. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js.map +1 -1
  175. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.d.ts +1 -1
  176. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +204 -187
  177. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js.map +1 -1
  178. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.d.ts +1 -1
  179. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +11 -11
  180. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js.map +1 -1
  181. package/lib/renderer/wgsl/chunks/sampling.wgsl.d.ts +1 -1
  182. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +89 -93
  183. package/lib/renderer/wgsl/chunks/sampling.wgsl.js.map +1 -1
  184. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +83 -83
  185. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +11 -11
  186. package/lib/renderer/wgsl/compose.frag.wgsl.js +98 -98
  187. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  188. package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
  189. package/lib/renderer/wgsl/jnlm.compute.js +74 -74
  190. package/lib/renderer/wgsl/offlineAdaptive.compute.js +25 -25
  191. package/lib/renderer/wgsl/oidnAuxiliary.wgsl.js +3 -3
  192. package/lib/renderer/wgsl/photonMap.compute.d.ts +29 -0
  193. package/lib/renderer/wgsl/photonMap.compute.js +352 -0
  194. package/lib/renderer/wgsl/photonMap.compute.js.map +1 -0
  195. package/lib/renderer/wgsl/proceduralSky.compute.js +64 -64
  196. package/lib/renderer/wgsl/rayTrace.compute.d.ts +9 -1
  197. package/lib/renderer/wgsl/rayTrace.compute.js +448 -522
  198. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  199. package/lib/scene/MaterialState.d.ts +2 -2
  200. package/lib/scene/MaterialState.js +2 -2
  201. package/lib/scene/MaterialState.js.map +1 -1
  202. package/lib/settings/render.d.ts +11 -0
  203. package/lib/settings/render.js +1 -0
  204. package/lib/settings/render.js.map +1 -1
  205. package/lib/util/fromTHREE.js +2 -2
  206. package/lib/util/fromTHREE.js.map +1 -1
  207. package/lib/version.d.ts +1 -1
  208. package/lib/version.js +1 -1
  209. package/lib/version.js.map +1 -1
  210. package/llms.txt +2 -1
  211. package/package.json +3 -3
@@ -1,56 +1,56 @@
1
1
  const displacementCommon = /*wgsl*/ `
2
2
 
3
3
 
4
- struct kc {
4
+ struct jI {
5
5
  barycentric: vec3f,
6
6
  t: f32,
7
7
  normal: vec3f,
8
8
 
9
9
  }
10
10
 
11
- fn wO(
11
+ fn xp(
12
12
  uu: f32,
13
- vA: vec3f, vB: vec3f,
13
+ vK: vec3f, vL: vec3f,
14
14
  eAC: vec3f, eBD: vec3f,
15
- je: vec3f,
16
- qT: f32,
17
- qV: ptr<function, f32>
15
+ iM: vec3f,
16
+ qK: f32,
17
+ qM: ptr<function, f32>
18
18
  ) -> bool {
19
19
  if (uu >= 0.0 && uu <= 1.0) {
20
- let pAB = mix(vA, vB, uu);
20
+ let pAB = mix(vK, vL, uu);
21
21
  let pCD = mix(eAC, eBD, uu);
22
- var n = cross(je, pCD);
23
- let xf = 1.0 / dot(n, n);
22
+ var n = cross(iM, pCD);
23
+ let xH = 1.0 / dot(n, n);
24
24
  n = cross(n, pAB);
25
- let tt = dot(n, pCD) * xf;
26
- let vv = dot(n, je) * xf;
27
- if (vv >= 0.0 && vv <= 1.0 && tt > qT && tt < *qV) {
28
- *qV = tt;
25
+ let tt = dot(n, pCD) * xH;
26
+ let vv = dot(n, iM) * xH;
27
+ if (vv >= 0.0 && vv <= 1.0 && tt > qK && tt < *qM) {
28
+ *qM = tt;
29
29
  return true;
30
30
  }
31
31
  }
32
32
  return false;
33
33
  }
34
34
 
35
- fn hx(
36
- qF: vec3f, je: vec3f, qT: f32, uM: f32,
35
+ fn hc(
36
+ qx: vec3f, iM: vec3f, qK: f32, uR: f32,
37
37
  pA: vec3f, pB: vec3f, pC: vec3f, pD: vec3f,
38
- qV: ptr<function, f32>
38
+ qM: ptr<function, f32>
39
39
  ) -> bool {
40
40
  let eAB = pB - pA;
41
41
  let eAC = pC - pA;
42
42
  let eBD = pD - pB;
43
43
  let eCD = pD - pC;
44
- let vA = pA - qF;
45
- let vB = pB - qF;
44
+ let vK = pA - qx;
45
+ let vL = pB - qx;
46
46
 
47
47
  var u1: f32;
48
48
  var u2: f32;
49
49
  {
50
50
  let qN = cross(eAB, -eCD);
51
- let a = dot(qN, je);
52
- var b = dot(cross(vB, je), eBD);
53
- let c = dot(cross(vA, je), eAC);
51
+ let a = dot(qN, iM);
52
+ var b = dot(cross(vL, iM), eBD);
53
+ let c = dot(cross(vK, iM), eAC);
54
54
  b -= a + c;
55
55
 
56
56
  let det = b * b - 4.0 * a * c;
@@ -62,19 +62,19 @@ if (a == 0.0) {
62
62
  u1 = -c / b;
63
63
  u2 = -1.0;
64
64
  } else {
65
- let xF = sqrt(det);
66
- let yo = -0.5 * (b + sign(b) * xF);
67
- u1 = yo / a;
68
- u2 = c / yo;
65
+ let yg = sqrt(det);
66
+ let yN = -0.5 * (b + sign(b) * yg);
67
+ u1 = yN / a;
68
+ u2 = c / yN;
69
69
  }
70
70
  }
71
71
 
72
- *qV = uM;
72
+ *qM = uR;
73
73
 
74
74
  var hit = false;
75
75
 
76
- hit = wO(u1, vA, vB, eAC, eBD, je, qT, qV) ||
77
- wO(u2, vA, vB, eAC, eBD, je, qT, qV);
76
+ hit = xp(u1, vK, vL, eAC, eBD, iM, qK, qM) ||
77
+ xp(u2, vK, vL, eAC, eBD, iM, qK, qM);
78
78
  if (!hit) {
79
79
  return false;
80
80
  }
@@ -82,70 +82,70 @@ return false;
82
82
  return true;
83
83
  }
84
84
 
85
- fn tM(
86
- qF: vec3f, je: vec3f, qT: f32, uM: f32,
85
+ fn tO(
86
+ qx: vec3f, iM: vec3f, qK: f32, uR: f32,
87
87
  pA: vec3f, pB: vec3f, pC: vec3f,
88
88
  pD: vec3f, pE: vec3f, pF: vec3f,
89
89
 
90
- bX: ptr<function, f32>,
91
- bW: ptr<function, f32>
90
+ bO: ptr<function, f32>,
91
+ bN: ptr<function, f32>
92
92
  ) -> bool {
93
- *bX = INF;
94
- *bW = -INF;
93
+ *bO = INF;
94
+ *bN = -INF;
95
95
 
96
- let xV = maxDimension(abs(je));
97
- let gY = nk(je, xV);
96
+ let yv = maxDimension(abs(iM));
97
+ let gH = mU(iM, yv);
98
98
  var tt: f32;
99
99
 
100
- tt = ga(
101
- qF, je,
102
- fP(pC, pB, pA), xV, gY, INF
100
+ tt = fM(
101
+ qx, iM,
102
+ fw(pC, pB, pA), yv, gH, INF
103
103
  ).t;
104
104
  if (tt > 0.0) {
105
- *bX = min(*bX, tt);
106
- *bW = max(*bW, tt);
105
+ *bO = min(*bO, tt);
106
+ *bN = max(*bN, tt);
107
107
  }
108
- tt = ga(
109
- qF, je,
110
- fP(pD, pE, pF), xV, gY, INF
108
+ tt = fM(
109
+ qx, iM,
110
+ fw(pD, pE, pF), yv, gH, INF
111
111
  ).t;
112
112
  if (tt > 0.0) {
113
- *bX = min(*bX, tt);
114
- *bW = max(*bW, tt);
113
+ *bO = min(*bO, tt);
114
+ *bN = max(*bN, tt);
115
115
  }
116
- if (hx(
117
- qF, je, -INF, INF,
116
+ if (hc(
117
+ qx, iM, -INF, INF,
118
118
  pA, pB, pD, pE,
119
119
  &tt)) {
120
- *bX = min(*bX, tt);
121
- *bW = max(*bW, tt);
120
+ *bO = min(*bO, tt);
121
+ *bN = max(*bN, tt);
122
122
  }
123
- if (hx(
124
- qF, je, -INF, INF,
123
+ if (hc(
124
+ qx, iM, -INF, INF,
125
125
  pB, pC, pE, pF,
126
126
  &tt)) {
127
- *bX = min(*bX, tt);
128
- *bW = max(*bW, tt);
127
+ *bO = min(*bO, tt);
128
+ *bN = max(*bN, tt);
129
129
  }
130
- if (hx(
131
- qF, je, -INF, INF,
130
+ if (hc(
131
+ qx, iM, -INF, INF,
132
132
  pC, pA, pF, pD,
133
133
  &tt)) {
134
- *bX = min(*bX, tt);
135
- *bW = max(*bW, tt);
134
+ *bO = min(*bO, tt);
135
+ *bN = max(*bN, tt);
136
136
  }
137
137
 
138
- *bX = max(*bX, qT);
139
- *bW = min(*bW, uM);
138
+ *bO = max(*bO, qK);
139
+ *bN = min(*bN, uR);
140
140
 
141
- return *bX <= *bW && *bW > 0.0;
141
+ return *bO <= *bN && *bN > 0.0;
142
142
  }
143
143
  `;
144
144
  export default /* wgsl */ `
145
145
 
146
146
  ${displacementCommon}
147
147
 
148
- fn mz(p: vec3f, p0: vec3f, p1: vec3f, p2: vec3f) -> vec3f {
148
+ fn mg(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;
@@ -156,9 +156,9 @@ let d11 = dot(v1, v1);
156
156
  let d20 = dot(v2, v0);
157
157
  let d21 = dot(v2, v1);
158
158
 
159
- let vs = 1.0 / (d00 * d11 - d01 * d01);
160
- let v = clamp((d11 * d20 - d01 * d21) * vs, 0.0, 1.0);
161
- let w = clamp((d00 * d21 - d01 * d20) * vs, 0.0, 1.0);
159
+ let vF = 1.0 / (d00 * d11 - d01 * d01);
160
+ let v = clamp((d11 * d20 - d01 * d21) * vF, 0.0, 1.0);
161
+ let w = clamp((d00 * d21 - d01 * d20) * vF, 0.0, 1.0);
162
162
  let u = 1.0 - v - w;
163
163
 
164
164
  return vec3f(u, v, w);
@@ -166,59 +166,59 @@ return vec3f(u, v, w);
166
166
 
167
167
 
168
168
 
169
- fn pY(
170
- rs: vec3f, rS: vec3f, yt: f32,
169
+ fn pS(
170
+ rl: vec3f, rP: vec3f, yR: f32,
171
171
  _pA: vec3f, _pB: vec3f, _pC: vec3f,
172
172
  _nA: vec3f, _nB: vec3f, _nC: vec3f,
173
- xm: vec2f, xn: vec2f, xo: vec2f,
173
+ xQ: vec2f, xR: vec2f, xS: vec2f,
174
174
 
175
- ku: i32,
176
- xl: vec2f,
175
+ jW: i32,
176
+ xP: vec2f,
177
177
 
178
- yd: f32, yc: f32,
178
+ yE: f32, yD: f32,
179
179
  hScale: f32,
180
- wk: f32,
181
- vH: f32,
180
+ wG: f32,
181
+ vR: f32,
182
182
  uvProjection: i32,
183
183
  uvScale: vec2f,
184
- xM: bool,
185
- sk: bool
186
- ) -> kc {
184
+ ym: bool,
185
+ se: bool
186
+ ) -> jI {
187
187
 
188
188
 
189
189
 
190
- let DT = select(max(abs(hScale) / 32.0, 1e-12), vH, vH > 0.0);
191
- let dt = DT / length(rS);
190
+ let DT = select(max(abs(hScale) / 32.0, 1e-12), vR, vR > 0.0);
191
+ let dt = DT / length(rP);
192
192
  let dbx = 0.001;
193
193
  let dby = 0.001;
194
194
 
195
- var result: kc;
195
+ var result: jI;
196
196
  result.t = INF;
197
197
 
198
- var bX = INF;
199
- var bW = -INF;
198
+ var bO = INF;
199
+ var bN = -INF;
200
200
 
201
- let sg = sign(hScale);
202
- let wC = abs(hScale);
201
+ let sb = sign(hScale);
202
+ let wZ = abs(hScale);
203
203
 
204
- let uC = sg * normalize(cross(_pB - _pA, _pC - _pA));
204
+ let uG = sb * normalize(cross(_pB - _pA, _pC - _pA));
205
205
 
206
206
 
207
- let dA = dot(_nA, uC);
208
- let dB = dot(_nB, uC);
209
- let dC = dot(_nC, uC);
207
+ let dA = dot(_nA, uG);
208
+ let dB = dot(_nB, uG);
209
+ let dC = dot(_nC, uG);
210
210
 
211
- var minH = yd * hScale * min(min(dA, dB), dC);
212
- var maxH = yc * hScale * max(max(dA, dB), dC);
211
+ var minH = yE * hScale * min(min(dA, dB), dC);
212
+ var maxH = yD * hScale * max(max(dA, dB), dC);
213
213
 
214
214
 
215
215
 
216
216
 
217
- let vC = abs(maxH) - abs(minH);
217
+ let vM = abs(maxH) - abs(minH);
218
218
 
219
219
 
220
220
  minH = sign(minH) * max(abs(minH) - DT * 2.0, 0.0);
221
- if (vC < DT * 2.0) {
221
+ if (vM < DT * 2.0) {
222
222
  maxH = sign(maxH) * min(abs(maxH) + DT * 2.0, abs(hScale));
223
223
  }
224
224
 
@@ -230,70 +230,70 @@ let pD = _pA + _nA * maxH / dA;
230
230
  let pE = _pB + _nB * maxH / dB;
231
231
  let pF = _pC + _nC * maxH / dC;
232
232
 
233
- if (!tM(
234
- rs, rS, 0.0, INF,
233
+ if (!tO(
234
+ rl, rP, 0.0, INF,
235
235
  pA, pB, pC,
236
236
  pD, pE, pF,
237
237
 
238
- &bX, &bW
238
+ &bO, &bN
239
239
  )) {
240
240
  return result;
241
241
  }
242
242
 
243
- var yp = false;
243
+ var yO = false;
244
244
 
245
- if (bW == bX) {
246
- bX = 0.0;
245
+ if (bN == bO) {
246
+ bO = 0.0;
247
247
  }
248
248
 
249
- var t = bX + dt * eC(2u);
250
- var s = rs + rS * t;
251
- var vq = dot(s - _pA, uC);
252
- var wV = select(0.0, INF, sg < 0.0);
249
+ var t = bO + dt * ek(2u);
250
+ var s = rl + rP * t;
251
+ var vE = dot(s - _pA, uG);
252
+ var hSurf = select(0.0, INF, sb < 0.0);
253
253
 
254
- var c0 = _pA + _nA * vq / dA;
255
- var c1 = _pB + _nB * vq / dB;
256
- var c2 = _pC + _nC * vq / dC;
254
+ var c0 = _pA + _nA * vE / dA;
255
+ var c1 = _pB + _nB * vE / dB;
256
+ var c2 = _pC + _nC * vE / dC;
257
257
 
258
- var uV: vec3f;
258
+ var vc: vec3f;
259
259
 
260
- vq = abs(vq);
260
+ vE = abs(vE);
261
261
 
262
- var sf = vq - wV;
263
- var qU = sf;
262
+ var hDiff = vE - hSurf;
263
+ var qL = hDiff;
264
264
  var step = 0;
265
265
 
266
266
  while (true) {
267
267
 
268
- let b = mz(s, c0, c1, c2);
268
+ let b = mg(s, c0, c1, c2);
269
269
 
270
- uV = _pA * b.x + _pB * b.y + _pC * b.z;
270
+ vc = _pA * b.x + _pB * b.y + _pC * b.z;
271
271
 
272
- vq = distance(uV, s);
272
+ vE = distance(vc, s);
273
273
 
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 = gU(uvProjection, uV - (_nA * b.x + _nB * b.y + _nC * b.z) * wk, n) * uvScale;
277
+ uv = gE(uvProjection, vc - (_nA * b.x + _nB * b.y + _nC * b.z) * wG, n) * uvScale;
278
278
  }
279
279
  else {
280
- uv = xm * b.x + xn * b.y + xo * b.z;
280
+ uv = xQ * b.x + xR * b.y + xS * b.z;
281
281
  }
282
- let h = sampleMap(ku, uv).x;
282
+ let h = sampleMap(jW, uv).x;
283
283
 
284
- wV = max(wC * h, DT);
284
+ hSurf = max(wZ * h, DT);
285
285
 
286
286
 
287
- let dh = dot(uC, s - c0);
287
+ let dh = dot(uG, s - c0);
288
288
  c0 = c0 + _nA * dh / dA;
289
289
  c1 = c1 + _nB * dh / dB;
290
290
  c2 = c2 + _nC * dh / dC;
291
291
 
292
- qU = sf;
293
- sf = vq - wV;
292
+ qL = hDiff;
293
+ hDiff = vE - hSurf;
294
294
 
295
- if (!(select(sf * sg, sf * qU, sk) > 0.0
296
- && t < bW + dt)
295
+ if (!(select(hDiff * sb, hDiff * qL, se) > 0.0
296
+ && t < bN + dt)
297
297
 
298
298
  && step > 0) {
299
299
  break;
@@ -301,15 +301,15 @@ break;
301
301
 
302
302
  step++;
303
303
  t = t + dt;
304
- s = s + rS * dt;
304
+ s = s + rP * dt;
305
305
  }
306
306
 
307
- if (select(sf * sg, sf * qU, sk) <= 0.0) {
308
- let dtt = dt * (abs(sf) / (abs(qU) + abs(sf) + EPS));
307
+ if (select(hDiff * sb, hDiff * qL, se) <= 0.0) {
308
+ let dtt = dt * (abs(hDiff) / (abs(qL) + abs(hDiff) + EPS));
309
309
  t = t - dtt;
310
310
 
311
- let yr = rs + rS * t;
312
- let b = mz(yr, c0, c1, c2);
311
+ let yP = rl + rP * t;
312
+ let b = mg(yP, c0, c1, c2);
313
313
 
314
314
  let N = normalize(_nA * b.x + _nB * b.y + _nC * b.z);
315
315
 
@@ -317,33 +317,33 @@ let p_a = _pA * b.x + _pB * b.y + _pC * b.z;
317
317
  let p_b = _pA * (b.x + dbx) + _pB * b.y + _pC * (b.z - dbx);
318
318
  let p_c = _pA * b.x + _pB * (b.y + dby) + _pC * (b.z - dby);
319
319
 
320
- var xX: vec2f;
321
- var xY: vec2f;
322
- var xZ: vec2f;
320
+ var yA: vec2f;
321
+ var yB: vec2f;
322
+ var yC: vec2f;
323
323
 
324
324
  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
- xX = gU(uvProjection, p_a - (_nA * b.x + _nB * b.y + _nC * b.z) * wk, NA) * uvScale;
329
- xY = gU(uvProjection, p_b - (_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx)) * wk, NB) * uvScale;
330
- xZ = gU(uvProjection, p_c - (_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby)) * wk, NC) * uvScale;
328
+ yA = gE(uvProjection, p_a - (_nA * b.x + _nB * b.y + _nC * b.z) * wG, NA) * uvScale;
329
+ yB = gE(uvProjection, p_b - (_nA * (b.x + dbx) + _nB * b.y + _nC * (b.z - dbx)) * wG, NB) * uvScale;
330
+ yC = gE(uvProjection, p_c - (_nA * b.x + _nB * (b.y + dby) + _nC * (b.z - dby)) * wG, NC) * uvScale;
331
331
  }
332
332
  else {
333
- xX = xm * b.x + xn * b.y + xo * b.z;
334
- xY = xm * (b.x + dbx) + xn * b.y + xo * (b.z - dbx);
335
- xZ = xm * b.x + xn * (b.y + dby) + xo * (b.z - dby);
333
+ yA = xQ * b.x + xR * b.y + xS * b.z;
334
+ yB = xQ * (b.x + dbx) + xR * b.y + xS * (b.z - dbx);
335
+ yC = xQ * b.x + xR * (b.y + dby) + xS * (b.z - dby);
336
336
  }
337
337
 
338
- let s_a = p_a + sg * N * sampleMap(ku, xX).x * hScale;
339
- let s_b = p_b + sg * N * sampleMap(ku, xY).x * hScale;
340
- let s_c = p_c + sg * N * sampleMap(ku, xZ).x * hScale;
338
+ let s_a = p_a + sb * N * sampleMap(jW, yA).x * hScale;
339
+ let s_b = p_b + sb * N * sampleMap(jW, yB).x * hScale;
340
+ let s_c = p_c + sb * N * sampleMap(jW, yC).x * hScale;
341
341
 
342
- let N_s = -sg * normalize(cross(s_c - s_a, s_b - s_a));
342
+ let N_s = -sb * normalize(cross(s_c - s_a, s_b - s_a));
343
343
 
344
344
  result.t = t;
345
345
  result.barycentric = b;
346
- result.normal = normalize(N_s - uC + sg * N);
346
+ result.normal = normalize(N_s - uG + sb * N);
347
347
  }
348
348
 
349
349
  return result;
@@ -4,13 +4,13 @@
4
4
  export default /* wgsl */ `
5
5
  var<private> s0: vec4u;
6
6
 
7
- fn gW(p: vec2u, frame: i32) {
7
+ fn fi(p: vec2u, frame: i32) {
8
8
 
9
9
  s0 = vec4u(p, u32(frame), u32(p.x) + u32(p.y));
10
10
  }
11
11
 
12
12
 
13
- fn xd() {
13
+ fn xF() {
14
14
  s0 = s0 * 1664525u + 1013904223u;
15
15
  s0.x += s0.y*s0.w; s0.y += s0.z*s0.x; s0.z += s0.x*s0.y; s0.w += s0.y*s0.z;
16
16
  s0 = s0 ^ (s0>>vec4(16u));
@@ -18,7 +18,7 @@ s0.x += s0.y*s0.w; s0.y += s0.z*s0.x; s0.z += s0.x*s0.y; s0.w += s0.y*s0.z;
18
18
  }
19
19
 
20
20
  fn rand() -> f32 {
21
- xd(); return f32(s0.x)/f32(0xffffffffu);
21
+ xF(); return f32(s0.x)/f32(0xffffffffu);
22
22
  }
23
23
 
24
24
  `;
@@ -1,6 +1,7 @@
1
- export default function rayTraceCore({ hasAnisotropyDirections, hasCoatNormals, hasSceneAlpha, lightCapabilities }: {
1
+ export default function rayTraceCore({ hasAnisotropyDirections, hasCoatNormals, hasSceneAlpha, caustics, lightCapabilities }: {
2
2
  hasAnisotropyDirections?: boolean;
3
3
  hasCoatNormals?: boolean;
4
4
  hasSceneAlpha?: boolean;
5
+ caustics?: boolean;
5
6
  lightCapabilities?: number;
6
7
  }): string;
@@ -2,7 +2,7 @@ import { materialBufferWgsl } from '../../materialLayoutSchema.js';
2
2
  import { ALL_LIGHT_SHADER_CAPABILITIES, LIGHT_SHADER_CAPABILITIES } from '../../shaderCapabilities.js';
3
3
  import { ShadowCatcherMaterial, UnlitMaterial } from '../../../constants.js';
4
4
  import { CONSTANT_DIRECTIONAL_LIGHT, CONSTANT_RECT_LIGHT, CONSTANT_SPHERE_LIGHT, CONSTANT_SPOT_LIGHT } from '../../lightConstants.js';
5
- export default function rayTraceCore({ hasAnisotropyDirections = true, hasCoatNormals = false, hasSceneAlpha = true, lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES }) {
5
+ export default function rayTraceCore({ hasAnisotropyDirections = true, hasCoatNormals = false, hasSceneAlpha = true, caustics = false, lightCapabilities = ALL_LIGHT_SHADER_CAPABILITIES }) {
6
6
  return /*wgsl*/ `
7
7
 
8
8
  const luminance = vec3f(0.2126, 0.7152, 0.0722);
@@ -62,6 +62,8 @@ barycentrics: vec2f,
62
62
 
63
63
  wavelength: f32,
64
64
 
65
+ spectralChannel: i32,
66
+
65
67
  mediumType: i32,
66
68
  mediumExtinction: vec3f,
67
69
  mediumScattering: vec3f,
@@ -81,7 +83,9 @@ specularAnisotropy: f32,
81
83
 
82
84
  baseMetalness: f32,
83
85
  specularIor: f32,
84
- specularRoughness: f32,
86
+ specularRoughness: f32,${caustics ? /* wgsl */ `
87
+ causticRoughness: f32,
88
+ causticNormalMapped: bool,` : ''}
85
89
 
86
90
  transmissionDispersionScale: f32,
87
91
  dispersionAbbeNumber: f32,
@@ -153,7 +157,13 @@ fromEye: bool,
153
157
  abort: bool,
154
158
  scatteringPdf: f32,
155
159
  scatteringIsDelta: bool,
156
- isNextRefraction: bool,
160
+ isNextRefraction: bool,${caustics ? /* wgsl */ `
161
+ causticK: u32,
162
+ causticSingleT: bool,
163
+ causticReceiverPrimary: bool,
164
+ causticHasReceiver: bool,
165
+ causticPhotonReceiver:bool,
166
+ causticMneeReceiver: bool,` : ''}
157
167
  };
158
168
 
159
169
  struct LightSampleRec {
@@ -209,7 +219,7 @@ secondaryUv1: vec2f,
209
219
  secondaryUv2: vec2f,
210
220
  };
211
221
 
212
- struct qb {
222
+ struct pW {
213
223
  probability: f32,
214
224
  aliasIndex: i32,
215
225
  sourceType: i32,
@@ -283,15 +293,15 @@ backgroundMapRotation: mat4x4f,
283
293
  @group(1) @binding(9) var openPbrEnergyLut: texture_2d<f32>;
284
294
  @group(1) @binding(10) var adaptiveSampleTargets: texture_2d<f32>;
285
295
 
286
- fn cS(el: i32, mc: i32) -> f32 {
287
- let iK = el + mc / 4;
296
+ fn cF(dV: i32, lK: i32) -> f32 {
297
+ let im = dV + lK / 4;
288
298
  let width = rtUniform.lightSamplingTextureWidth;
289
- let packed = textureLoad(lightSamplingData, vec2i(iK % width, iK / width), 0);
290
- return packed[mc % 4];
299
+ let packed = textureLoad(lightSamplingData, vec2i(im % width, im / width), 0);
300
+ return packed[lK % 4];
291
301
  }
292
302
 
293
- fn lB(el: i32, uv: vec2f) -> f32 {
294
- if (el < 0) { return 1.0; }
303
+ fn ld(dV: i32, uv: vec2f) -> f32 {
304
+ if (dV < 0) { return 1.0; }
295
305
  let pixel = fract(uv) * 128.0 - vec2f(0.5);
296
306
  let x0 = i32(floor(pixel.x));
297
307
  let y0 = i32(floor(pixel.y));
@@ -301,26 +311,26 @@ let xa = select(x0, 127, x0 < 0);
301
311
  let xb = select(x0 + 1, 0, x0 >= 127);
302
312
  let ya = select(y0, 127, y0 < 0);
303
313
  let yb = select(y0 + 1, 0, y0 >= 127);
304
- let a = cS(el, ya * 128 + xa);
305
- let b = cS(el, ya * 128 + xb);
306
- let c = cS(el, yb * 128 + xa);
307
- let d = cS(el, yb * 128 + xb);
314
+ let a = cF(dV, ya * 128 + xa);
315
+ let b = cF(dV, ya * 128 + xb);
316
+ let c = cF(dV, yb * 128 + xa);
317
+ let d = cF(dV, yb * 128 + xb);
308
318
  return mix(mix(a, b, fx), mix(c, d, fx), fy);
309
319
  }
310
320
 
311
- fn bP(light: Light, dV: vec3f) -> f32 {
321
+ fn evaluateSpotEmissionMultiplier(light: Light, dI: vec3f) -> f32 {
312
322
  let axis = normalize(light.u);
313
- let ci = dot(axis, dV);
314
- var vm = select(0.0, 1.0, ci >= light.v.x);
323
+ let ct = dot(axis, dI);
324
+ var vw = select(0.0, 1.0, ct >= light.v.x);
315
325
  if (light.v.y > light.v.x + 1e-6) {
316
- vm = smoothstep(light.v.x, light.v.y, ci);
326
+ vw = smoothstep(light.v.x, light.v.y, ct);
317
327
  }
318
- if (vm <= 0.0 || light.textureIndex < 0.0) { return vm; }
319
- let vK = light.iesReference;
320
- let xj = cross(axis, vK);
321
- let vertical = acos(clamp(ci, -1.0, 1.0));
322
- let horizontal = atan2(dot(dV, xj), dot(dV, vK));
323
- return vm * lB(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));
328
+ if (vw <= 0.0 || light.textureIndex < 0.0) { return vw; }
329
+ let vX = light.iesReference;
330
+ let xN = cross(axis, vX);
331
+ let vertical = acos(clamp(ct, -1.0, 1.0));
332
+ let horizontal = atan2(dot(dI, xN), dot(dI, vX));
333
+ return vw * ld(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI + 0.5));
324
334
  }
325
335
 
326
336
 
@@ -332,7 +342,7 @@ return vm * lB(i32(light.textureIndex), vec2f(vertical / PI, horizontal / TWOPI
332
342
  @group(2) @binding(2) var<uniform> analyticLights: array<Light, NUM_UNIFORM_LIGHTS>;
333
343
 
334
344
 
335
- fn gC(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {
345
+ fn initRay(ray: ptr<function, Ray>, origin: vec3f, direction: vec3f) {
336
346
  (*ray).o = origin;
337
347
  (*ray).d = direction;
338
348
  }