@plasius/gpu-lighting 0.1.8 → 0.1.10
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.
- package/CHANGELOG.md +44 -0
- package/README.md +33 -0
- package/dist/index.cjs +206 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +204 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -5
- package/src/index.js +220 -0
package/CHANGELOG.md
CHANGED
|
@@ -20,6 +20,48 @@ The format is based on **[Keep a Changelog](https://keepachangelog.com/en/1.1.0/
|
|
|
20
20
|
- **Security**
|
|
21
21
|
- (placeholder)
|
|
22
22
|
|
|
23
|
+
## [0.1.10] - 2026-03-23
|
|
24
|
+
|
|
25
|
+
- **Added**
|
|
26
|
+
- A browser-based 3D harbor demo so lighting band behavior is visible against
|
|
27
|
+
GLTF ships, cloth, and water instead of a catalog-only page.
|
|
28
|
+
|
|
29
|
+
- **Changed**
|
|
30
|
+
- `gpu-lighting/demo/` now delegates its 3D harbor scene to the shared
|
|
31
|
+
`@plasius/gpu-shared` showcase runtime instead of carrying a package-local copy
|
|
32
|
+
of the renderer and loader logic.
|
|
33
|
+
- The harbor runtime now renders stronger near-field shadow projection and
|
|
34
|
+
reflection accents so the lighting bands read closer to the intended
|
|
35
|
+
ray-traced lighting path.
|
|
36
|
+
|
|
37
|
+
- **Fixed**
|
|
38
|
+
- The package-local lighting demo now gives a clear visual result instead of
|
|
39
|
+
looking like a flat catalog surface.
|
|
40
|
+
|
|
41
|
+
- **Security**
|
|
42
|
+
- (placeholder)
|
|
43
|
+
|
|
44
|
+
## [0.1.9] - 2026-03-15
|
|
45
|
+
|
|
46
|
+
- **Added**
|
|
47
|
+
- ADR, TDR, and test-first planning coverage for distance-banded lighting and
|
|
48
|
+
shadow-source strategy in the ray-tracing-first renderer.
|
|
49
|
+
- Added `createLightingBandPlan(...)` and public near/mid/far/horizon
|
|
50
|
+
lighting-band exports.
|
|
51
|
+
- Added tests covering explicit banded shadow sources, RT participation
|
|
52
|
+
scaling, cadence policy, and horizon impression behavior.
|
|
53
|
+
|
|
54
|
+
- **Changed**
|
|
55
|
+
- Profile worker manifests now publish `lightingBands`, and technique worker
|
|
56
|
+
jobs now carry ray-tracing-first quality dimension metadata for downstream
|
|
57
|
+
`@plasius/gpu-performance` integrations.
|
|
58
|
+
|
|
59
|
+
- **Fixed**
|
|
60
|
+
- (placeholder)
|
|
61
|
+
|
|
62
|
+
- **Security**
|
|
63
|
+
- (placeholder)
|
|
64
|
+
|
|
23
65
|
## [0.1.8] - 2026-03-14
|
|
24
66
|
|
|
25
67
|
- **Added**
|
|
@@ -142,3 +184,5 @@ The format is based on **[Keep a Changelog](https://keepachangelog.com/en/1.1.0/
|
|
|
142
184
|
[0.1.6]: https://github.com/Plasius-LTD/gpu-lighting/releases/tag/v0.1.6
|
|
143
185
|
[0.1.7]: https://github.com/Plasius-LTD/gpu-lighting/releases/tag/v0.1.7
|
|
144
186
|
[0.1.8]: https://github.com/Plasius-LTD/gpu-lighting/releases/tag/v0.1.8
|
|
187
|
+
[0.1.9]: https://github.com/Plasius-LTD/gpu-lighting/releases/tag/v0.1.9
|
|
188
|
+
[0.1.10]: https://github.com/Plasius-LTD/gpu-lighting/releases/tag/v0.1.10
|
package/README.md
CHANGED
|
@@ -26,6 +26,18 @@ Apache-2.0. ESM + CJS builds. WGSL assets are published in `dist/`.
|
|
|
26
26
|
npm install @plasius/gpu-lighting
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
## Browser Demo
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
npm run demo
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Then open `http://localhost:8000/gpu-lighting/demo/`.
|
|
36
|
+
|
|
37
|
+
The browser demo now mounts the shared 3D harbor validation scene from
|
|
38
|
+
`@plasius/gpu-shared` instead of a catalog-only page, so lighting-band behavior
|
|
39
|
+
is visible against GLTF ships, water, and cloth.
|
|
40
|
+
|
|
29
41
|
## Usage (load one technique)
|
|
30
42
|
|
|
31
43
|
```js
|
|
@@ -71,6 +83,24 @@ const profileManifest = getLightingProfileWorkerManifest("realtime");
|
|
|
71
83
|
console.log(profileManifest.jobs.map((job) => job.worker.jobType));
|
|
72
84
|
```
|
|
73
85
|
|
|
86
|
+
## Distance-Banded Lighting
|
|
87
|
+
|
|
88
|
+
```js
|
|
89
|
+
import { createLightingBandPlan } from "@plasius/gpu-lighting";
|
|
90
|
+
|
|
91
|
+
const bandPlan = createLightingBandPlan({
|
|
92
|
+
profile: "realtime",
|
|
93
|
+
importance: "high",
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
console.log(bandPlan.bands.map((band) => band.primaryShadowSource));
|
|
97
|
+
console.log(bandPlan.bands.find((band) => band.band === "near").rtParticipation);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Band plans make near, mid, far, and horizon shadow sources explicit, keep RT
|
|
101
|
+
shadow/reflection/GI participation independent, and publish temporal reuse plus
|
|
102
|
+
update cadence expectations for downstream renderer and performance packages.
|
|
103
|
+
|
|
74
104
|
## DAG Scheduling
|
|
75
105
|
|
|
76
106
|
Lighting worker manifests now publish `schedulerMode: "dag"` plus per-job
|
|
@@ -135,6 +165,9 @@ npm run demo
|
|
|
135
165
|
|
|
136
166
|
Then open `http://localhost:8000/gpu-lighting/demo/`.
|
|
137
167
|
|
|
168
|
+
The demo is intentionally catalog-first. It does not mount a 3D canvas; it
|
|
169
|
+
shows profile, technique, and worker-planning state.
|
|
170
|
+
|
|
138
171
|
## Development Checks
|
|
139
172
|
|
|
140
173
|
```sh
|
package/dist/index.cjs
CHANGED
|
@@ -29,6 +29,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
29
29
|
// src/index.js
|
|
30
30
|
var index_exports = {};
|
|
31
31
|
__export(index_exports, {
|
|
32
|
+
createLightingBandPlan: () => createLightingBandPlan,
|
|
32
33
|
defaultLightingProfile: () => defaultLightingProfile,
|
|
33
34
|
defaultLightingTechnique: () => defaultLightingTechnique,
|
|
34
35
|
getLightingProfile: () => getLightingProfile,
|
|
@@ -36,6 +37,7 @@ __export(index_exports, {
|
|
|
36
37
|
getLightingTechnique: () => getLightingTechnique,
|
|
37
38
|
getLightingTechniqueWorkerManifest: () => getLightingTechniqueWorkerManifest,
|
|
38
39
|
lightingDebugOwner: () => lightingDebugOwner,
|
|
40
|
+
lightingDistanceBands: () => lightingDistanceBands,
|
|
39
41
|
lightingJobLabels: () => lightingJobLabels,
|
|
40
42
|
lightingJobs: () => lightingJobs,
|
|
41
43
|
lightingPreludeWgslUrl: () => lightingPreludeWgslUrl,
|
|
@@ -164,8 +166,133 @@ var lightingProfiles = Object.freeze(
|
|
|
164
166
|
);
|
|
165
167
|
var lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));
|
|
166
168
|
var defaultLightingProfile = "realtime";
|
|
169
|
+
var lightingDistanceBands = Object.freeze([
|
|
170
|
+
"near",
|
|
171
|
+
"mid",
|
|
172
|
+
"far",
|
|
173
|
+
"horizon"
|
|
174
|
+
]);
|
|
167
175
|
var lightingWorkerQueueClass = "lighting";
|
|
168
176
|
var lightingDebugOwner = "lighting";
|
|
177
|
+
var lightingImportanceLevels = Object.freeze([
|
|
178
|
+
"low",
|
|
179
|
+
"medium",
|
|
180
|
+
"high",
|
|
181
|
+
"critical"
|
|
182
|
+
]);
|
|
183
|
+
var lightingBandPolicySpecs = Object.freeze({
|
|
184
|
+
near: Object.freeze({
|
|
185
|
+
primaryShadowSource: "ray-traced-primary",
|
|
186
|
+
assistShadowSources: Object.freeze(["visibility-raster", "shadow-map-assist"]),
|
|
187
|
+
temporalReuse: "balanced",
|
|
188
|
+
updateCadenceDivisor: 1,
|
|
189
|
+
liveObjectShadows: true,
|
|
190
|
+
impressionOnly: false
|
|
191
|
+
}),
|
|
192
|
+
mid: Object.freeze({
|
|
193
|
+
primaryShadowSource: "selective-raster-and-proxy",
|
|
194
|
+
assistShadowSources: Object.freeze([
|
|
195
|
+
"regional-shadow-map",
|
|
196
|
+
"proxy-caster",
|
|
197
|
+
"temporal-history"
|
|
198
|
+
]),
|
|
199
|
+
temporalReuse: "aggressive",
|
|
200
|
+
updateCadenceDivisor: 2,
|
|
201
|
+
liveObjectShadows: true,
|
|
202
|
+
impressionOnly: false
|
|
203
|
+
}),
|
|
204
|
+
far: Object.freeze({
|
|
205
|
+
primaryShadowSource: "merged-proxy-casters",
|
|
206
|
+
assistShadowSources: Object.freeze([
|
|
207
|
+
"coarse-directional",
|
|
208
|
+
"semi-static-occlusion"
|
|
209
|
+
]),
|
|
210
|
+
temporalReuse: "high",
|
|
211
|
+
updateCadenceDivisor: 8,
|
|
212
|
+
liveObjectShadows: false,
|
|
213
|
+
impressionOnly: false
|
|
214
|
+
}),
|
|
215
|
+
horizon: Object.freeze({
|
|
216
|
+
primaryShadowSource: "baked-impression",
|
|
217
|
+
assistShadowSources: Object.freeze(["atmospheric-gradient", "skyline-darkening"]),
|
|
218
|
+
temporalReuse: "baked",
|
|
219
|
+
updateCadenceDivisor: 60,
|
|
220
|
+
liveObjectShadows: false,
|
|
221
|
+
impressionOnly: true
|
|
222
|
+
})
|
|
223
|
+
});
|
|
224
|
+
function assertLightingImportance(name, value) {
|
|
225
|
+
if (!lightingImportanceLevels.includes(value)) {
|
|
226
|
+
throw new Error(
|
|
227
|
+
`${name} must be one of: ${lightingImportanceLevels.join(", ")}.`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
return value;
|
|
231
|
+
}
|
|
232
|
+
function resolveBandParticipation(profileName, band, importance) {
|
|
233
|
+
const referenceProfile = profileName === "reference";
|
|
234
|
+
const premiumImportance = importance === "critical" || importance === "high";
|
|
235
|
+
if (band === "near") {
|
|
236
|
+
return Object.freeze({
|
|
237
|
+
directShadows: premiumImportance ? "premium" : "selective",
|
|
238
|
+
reflections: premiumImportance ? "premium" : "selective",
|
|
239
|
+
globalIllumination: referenceProfile || importance === "critical" ? "premium" : "selective"
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
if (band === "mid") {
|
|
243
|
+
return Object.freeze({
|
|
244
|
+
directShadows: premiumImportance ? "selective" : "proxy",
|
|
245
|
+
reflections: referenceProfile && premiumImportance ? "selective" : "proxy",
|
|
246
|
+
globalIllumination: referenceProfile && importance === "critical" ? "selective" : "disabled"
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
if (band === "far") {
|
|
250
|
+
return Object.freeze({
|
|
251
|
+
directShadows: "proxy",
|
|
252
|
+
reflections: referenceProfile && importance === "critical" ? "proxy" : "disabled",
|
|
253
|
+
globalIllumination: "disabled"
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
return Object.freeze({
|
|
257
|
+
directShadows: "disabled",
|
|
258
|
+
reflections: "disabled",
|
|
259
|
+
globalIllumination: "disabled"
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
function createLightingBandPlan(options = {}) {
|
|
263
|
+
const profileName = options.profile ?? defaultLightingProfile;
|
|
264
|
+
const profile = getLightingProfile(profileName);
|
|
265
|
+
const importance = assertLightingImportance(
|
|
266
|
+
"importance",
|
|
267
|
+
options.importance ?? "high"
|
|
268
|
+
);
|
|
269
|
+
const bands = Object.freeze(
|
|
270
|
+
lightingDistanceBands.map(
|
|
271
|
+
(band) => Object.freeze({
|
|
272
|
+
band,
|
|
273
|
+
profile: profile.name,
|
|
274
|
+
importance,
|
|
275
|
+
primaryShadowSource: lightingBandPolicySpecs[band].primaryShadowSource,
|
|
276
|
+
assistShadowSources: Object.freeze([
|
|
277
|
+
...lightingBandPolicySpecs[band].assistShadowSources
|
|
278
|
+
]),
|
|
279
|
+
rtParticipation: resolveBandParticipation(profile.name, band, importance),
|
|
280
|
+
temporalReuse: lightingBandPolicySpecs[band].temporalReuse,
|
|
281
|
+
updateCadenceDivisor: lightingBandPolicySpecs[band].updateCadenceDivisor,
|
|
282
|
+
liveObjectShadows: lightingBandPolicySpecs[band].liveObjectShadows,
|
|
283
|
+
impressionOnly: lightingBandPolicySpecs[band].impressionOnly
|
|
284
|
+
})
|
|
285
|
+
)
|
|
286
|
+
);
|
|
287
|
+
return Object.freeze({
|
|
288
|
+
schemaVersion: 1,
|
|
289
|
+
owner: lightingDebugOwner,
|
|
290
|
+
profile: profile.name,
|
|
291
|
+
importance,
|
|
292
|
+
techniques: Object.freeze([...profile.techniques]),
|
|
293
|
+
bands
|
|
294
|
+
});
|
|
295
|
+
}
|
|
169
296
|
function buildWorkerBudgetLevels(jobType, queueClass, presets) {
|
|
170
297
|
return Object.freeze([
|
|
171
298
|
Object.freeze({
|
|
@@ -745,6 +872,78 @@ var lightingWorkerDagSpecs = {
|
|
|
745
872
|
}
|
|
746
873
|
}
|
|
747
874
|
};
|
|
875
|
+
function resolveLightingQualityDimensions(techniqueName, jobKey) {
|
|
876
|
+
const key = `${techniqueName}.${jobKey}`;
|
|
877
|
+
return Object.freeze(
|
|
878
|
+
{
|
|
879
|
+
"hybrid.directLighting": { shadows: 1, lightingSamples: 0.7 },
|
|
880
|
+
"hybrid.screenTrace": { rayTracing: 1, temporalReuse: 0.4 },
|
|
881
|
+
"hybrid.radianceCache": {
|
|
882
|
+
lightingSamples: 0.8,
|
|
883
|
+
updateCadence: 0.7,
|
|
884
|
+
temporalReuse: 1
|
|
885
|
+
},
|
|
886
|
+
"hybrid.finalGather": { lightingSamples: 1, rayTracing: 0.6 },
|
|
887
|
+
"hybrid.reflectionResolve": {
|
|
888
|
+
rayTracing: 0.5,
|
|
889
|
+
temporalReuse: 1,
|
|
890
|
+
shading: 0.3
|
|
891
|
+
},
|
|
892
|
+
"pathtracer.pathTrace": { rayTracing: 1, lightingSamples: 1 },
|
|
893
|
+
"pathtracer.accumulate": { temporalReuse: 1, updateCadence: 0.4 },
|
|
894
|
+
"pathtracer.denoise": { temporalReuse: 1, shading: 0.4 },
|
|
895
|
+
"volumetrics.froxelIntegrate": {
|
|
896
|
+
lightingSamples: 0.6,
|
|
897
|
+
shading: 0.4,
|
|
898
|
+
updateCadence: 0.3
|
|
899
|
+
},
|
|
900
|
+
"volumetrics.volumetricShadow": { shadows: 0.8, updateCadence: 0.5 },
|
|
901
|
+
"hdri.irradianceConvolution": {
|
|
902
|
+
lightingSamples: 0.4,
|
|
903
|
+
temporalReuse: 1,
|
|
904
|
+
updateCadence: 1
|
|
905
|
+
},
|
|
906
|
+
"hdri.specularPrefilter": {
|
|
907
|
+
lightingSamples: 0.5,
|
|
908
|
+
temporalReuse: 1,
|
|
909
|
+
updateCadence: 1
|
|
910
|
+
},
|
|
911
|
+
"hdri.brdfLut": {
|
|
912
|
+
shading: 0.4,
|
|
913
|
+
temporalReuse: 1,
|
|
914
|
+
updateCadence: 1
|
|
915
|
+
}
|
|
916
|
+
}[key] ?? {}
|
|
917
|
+
);
|
|
918
|
+
}
|
|
919
|
+
function resolveLightingImportanceSignals(techniqueName, jobKey) {
|
|
920
|
+
const key = `${techniqueName}.${jobKey}`;
|
|
921
|
+
return Object.freeze(
|
|
922
|
+
{
|
|
923
|
+
"hybrid.directLighting": { visible: true, shadowSignificance: "high" },
|
|
924
|
+
"hybrid.screenTrace": { visible: true, reflectionSignificance: "high" },
|
|
925
|
+
"hybrid.radianceCache": { visible: true },
|
|
926
|
+
"hybrid.finalGather": {
|
|
927
|
+
visible: true,
|
|
928
|
+
shadowSignificance: "critical",
|
|
929
|
+
reflectionSignificance: "high"
|
|
930
|
+
},
|
|
931
|
+
"hybrid.reflectionResolve": { visible: true, reflectionSignificance: "high" },
|
|
932
|
+
"pathtracer.pathTrace": {
|
|
933
|
+
visible: true,
|
|
934
|
+
shadowSignificance: "high",
|
|
935
|
+
reflectionSignificance: "high"
|
|
936
|
+
},
|
|
937
|
+
"pathtracer.accumulate": { visible: true },
|
|
938
|
+
"pathtracer.denoise": { visible: true },
|
|
939
|
+
"volumetrics.froxelIntegrate": { visible: true },
|
|
940
|
+
"volumetrics.volumetricShadow": { visible: true, shadowSignificance: "high" },
|
|
941
|
+
"hdri.irradianceConvolution": { visible: false },
|
|
942
|
+
"hdri.specularPrefilter": { visible: false, reflectionSignificance: "medium" },
|
|
943
|
+
"hdri.brdfLut": { visible: false }
|
|
944
|
+
}[key] ?? {}
|
|
945
|
+
);
|
|
946
|
+
}
|
|
748
947
|
function buildWorkerManifestJob(techniqueName, job) {
|
|
749
948
|
const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];
|
|
750
949
|
const dag = lightingWorkerDagSpecs[techniqueName][job.key];
|
|
@@ -768,6 +967,8 @@ function buildWorkerManifestJob(techniqueName, job) {
|
|
|
768
967
|
domain: spec.domain,
|
|
769
968
|
authority: "visual",
|
|
770
969
|
importance: spec.importance,
|
|
970
|
+
qualityDimensions: resolveLightingQualityDimensions(techniqueName, job.key),
|
|
971
|
+
importanceSignals: resolveLightingImportanceSignals(techniqueName, job.key),
|
|
771
972
|
levels: spec.levels
|
|
772
973
|
}),
|
|
773
974
|
debug: Object.freeze({
|
|
@@ -848,6 +1049,7 @@ function getLightingProfileWorkerManifest(name = defaultLightingProfile) {
|
|
|
848
1049
|
const techniques = profile.techniques.map(
|
|
849
1050
|
(techniqueName) => getLightingTechniqueWorkerManifest(techniqueName)
|
|
850
1051
|
);
|
|
1052
|
+
const lightingBandPlan = createLightingBandPlan({ profile: profile.name });
|
|
851
1053
|
return Object.freeze({
|
|
852
1054
|
schemaVersion: 1,
|
|
853
1055
|
owner: lightingDebugOwner,
|
|
@@ -855,6 +1057,7 @@ function getLightingProfileWorkerManifest(name = defaultLightingProfile) {
|
|
|
855
1057
|
description: profile.description,
|
|
856
1058
|
schedulerMode: "dag",
|
|
857
1059
|
techniques: Object.freeze(techniques),
|
|
1060
|
+
lightingBands: lightingBandPlan.bands,
|
|
858
1061
|
jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs))
|
|
859
1062
|
});
|
|
860
1063
|
}
|
|
@@ -993,11 +1196,13 @@ async function loadLightingProfileWorkerPlan(profileName = defaultLightingProfil
|
|
|
993
1196
|
return {
|
|
994
1197
|
profile,
|
|
995
1198
|
techniques,
|
|
1199
|
+
lightingBandPlan: createLightingBandPlan({ profile: profile.name }),
|
|
996
1200
|
workerManifest: getLightingProfileWorkerManifest(profile.name)
|
|
997
1201
|
};
|
|
998
1202
|
}
|
|
999
1203
|
// Annotate the CommonJS export names for ESM import in node:
|
|
1000
1204
|
0 && (module.exports = {
|
|
1205
|
+
createLightingBandPlan,
|
|
1001
1206
|
defaultLightingProfile,
|
|
1002
1207
|
defaultLightingTechnique,
|
|
1003
1208
|
getLightingProfile,
|
|
@@ -1005,6 +1210,7 @@ async function loadLightingProfileWorkerPlan(profileName = defaultLightingProfil
|
|
|
1005
1210
|
getLightingTechnique,
|
|
1006
1211
|
getLightingTechniqueWorkerManifest,
|
|
1007
1212
|
lightingDebugOwner,
|
|
1213
|
+
lightingDistanceBands,
|
|
1008
1214
|
lightingJobLabels,
|
|
1009
1215
|
lightingJobs,
|
|
1010
1216
|
lightingPreludeWgslUrl,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.js"],"sourcesContent":["const baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return new URL(\"./index.js\", __IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\n\nexport const lightingWorkerQueueClass = \"lighting\";\nexport const lightingDebugOwner = \"lighting\";\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst lightingWorkerSpecPresets = {\n hybrid: {\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n \"lighting.hybrid.shadow-atlas\",\n ],\n jobs: {\n directLighting: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.directLighting\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.shadow-atlas\"],\n },\n screenTrace: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.screenTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 2.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n radianceCache: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.radianceCache\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.radiance-cache\"],\n },\n finalGather: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.finalGather\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 2.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n ],\n },\n reflectionResolve: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.reflectionResolve\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n },\n },\n pathtracer: {\n suggestedAllocationIds: [\n \"lighting.pathtracer.path-state\",\n \"lighting.pathtracer.accumulation\",\n \"lighting.pathtracer.denoise-history\",\n ],\n jobs: {\n pathTrace: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.pathTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 3,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 2.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 3.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.path-state\"],\n },\n accumulate: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.accumulate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.accumulation\"],\n },\n denoise: {\n domain: \"post-processing\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.denoise\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.denoise-history\"],\n },\n },\n },\n volumetrics: {\n suggestedAllocationIds: [\n \"lighting.volumetrics.froxel-grid\",\n \"lighting.volumetrics.shadow-history\",\n ],\n jobs: {\n froxelIntegrate: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.froxelIntegrate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.7,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.froxel-grid\"],\n },\n volumetricShadow: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.volumetricShadow\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.shadow-history\"],\n },\n },\n },\n hdri: {\n suggestedAllocationIds: [\n \"lighting.hdri.cubemap\",\n \"lighting.hdri.prefilter\",\n \"lighting.hdri.brdf-lut\",\n ],\n jobs: {\n irradianceConvolution: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.irradianceConvolution\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.cubemap\"],\n },\n specularPrefilter: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.specularPrefilter\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.prefilter\"],\n },\n brdfLut: {\n domain: \"lighting\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.brdfLut\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 4,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 8,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 16,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 24,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.brdf-lut\"],\n },\n },\n },\n};\n\nconst lightingWorkerDagSpecs = {\n hybrid: {\n directLighting: { priority: 4, dependencies: [] },\n screenTrace: { priority: 3, dependencies: [] },\n radianceCache: { priority: 4, dependencies: [\"directLighting\"] },\n finalGather: { priority: 2, dependencies: [\"radianceCache\", \"screenTrace\"] },\n reflectionResolve: {\n priority: 1,\n dependencies: [\"screenTrace\", \"finalGather\"],\n },\n },\n pathtracer: {\n pathTrace: { priority: 4, dependencies: [] },\n accumulate: { priority: 3, dependencies: [\"pathTrace\"] },\n denoise: { priority: 2, dependencies: [\"accumulate\"] },\n },\n volumetrics: {\n volumetricShadow: { priority: 3, dependencies: [] },\n froxelIntegrate: { priority: 2, dependencies: [\"volumetricShadow\"] },\n },\n hdri: {\n irradianceConvolution: { priority: 3, dependencies: [] },\n specularPrefilter: { priority: 3, dependencies: [] },\n brdfLut: {\n priority: 2,\n dependencies: [\"irradianceConvolution\", \"specularPrefilter\"],\n },\n },\n};\n\nfunction buildWorkerManifestJob(techniqueName, job) {\n const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];\n const dag = lightingWorkerDagSpecs[techniqueName][job.key];\n const dependencies = dag.dependencies.map(\n (dependency) => `lighting.${techniqueName}.${dependency}`\n );\n\n return Object.freeze({\n key: job.key,\n label: job.label,\n worker: Object.freeze({\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: job.label,\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: lightingDebugOwner,\n queueClass: lightingWorkerQueueClass,\n jobType: job.label,\n tags: Object.freeze([\n \"lighting\",\n techniqueName,\n job.key,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildLightingWorkerManifest(name, technique) {\n const spec = lightingWorkerSpecPresets[name];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n technique: name,\n description: technique.description,\n queueClass: lightingWorkerQueueClass,\n schedulerMode: \"dag\",\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n technique.jobs.map((job) => buildWorkerManifestJob(name, job))\n ),\n });\n}\n\nexport const lightingWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(lightingTechniques).map(([name, technique]) => [\n name,\n buildLightingWorkerManifest(name, technique),\n ])\n )\n);\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getLightingTechniqueWorkerManifest(\n name = defaultLightingTechnique\n) {\n const manifest = lightingWorkerManifests[name];\n if (!manifest) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(\n `Unknown lighting technique \"${name}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function getLightingProfileWorkerManifest(\n name = defaultLightingProfile\n) {\n const profile = getLightingProfile(name);\n const techniques = profile.techniques.map((techniqueName) =>\n getLightingTechniqueWorkerManifest(techniqueName)\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n description: profile.description,\n schedulerMode: \"dag\",\n techniques: Object.freeze(techniques),\n jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs)),\n });\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingTechniqueWorkerBundle(\n techniqueName = defaultLightingTechnique,\n options = {}\n) {\n const technique = getLightingTechnique(techniqueName);\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n technique.name,\n options\n );\n\n return {\n technique: technique.name,\n preludeWgsl,\n jobs,\n workerManifest: getLightingTechniqueWorkerManifest(technique.name),\n };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n\nexport async function loadLightingProfileWorkerPlan(\n profileName = defaultLightingProfile,\n options = {}\n) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map((techniqueName) =>\n loadLightingTechniqueWorkerBundle(techniqueName, options)\n )\n );\n\n return {\n profile,\n techniques,\n workerManifest: getLightingProfileWorkerManifest(profile.name),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAM,WAAW,MAAM;AACrB,MAAI,OAA4C;AAC9C,WAAO,IAAI,IAAI,cAAc,MAAmB;AAAA,EAClD;AACA,MAAI,OAAO,eAAe,eAAe,OAAO,YAAY,aAAa;AACvE,UAAM,EAAE,cAAc,IAAI,QAAQ,KAAU;AAC5C,WAAO,cAAc,UAAU;AAAA,EACjC;AACA,QAAM,OACJ,OAAO,YAAY,eAAe,QAAQ,MACtC,UAAU,QAAQ,IAAI,CAAC,MACvB;AACN,SAAO,IAAI,IAAI,cAAc,IAAI;AACnC,GAAG;AAEH,IAAM,iBAAiB;AAAA,EACrB,QAAQ;AAAA,IACN,aACE;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,eAAe;AAAA,MACf,aAAa;AAAA,MACb,mBAAmB;AAAA,IACrB;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,aACE;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,aACE;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,aACE;AAAA,IACF,SAAS;AAAA,IACT,MAAM;AAAA,MACJ,uBAAuB;AAAA,MACvB,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,eAAe,MAAM,MAAM;AAClC,QAAM,aAAa,IAAI,IAAI,gBAAgB,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO;AAC1E,QAAM,OAAO,OAAO,QAAQ,KAAK,IAAI,EAAE,IAAI,CAAC,CAAC,KAAK,IAAI,MAAM;AAC1D,UAAM,QAAQ,YAAY,IAAI,IAAI,GAAG;AACrC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,KAAK,IAAI,IAAI,gBAAgB,IAAI,IAAI,IAAI,IAAI,OAAO;AAAA,MACpD,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACD,SAAO;AAAA,IACL;AAAA,IACA,aAAa,KAAK;AAAA,IAClB;AAAA,IACA;AAAA,EACF;AACF;AAEO,IAAM,qBAAqB,OAAO;AAAA,EACvC,OAAO;AAAA,IACL,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,MACnD;AAAA,MACA,eAAe,MAAM,IAAI;AAAA,IAC3B,CAAC;AAAA,EACH;AACF;AAEO,IAAM,yBAAyB,OAAO,OAAO,OAAO,KAAK,kBAAkB,CAAC;AAE5E,IAAM,2BAA2B;AAExC,IAAM,eAAe;AAAA,EACnB,UAAU;AAAA,IACR,aACE;AAAA,IACF,YAAY,CAAC,UAAU,eAAe,MAAM;AAAA,EAC9C;AAAA,EACA,QAAQ;AAAA,IACN,aACE;AAAA,IACF,YAAY,CAAC,UAAU,MAAM;AAAA,EAC/B;AAAA,EACA,WAAW;AAAA,IACT,aACE;AAAA,IACF,YAAY,CAAC,cAAc,eAAe,MAAM;AAAA,EAClD;AACF;AAEA,SAAS,aAAa,MAAM,MAAM;AAChC,SAAO;AAAA,IACL;AAAA,IACA,aAAa,KAAK;AAAA,IAClB,YAAY,CAAC,GAAG,KAAK,UAAU;AAAA,EACjC;AACF;AAEO,IAAM,mBAAmB,OAAO;AAAA,EACrC,OAAO;AAAA,IACL,OAAO,QAAQ,YAAY,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AAAA,MACjD;AAAA,MACA,aAAa,MAAM,IAAI;AAAA,IACzB,CAAC;AAAA,EACH;AACF;AAEO,IAAM,uBAAuB,OAAO,OAAO,OAAO,KAAK,gBAAgB,CAAC;AAExE,IAAM,yBAAyB;AAE/B,IAAM,2BAA2B;AACjC,IAAM,qBAAqB;AAElC,SAAS,wBAAwB,SAAS,YAAY,SAAS;AAC7D,SAAO,OAAO,OAAO;AAAA,IACnB,OAAO,OAAO;AAAA,MACZ,IAAI;AAAA,MACJ,iBAAiB,QAAQ,IAAI;AAAA,MAC7B,QAAQ,OAAO,OAAO;AAAA,QACpB,uBAAuB,QAAQ,IAAI;AAAA,QACnC,oBAAoB,QAAQ,IAAI;AAAA,QAChC,gBAAgB,QAAQ,IAAI;AAAA,QAC5B,gBAAgB,QAAQ,IAAI;AAAA,QAC5B,eAAe,QAAQ,IAAI;AAAA,QAC3B,UAAU,OAAO,OAAO;AAAA,UACtB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,IACD,OAAO,OAAO;AAAA,MACZ,IAAI;AAAA,MACJ,iBAAiB,QAAQ,OAAO;AAAA,MAChC,QAAQ,OAAO,OAAO;AAAA,QACpB,uBAAuB,QAAQ,OAAO;AAAA,QACtC,oBAAoB,QAAQ,OAAO;AAAA,QACnC,gBAAgB,QAAQ,OAAO;AAAA,QAC/B,gBAAgB,QAAQ,OAAO;AAAA,QAC/B,eAAe,QAAQ,OAAO;AAAA,QAC9B,UAAU,OAAO,OAAO;AAAA,UACtB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,IACD,OAAO,OAAO;AAAA,MACZ,IAAI;AAAA,MACJ,iBAAiB,QAAQ,KAAK;AAAA,MAC9B,QAAQ,OAAO,OAAO;AAAA,QACpB,uBAAuB,QAAQ,KAAK;AAAA,QACpC,oBAAoB,QAAQ,KAAK;AAAA,QACjC,gBAAgB,QAAQ,KAAK;AAAA,QAC7B,gBAAgB,QAAQ,KAAK;AAAA,QAC7B,eAAe,QAAQ,KAAK;AAAA,QAC5B,UAAU,OAAO,OAAO;AAAA,UACtB,OAAO;AAAA,UACP;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,4BAA4B;AAAA,EAChC,QAAQ;AAAA,IACN,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,gBAAgB;AAAA,QACd,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,8BAA8B;AAAA,MACzD;AAAA,MACA,aAAa;AAAA,QACX,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,oCAAoC;AAAA,MAC/D;AAAA,MACA,eAAe;AAAA,QACb,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,gCAAgC;AAAA,MAC3D;AAAA,MACA,aAAa;AAAA,QACX,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB;AAAA,UACtB;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,mBAAmB;AAAA,QACjB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,oCAAoC;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,gCAAgC;AAAA,MAC3D;AAAA,MACA,YAAY;AAAA,QACV,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,kCAAkC;AAAA,MAC7D;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,qCAAqC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA,EACA,aAAa;AAAA,IACX,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,iBAAiB;AAAA,QACf,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,kCAAkC;AAAA,MAC7D;AAAA,MACA,kBAAkB;AAAA,QAChB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,qCAAqC;AAAA,MAChE;AAAA,IACF;AAAA,EACF;AAAA,EACA,MAAM;AAAA,IACJ,wBAAwB;AAAA,MACtB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA,MAAM;AAAA,MACJ,uBAAuB;AAAA,QACrB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,uBAAuB;AAAA,MAClD;AAAA,MACA,mBAAmB;AAAA,QACjB,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,yBAAyB;AAAA,MACpD;AAAA,MACA,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,YAAY;AAAA,QACZ,QAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,YACE,KAAK;AAAA,cACH,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,QAAQ;AAAA,cACN,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,YACA,MAAM;AAAA,cACJ,iBAAiB;AAAA,cACjB,uBAAuB;AAAA,cACvB,oBAAoB;AAAA,cACpB,gBAAgB;AAAA,cAChB,gBAAgB;AAAA,cAChB,eAAe;AAAA,YACjB;AAAA,UACF;AAAA,QACF;AAAA,QACA,wBAAwB,CAAC,wBAAwB;AAAA,MACnD;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,yBAAyB;AAAA,EAC7B,QAAQ;AAAA,IACN,gBAAgB,EAAE,UAAU,GAAG,cAAc,CAAC,EAAE;AAAA,IAChD,aAAa,EAAE,UAAU,GAAG,cAAc,CAAC,EAAE;AAAA,IAC7C,eAAe,EAAE,UAAU,GAAG,cAAc,CAAC,gBAAgB,EAAE;AAAA,IAC/D,aAAa,EAAE,UAAU,GAAG,cAAc,CAAC,iBAAiB,aAAa,EAAE;AAAA,IAC3E,mBAAmB;AAAA,MACjB,UAAU;AAAA,MACV,cAAc,CAAC,eAAe,aAAa;AAAA,IAC7C;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,WAAW,EAAE,UAAU,GAAG,cAAc,CAAC,EAAE;AAAA,IAC3C,YAAY,EAAE,UAAU,GAAG,cAAc,CAAC,WAAW,EAAE;AAAA,IACvD,SAAS,EAAE,UAAU,GAAG,cAAc,CAAC,YAAY,EAAE;AAAA,EACvD;AAAA,EACA,aAAa;AAAA,IACX,kBAAkB,EAAE,UAAU,GAAG,cAAc,CAAC,EAAE;AAAA,IAClD,iBAAiB,EAAE,UAAU,GAAG,cAAc,CAAC,kBAAkB,EAAE;AAAA,EACrE;AAAA,EACA,MAAM;AAAA,IACJ,uBAAuB,EAAE,UAAU,GAAG,cAAc,CAAC,EAAE;AAAA,IACvD,mBAAmB,EAAE,UAAU,GAAG,cAAc,CAAC,EAAE;AAAA,IACnD,SAAS;AAAA,MACP,UAAU;AAAA,MACV,cAAc,CAAC,yBAAyB,mBAAmB;AAAA,IAC7D;AAAA,EACF;AACF;AAEA,SAAS,uBAAuB,eAAe,KAAK;AAClD,QAAM,OAAO,0BAA0B,aAAa,EAAE,KAAK,IAAI,GAAG;AAClE,QAAM,MAAM,uBAAuB,aAAa,EAAE,IAAI,GAAG;AACzD,QAAM,eAAe,IAAI,aAAa;AAAA,IACpC,CAAC,eAAe,YAAY,aAAa,IAAI,UAAU;AAAA,EACzD;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,KAAK,IAAI;AAAA,IACT,OAAO,IAAI;AAAA,IACX,QAAQ,OAAO,OAAO;AAAA,MACpB,SAAS,IAAI;AAAA,MACb,YAAY;AAAA,MACZ,UAAU,IAAI;AAAA,MACd,cAAc,OAAO,OAAO,YAAY;AAAA,MACxC,eAAe;AAAA,IACjB,CAAC;AAAA,IACD,aAAa,OAAO,OAAO;AAAA,MACzB,IAAI,IAAI;AAAA,MACR,SAAS,IAAI;AAAA,MACb,YAAY;AAAA,MACZ,QAAQ,KAAK;AAAA,MACb,WAAW;AAAA,MACX,YAAY,KAAK;AAAA,MACjB,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,IACD,OAAO,OAAO,OAAO;AAAA,MACnB,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,SAAS,IAAI;AAAA,MACb,MAAM,OAAO,OAAO;AAAA,QAClB;AAAA,QACA;AAAA,QACA,IAAI;AAAA,QACJ,KAAK;AAAA,MACP,CAAC;AAAA,MACD,wBAAwB,OAAO,OAAO,CAAC,GAAG,KAAK,sBAAsB,CAAC;AAAA,IACxE,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,4BAA4B,MAAM,WAAW;AACpD,QAAM,OAAO,0BAA0B,IAAI;AAE3C,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe;AAAA,IACf,OAAO;AAAA,IACP,WAAW;AAAA,IACX,aAAa,UAAU;AAAA,IACvB,YAAY;AAAA,IACZ,eAAe;AAAA,IACf,wBAAwB,OAAO,OAAO,CAAC,GAAG,KAAK,sBAAsB,CAAC;AAAA,IACtE,MAAM,OAAO;AAAA,MACX,UAAU,KAAK,IAAI,CAAC,QAAQ,uBAAuB,MAAM,GAAG,CAAC;AAAA,IAC/D;AAAA,EACF,CAAC;AACH;AAEO,IAAM,0BAA0B,OAAO;AAAA,EAC5C,OAAO;AAAA,IACL,OAAO,QAAQ,kBAAkB,EAAE,IAAI,CAAC,CAAC,MAAM,SAAS,MAAM;AAAA,MAC5D;AAAA,MACA,4BAA4B,MAAM,SAAS;AAAA,IAC7C,CAAC;AAAA,EACH;AACF;AAEA,SAAS,gBAAgB,WAAW,KAAK;AACvC,QAAM,MAAM,UAAU,KAAK,KAAK,CAAC,UAAU,MAAM,QAAQ,GAAG;AAC5D,MAAI,CAAC,KAAK;AACR,UAAM,YAAY,UAAU,KAAK,IAAI,CAAC,UAAU,MAAM,GAAG,EAAE,KAAK,IAAI;AACpE,UAAM,IAAI;AAAA,MACR,gBAAgB,GAAG,oBAAoB,UAAU,IAAI,iBACrC,SAAS;AAAA,IAC3B;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,OAAO,0BAA0B;AACpE,QAAM,YAAY,mBAAmB,IAAI;AACzC,MAAI,CAAC,WAAW;AACd,UAAM,YAAY,uBAAuB,KAAK,IAAI;AAClD,UAAM,IAAI,MAAM,+BAA+B,IAAI,iBAAiB,SAAS,GAAG;AAAA,EAClF;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAO,wBAAwB;AAChE,QAAM,UAAU,iBAAiB,IAAI;AACrC,MAAI,CAAC,SAAS;AACZ,UAAM,YAAY,qBAAqB,KAAK,IAAI;AAChD,UAAM,IAAI,MAAM,6BAA6B,IAAI,iBAAiB,SAAS,GAAG;AAAA,EAChF;AACA,SAAO;AACT;AAEO,SAAS,mCACd,OAAO,0BACP;AACA,QAAM,WAAW,wBAAwB,IAAI;AAC7C,MAAI,CAAC,UAAU;AACb,UAAM,YAAY,uBAAuB,KAAK,IAAI;AAClD,UAAM,IAAI;AAAA,MACR,+BAA+B,IAAI,iBAAiB,SAAS;AAAA,IAC/D;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,iCACd,OAAO,wBACP;AACA,QAAM,UAAU,mBAAmB,IAAI;AACvC,QAAM,aAAa,QAAQ,WAAW;AAAA,IAAI,CAAC,kBACzC,mCAAmC,aAAa;AAAA,EAClD;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe;AAAA,IACf,OAAO;AAAA,IACP,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB,eAAe;AAAA,IACf,YAAY,OAAO,OAAO,UAAU;AAAA,IACpC,MAAM,OAAO,OAAO,WAAW,QAAQ,CAAC,cAAc,UAAU,IAAI,CAAC;AAAA,EACvE,CAAC;AACH;AAEA,IAAM,mBAAmB,qBAAqB,wBAAwB;AAE/D,IAAM,yBAAyB,iBAAiB;AAEhD,IAAM,oBAAoB,OAAO;AAAA,EACtC,OAAO,YAAY,iBAAiB,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,KAAK,CAAC,CAAC;AAC7E;AAEO,IAAM,eAAe,iBAAiB,KAAK,IAAI,CAAC,SAAS;AAAA,EAC9D,OAAO,IAAI;AAAA,EACX,KAAK,IAAI;AAAA,EACT,YAAY,IAAI;AAClB,EAAE;AAEF,SAAS,kBAAkB,QAAQ,SAAS;AAC1C,QAAM,SAAS,OAAO,MAAM,GAAG,GAAG,EAAE,YAAY;AAChD,MACE,OAAO,SAAS,WAAW,KAC3B,OAAO,SAAS,OAAO,KACvB,OAAO,SAAS,OAAO,GACvB;AACA,UAAM,QAAQ,UAAU,QAAQ,OAAO,KAAK;AAC5C,UAAM,IAAI;AAAA,MACR,gBAAgB,KAAK;AAAA,IACvB;AAAA,EACF;AACF;AAEA,eAAe,eAAe,UAAU,CAAC,GAAG;AAC1C,QAAM,EAAE,MAAM,KAAK,UAAU,WAAW,OAAO,KAAK,IAAI,WAAW,CAAC;AACpE,MAAI,OAAO,SAAS,UAAU;AAC5B,sBAAkB,MAAM,aAAa;AACrC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AACA,QAAM,WAAW,eAAe,MAAM,MAAM,IAAI,IAAI,KAAK,QAAQ,OAAO;AACxE,MAAI,CAAC,WAAW,SAAS,aAAa,SAAS;AAC7C,UAAM,EAAE,SAAS,IAAI,MAAM,OAAO,aAAkB;AACpD,UAAM,EAAE,cAAc,IAAI,MAAM,OAAO,KAAU;AACjD,UAAMA,UAAS,MAAM,SAAS,cAAc,QAAQ,GAAG,MAAM;AAC7D,sBAAkBA,SAAQ,SAAS,IAAI;AACvC,WAAOA;AAAA,EACT;AACA,QAAM,WAAW,MAAM,QAAQ,QAAQ;AACvC,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,SAAS,YAAY,WAAW,SAAS,SAAS;AACxD,UAAM,aAAa,gBAAgB,WAAW,SAAS,aAAa;AACpE,UAAM,SAAS,aAAa,GAAG,MAAM,IAAI,UAAU,KAAK,GAAG,MAAM;AACjE,UAAM,IAAI,MAAM,wBAAwB,MAAM,GAAG;AAAA,EACnD;AACA,QAAM,SAAS,MAAM,SAAS,KAAK;AACnC,oBAAkB,QAAQ,SAAS,IAAI;AACvC,SAAO;AACT;AAEA,eAAe,qBAAqB,WAAW,SAAS;AACtD,QAAM,SAAS,MAAM,eAAe,EAAE,KAAK,UAAU,YAAY,QAAQ,CAAC;AAC1E,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI,MAAM,kBAAkB,UAAU,IAAI,uBAAuB;AAAA,EACzE;AACA,SAAO;AACT;AAEA,eAAe,iBAAiB,WAAW,KAAK,SAAS;AACvD,QAAM,SAAS,MAAM,eAAe,EAAE,KAAK,IAAI,KAAK,QAAQ,CAAC;AAC7D,MAAI,OAAO,WAAW,UAAU;AAC9B,UAAM,IAAI;AAAA,MACR,kBAAkB,UAAU,IAAI,SAAS,IAAI,GAAG;AAAA,IAClD;AAAA,EACF;AACA,SAAO;AACT;AAEA,eAAsB,iCACpB,eACA,UAAU,CAAC,GACX;AACA,QAAM,EAAE,QAAQ,IAAI,WAAW,CAAC;AAChC,QAAM,YAAY,qBAAqB,aAAa;AACpD,SAAO,qBAAqB,WAAW,OAAO;AAChD;AAEA,eAAsB,6BACpB,eACA,QACA,UAAU,CAAC,GACX;AACA,QAAM,EAAE,QAAQ,IAAI,WAAW,CAAC;AAChC,QAAM,YAAY,qBAAqB,aAAa;AACpD,QAAM,MAAM,gBAAgB,WAAW,MAAM;AAC7C,SAAO,iBAAiB,WAAW,KAAK,OAAO;AACjD;AAEA,eAAsB,0BAA0B,eAAe,UAAU,CAAC,GAAG;AAC3E,QAAM,EAAE,QAAQ,IAAI,WAAW,CAAC;AAChC,QAAM,YAAY,qBAAqB,aAAa;AACpD,QAAM,cAAc,MAAM,qBAAqB,WAAW,OAAO;AACjE,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,UAAU,KAAK,IAAI,CAAC,QAAQ,iBAAiB,WAAW,KAAK,OAAO,CAAC;AAAA,EACvE;AACA,QAAM,OAAO,UAAU,KAAK,IAAI,CAAC,KAAK,WAAW;AAAA,IAC/C,MAAM,WAAW,KAAK;AAAA,IACtB,OAAO,IAAI;AAAA,IACX,YAAY,IAAI;AAAA,EAClB,EAAE;AACF,SAAO,EAAE,aAAa,KAAK;AAC7B;AAEA,eAAsB,kCACpB,gBAAgB,0BAChB,UAAU,CAAC,GACX;AACA,QAAM,YAAY,qBAAqB,aAAa;AACpD,QAAM,EAAE,aAAa,KAAK,IAAI,MAAM;AAAA,IAClC,UAAU;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW,UAAU;AAAA,IACrB;AAAA,IACA;AAAA,IACA,gBAAgB,mCAAmC,UAAU,IAAI;AAAA,EACnE;AACF;AAEA,eAAsB,wBAAwB,UAAU,CAAC,GAAG;AAC1D,QAAM,EAAE,QAAQ,IAAI,WAAW,CAAC;AAChC,SAAO,qBAAqB,kBAAkB,OAAO;AACvD;AAEA,eAAsB,iBAAiB,UAAU,CAAC,GAAG;AACnD,SAAO,0BAA0B,0BAA0B,OAAO;AACpE;AAEA,eAAsB,oBAAoB,aAAa,UAAU,CAAC,GAAG;AACnE,QAAM,UAAU,mBAAmB,WAAW;AAC9C,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,QAAQ,WAAW,IAAI,OAAO,kBAAkB;AAC9C,YAAM,EAAE,aAAa,KAAK,IAAI,MAAM;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,EAAE,SAAS,WAAW;AAC/B;AAEA,eAAsB,8BACpB,cAAc,wBACd,UAAU,CAAC,GACX;AACA,QAAM,UAAU,mBAAmB,WAAW;AAC9C,QAAM,aAAa,MAAM,QAAQ;AAAA,IAC/B,QAAQ,WAAW;AAAA,MAAI,CAAC,kBACtB,kCAAkC,eAAe,OAAO;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,gBAAgB,iCAAiC,QAAQ,IAAI;AAAA,EAC/D;AACF;","names":["source"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.js"],"sourcesContent":["const baseUrl = (() => {\n if (typeof __IMPORT_META_URL__ !== \"undefined\") {\n return new URL(\"./index.js\", __IMPORT_META_URL__);\n }\n if (typeof __filename !== \"undefined\" && typeof require !== \"undefined\") {\n const { pathToFileURL } = require(\"node:url\");\n return pathToFileURL(__filename);\n }\n const base =\n typeof process !== \"undefined\" && process.cwd\n ? `file://${process.cwd()}/`\n : \"file:///\";\n return new URL(\"./index.js\", base);\n})();\n\nconst techniqueSpecs = {\n hybrid: {\n description:\n \"Lumen-inspired hybrid realtime GI and reflections with radiance cache final gather.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n directLighting: \"direct-lighting.job.wgsl\",\n screenTrace: \"screen-trace.job.wgsl\",\n radianceCache: \"radiance-cache.job.wgsl\",\n finalGather: \"final-gather.job.wgsl\",\n reflectionResolve: \"reflection-resolve.job.wgsl\",\n },\n },\n pathtracer: {\n description:\n \"Monte Carlo path-traced reference mode with progressive accumulation and denoise stage.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n pathTrace: \"pathtrace.job.wgsl\",\n accumulate: \"accumulate.job.wgsl\",\n denoise: \"denoise.job.wgsl\",\n },\n },\n volumetrics: {\n description:\n \"Froxel volumetric lighting for fog, shafts, and participating media shadows.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n froxelIntegrate: \"froxel-integrate.job.wgsl\",\n volumetricShadow: \"volumetric-shadow.job.wgsl\",\n },\n },\n hdri: {\n description:\n \"HDRI and IBL precompute passes including irradiance, specular prefilter, and BRDF LUT.\",\n prelude: \"prelude.wgsl\",\n jobs: {\n irradianceConvolution: \"irradiance-convolution.job.wgsl\",\n specularPrefilter: \"specular-prefilter.job.wgsl\",\n brdfLut: \"brdf-lut.job.wgsl\",\n },\n },\n};\n\nfunction buildTechnique(name, spec) {\n const preludeUrl = new URL(`./techniques/${name}/${spec.prelude}`, baseUrl);\n const jobs = Object.entries(spec.jobs).map(([key, file]) => {\n const label = `lighting.${name}.${key}`;\n return {\n key,\n label,\n url: new URL(`./techniques/${name}/${file}`, baseUrl),\n sourceName: label,\n };\n });\n return {\n name,\n description: spec.description,\n preludeUrl,\n jobs,\n };\n}\n\nexport const lightingTechniques = Object.freeze(\n Object.fromEntries(\n Object.entries(techniqueSpecs).map(([name, spec]) => [\n name,\n buildTechnique(name, spec),\n ])\n )\n);\n\nexport const lightingTechniqueNames = Object.freeze(Object.keys(lightingTechniques));\n\nexport const defaultLightingTechnique = \"hybrid\";\n\nconst profileSpecs = {\n realtime: {\n description:\n \"Primary runtime profile: hybrid GI/reflections with volumetrics and HDRI/IBL.\",\n techniques: [\"hybrid\", \"volumetrics\", \"hdri\"],\n },\n hybrid: {\n description:\n \"Hybrid-focused profile for direct tuning of Lumen-inspired realtime passes.\",\n techniques: [\"hybrid\", \"hdri\"],\n },\n reference: {\n description:\n \"Reference quality profile: path tracing plus volumetrics and HDRI/IBL validation.\",\n techniques: [\"pathtracer\", \"volumetrics\", \"hdri\"],\n },\n};\n\nfunction buildProfile(name, spec) {\n return {\n name,\n description: spec.description,\n techniques: [...spec.techniques],\n };\n}\n\nexport const lightingProfiles = Object.freeze(\n Object.fromEntries(\n Object.entries(profileSpecs).map(([name, spec]) => [\n name,\n buildProfile(name, spec),\n ])\n )\n);\n\nexport const lightingProfileNames = Object.freeze(Object.keys(lightingProfiles));\n\nexport const defaultLightingProfile = \"realtime\";\nexport const lightingDistanceBands = Object.freeze([\n \"near\",\n \"mid\",\n \"far\",\n \"horizon\",\n]);\n\nexport const lightingWorkerQueueClass = \"lighting\";\nexport const lightingDebugOwner = \"lighting\";\n\nconst lightingImportanceLevels = Object.freeze([\n \"low\",\n \"medium\",\n \"high\",\n \"critical\",\n]);\n\nconst lightingBandPolicySpecs = Object.freeze({\n near: Object.freeze({\n primaryShadowSource: \"ray-traced-primary\",\n assistShadowSources: Object.freeze([\"visibility-raster\", \"shadow-map-assist\"]),\n temporalReuse: \"balanced\",\n updateCadenceDivisor: 1,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n mid: Object.freeze({\n primaryShadowSource: \"selective-raster-and-proxy\",\n assistShadowSources: Object.freeze([\n \"regional-shadow-map\",\n \"proxy-caster\",\n \"temporal-history\",\n ]),\n temporalReuse: \"aggressive\",\n updateCadenceDivisor: 2,\n liveObjectShadows: true,\n impressionOnly: false,\n }),\n far: Object.freeze({\n primaryShadowSource: \"merged-proxy-casters\",\n assistShadowSources: Object.freeze([\n \"coarse-directional\",\n \"semi-static-occlusion\",\n ]),\n temporalReuse: \"high\",\n updateCadenceDivisor: 8,\n liveObjectShadows: false,\n impressionOnly: false,\n }),\n horizon: Object.freeze({\n primaryShadowSource: \"baked-impression\",\n assistShadowSources: Object.freeze([\"atmospheric-gradient\", \"skyline-darkening\"]),\n temporalReuse: \"baked\",\n updateCadenceDivisor: 60,\n liveObjectShadows: false,\n impressionOnly: true,\n }),\n});\n\nfunction assertLightingImportance(name, value) {\n if (!lightingImportanceLevels.includes(value)) {\n throw new Error(\n `${name} must be one of: ${lightingImportanceLevels.join(\", \")}.`\n );\n }\n return value;\n}\n\nfunction resolveBandParticipation(profileName, band, importance) {\n const referenceProfile = profileName === \"reference\";\n const premiumImportance =\n importance === \"critical\" || importance === \"high\";\n\n if (band === \"near\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"premium\" : \"selective\",\n reflections: premiumImportance ? \"premium\" : \"selective\",\n globalIllumination:\n referenceProfile || importance === \"critical\" ? \"premium\" : \"selective\",\n });\n }\n\n if (band === \"mid\") {\n return Object.freeze({\n directShadows: premiumImportance ? \"selective\" : \"proxy\",\n reflections:\n referenceProfile && premiumImportance ? \"selective\" : \"proxy\",\n globalIllumination:\n referenceProfile && importance === \"critical\" ? \"selective\" : \"disabled\",\n });\n }\n\n if (band === \"far\") {\n return Object.freeze({\n directShadows: \"proxy\",\n reflections:\n referenceProfile && importance === \"critical\" ? \"proxy\" : \"disabled\",\n globalIllumination: \"disabled\",\n });\n }\n\n return Object.freeze({\n directShadows: \"disabled\",\n reflections: \"disabled\",\n globalIllumination: \"disabled\",\n });\n}\n\nexport function createLightingBandPlan(options = {}) {\n const profileName = options.profile ?? defaultLightingProfile;\n const profile = getLightingProfile(profileName);\n const importance = assertLightingImportance(\n \"importance\",\n options.importance ?? \"high\"\n );\n\n const bands = Object.freeze(\n lightingDistanceBands.map((band) =>\n Object.freeze({\n band,\n profile: profile.name,\n importance,\n primaryShadowSource: lightingBandPolicySpecs[band].primaryShadowSource,\n assistShadowSources: Object.freeze([\n ...lightingBandPolicySpecs[band].assistShadowSources,\n ]),\n rtParticipation: resolveBandParticipation(profile.name, band, importance),\n temporalReuse: lightingBandPolicySpecs[band].temporalReuse,\n updateCadenceDivisor: lightingBandPolicySpecs[band].updateCadenceDivisor,\n liveObjectShadows: lightingBandPolicySpecs[band].liveObjectShadows,\n impressionOnly: lightingBandPolicySpecs[band].impressionOnly,\n })\n )\n );\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n importance,\n techniques: Object.freeze([...profile.techniques]),\n bands,\n });\n}\n\nfunction buildWorkerBudgetLevels(jobType, queueClass, presets) {\n return Object.freeze([\n Object.freeze({\n id: \"low\",\n estimatedCostMs: presets.low.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.low.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.low.maxJobsPerDispatch,\n cadenceDivisor: presets.low.cadenceDivisor,\n workgroupScale: presets.low.workgroupScale,\n maxQueueDepth: presets.low.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"low\",\n }),\n }),\n }),\n Object.freeze({\n id: \"medium\",\n estimatedCostMs: presets.medium.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.medium.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.medium.maxJobsPerDispatch,\n cadenceDivisor: presets.medium.cadenceDivisor,\n workgroupScale: presets.medium.workgroupScale,\n maxQueueDepth: presets.medium.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"medium\",\n }),\n }),\n }),\n Object.freeze({\n id: \"high\",\n estimatedCostMs: presets.high.estimatedCostMs,\n config: Object.freeze({\n maxDispatchesPerFrame: presets.high.maxDispatchesPerFrame,\n maxJobsPerDispatch: presets.high.maxJobsPerDispatch,\n cadenceDivisor: presets.high.cadenceDivisor,\n workgroupScale: presets.high.workgroupScale,\n maxQueueDepth: presets.high.maxQueueDepth,\n metadata: Object.freeze({\n owner: lightingDebugOwner,\n queueClass,\n jobType,\n quality: \"high\",\n }),\n }),\n }),\n ]);\n}\n\nconst lightingWorkerSpecPresets = {\n hybrid: {\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n \"lighting.hybrid.shadow-atlas\",\n ],\n jobs: {\n directLighting: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.directLighting\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 256,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 512,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.shadow-atlas\"],\n },\n screenTrace: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.screenTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 3,\n workgroupScale: 0.4,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 2.2,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n radianceCache: {\n domain: \"lighting\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.radianceCache\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.radiance-cache\"],\n },\n finalGather: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.finalGather\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 128,\n },\n medium: {\n estimatedCostMs: 1.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 256,\n },\n high: {\n estimatedCostMs: 2.6,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 192,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 384,\n },\n }\n ),\n suggestedAllocationIds: [\n \"lighting.hybrid.radiance-cache\",\n \"lighting.hybrid.reflection-history\",\n ],\n },\n reflectionResolve: {\n domain: \"reflections\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hybrid.reflectionResolve\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hybrid.reflection-history\"],\n },\n },\n },\n pathtracer: {\n suggestedAllocationIds: [\n \"lighting.pathtracer.path-state\",\n \"lighting.pathtracer.accumulation\",\n \"lighting.pathtracer.denoise-history\",\n ],\n jobs: {\n pathTrace: {\n domain: \"lighting\",\n importance: \"critical\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.pathTrace\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 1.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 3,\n workgroupScale: 0.45,\n maxQueueDepth: 48,\n },\n medium: {\n estimatedCostMs: 2.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.7,\n maxQueueDepth: 96,\n },\n high: {\n estimatedCostMs: 3.8,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 128,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.path-state\"],\n },\n accumulate: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.accumulate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.accumulation\"],\n },\n denoise: {\n domain: \"post-processing\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.pathtracer.denoise\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 32,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 64,\n },\n high: {\n estimatedCostMs: 1.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 96,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.pathtracer.denoise-history\"],\n },\n },\n },\n volumetrics: {\n suggestedAllocationIds: [\n \"lighting.volumetrics.froxel-grid\",\n \"lighting.volumetrics.shadow-history\",\n ],\n jobs: {\n froxelIntegrate: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.froxelIntegrate\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 96,\n },\n medium: {\n estimatedCostMs: 1.1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 64,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 192,\n },\n high: {\n estimatedCostMs: 1.7,\n maxDispatchesPerFrame: 2,\n maxJobsPerDispatch: 128,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 256,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.froxel-grid\"],\n },\n volumetricShadow: {\n domain: \"volumetrics\",\n importance: \"high\",\n levels: buildWorkerBudgetLevels(\n \"lighting.volumetrics.volumetricShadow\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 24,\n cadenceDivisor: 2,\n workgroupScale: 0.5,\n maxQueueDepth: 64,\n },\n medium: {\n estimatedCostMs: 0.9,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 48,\n cadenceDivisor: 1,\n workgroupScale: 0.75,\n maxQueueDepth: 128,\n },\n high: {\n estimatedCostMs: 1.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 96,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 192,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.volumetrics.shadow-history\"],\n },\n },\n },\n hdri: {\n suggestedAllocationIds: [\n \"lighting.hdri.cubemap\",\n \"lighting.hdri.prefilter\",\n \"lighting.hdri.brdf-lut\",\n ],\n jobs: {\n irradianceConvolution: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.irradianceConvolution\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.3,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.5,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 0.8,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.cubemap\"],\n },\n specularPrefilter: {\n domain: \"lighting\",\n importance: \"medium\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.specularPrefilter\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 16,\n },\n medium: {\n estimatedCostMs: 0.7,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 32,\n },\n high: {\n estimatedCostMs: 1,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 32,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 48,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.prefilter\"],\n },\n brdfLut: {\n domain: \"lighting\",\n importance: \"low\",\n levels: buildWorkerBudgetLevels(\n \"lighting.hdri.brdfLut\",\n lightingWorkerQueueClass,\n {\n low: {\n estimatedCostMs: 0.2,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 4,\n cadenceDivisor: 3,\n workgroupScale: 0.5,\n maxQueueDepth: 8,\n },\n medium: {\n estimatedCostMs: 0.4,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 8,\n cadenceDivisor: 2,\n workgroupScale: 0.75,\n maxQueueDepth: 16,\n },\n high: {\n estimatedCostMs: 0.6,\n maxDispatchesPerFrame: 1,\n maxJobsPerDispatch: 16,\n cadenceDivisor: 1,\n workgroupScale: 1,\n maxQueueDepth: 24,\n },\n }\n ),\n suggestedAllocationIds: [\"lighting.hdri.brdf-lut\"],\n },\n },\n },\n};\n\nconst lightingWorkerDagSpecs = {\n hybrid: {\n directLighting: { priority: 4, dependencies: [] },\n screenTrace: { priority: 3, dependencies: [] },\n radianceCache: { priority: 4, dependencies: [\"directLighting\"] },\n finalGather: { priority: 2, dependencies: [\"radianceCache\", \"screenTrace\"] },\n reflectionResolve: {\n priority: 1,\n dependencies: [\"screenTrace\", \"finalGather\"],\n },\n },\n pathtracer: {\n pathTrace: { priority: 4, dependencies: [] },\n accumulate: { priority: 3, dependencies: [\"pathTrace\"] },\n denoise: { priority: 2, dependencies: [\"accumulate\"] },\n },\n volumetrics: {\n volumetricShadow: { priority: 3, dependencies: [] },\n froxelIntegrate: { priority: 2, dependencies: [\"volumetricShadow\"] },\n },\n hdri: {\n irradianceConvolution: { priority: 3, dependencies: [] },\n specularPrefilter: { priority: 3, dependencies: [] },\n brdfLut: {\n priority: 2,\n dependencies: [\"irradianceConvolution\", \"specularPrefilter\"],\n },\n },\n};\n\nfunction resolveLightingQualityDimensions(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { shadows: 1, lightingSamples: 0.7 },\n \"hybrid.screenTrace\": { rayTracing: 1, temporalReuse: 0.4 },\n \"hybrid.radianceCache\": {\n lightingSamples: 0.8,\n updateCadence: 0.7,\n temporalReuse: 1,\n },\n \"hybrid.finalGather\": { lightingSamples: 1, rayTracing: 0.6 },\n \"hybrid.reflectionResolve\": {\n rayTracing: 0.5,\n temporalReuse: 1,\n shading: 0.3,\n },\n \"pathtracer.pathTrace\": { rayTracing: 1, lightingSamples: 1 },\n \"pathtracer.accumulate\": { temporalReuse: 1, updateCadence: 0.4 },\n \"pathtracer.denoise\": { temporalReuse: 1, shading: 0.4 },\n \"volumetrics.froxelIntegrate\": {\n lightingSamples: 0.6,\n shading: 0.4,\n updateCadence: 0.3,\n },\n \"volumetrics.volumetricShadow\": { shadows: 0.8, updateCadence: 0.5 },\n \"hdri.irradianceConvolution\": {\n lightingSamples: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.specularPrefilter\": {\n lightingSamples: 0.5,\n temporalReuse: 1,\n updateCadence: 1,\n },\n \"hdri.brdfLut\": {\n shading: 0.4,\n temporalReuse: 1,\n updateCadence: 1,\n },\n }[key] ?? {}\n );\n}\n\nfunction resolveLightingImportanceSignals(techniqueName, jobKey) {\n const key = `${techniqueName}.${jobKey}`;\n return Object.freeze(\n {\n \"hybrid.directLighting\": { visible: true, shadowSignificance: \"high\" },\n \"hybrid.screenTrace\": { visible: true, reflectionSignificance: \"high\" },\n \"hybrid.radianceCache\": { visible: true },\n \"hybrid.finalGather\": {\n visible: true,\n shadowSignificance: \"critical\",\n reflectionSignificance: \"high\",\n },\n \"hybrid.reflectionResolve\": { visible: true, reflectionSignificance: \"high\" },\n \"pathtracer.pathTrace\": {\n visible: true,\n shadowSignificance: \"high\",\n reflectionSignificance: \"high\",\n },\n \"pathtracer.accumulate\": { visible: true },\n \"pathtracer.denoise\": { visible: true },\n \"volumetrics.froxelIntegrate\": { visible: true },\n \"volumetrics.volumetricShadow\": { visible: true, shadowSignificance: \"high\" },\n \"hdri.irradianceConvolution\": { visible: false },\n \"hdri.specularPrefilter\": { visible: false, reflectionSignificance: \"medium\" },\n \"hdri.brdfLut\": { visible: false },\n }[key] ?? {}\n );\n}\n\nfunction buildWorkerManifestJob(techniqueName, job) {\n const spec = lightingWorkerSpecPresets[techniqueName].jobs[job.key];\n const dag = lightingWorkerDagSpecs[techniqueName][job.key];\n const dependencies = dag.dependencies.map(\n (dependency) => `lighting.${techniqueName}.${dependency}`\n );\n\n return Object.freeze({\n key: job.key,\n label: job.label,\n worker: Object.freeze({\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n priority: dag.priority,\n dependencies: Object.freeze(dependencies),\n schedulerMode: \"dag\",\n }),\n performance: Object.freeze({\n id: job.label,\n jobType: job.label,\n queueClass: lightingWorkerQueueClass,\n domain: spec.domain,\n authority: \"visual\",\n importance: spec.importance,\n qualityDimensions: resolveLightingQualityDimensions(techniqueName, job.key),\n importanceSignals: resolveLightingImportanceSignals(techniqueName, job.key),\n levels: spec.levels,\n }),\n debug: Object.freeze({\n owner: lightingDebugOwner,\n queueClass: lightingWorkerQueueClass,\n jobType: job.label,\n tags: Object.freeze([\n \"lighting\",\n techniqueName,\n job.key,\n spec.domain,\n ]),\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n }),\n });\n}\n\nfunction buildLightingWorkerManifest(name, technique) {\n const spec = lightingWorkerSpecPresets[name];\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n technique: name,\n description: technique.description,\n queueClass: lightingWorkerQueueClass,\n schedulerMode: \"dag\",\n suggestedAllocationIds: Object.freeze([...spec.suggestedAllocationIds]),\n jobs: Object.freeze(\n technique.jobs.map((job) => buildWorkerManifestJob(name, job))\n ),\n });\n}\n\nexport const lightingWorkerManifests = Object.freeze(\n Object.fromEntries(\n Object.entries(lightingTechniques).map(([name, technique]) => [\n name,\n buildLightingWorkerManifest(name, technique),\n ])\n )\n);\n\nfunction getTechniqueJob(technique, key) {\n const job = technique.jobs.find((entry) => entry.key === key);\n if (!job) {\n const available = technique.jobs.map((entry) => entry.key).join(\", \");\n throw new Error(\n `Unknown job \"${key}\" for technique \"${technique.name}\". ` +\n `Available: ${available}.`\n );\n }\n return job;\n}\n\nexport function getLightingTechnique(name = defaultLightingTechnique) {\n const technique = lightingTechniques[name];\n if (!technique) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(`Unknown lighting technique \"${name}\". Available: ${available}.`);\n }\n return technique;\n}\n\nexport function getLightingProfile(name = defaultLightingProfile) {\n const profile = lightingProfiles[name];\n if (!profile) {\n const available = lightingProfileNames.join(\", \");\n throw new Error(`Unknown lighting profile \"${name}\". Available: ${available}.`);\n }\n return profile;\n}\n\nexport function getLightingTechniqueWorkerManifest(\n name = defaultLightingTechnique\n) {\n const manifest = lightingWorkerManifests[name];\n if (!manifest) {\n const available = lightingTechniqueNames.join(\", \");\n throw new Error(\n `Unknown lighting technique \"${name}\". Available: ${available}.`\n );\n }\n return manifest;\n}\n\nexport function getLightingProfileWorkerManifest(\n name = defaultLightingProfile\n) {\n const profile = getLightingProfile(name);\n const techniques = profile.techniques.map((techniqueName) =>\n getLightingTechniqueWorkerManifest(techniqueName)\n );\n const lightingBandPlan = createLightingBandPlan({ profile: profile.name });\n\n return Object.freeze({\n schemaVersion: 1,\n owner: lightingDebugOwner,\n profile: profile.name,\n description: profile.description,\n schedulerMode: \"dag\",\n techniques: Object.freeze(techniques),\n lightingBands: lightingBandPlan.bands,\n jobs: Object.freeze(techniques.flatMap((technique) => technique.jobs)),\n });\n}\n\nconst defaultTechnique = getLightingTechnique(defaultLightingTechnique);\n\nexport const lightingPreludeWgslUrl = defaultTechnique.preludeUrl;\n\nexport const lightingJobLabels = Object.freeze(\n Object.fromEntries(defaultTechnique.jobs.map((job) => [job.key, job.label]))\n);\n\nexport const lightingJobs = defaultTechnique.jobs.map((job) => ({\n label: job.label,\n url: job.url,\n sourceName: job.sourceName,\n}));\n\nfunction assertNotHtmlWgsl(source, context) {\n const sample = source.slice(0, 200).toLowerCase();\n if (\n sample.includes(\"<!doctype\") ||\n sample.includes(\"<html\") ||\n sample.includes(\"<meta\")\n ) {\n const label = context ? ` for ${context}` : \"\";\n throw new Error(\n `Expected WGSL${label} but received HTML. Check the URL or server root.`\n );\n }\n}\n\nasync function loadWgslSource(options = {}) {\n const { wgsl, url, fetcher = globalThis.fetch, base } = options ?? {};\n if (typeof wgsl === \"string\") {\n assertNotHtmlWgsl(wgsl, \"inline WGSL\");\n return wgsl;\n }\n if (!url) {\n return null;\n }\n const resolved = url instanceof URL ? url : new URL(url, base ?? baseUrl);\n if (!fetcher || resolved.protocol === \"file:\") {\n const { readFile } = await import(\"node:fs/promises\");\n const { fileURLToPath } = await import(\"node:url\");\n const source = await readFile(fileURLToPath(resolved), \"utf8\");\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n }\n const response = await fetcher(resolved);\n if (!response.ok) {\n const status = \"status\" in response ? response.status : \"unknown\";\n const statusText = \"statusText\" in response ? response.statusText : \"\";\n const detail = statusText ? `${status} ${statusText}` : `${status}`;\n throw new Error(`Failed to load WGSL (${detail})`);\n }\n const source = await response.text();\n assertNotHtmlWgsl(source, resolved.href);\n return source;\n}\n\nasync function loadTechniquePrelude(technique, fetcher) {\n const source = await loadWgslSource({ url: technique.preludeUrl, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(`Failed to load ${technique.name} prelude WGSL source.`);\n }\n return source;\n}\n\nasync function loadTechniqueJob(technique, job, fetcher) {\n const source = await loadWgslSource({ url: job.url, fetcher });\n if (typeof source !== \"string\") {\n throw new Error(\n `Failed to load ${technique.name} job \"${job.key}\" WGSL source.`\n );\n }\n return source;\n}\n\nexport async function loadLightingTechniquePreludeWgsl(\n techniqueName,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n return loadTechniquePrelude(technique, fetcher);\n}\n\nexport async function loadLightingTechniqueJobWgsl(\n techniqueName,\n jobKey,\n options = {}\n) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const job = getTechniqueJob(technique, jobKey);\n return loadTechniqueJob(technique, job, fetcher);\n}\n\nexport async function loadLightingTechniqueJobs(techniqueName, options = {}) {\n const { fetcher } = options ?? {};\n const technique = getLightingTechnique(techniqueName);\n const preludeWgsl = await loadTechniquePrelude(technique, fetcher);\n const jobSources = await Promise.all(\n technique.jobs.map((job) => loadTechniqueJob(technique, job, fetcher))\n );\n const jobs = technique.jobs.map((job, index) => ({\n wgsl: jobSources[index],\n label: job.label,\n sourceName: job.sourceName,\n }));\n return { preludeWgsl, jobs };\n}\n\nexport async function loadLightingTechniqueWorkerBundle(\n techniqueName = defaultLightingTechnique,\n options = {}\n) {\n const technique = getLightingTechnique(techniqueName);\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n technique.name,\n options\n );\n\n return {\n technique: technique.name,\n preludeWgsl,\n jobs,\n workerManifest: getLightingTechniqueWorkerManifest(technique.name),\n };\n}\n\nexport async function loadLightingPreludeWgsl(options = {}) {\n const { fetcher } = options ?? {};\n return loadTechniquePrelude(defaultTechnique, fetcher);\n}\n\nexport async function loadLightingJobs(options = {}) {\n return loadLightingTechniqueJobs(defaultLightingTechnique, options);\n}\n\nexport async function loadLightingProfile(profileName, options = {}) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map(async (techniqueName) => {\n const { preludeWgsl, jobs } = await loadLightingTechniqueJobs(\n techniqueName,\n options\n );\n return {\n technique: techniqueName,\n preludeWgsl,\n jobs,\n };\n })\n );\n return { profile, techniques };\n}\n\nexport async function loadLightingProfileWorkerPlan(\n profileName = defaultLightingProfile,\n options = {}\n) {\n const profile = getLightingProfile(profileName);\n const techniques = await Promise.all(\n profile.techniques.map((techniqueName) =>\n loadLightingTechniqueWorkerBundle(techniqueName, options)\n )\n );\n\n return {\n profile,\n techniques,\n lightingBandPlan: createLightingBandPlan({ profile: profile.name }),\n workerManifest: getLightingProfileWorkerManifest(profile.name),\n };\n}\n"],"mappings":"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","names":["source"]}
|