@driftengine/core 4.13.3 → 4.13.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 (153) hide show
  1. package/CHANGELOG.json +52 -0
  2. package/README.md +1 -1
  3. package/dist/index.d.ts +3 -2
  4. package/dist/render/anisotropicLobe.d.ts +5 -0
  5. package/dist/render/anisotropicLobe.js +13 -0
  6. package/dist/render/atmosphere.d.ts +79 -1
  7. package/dist/render/atmosphere.js +66 -19
  8. package/dist/render/backend/webgl2/renderer.d.ts +34 -2
  9. package/dist/render/backend/webgl2/renderer.js +44 -12
  10. package/dist/render/backend/webgpu/boltPass.d.ts +1 -1
  11. package/dist/render/backend/webgpu/causticsPass.d.ts +1 -1
  12. package/dist/render/backend/webgpu/clothSetPack.js +1 -0
  13. package/dist/render/backend/webgpu/clothSolvePack.d.ts +5 -2
  14. package/dist/render/backend/webgpu/clothSolvePack.js +2 -1
  15. package/dist/render/backend/webgpu/filmPass.d.ts +1 -1
  16. package/dist/render/backend/webgpu/gpuClothSet.js +1 -1
  17. package/dist/render/backend/webgpu/gpuDrivenPass.js +20 -3
  18. package/dist/render/backend/webgpu/linePass.d.ts +1 -1
  19. package/dist/render/backend/webgpu/mediumFields.d.ts +17 -0
  20. package/dist/render/backend/webgpu/mediumFields.js +74 -0
  21. package/dist/render/backend/webgpu/plumePass.d.ts +3 -3
  22. package/dist/render/backend/webgpu/postPass.d.ts +7 -2
  23. package/dist/render/backend/webgpu/renderer.d.ts +13 -3
  24. package/dist/render/backend/webgpu/renderer.js +86 -150
  25. package/dist/render/backend/webgpu/scatterPass.d.ts +1 -1
  26. package/dist/render/backend/webgpu/shaders/clothSolve.wgsl.d.ts +1 -1
  27. package/dist/render/backend/webgpu/shaders/clothSolve.wgsl.js +7 -5
  28. package/dist/render/backend/webgpu/waterPass.d.ts +1 -1
  29. package/dist/render/environmentMixing.d.ts +18 -0
  30. package/dist/render/environmentMixing.js +40 -0
  31. package/dist/render/fog.d.ts +43 -1
  32. package/dist/render/fog.js +87 -22
  33. package/dist/render/globalMedium.d.ts +112 -10
  34. package/dist/render/globalMedium.js +96 -1
  35. package/dist/render/globalMediumPass.d.ts +7 -3
  36. package/dist/render/globalMediumPass.js +22 -1
  37. package/dist/render/hairLobes.d.ts +27 -2
  38. package/dist/render/hairLobes.js +57 -4
  39. package/dist/render/lightBudget.d.ts +12 -0
  40. package/dist/render/lightBudget.js +24 -0
  41. package/dist/render/sceneTarget.d.ts +5 -3
  42. package/dist/render/sceneTarget.js +14 -8
  43. package/dist/render/shaders/arcane.d.ts +1 -1
  44. package/dist/render/shaders/bolt.d.ts +1 -1
  45. package/dist/render/shaders/caustics.d.ts +1 -1
  46. package/dist/render/shaders/film.d.ts +1 -1
  47. package/dist/render/shaders/film.js +4 -1
  48. package/dist/render/shaders/fire.d.ts +1 -1
  49. package/dist/render/shaders/flat/anisotropic.d.ts +8 -1
  50. package/dist/render/shaders/flat/anisotropic.js +25 -3
  51. package/dist/render/shaders/flat/hair.js +77 -27
  52. package/dist/render/shaders/flat/main.d.ts +1 -1
  53. package/dist/render/shaders/flat/main.js +23 -3
  54. package/dist/render/shaders/flat/models.js +12 -5
  55. package/dist/render/shaders/flat/preamble.js +7 -0
  56. package/dist/render/shaders/fog.d.ts +4 -4
  57. package/dist/render/shaders/fog.js +81 -32
  58. package/dist/render/shaders/generated/arcane.wgsl.d.ts +29 -39
  59. package/dist/render/shaders/generated/arcane.wgsl.js +29 -39
  60. package/dist/render/shaders/generated/bolt.wgsl.d.ts +26 -36
  61. package/dist/render/shaders/generated/bolt.wgsl.js +26 -36
  62. package/dist/render/shaders/generated/caustics.wgsl.d.ts +25 -35
  63. package/dist/render/shaders/generated/caustics.wgsl.js +25 -35
  64. package/dist/render/shaders/generated/film.wgsl.d.ts +28 -38
  65. package/dist/render/shaders/generated/film.wgsl.js +28 -38
  66. package/dist/render/shaders/generated/fire.wgsl.d.ts +28 -38
  67. package/dist/render/shaders/generated/fire.wgsl.js +28 -38
  68. package/dist/render/shaders/generated/flat.wgsl.d.ts +1466 -1546
  69. package/dist/render/shaders/generated/flat.wgsl.js +1489 -1569
  70. package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +98 -12
  71. package/dist/render/shaders/generated/globalMedium.wgsl.js +98 -12
  72. package/dist/render/shaders/generated/line.wgsl.d.ts +25 -35
  73. package/dist/render/shaders/generated/line.wgsl.js +25 -35
  74. package/dist/render/shaders/generated/particle.wgsl.d.ts +100 -140
  75. package/dist/render/shaders/generated/particle.wgsl.js +100 -140
  76. package/dist/render/shaders/generated/rush.wgsl.d.ts +20 -10
  77. package/dist/render/shaders/generated/rush.wgsl.js +20 -10
  78. package/dist/render/shaders/generated/scatter.wgsl.d.ts +25 -35
  79. package/dist/render/shaders/generated/scatter.wgsl.js +25 -35
  80. package/dist/render/shaders/generated/smoke.wgsl.d.ts +28 -38
  81. package/dist/render/shaders/generated/smoke.wgsl.js +28 -38
  82. package/dist/render/shaders/generated/water.wgsl.d.ts +29 -39
  83. package/dist/render/shaders/generated/water.wgsl.js +29 -39
  84. package/dist/render/shaders/globalMedium.js +114 -10
  85. package/dist/render/shaders/gpudriven/blendRaster.wgsl.js +2 -1
  86. package/dist/render/shaders/gpudriven/fog.wgsl.d.ts +10 -4
  87. package/dist/render/shaders/gpudriven/fog.wgsl.js +77 -19
  88. package/dist/render/shaders/gpudriven/frameBlock.wgsl.d.ts +1 -1
  89. package/dist/render/shaders/gpudriven/frameBlock.wgsl.js +12 -1
  90. package/dist/render/shaders/gpudriven/shade.wgsl.js +3 -1
  91. package/dist/render/shaders/line.d.ts +1 -1
  92. package/dist/render/shaders/line.js +4 -2
  93. package/dist/render/shaders/localExposure.d.ts +42 -1
  94. package/dist/render/shaders/localExposure.js +73 -6
  95. package/dist/render/shaders/particle.d.ts +3 -3
  96. package/dist/render/shaders/particle.js +10 -6
  97. package/dist/render/shaders/scatter.d.ts +1 -1
  98. package/dist/render/shaders/scatter.js +4 -2
  99. package/dist/render/shaders/smoke.d.ts +1 -1
  100. package/dist/render/shaders/water.d.ts +1 -1
  101. package/dist/render/shaders/water.js +2 -1
  102. package/dist/render/surfaceModel.d.ts +23 -4
  103. package/dist/render/surfaceModel.js +12 -2
  104. package/package.json +6 -6
  105. package/src/index.ts +12 -2
  106. package/src/render/anisotropicLobe.ts +20 -0
  107. package/src/render/atmosphere.ts +153 -20
  108. package/src/render/backend/webgl2/renderer.ts +63 -13
  109. package/src/render/backend/webgpu/clothSetPack.ts +1 -0
  110. package/src/render/backend/webgpu/clothSolvePack.ts +6 -2
  111. package/src/render/backend/webgpu/gpuClothSet.ts +1 -1
  112. package/src/render/backend/webgpu/gpuDrivenPass.ts +20 -3
  113. package/src/render/backend/webgpu/mediumFields.ts +87 -0
  114. package/src/render/backend/webgpu/renderer.ts +109 -157
  115. package/src/render/backend/webgpu/shaders/clothSolve.wgsl.ts +7 -5
  116. package/src/render/environmentMixing.ts +48 -0
  117. package/src/render/fog.ts +125 -25
  118. package/src/render/globalMedium.ts +214 -11
  119. package/src/render/globalMediumPass.ts +29 -4
  120. package/src/render/hairLobes.ts +109 -3
  121. package/src/render/lightBudget.ts +32 -0
  122. package/src/render/sceneTarget.ts +15 -11
  123. package/src/render/shaders/film.ts +4 -1
  124. package/src/render/shaders/flat/anisotropic.ts +25 -3
  125. package/src/render/shaders/flat/hair.ts +77 -27
  126. package/src/render/shaders/flat/main.ts +23 -3
  127. package/src/render/shaders/flat/models.ts +12 -5
  128. package/src/render/shaders/flat/preamble.ts +7 -0
  129. package/src/render/shaders/fog.ts +81 -32
  130. package/src/render/shaders/generated/arcane.wgsl.ts +29 -39
  131. package/src/render/shaders/generated/bolt.wgsl.ts +26 -36
  132. package/src/render/shaders/generated/caustics.wgsl.ts +25 -35
  133. package/src/render/shaders/generated/film.wgsl.ts +28 -38
  134. package/src/render/shaders/generated/fire.wgsl.ts +28 -38
  135. package/src/render/shaders/generated/flat.wgsl.ts +1489 -1569
  136. package/src/render/shaders/generated/globalMedium.wgsl.ts +98 -12
  137. package/src/render/shaders/generated/line.wgsl.ts +25 -35
  138. package/src/render/shaders/generated/particle.wgsl.ts +100 -140
  139. package/src/render/shaders/generated/rush.wgsl.ts +20 -10
  140. package/src/render/shaders/generated/scatter.wgsl.ts +25 -35
  141. package/src/render/shaders/generated/smoke.wgsl.ts +28 -38
  142. package/src/render/shaders/generated/water.wgsl.ts +29 -39
  143. package/src/render/shaders/globalMedium.ts +114 -10
  144. package/src/render/shaders/gpudriven/blendRaster.wgsl.ts +2 -1
  145. package/src/render/shaders/gpudriven/fog.wgsl.ts +78 -19
  146. package/src/render/shaders/gpudriven/frameBlock.wgsl.ts +12 -1
  147. package/src/render/shaders/gpudriven/shade.wgsl.ts +3 -1
  148. package/src/render/shaders/line.ts +4 -2
  149. package/src/render/shaders/localExposure.ts +115 -6
  150. package/src/render/shaders/particle.ts +10 -6
  151. package/src/render/shaders/scatter.ts +4 -2
  152. package/src/render/shaders/water.ts +2 -1
  153. package/src/render/surfaceModel.ts +41 -6
@@ -278,7 +278,7 @@ export class GpuClothSet {
278
278
  u[base + 32] = garment.range.colliderBase;
279
279
  u[base + 33] = garment.range.colliders;
280
280
  u[base + 34] = garment.particles.width;
281
- f[base + 35] = 1 / (1 + p.pull * h * h);
281
+ f[base + 35] = p.pull * h * h;
282
282
  f[base + 36] = exactExp(p.damping * h);
283
283
  f[base + 37] = exactExp(p.drag * h);
284
284
  f[base + 38] = p.maxDistanceScale;
@@ -123,11 +123,11 @@ export const VERTEX_FLOATS = GPU_DRIVEN_VERTEX_FLOATS;
123
123
  /**
124
124
  * Floats the shading pass's frame block holds. Matches `FRAME_BLOCK_WGSL`'s `Frame`.
125
125
  *
126
- * Two matrices and fifteen vectors: the camera's, the light's, then the eye, the light's direction
126
+ * Two matrices and eighteen vectors: the camera's, the light's, then the eye, the light's direction
127
127
  * and colour, the sky, the ground, the target's size, the shadow's settings in two, the probe's in
128
- * two, the medium's four, and the visibility buffer's row.
128
+ * two, the medium's four, the visibility buffer's row, and the medium's last three after it.
129
129
  */
130
- const FRAME_FLOATS = 92;
130
+ const FRAME_FLOATS = 104;
131
131
  /** Where each block starts in it, so the writer and the shader cannot drift apart. */
132
132
  const FRAME_LIGHT_VIEW_PROJ = 16;
133
133
  const FRAME_EYE = 32;
@@ -145,6 +145,9 @@ const FRAME_FOG_UNDERWATER = 76;
145
145
  const FRAME_FOG_HEIGHT = 80;
146
146
  const FRAME_FOG_RANGE = 84;
147
147
  const FRAME_PITCH = 88;
148
+ const FRAME_FOG_LIMITS = 92;
149
+ const FRAME_FOG_GLOW = 96;
150
+ const FRAME_FOG_GLOW_DIR = 100;
148
151
  /**
149
152
  * Pixels the internal width is rounded up to.
150
153
  *
@@ -2168,6 +2171,20 @@ export class GpuDrivenPass {
2168
2171
  params[FRAME_FOG_RANGE + 1] = fog?.far ?? 0;
2169
2172
  params[FRAME_FOG_RANGE + 2] = fog?.mode ?? MEDIUM_FOG;
2170
2173
  params[FRAME_FOG_RANGE + 3] = fog?.underwaterDensity ?? 0;
2174
+ /* The second layer, the floor, the cutoff and the glow: every one none at zero, as a view
2175
+ written before they existed asks. */
2176
+ params[FRAME_FOG_HEIGHT + 2] = fog?.density2 ?? 0;
2177
+ params[FRAME_FOG_HEIGHT + 3] = fog?.heightFalloff2 ?? 0;
2178
+ params[FRAME_FOG_LIMITS] = fog?.floor ?? 0;
2179
+ params[FRAME_FOG_LIMITS + 1] = fog?.cutoff ?? 0;
2180
+ params[FRAME_FOG_GLOW] = fog?.glowColour?.[0] ?? 0;
2181
+ params[FRAME_FOG_GLOW + 1] = fog?.glowColour?.[1] ?? 0;
2182
+ params[FRAME_FOG_GLOW + 2] = fog?.glowColour?.[2] ?? 0;
2183
+ params[FRAME_FOG_GLOW + 3] = fog?.glowExponent ?? 1;
2184
+ params[FRAME_FOG_GLOW_DIR] = fog?.glowDirection?.[0] ?? 0;
2185
+ params[FRAME_FOG_GLOW_DIR + 1] = fog?.glowDirection?.[1] ?? 1;
2186
+ params[FRAME_FOG_GLOW_DIR + 2] = fog?.glowDirection?.[2] ?? 0;
2187
+ params[FRAME_FOG_GLOW_DIR + 3] = fog?.glowStart ?? 0;
2171
2188
  /* The scene's own decision about whether its grid supplies the ambient, as it is on the
2172
2189
  forward path: `ProbeBakeOptions.irradiance` reaches here as `PassEnvironment.irradiance`. */
2173
2190
  params[FRAME_ENVIRONMENT_MIX] = room !== null && room.irradiance ? 1 : 0;
@@ -29,7 +29,7 @@ import type { PipelineCache } from './pipelineCache.ts';
29
29
  export declare const LINE_VERT_FIELDS: UniformFields;
30
30
  export declare const LINE_VERT_SIZE: 160;
31
31
  export declare const LINE_FRAG_FIELDS: UniformFields;
32
- export declare const LINE_FRAG_SIZE: 112;
32
+ export declare const LINE_FRAG_SIZE: 160;
33
33
  /** A polyline batch on the device, behind the surface's opaque handle. */
34
34
  export interface GpuLines {
35
35
  readonly fromBuffer: GPUBuffer;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * The medium's fields, every uniform `shaders/fog.ts` declares, written into a pass's block by name
3
+ * from one resolved atmosphere.
4
+ *
5
+ * **One writer for every pass that fogs.** Ten passes wrote the same ten fields by hand, so a field
6
+ * the medium grows was ten places to remember and a pass that missed one read zero: the fourth
7
+ * point of the rule `AGENTS.md` dates 2026-08-13. A field a pass's shader never reads is compiled
8
+ * out of its block, so each is written only where the block holds it. An absent field is not an
9
+ * offset of zero, which is the first field of the block.
10
+ */
11
+ import type { ResolvedAtmosphere } from '../../atmosphere.ts';
12
+ import type { UniformFields } from './scatterPass.ts';
13
+ import type { UniformRing } from './uniformRing.ts';
14
+ /** Into a block staged as floats, indexed in four-byte words. */
15
+ export declare function writeMediumFields(fields: UniformFields, f: Float32Array, m: ResolvedAtmosphere): void;
16
+ /** Into one slot of a ring, at the fields' byte offsets. */
17
+ export declare function writeMediumSlot(ring: UniformRing, slot: number, fields: UniformFields, m: ResolvedAtmosphere): void;
@@ -0,0 +1,74 @@
1
+ /** A field's byte offset in the block, or -1 where the shader compiled it out. */
2
+ function placed(fields, name) {
3
+ return fields[name]?.offset ?? -1;
4
+ }
5
+ /** Into a block staged as floats, indexed in four-byte words. */
6
+ export function writeMediumFields(fields, f, m) {
7
+ let at = placed(fields, 'uFogColor');
8
+ if (at >= 0)
9
+ f.set(m.fogColor, at / 4);
10
+ at = placed(fields, 'uFogMedium');
11
+ if (at >= 0) {
12
+ f[at / 4] = m.fogDensity;
13
+ f[at / 4 + 1] = m.fogHeightFalloff;
14
+ f[at / 4 + 2] = m.fogEyeY;
15
+ f[at / 4 + 3] = m.underwaterFogDensity;
16
+ }
17
+ at = placed(fields, 'uFogRange');
18
+ if (at >= 0) {
19
+ f[at / 4] = m.fogNear;
20
+ f[at / 4 + 1] = m.fogFar;
21
+ f[at / 4 + 2] = m.fogMode;
22
+ f[at / 4 + 3] = 0;
23
+ }
24
+ at = placed(fields, 'uUnderwaterColor');
25
+ if (at >= 0)
26
+ f.set(m.underwaterColor, at / 4);
27
+ at = placed(fields, 'uUnderwaterFactor');
28
+ if (at >= 0)
29
+ f[at / 4] = m.underwaterFactor;
30
+ at = placed(fields, 'uFogLayer2');
31
+ if (at >= 0)
32
+ f.set(m.fogLayer2, at / 4);
33
+ at = placed(fields, 'uFogGlow');
34
+ if (at >= 0)
35
+ f.set(m.fogGlow, at / 4);
36
+ at = placed(fields, 'uFogGlowDir');
37
+ if (at >= 0)
38
+ f.set(m.fogGlowDir, at / 4);
39
+ }
40
+ /** Into one slot of a ring, at the fields' byte offsets. */
41
+ export function writeMediumSlot(ring, slot, fields, m) {
42
+ let at = placed(fields, 'uFogColor');
43
+ if (at >= 0)
44
+ ring.writeFloats(slot, at, m.fogColor);
45
+ at = placed(fields, 'uFogMedium');
46
+ if (at >= 0) {
47
+ ring.writeFloat(slot, at, m.fogDensity);
48
+ ring.writeFloat(slot, at + 4, m.fogHeightFalloff);
49
+ ring.writeFloat(slot, at + 8, m.fogEyeY);
50
+ ring.writeFloat(slot, at + 12, m.underwaterFogDensity);
51
+ }
52
+ at = placed(fields, 'uFogRange');
53
+ if (at >= 0) {
54
+ ring.writeFloat(slot, at, m.fogNear);
55
+ ring.writeFloat(slot, at + 4, m.fogFar);
56
+ ring.writeFloat(slot, at + 8, m.fogMode);
57
+ ring.writeFloat(slot, at + 12, 0);
58
+ }
59
+ at = placed(fields, 'uUnderwaterColor');
60
+ if (at >= 0)
61
+ ring.writeFloats(slot, at, m.underwaterColor);
62
+ at = placed(fields, 'uUnderwaterFactor');
63
+ if (at >= 0)
64
+ ring.writeFloat(slot, at, m.underwaterFactor);
65
+ at = placed(fields, 'uFogLayer2');
66
+ if (at >= 0)
67
+ ring.writeFloats(slot, at, m.fogLayer2);
68
+ at = placed(fields, 'uFogGlow');
69
+ if (at >= 0)
70
+ ring.writeFloats(slot, at, m.fogGlow);
71
+ at = placed(fields, 'uFogGlowDir');
72
+ if (at >= 0)
73
+ ring.writeFloats(slot, at, m.fogGlowDir);
74
+ }
@@ -15,9 +15,9 @@ export declare const PLUME_VERT_SIZE: 112;
15
15
  export declare const PLUME_FRAG_FIELDS: UniformFields;
16
16
  export declare const PLUME_FRAG_SIZE: number;
17
17
  /** Each material's own block, so a change to one and not the others is caught rather than assumed. */
18
- export declare const FIRE_FRAG_SIZE: 128;
19
- export declare const SMOKE_FRAG_SIZE: 128;
20
- export declare const ARCANE_FRAG_SIZE: 144;
18
+ export declare const FIRE_FRAG_SIZE: 176;
19
+ export declare const SMOKE_FRAG_SIZE: 176;
20
+ export declare const ARCANE_FRAG_SIZE: 192;
21
21
  export declare function plumeVertexLayouts(): GPUVertexBufferLayout[];
22
22
  /** Plume geometry on the device, behind the surface's opaque handle. */
23
23
  export interface GpuPlumes {
@@ -26,7 +26,7 @@ import type { PipelineCache } from './pipelineCache.ts';
26
26
  * float target the generated shaders can sample as an ordinary texture.
27
27
  */
28
28
  export declare const RUSH_FRAG_FIELDS: UniformFields;
29
- export declare const RUSH_FRAG_SIZE: 288;
29
+ export declare const RUSH_FRAG_SIZE: 320;
30
30
  declare const RUSH_UNIFORMS: 1;
31
31
  declare const RUSH_TEXTURES: {
32
32
  readonly uScene: {
@@ -75,7 +75,7 @@ export declare const AO_FRAG_SIZE: 96;
75
75
  export declare const AO_BLUR_FIELDS: UniformFields;
76
76
  export declare const AO_BLUR_SIZE: 48;
77
77
  export declare const MEDIUM_FRAG_FIELDS: UniformFields;
78
- export declare const MEDIUM_FRAG_SIZE: 304;
78
+ export declare const MEDIUM_FRAG_SIZE: 2400;
79
79
  export declare const MEDIUM_UPSAMPLE_FIELDS: UniformFields;
80
80
  export declare const MEDIUM_UPSAMPLE_SIZE: 48;
81
81
  export declare const BLOOM_PREFILTER_FIELDS: UniformFields;
@@ -369,6 +369,11 @@ export declare const MEDIUM_TEXTURES: {
369
369
  readonly sampler: 35;
370
370
  readonly type: "sampler2DArray";
371
371
  };
372
+ readonly uPointShadows: {
373
+ readonly texture: 36;
374
+ readonly sampler: 37;
375
+ readonly type: "sampler2DArray";
376
+ };
372
377
  };
373
378
  export declare const MEDIUM_UPSAMPLE_UNIFORMS: 1;
374
379
  export declare const MEDIUM_UPSAMPLE_TEXTURES: {
@@ -35,6 +35,7 @@ import type { SurfaceMaterial, SurfaceTextureOptions } from '../../surfaceTextur
35
35
  import type { RenderBackend } from '../api.ts';
36
36
  import { type DisplayRange } from '../../displayRange.ts';
37
37
  import { type FilmicCurve } from '../../filmicCurve.ts';
38
+ import type { LocalExposureOptions } from '../../shaders/localExposure.ts';
38
39
  import { type ColourGradeLut } from '../../colourGrade.ts';
39
40
  import type { CausticSheet } from '../../causticsRenderer.ts';
40
41
  import { type GpuCaustics } from './causticsPass.ts';
@@ -45,6 +46,7 @@ import type { DeviceParticles, ParticleInstances } from '../../particlePool.ts';
45
46
  import type { PlumeOptions, PlumePlacement } from '../../plumeRenderer.ts';
46
47
  import type { InstanceData } from '../../instancedMesh.ts';
47
48
  import { type RenderQuality } from '../../renderQuality.ts';
49
+ import type { GlobalMediumSettings } from '../../globalMedium.ts';
48
50
  import type { MeshData } from '../../mesh.ts';
49
51
  import type { ShadowCasters } from '../../shadowCasters.ts';
50
52
  import { type GpuMesh } from './buffers.ts';
@@ -724,6 +726,9 @@ export declare class WebGPURenderer implements RendererApi {
724
726
  private readonly mediumInvProjection;
725
727
  /** This frame's medium. Off until a caller says otherwise. See `setGlobalMedium`. */
726
728
  private mediumOptions;
729
+ /** The lamps the medium is lit by, and the lit stage's lamps they come from, refilled a frame. */
730
+ private readonly mediumLamps;
731
+ private readonly mediumLights;
727
732
  /**
728
733
  * The temporal resolve: its block, its ping-pong pair, and the jitter state.
729
734
  *
@@ -1412,6 +1417,10 @@ export declare class WebGPURenderer implements RendererApi {
1412
1417
  setSurfaceReflectivity(amount: number): void;
1413
1418
  /** How bright the environment the surfaces drawn next reflect is. See `renderer.ts`. */
1414
1419
  setEnvironmentGain(gain: number): void;
1420
+ /** The environment brought to the light where a surface stands. See `renderer.ts`. */
1421
+ setEnvironmentMixing(weight: number, roughnessLow?: number, roughnessHigh?: number): void;
1422
+ /** `uEnvironmentMixing` as it stands; none until a draw asks. See `setEnvironmentMixing`. */
1423
+ private readonly environmentMixing;
1415
1424
  /**
1416
1425
  * The reflectivity and environment gain the setters gave the pass, and the ones the material
1417
1426
  * set now states, or null where it states none (`SurfaceMaterial.reflectivity`). A draw wears the
@@ -3980,8 +3989,9 @@ export declare class WebGPURenderer implements RendererApi {
3980
3989
  /** Eye adaptation: how far, this frame's time step, and the pass once asked for. */
3981
3990
  private autoExposure;
3982
3991
  private autoExposureDt;
3983
- /** How far each region is brought toward the frame. See `setLocalExposure`. */
3992
+ /** Whether regions move, and how, as `resolveLocalExposure` packs it. See `setLocalExposure`. */
3984
3993
  private localExposure;
3994
+ private readonly localExposureShape;
3985
3995
  private exposurePass;
3986
3996
  /**
3987
3997
  * How strongly the lens darkens the frame's corners, held until changed: 0 is none, 0.5 is about
@@ -4039,7 +4049,7 @@ export declare class WebGPURenderer implements RendererApi {
4039
4049
  * version is that `density` is extinction per metre, 0 is a real off that allocates nothing and
4040
4050
  * draws nothing, and the three optional arguments are held until changed.
4041
4051
  */
4042
- setGlobalMedium(density: number, albedo?: number, anisotropy?: number, maxDistance?: number): void;
4052
+ setGlobalMedium(density: number | GlobalMediumSettings, albedo?: number | Vec3, anisotropy?: number, maxDistance?: number): void;
4043
4053
  /** How much speed blur the frame should resolve with, 0 to 1. */
4044
4054
  setSpeedRush(strength: number): void;
4045
4055
  /**
@@ -4083,7 +4093,7 @@ export declare class WebGPURenderer implements RendererApi {
4083
4093
  * the same setter over the same state, sharing eye adaptation's pass, which is built the first
4084
4094
  * time either is asked for.
4085
4095
  */
4086
- setLocalExposure(strength: number): void;
4096
+ setLocalExposure(setting: number | LocalExposureOptions): void;
4087
4097
  /** The exposure pass, built once; the composite's group holds placeholders until it exists. */
4088
4098
  private ensureExposurePass;
4089
4099
  /**