@meimu/mutracer 0.1.2 → 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 (68) hide show
  1. package/dist/assets/bvh.worker.js +1 -1
  2. package/dist/mutracer.umd.js +3429 -3390
  3. package/lib/oidn.d.ts +1 -1
  4. package/lib/oidnBundledWeights.cdn.d.ts +2 -2
  5. package/lib/renderer/WGPUBloomPass.js +18 -18
  6. package/lib/renderer/WGPUFullQuadPass.js +3 -3
  7. package/lib/renderer/WGPUJNLMDenoiser.js +62 -62
  8. package/lib/renderer/WGPURayTraceOutput.js +14 -12
  9. package/lib/renderer/WGPURayTraceOutput.js.map +1 -1
  10. package/lib/renderer/WGPURayTracePass.js +1 -1
  11. package/lib/renderer/WGPURayTracePass.js.map +1 -1
  12. package/lib/renderer/WGPURenderingPipeline.js +20 -18
  13. package/lib/renderer/WGPURenderingPipeline.js.map +1 -1
  14. package/lib/renderer/WebGLJNLMDenoiser.js +61 -61
  15. package/lib/renderer/WebGLRayTraceOutputPass.js +4 -4
  16. package/lib/renderer/glsl/chunks/cameraRay.glsl.js +9 -9
  17. package/lib/renderer/glsl/chunks/envMap.glsl.js +45 -45
  18. package/lib/renderer/glsl/chunks/intersect.glsl.js +262 -262
  19. package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +111 -111
  20. package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +436 -436
  21. package/lib/renderer/glsl/chunks/rand.glsl.js +3 -3
  22. package/lib/renderer/glsl/chunks/random.glsl.js +3 -3
  23. package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +32 -32
  24. package/lib/renderer/glsl/chunks/sampleLight.glsl.js +54 -54
  25. package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +71 -71
  26. package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +12 -12
  27. package/lib/renderer/glsl/chunks/sampling.glsl.js +64 -64
  28. package/lib/renderer/glsl/chunks/sobol.glsl.js +49 -49
  29. package/lib/renderer/glsl/chunks/textureLinear.glsl.js +5 -5
  30. package/lib/renderer/glsl/chunks/uvProjection.glsl.js +5 -5
  31. package/lib/renderer/glsl/depthQuery.frag.js +2 -2
  32. package/lib/renderer/glsl/normalizeRayTraceOutput.frag.js +8 -8
  33. package/lib/renderer/glsl/rayTrace.frag.js +128 -128
  34. package/lib/renderer/glsl/shadowCatcher.frag.js +12 -12
  35. package/lib/renderer/glsl/webglPipeline.frag.js +49 -49
  36. package/lib/renderer/lightsUtil.js +1 -1
  37. package/lib/renderer/lightsUtil.js.map +1 -1
  38. package/lib/renderer/scratchSampling.js +6 -6
  39. package/lib/renderer/wgsl/chunks/common.wgsl.js +4 -4
  40. package/lib/renderer/wgsl/chunks/envMap.wgsl.js +29 -29
  41. package/lib/renderer/wgsl/chunks/intersect.wgsl.js +368 -368
  42. package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +5 -5
  43. package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +51 -51
  44. package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +453 -453
  45. package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +116 -116
  46. package/lib/renderer/wgsl/chunks/rand.wgsl.js +3 -3
  47. package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +13 -13
  48. package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +94 -94
  49. package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +119 -119
  50. package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +5 -5
  51. package/lib/renderer/wgsl/chunks/sampling.wgsl.js +62 -62
  52. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.d.ts +3 -3
  53. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js +2 -2
  54. package/lib/renderer/wgsl/chunks/shadowCatcherAccumulation.wgsl.js.map +1 -1
  55. package/lib/renderer/wgsl/chunks/sobol.wgsl.js +53 -53
  56. package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +5 -5
  57. package/lib/renderer/wgsl/compose.frag.wgsl.d.ts +2 -2
  58. package/lib/renderer/wgsl/compose.frag.wgsl.js +120 -92
  59. package/lib/renderer/wgsl/compose.frag.wgsl.js.map +1 -1
  60. package/lib/renderer/wgsl/customDenoise.wgsl.js +10 -10
  61. package/lib/renderer/wgsl/depthQuery.wgsl.js +3 -3
  62. package/lib/renderer/wgsl/offlineAdaptive.compute.js +26 -26
  63. package/lib/renderer/wgsl/rayTrace.compute.js +220 -211
  64. package/lib/renderer/wgsl/rayTrace.compute.js.map +1 -1
  65. package/lib/version.d.ts +1 -1
  66. package/lib/version.js +1 -1
  67. package/lib/version.js.map +1 -1
  68. package/package.json +5 -4
@@ -7,22 +7,22 @@ export const brightFragment = new FragmentShader({
7
7
  scale: Shader.uniform('float', 1)
8
8
  },
9
9
  main: glsl `
10
- const vec3 uE = vec3(0.2125, 0.7154, 0.0721);
11
- vec4 sm(vec4 a, vec4 b, vec4 c) {
10
+ const vec3 uJ = vec3(0.2125, 0.7154, 0.0721);
11
+ vec4 st(vec4 a, vec4 b, vec4 c) {
12
12
  return a + b + c - min(min(a, b), c) - max(max(a, b), c);
13
13
  }
14
14
  void main() {
15
15
  vec2 d = 1.0 / vec2(colorTexRegion());
16
- vec4 iW = sample_colorTex(v_Texcoord);
16
+ vec4 iX = sample_colorTex(v_Texcoord);
17
17
  vec4 s1 = sample_colorTex(v_Texcoord - vec2(d.x, 0.0));
18
18
  vec4 s2 = sample_colorTex(v_Texcoord + vec2(d.x, 0.0));
19
19
  vec4 s3 = sample_colorTex(v_Texcoord - vec2(0.0, d.y));
20
20
  vec4 s4 = sample_colorTex(v_Texcoord + vec2(0.0, d.y));
21
- iW = sm(sm(iW, s1, s2), s3, s4);
22
- float lum = dot(iW.rgb, uE);
23
- out_color = lum > threshold && iW.a > 0.0
24
- ? vec4(iW.rgb * scale, iW.a)
25
- : vec4(0.0, 0.0, 0.0, iW.a);
21
+ iX = st(st(iX, s1, s2), s3, s4);
22
+ float lum = dot(iX.rgb, uJ);
23
+ out_color = lum > threshold && iX.a > 0.0
24
+ ? vec4(iX.rgb * scale, iX.a)
25
+ : vec4(0.0, 0.0, 0.0, iX.a);
26
26
  }`
27
27
  });
28
28
  export const composeFragment = new FragmentShader({
@@ -48,35 +48,35 @@ export const composeFragment = new FragmentShader({
48
48
  sRGBOutput: Shader.uniform('bool', 1)
49
49
  },
50
50
  main: glsl `
51
- vec3 jL(vec3 color) {
51
+ vec3 jN(vec3 color) {
52
52
  return clamp(color, 0.0, 1.0);
53
53
  }
54
- vec3 iJ(vec3 color) {
54
+ vec3 iK(vec3 color) {
55
55
  return clamp(color / (vec3(1.0) + color), 0.0, 1.0);
56
56
  }
57
- vec3 jC(vec3 color) {
57
+ vec3 jE(vec3 color) {
58
58
  color = max(vec3(0.0), color - 0.004);
59
59
  return pow((color * (6.2 * color + 0.5)) /
60
60
  (color * (6.2 * color + 1.7) + 0.06), vec3(2.2));
61
61
  }
62
- vec3 ox(vec3 value) {
63
- vec3 kC = value * (value + 0.0245786) - 0.000090537;
62
+ vec3 oA(vec3 value) {
63
+ vec3 kF = value * (value + 0.0245786) - 0.000090537;
64
64
  vec3 ap = value * (0.983729 * value + 0.4329510) + 0.238081;
65
- return kC / ap;
65
+ return kF / ap;
66
66
  }
67
- vec3 lh(vec3 color) {
68
- const mat3 pj = mat3(
67
+ vec3 ll(vec3 color) {
68
+ const mat3 pn = mat3(
69
69
  vec3(0.59719, 0.07600, 0.02840),
70
70
  vec3(0.35458, 0.90834, 0.13383),
71
71
  vec3(0.04823, 0.01566, 0.83777)
72
72
  );
73
- const mat3 os = mat3(
73
+ const mat3 ov = mat3(
74
74
  vec3(1.60475, -0.10208, -0.00327),
75
75
  vec3(-0.53108, 1.10813, -0.07276),
76
76
  vec3(-0.07367, -0.00605, 1.07602)
77
77
  );
78
- color = pj * (color / 0.6);
79
- return clamp(os * ox(color), 0.0, 1.0);
78
+ color = pn * (color / 0.6);
79
+ return clamp(ov * oA(color), 0.0, 1.0);
80
80
  }
81
81
  const mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(
82
82
  vec3(1.6605, -0.1246, -0.0182),
@@ -89,43 +89,43 @@ vec3(0.3293, 0.9195, 0.0880),
89
89
  vec3(0.0433, 0.0113, 0.8956)
90
90
  );
91
91
  vec3 fP(vec3 value) {
92
- vec3 mB = value * value;
93
- vec3 qy = mB * mB;
94
- return 15.5 * qy * mB - 40.14 * qy * value
95
- + 31.96 * qy - 6.868 * mB * value
96
- + 0.4298 * mB + 0.1191 * value - 0.00232;
92
+ vec3 mE = value * value;
93
+ vec3 qC = mE * mE;
94
+ return 15.5 * qC * mE - 40.14 * qC * value
95
+ + 31.96 * qC - 6.868 * mE * value
96
+ + 0.4298 * mE + 0.1191 * value - 0.00232;
97
97
  }
98
- vec3 lP(vec3 color) {
99
- const mat3 pl = mat3(
98
+ vec3 lS(vec3 color) {
99
+ const mat3 pp = mat3(
100
100
  vec3(0.856627153315983, 0.137318972929847, 0.11189821299995),
101
101
  vec3(0.0951212405381588, 0.761241990602591, 0.0767994186031903),
102
102
  vec3(0.0482516061458583, 0.101439036467562, 0.811302368396859)
103
103
  );
104
- const mat3 ot = mat3(
104
+ const mat3 ow = mat3(
105
105
  vec3(1.1271005818144368, -0.1413297634984383, -0.14132976349843826),
106
106
  vec3(-0.11060664309660323, 1.157823702216272, -0.11060664309660294),
107
107
  vec3(-0.016493938717834573, -0.016493938717834257, 1.2519364065950405)
108
108
  );
109
- color = pl * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);
109
+ color = pp * (LINEAR_SRGB_TO_LINEAR_REC2020 * color);
110
110
  color = clamp((log2(max(color, 1e-10)) + 12.47393) / 16.5, 0.0, 1.0);
111
- color = ot * fP(color);
111
+ color = ow * fP(color);
112
112
  color = pow(max(color, 0.0), vec3(2.2));
113
113
  return clamp(LINEAR_REC2020_TO_LINEAR_SRGB * color, 0.0, 1.0);
114
114
  }
115
- vec3 cH(vec3 color) {
116
- if (toneMappingMode == 1) return lh(color);
117
- if (toneMappingMode == 2) return jC(color);
118
- if (toneMappingMode == 3) return iJ(color);
119
- if (toneMappingMode == 4) return jL(color);
120
- return lP(color);
115
+ vec3 cl(vec3 color) {
116
+ if (toneMappingMode == 1) return ll(color);
117
+ if (toneMappingMode == 2) return jE(color);
118
+ if (toneMappingMode == 3) return iK(color);
119
+ if (toneMappingMode == 4) return jN(color);
120
+ return lS(color);
121
121
  }
122
- vec3 gS(vec3 color) {
123
- vec3 sW = vec3(
122
+ vec3 fX(vec3 color) {
123
+ vec3 tb = vec3(
124
124
  1.0 + temperature * 0.16 + tint * 0.04,
125
125
  1.0 - tint * 0.12,
126
126
  1.0 - temperature * 0.16 + tint * 0.04
127
127
  );
128
- color = max(color * sW, 0.0);
128
+ color = max(color * tb, 0.0);
129
129
  color = max((color - 0.18) * contrast + 0.18, 0.0);
130
130
  float luminance = dot(color, vec3(0.2126, 0.7152, 0.0722));
131
131
  return max(mix(vec3(luminance), color, saturation), 0.0);
@@ -141,11 +141,11 @@ return;
141
141
  vec4 color = sample_colorTex(uv);
142
142
  vec4 bloom = sample_bloomTex(uv) * bloomIntensity;
143
143
  color.rgb += bloom.rgb;
144
- color.rgb = gS(color.rgb * exposure);
144
+ color.rgb = fX(color.rgb * exposure);
145
145
  if (sRGBOutput) {
146
146
  float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));
147
147
  color.rgb *= 1.0 - vignette * edge;
148
- color.rgb = cH(color.rgb);
148
+ color.rgb = cl(color.rgb);
149
149
  color.rgb = pow(max(color.rgb, 0.0), vec3(1.0 / 2.2));
150
150
  }
151
151
  color.a = max(color.a, min(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 1.0));
@@ -161,24 +161,24 @@ fO = max(fO - (1.0 - shadowCatcherAlpha), 0.0);
161
161
  if (coverage > 0.0) {
162
162
  vec4 foreground = sample_foregroundTex(uv);
163
163
  vec4 background = sample_catcherBackgroundTex(uv);
164
- vec3 bK = gS((foreground.rgb + bloom.rgb) * exposure);
165
- vec3 backgroundColor = gS((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);
164
+ vec3 bK = fX((foreground.rgb + bloom.rgb) * exposure);
165
+ vec3 backgroundColor = fX((background.rgb / max(background.a, 0.000001) + bloom.rgb) * exposure);
166
166
  if (sRGBOutput) {
167
167
  float edge = smoothstep(0.2, 0.72, distance(uv, vec2(0.5)));
168
168
  bK *= 1.0 - vignette * edge;
169
169
  backgroundColor *= 1.0 - vignette * edge;
170
- bK = pow(max(cH(bK), 0.0), vec3(1.0 / 2.2));
171
- backgroundColor = pow(max(cH(backgroundColor), 0.0), vec3(1.0 / 2.2));
170
+ bK = pow(max(cl(bK), 0.0), vec3(1.0 / 2.2));
171
+ backgroundColor = pow(max(cl(backgroundColor), 0.0), vec3(1.0 / 2.2));
172
172
  }
173
173
 
174
174
  float opacity = fO;
175
175
  fO *= coverage;
176
- float lR = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
177
- float hr = max(foreground.a, lR * (1.0 - coverage));
178
- float hg = max(background.a, lR * coverage);
179
- float alpha = hr + hg * (1.0 - opacity) + fO;
176
+ float lU = clamp(dot(bloom.rgb, vec3(0.2125, 0.7154, 0.0721)), 0.0, 1.0);
177
+ float hr = max(foreground.a, lU * (1.0 - coverage));
178
+ float iZ = max(background.a, lU * coverage);
179
+ float alpha = hr + iZ * (1.0 - opacity) + fO;
180
180
  vec3 premultiplied = bK * hr
181
- + backgroundColor * hg * (1.0 - opacity)
181
+ + backgroundColor * iZ * (1.0 - opacity)
182
182
  + shadowCatcherColor * fO;
183
183
  color = vec4(premultiplied / max(alpha, 0.000001), alpha);
184
184
  }
@@ -31,7 +31,7 @@ export function packLightsToBuffer(lights, texturesIndices, selectionPmfs = [],
31
31
  packVec3(off + 2, getRectLightUOrV(light, 0));
32
32
  data[(off + 2) * 4 + 3] = light.spread;
33
33
  packVec3(off + 3, getRectLightUOrV(light, 1));
34
- data[(off + 3) * 4 + 3] = texturesIndices[i];
34
+ data[(off + 3) * 4 + 3] = texturesIndices[i] ?? -1;
35
35
  packVec3(off + 4, [
36
36
  light.spread,
37
37
  getRectLightArea(light),
@@ -1 +1 @@
1
- {"version":3,"file":"lightsUtil.js","sourceRoot":"","sources":["../../src/renderer/lightsUtil.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,MAAM,UAAU,kBAAkB,CAChC,MAAkE,EAClE,eAAyB,EACzB,gBAAmC,EAAE,EACrC,gBAAmC,EAAE,EACrC,yBAA4C,EAAE;IAE9C,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC5B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;IAChC,MAAM,gBAAgB,GAAG,CAAC,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,SAAS,GAAG,gBAAgB,GAAG,CAAC,CAAC,CAAC;IAEhE,SAAS,QAAQ,CAAC,GAAW,EAAE,CAA0B;QACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,IAAI,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;QAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,MAAM,GAAG,GAAG,CAAC,GAAG,gBAAgB,CAAC;QACjC,QAAQ,CACN,GAAG,EACH,KAAK,CAAC,QAAQ,CACf,CAAC;QACF,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACnE,WAAW;QACX,MAAM,aAAa,GACjB,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;YAChB,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa;YACxB,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa;YACxB,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa;SACzB,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,SAAS,CAAC;QAClE,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC;YACvC,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9C,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC7C,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;gBAChB,KAAK,CAAC,MAAM;gBACZ,gBAAgB,CAAC,KAAK,CAAC;gBACvB,mBAAmB;aACpB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;gBAChB,KAAK,CAAC,MAAM;gBACZ,kBAAkB,CAAC,KAAK,CAAC;gBACzB,qBAAqB;aACtB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YACtC,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;gBAChB,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;gBAC5C,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;gBACjE,CAAC;aACF,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1D,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE;gBAChB,KAAK,CAAC,MAAM;gBACZ,gBAAgB,CAAC,KAAK,CAAC;gBACvB,mBAAmB;aACpB,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC7C,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5C,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,0BAA0B,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,SAAS,GAAG,CAAC,CAAO,EAAE,QAAc,EAAQ,EAAE;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,GAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC7E,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;IAChD,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,CAAC,GAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAC,UAAU,GAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,GAAC,UAAU,GAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,GAAC,UAAU,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;QAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;IACnF,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAS,CAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,GAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAS,EAAE,CAAC;AACzE,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,KAAoB,IAAI,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;AACvG,MAAM,UAAU,gBAAgB,CAAC,KAAgB,EAAE,IAAW;IAC5D,MAAM,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IACzE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,EAAC,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,EAAC,IAAI,CAAC,CAAC,CAAC,GAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,KAAgB,IAAI,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;AAEjF,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC7C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAkB;IACjD,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAgB;IAC7C,OAAO,CAAC,GAAG,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAgB;IACjD,yEAAyE;IACzE,qEAAqE;IACrE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,SAAS,CAAC;IAC/C,OAAO,KAAK,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAAgB;IAC1D,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CACvB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC,CACrD,CAAC;IACF,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC;AAC3D,CAAC;AAED,MAAM,YAAY,GAAG,IAAI,OAAO,EAAc,CAAC;AAC/C,kGAAkG;AAClG,MAAM,UAAU,mBAAmB,CAAC,MAA6B,EAAE,OAAgC;IACjG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB;YAAE,SAAS;QAChD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,EAAE,GAAW,EAAE,QAAgB,EAAE,EAAE;YAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;YACzF,OAAO,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,EAAC,KAAK,CAAC,CAAC;YACzC,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC;QACF,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,EAAC,CAAC,EAAC,MAAM,CAAC,SAAS,EAAC,CAAC,CAAC,CAAC;QAC9D,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE;YAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,MAAM,CAAC,SAAS,EAAC,CAAC,CAAC,CAAC;QAChF,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;YAClC,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,EAAE,EAAC,CAAC,EAAE;gBAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC/D,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBAAC,OAAO,GAAG,IAAI,CAAC;gBAC3D,CAAC;QACH,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,KAAI,IAAI,CAAC,GAAC,CAAC,EAAC,CAAC,GAAC,CAAC,EAAC,CAAC,EAAE;gBAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAC,CAAC,EAAC,MAAM,CAAC,SAAS,EAAC,CAAC,CAAC,CAAC;YAC9E,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAC,CAAC,EAAC,CAAC,EAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW;YAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAC,CAAC,EAAC,MAAM,CAAC,SAAS,EAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3J,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAC,MAAM,CAAC,OAAO,EAAC,GAAG,EAAC,EAAE,CAAC,CAAC;YACjE,KAAK,CAAC,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,UAAU,EAAC,CAAC,EAAC,KAAK,CAAC,UAAU,EAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACxC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,KAAK,CAAC,IAAI,uBAAuB,CAAC,CAAC;YACtE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import type { SceneLight, AnalyticLight } from '../scene/Scene.js';\nimport type { Vec3 } from '../types.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\n\nexport const CONSTANT_DIRECTIONAL_LIGHT = 1;\nexport const CONSTANT_SPHERE_LIGHT = 2;\nexport const CONSTANT_RECT_LIGHT = 3;\nexport const CONSTANT_SPOT_LIGHT = 4;\n\nexport function packLightsToBuffer(\n lights: (DirectionalLight | RectLight | SphereLight | SpotLight)[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number> = [],\n selectionCdfs: ArrayLike<number> = [],\n iesProfileTexelOffsets: ArrayLike<number> = []\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n const PIXELS_PER_LIGHT = 6;\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3(idx: number, v: number[] | Float32Array) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = v[i];\n }\n }\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n light.position\n );\n data[off * 4 + 3] = selectionPmfs[i] ?? 1 / Math.max(numLights, 1);\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n data[(off + 1) * 4 + 3] = selectionCdfs[i] ?? (i + 1) / numLights;\n if (light.type === 'RectLight') {\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n data[(off + 3) * 4 + 3] = texturesIndices[i];\n packVec3(off + 4, [\n light.spread,\n getRectLightArea(light),\n CONSTANT_RECT_LIGHT\n ]);\n } else if (light.type === 'SphereLight') {\n packVec3(off + 4, [\n light.radius,\n getSphereLightArea(light),\n CONSTANT_SPHERE_LIGHT\n ]);\n } else if (light.type === 'SpotLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.min(1, Math.max(0, 1 - light.innerAngle / light.outerAngle)),\n 0\n ]);\n data[(off + 3) * 4 + 3] = iesProfileTexelOffsets[i] ?? -1;\n packVec3(off + 4, [\n light.radius,\n getSpotLightArea(light),\n CONSTANT_SPOT_LIGHT\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 4, [0, 0, CONSTANT_DIRECTIONAL_LIGHT]);\n }\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n\nexport function getRigidLightFrame(light: AnalyticLight) {\n const m = light.transform;\n const normalize = (v: Vec3, fallback: Vec3): Vec3 => {\n const length = Math.hypot(v[0], v[1], v[2]);\n return length > 1e-12 ? [v[0]/length, v[1]/length, v[2]/length] : fallback;\n };\n const z = normalize([m[8],m[9],m[10]], [0,0,1]);\n const projection = m[0]*z[0] + m[1]*z[1] + m[2]*z[2];\n let x: Vec3 = [m[0]-projection*z[0],m[1]-projection*z[1],m[2]-projection*z[2]];\n if (Math.hypot(...x) <= 1e-12) x = Math.abs(z[1]) < .99 ? [z[2],0,-z[0]] : [1,0,0];\n x = normalize(x, [1,0,0]);\n const y: Vec3 = [z[1]*x[2]-z[2]*x[1], z[2]*x[0]-z[0]*x[2], z[0]*x[1]-z[1]*x[0]];\n return { x, y, direction: [-z[0] || 0,-z[1] || 0,-z[2] || 0] as Vec3 };\n}\nexport function getLightDirection(light: AnalyticLight) { return getRigidLightFrame(light).direction; }\nexport function getRectLightUOrV(light: RectLight, uOrV: 0 | 1) {\n const frame = getRigidLightFrame(light), axis = uOrV ? frame.y : frame.x;\n const size = light.size[uOrV] * (uOrV ? -1 : 1);\n return [axis[0]*size,axis[1]*size,axis[2]*size];\n}\nexport function getRectLightPosition(light: RectLight) { return light.position; }\n\nexport function getRectLightArea(light: RectLight) {\n return light.size[0] * light.size[1];\n}\n\nexport function getSphereLightArea(light: SphereLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightArea(light: SpotLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightRadiance(light: SpotLight) {\n // A zero-radius spot is a point emitter. Its stored emission is luminous\n // intensity (cd), and the shader applies inverse-square attenuation.\n if (light.radius === 0) return light.intensity;\n return light.intensity / (Math.PI * light.radius ** 2);\n}\n\nexport function getSpotLightShapingFluxFactor(light: SpotLight) {\n const cosConeAngle = Math.cos((light.outerAngle * Math.PI) / 180);\n const softness = Math.min(\n 1,\n Math.max(0, 1 - light.innerAngle / light.outerAngle)\n );\n return (1 - cosConeAngle) * (1 - 0.5 * softness) * 0.5;\n}\n\nconst warnedLights = new WeakSet<SceneLight>();\n/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */\nexport function validateSceneLights(lights: readonly SceneLight[], onError?: (error: Error) => void) {\n for (const light of lights) {\n if (light.type === 'EnvironmentLight') continue;\n let invalid = false;\n const clamp = (value: number, min: number, max: number, fallback: number) => {\n const normalized = Math.min(max,Math.max(min,Number.isFinite(value) ? value : fallback));\n invalid ||= !Object.is(normalized,value);\n return normalized;\n };\n light.intensity = clamp(light.intensity,0,Number.MAX_VALUE,1);\n for(let i=0;i<3;i++)light.color[i] = clamp(light.color[i],0,Number.MAX_VALUE,1);\n if (light.type !== 'AmbientLight') {\n for(let i=0;i<16;i++) if (!Number.isFinite(light.transform[i])) {\n light.transform[i] = i % 5 === 0 ? 1 : 0; invalid = true;\n }\n }\n if (light.type === 'RectLight') {\n for(let i=0;i<2;i++)light.size[i] = clamp(light.size[i],0,Number.MAX_VALUE,1);\n light.spread = clamp(light.spread,0,1,1);\n }\n if (light.type === 'SphereLight' || light.type === 'SpotLight') light.radius = clamp(light.radius,0,Number.MAX_VALUE,light.type === 'SpotLight' ? .01 : 1);\n if (light.type === 'SpotLight') {\n light.outerAngle = clamp(light.outerAngle,Number.EPSILON,180,45);\n light.innerAngle = clamp(light.innerAngle,0,light.outerAngle,30);\n }\n if (invalid && !warnedLights.has(light)) {\n warnedLights.add(light);\n const error = new Error(`Invalid ${light.type} values were clamped.`);\n console.warn(error.message);\n onError?.(error);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"lightsUtil.js","sourceRoot":"","sources":["../../src/renderer/lightsUtil.ts"],"names":[],"mappings":"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","sourcesContent":["import type { SceneLight, AnalyticLight } from '../scene/Scene.js';\nimport type { Vec3 } from '../types.js';\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\n\nexport const CONSTANT_DIRECTIONAL_LIGHT = 1;\nexport const CONSTANT_SPHERE_LIGHT = 2;\nexport const CONSTANT_RECT_LIGHT = 3;\nexport const CONSTANT_SPOT_LIGHT = 4;\n\nexport function packLightsToBuffer(\n lights: (DirectionalLight | RectLight | SphereLight | SpotLight)[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number> = [],\n selectionCdfs: ArrayLike<number> = [],\n iesProfileTexelOffsets: ArrayLike<number> = []\n) {\n validateSceneLights(lights);\n const numLights = lights.length;\n const PIXELS_PER_LIGHT = 6;\n const data = new Float32Array(numLights * PIXELS_PER_LIGHT * 4);\n\n function packVec3(idx: number, v: number[] | Float32Array) {\n for (let i = 0; i < 3; i++) {\n data[i + idx * 4] = v[i];\n }\n }\n\n for (let i = 0; i < numLights; i++) {\n const light = lights[i];\n const color = light.color;\n const intensity = light.intensity;\n const off = i * PIXELS_PER_LIGHT;\n packVec3(\n off,\n light.position\n );\n data[off * 4 + 3] = selectionPmfs[i] ?? 1 / Math.max(numLights, 1);\n // emission\n const emissionScale =\n light.type === 'SpotLight' ? getSpotLightRadiance(light) : intensity;\n packVec3(off + 1, [\n color[0] * emissionScale,\n color[1] * emissionScale,\n color[2] * emissionScale\n ]);\n data[(off + 1) * 4 + 3] = selectionCdfs[i] ?? (i + 1) / numLights;\n if (light.type === 'RectLight') {\n packVec3(off + 2, getRectLightUOrV(light, 0));\n data[(off + 2) * 4 + 3] = light.spread;\n packVec3(off + 3, getRectLightUOrV(light, 1));\n data[(off + 3) * 4 + 3] = texturesIndices[i] ?? -1;\n packVec3(off + 4, [\n light.spread,\n getRectLightArea(light),\n CONSTANT_RECT_LIGHT\n ]);\n } else if (light.type === 'SphereLight') {\n packVec3(off + 4, [\n light.radius,\n getSphereLightArea(light),\n CONSTANT_SPHERE_LIGHT\n ]);\n } else if (light.type === 'SpotLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 3, [\n Math.cos((light.outerAngle * Math.PI) / 180),\n Math.min(1, Math.max(0, 1 - light.innerAngle / light.outerAngle)),\n 0\n ]);\n data[(off + 3) * 4 + 3] = iesProfileTexelOffsets[i] ?? -1;\n packVec3(off + 4, [\n light.radius,\n getSpotLightArea(light),\n CONSTANT_SPOT_LIGHT\n ]);\n } else if (light.type === 'DirectionalLight') {\n packVec3(off + 2, getLightDirection(light));\n packVec3(off + 4, [0, 0, CONSTANT_DIRECTIONAL_LIGHT]);\n }\n packVec3(off + 5, getRigidLightFrame(light).x);\n }\n\n return data;\n}\n\nexport function getRigidLightFrame(light: AnalyticLight) {\n const m = light.transform;\n const normalize = (v: Vec3, fallback: Vec3): Vec3 => {\n const length = Math.hypot(v[0], v[1], v[2]);\n return length > 1e-12 ? [v[0]/length, v[1]/length, v[2]/length] : fallback;\n };\n const z = normalize([m[8],m[9],m[10]], [0,0,1]);\n const projection = m[0]*z[0] + m[1]*z[1] + m[2]*z[2];\n let x: Vec3 = [m[0]-projection*z[0],m[1]-projection*z[1],m[2]-projection*z[2]];\n if (Math.hypot(...x) <= 1e-12) x = Math.abs(z[1]) < .99 ? [z[2],0,-z[0]] : [1,0,0];\n x = normalize(x, [1,0,0]);\n const y: Vec3 = [z[1]*x[2]-z[2]*x[1], z[2]*x[0]-z[0]*x[2], z[0]*x[1]-z[1]*x[0]];\n return { x, y, direction: [-z[0] || 0,-z[1] || 0,-z[2] || 0] as Vec3 };\n}\nexport function getLightDirection(light: AnalyticLight) { return getRigidLightFrame(light).direction; }\nexport function getRectLightUOrV(light: RectLight, uOrV: 0 | 1) {\n const frame = getRigidLightFrame(light), axis = uOrV ? frame.y : frame.x;\n const size = light.size[uOrV] * (uOrV ? -1 : 1);\n return [axis[0]*size,axis[1]*size,axis[2]*size];\n}\nexport function getRectLightPosition(light: RectLight) { return light.position; }\n\nexport function getRectLightArea(light: RectLight) {\n return light.size[0] * light.size[1];\n}\n\nexport function getSphereLightArea(light: SphereLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightArea(light: SpotLight) {\n return 4 * Math.PI * light.radius ** 2;\n}\n\nexport function getSpotLightRadiance(light: SpotLight) {\n // A zero-radius spot is a point emitter. Its stored emission is luminous\n // intensity (cd), and the shader applies inverse-square attenuation.\n if (light.radius === 0) return light.intensity;\n return light.intensity / (Math.PI * light.radius ** 2);\n}\n\nexport function getSpotLightShapingFluxFactor(light: SpotLight) {\n const cosConeAngle = Math.cos((light.outerAngle * Math.PI) / 180);\n const softness = Math.min(\n 1,\n Math.max(0, 1 - light.innerAngle / light.outerAngle)\n );\n return (1 - cosConeAngle) * (1 - 0.5 * softness) * 0.5;\n}\n\nconst warnedLights = new WeakSet<SceneLight>();\n/** Sanitizes invalid mutable light values at the packing boundary; notifications are nonfatal. */\nexport function validateSceneLights(lights: readonly SceneLight[], onError?: (error: Error) => void) {\n for (const light of lights) {\n if (light.type === 'EnvironmentLight') continue;\n let invalid = false;\n const clamp = (value: number, min: number, max: number, fallback: number) => {\n const normalized = Math.min(max,Math.max(min,Number.isFinite(value) ? value : fallback));\n invalid ||= !Object.is(normalized,value);\n return normalized;\n };\n light.intensity = clamp(light.intensity,0,Number.MAX_VALUE,1);\n for(let i=0;i<3;i++)light.color[i] = clamp(light.color[i],0,Number.MAX_VALUE,1);\n if (light.type !== 'AmbientLight') {\n for(let i=0;i<16;i++) if (!Number.isFinite(light.transform[i])) {\n light.transform[i] = i % 5 === 0 ? 1 : 0; invalid = true;\n }\n }\n if (light.type === 'RectLight') {\n for(let i=0;i<2;i++)light.size[i] = clamp(light.size[i],0,Number.MAX_VALUE,1);\n light.spread = clamp(light.spread,0,1,1);\n }\n if (light.type === 'SphereLight' || light.type === 'SpotLight') light.radius = clamp(light.radius,0,Number.MAX_VALUE,light.type === 'SpotLight' ? .01 : 1);\n if (light.type === 'SpotLight') {\n light.outerAngle = clamp(light.outerAngle,Number.EPSILON,180,45);\n light.innerAngle = clamp(light.innerAngle,0,light.outerAngle,30);\n }\n if (invalid && !warnedLights.has(light)) {\n warnedLights.add(light);\n const error = new Error(`Invalid ${light.type} values were clamped.`);\n console.warn(error.message);\n onError?.(error);\n }\n }\n}\n"]}
@@ -11,10 +11,10 @@ return textureLoad(${name}, fM, level);
11
11
  ${samplers.map(sampler => /* wgsl */ `
12
12
  fn sample_${name}_${sampler}(fD: vec2f) -> vec4f {
13
13
  ${scratch ? /* wgsl */ `
14
- let jT = textureDimensions(${name});
15
- if (all(jT == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, fD, 0.0); }
14
+ let jV = textureDimensions(${name});
15
+ if (all(jV == ${name}Region())) { return textureSampleLevel(${name}, ${sampler}, fD, 0.0); }
16
16
  let fM = clamp(fD * vec2f(${name}Region()), vec2f(0.5), vec2f(${name}Region()) - vec2f(0.5));
17
- return textureSampleLevel(${name}, ${sampler}, fM / vec2f(jT), 0.0);`
17
+ return textureSampleLevel(${name}, ${sampler}, fM / vec2f(jV), 0.0);`
18
18
  : `return textureSample(${name}, ${sampler}, fD);`}
19
19
  }`).join('')}`).join('');
20
20
  }
@@ -29,10 +29,10 @@ return texelFetch(${name}, fM, level);
29
29
  }
30
30
  vec4 sample_${name}(vec2 fD) {
31
31
  ${scratch ? /* glsl */ `
32
- ivec2 jT = textureSize(${name}, 0);
33
- if (all(equal(jT, ${name}Region()))) return texture(${name}, fD);
32
+ ivec2 jV = textureSize(${name}, 0);
33
+ if (all(equal(jV, ${name}Region()))) return texture(${name}, fD);
34
34
  vec2 fM = clamp(fD * vec2(${name}Region()), vec2(0.5), vec2(${name}Region()) - vec2(0.5));
35
- return texture(${name}, fM / vec2(jT));`
35
+ return texture(${name}, fM / vec2(jV));`
36
36
  : `return texture(${name}, fD);`}
37
37
  }`).join('');
38
38
  }
@@ -11,12 +11,12 @@ const ROUGHNESS_MIN = 0.001;
11
11
 
12
12
 
13
13
 
14
- fn rD(position: vec3f, geometricNormal: vec3f, direction: vec3f) -> vec3f {
14
+ fn rI(position: vec3f, geometricNormal: vec3f, direction: vec3f) -> vec3f {
15
15
  let normal = select(-geometricNormal, geometricNormal, dot(geometricNormal, direction) >= 0.0);
16
- let pY = vec3i(256.0 * normal);
16
+ let qc = vec3i(256.0 * normal);
17
17
  let bits = bitcast<vec3i>(position);
18
- let vC = bitcast<vec3f>(bits + select(pY, -pY, position < vec3f(0.0)));
19
- return select(vC, position + normal / 65536.0, abs(position) < vec3f(1.0 / 32.0));
18
+ let vH = bitcast<vec3f>(bits + select(qc, -qc, position < vec3f(0.0)));
19
+ return select(vH, position + normal / 65536.0, abs(position) < vec3f(1.0 / 32.0));
20
20
  }
21
21
 
22
22
  `;
@@ -11,32 +11,32 @@ fn textureLinear(tex: texture_2d<f32>, _uv: vec2f) -> vec4f {
11
11
 
12
12
  let size = vec2f(textureDimensions(tex, 0));
13
13
 
14
- let wx = _uv * size - vec2f(0.5);
15
- let vH = floor(wx);
16
- let f = fract(wx);
17
- let vG = vec2i(vH);
14
+ let wF = _uv * size - vec2f(0.5);
15
+ let vM = floor(wF);
16
+ let f = fract(wF);
17
+ let vL = vec2i(vM);
18
18
  let maximum = vec2i(size) - vec2i(1);
19
19
 
20
20
 
21
- let s1 = textureLoad(tex, clamp(vG + vec2i(0, 0), vec2i(0), maximum), 0);
22
- let s2 = textureLoad(tex, clamp(vG + vec2i(1, 0), vec2i(0), maximum), 0);
23
- let s3 = textureLoad(tex, clamp(vG + vec2i(0, 1), vec2i(0), maximum), 0);
24
- let s4 = textureLoad(tex, clamp(vG + vec2i(1, 1), vec2i(0), maximum), 0);
21
+ let s1 = textureLoad(tex, clamp(vL + vec2i(0, 0), vec2i(0), maximum), 0);
22
+ let s2 = textureLoad(tex, clamp(vL + vec2i(1, 0), vec2i(0), maximum), 0);
23
+ let s3 = textureLoad(tex, clamp(vL + vec2i(0, 1), vec2i(0), maximum), 0);
24
+ let s4 = textureLoad(tex, clamp(vL + vec2i(1, 1), vec2i(0), maximum), 0);
25
25
 
26
26
  return mix(mix(s1, s2, f.x), mix(s3, s4, f.x), f.y);
27
27
 
28
28
  }
29
29
 
30
- fn aS(gb: vec3f) -> vec2f {
31
- var phi = atan2(-gb.z, -gb.x);
30
+ fn aS(gc: vec3f) -> vec2f {
31
+ var phi = atan2(-gc.z, -gc.x);
32
32
  if (phi < 0.0) {
33
33
  phi += TWOPI;
34
34
  }
35
- let theta = acos(gb.y);
35
+ let theta = acos(gc.y);
36
36
  return vec2f(phi * 0.5 * INVPI, theta * INVPI);
37
37
  }
38
38
 
39
- fn qp(u: f32, vOffset: ptr<function, i32>, pdf: ptr<function, vec2f>) -> f32 {
39
+ fn qt(u: f32, vOffset: ptr<function, i32>, pdf: ptr<function, vec2f>) -> f32 {
40
40
  let size = vec2i(textureDimensions(envMap, 0));
41
41
 
42
42
  var left = 0;
@@ -62,7 +62,7 @@ let s1 = textureLoad(envMapDistribution, vec2i(0, *vOffset + 1), 0).xy;
62
62
  return (f32(*vOffset) + (u - s0.x) / (s1.x - s0.x)) / f32(size.y);
63
63
  }
64
64
 
65
- fn qo(u: f32, vOffset: i32, pdf: ptr<function, vec2f>) -> f32 {
65
+ fn qs(u: f32, vOffset: i32, pdf: ptr<function, vec2f>) -> f32 {
66
66
  let size = vec2i(textureDimensions(envMap, 0));
67
67
 
68
68
  var left = 0;
@@ -76,36 +76,36 @@ left = mid + 1;
76
76
  right = mid;
77
77
  }
78
78
  }
79
- let oG = left - 1;
79
+ let oJ = left - 1;
80
80
 
81
81
 
82
82
 
83
- let s0 = textureLoad(envMapDistribution, vec2i(1 + oG, vOffset), 0).xy;
84
- let s1 = textureLoad(envMapDistribution, vec2i(1 + oG + 1, vOffset), 0).xy;
83
+ let s0 = textureLoad(envMapDistribution, vec2i(1 + oJ, vOffset), 0).xy;
84
+ let s1 = textureLoad(envMapDistribution, vec2i(1 + oJ + 1, vOffset), 0).xy;
85
85
 
86
86
  (*pdf).x = s0.y;
87
87
 
88
- return (f32(oG) + (u - s0.x) / (s1.x - s0.x)) / f32(size.x);
88
+ return (f32(oJ) + (u - s0.x) / (s1.x - s0.x)) / f32(size.x);
89
89
  }
90
90
 
91
91
 
92
- fn oA(random: vec2f, uv: ptr<function, vec2f>, pdf: ptr<function, f32>) -> vec3f {
93
- var gY: vec2f;
92
+ fn oD(random: vec2f, uv: ptr<function, vec2f>, pdf: ptr<function, f32>) -> vec3f {
93
+ var gZ: vec2f;
94
94
  var vOffset: i32;
95
95
 
96
- (*uv).y = qp(random.x, &vOffset, &gY);
97
- (*uv).x = qo(random.y, vOffset, &gY);
96
+ (*uv).y = qt(random.x, &vOffset, &gZ);
97
+ (*uv).x = qs(random.y, vOffset, &gZ);
98
98
 
99
99
  let phi = (*uv).x * TWOPI;
100
100
  let theta = (*uv).y * PI;
101
101
  let cc = cos(theta);
102
102
  let sinTheta = sin(theta);
103
- let tZ = cos(phi);
104
- let uh = sin(phi);
103
+ let ue = cos(phi);
104
+ let um = sin(phi);
105
105
 
106
- let dir = vec3f(-sinTheta * tZ, cc, -sinTheta * uh);
106
+ let dir = vec3f(-sinTheta * ue, cc, -sinTheta * um);
107
107
 
108
- *pdf = gY.x * gY.y * INVPI2 / (2.0 * sinTheta);
108
+ *pdf = gZ.x * gZ.y * INVPI2 / (2.0 * sinTheta);
109
109
 
110
110
  return dir;
111
111
  }
@@ -115,12 +115,12 @@ let size = vec2f(textureDimensions(envMap, 0));
115
115
 
116
116
  let sinTheta = sin(_uv.y * PI);
117
117
 
118
- let vL = vec2i(_uv * size);
118
+ let vQ = vec2i(_uv * size);
119
119
 
120
- let sw = textureLoad(envMapDistribution, vec2i(1 + vL.x, vL.y), 0).y;
121
- let sz = textureLoad(envMapDistribution, vec2i(0, vL.y), 0).y;
120
+ let sD = textureLoad(envMapDistribution, vec2i(1 + vQ.x, vQ.y), 0).y;
121
+ let sE = textureLoad(envMapDistribution, vec2i(0, vQ.y), 0).y;
122
122
 
123
- return sw * sz * INVPI2 / (2.0 * sinTheta);
123
+ return sD * sE * INVPI2 / (2.0 * sinTheta);
124
124
  }
125
125
 
126
126