@meimu/mutracer 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/bvh.worker.js +1 -1
- package/dist/mutracer.umd.js +1425 -1421
- package/docs/api.md +2 -1
- package/docs/materials.md +17 -26
- package/docs/threejs.md +5 -5
- package/docs/viewer.md +36 -3
- package/lib/oidn.d.ts +1 -1
- package/lib/oidnBundledWeights.cdn.d.ts +2 -2
- package/lib/renderer/WGPUFullQuadPass.js +3 -3
- package/lib/renderer/WGPUJNLMDenoiser.js +35 -35
- package/lib/renderer/WGPURayTraceOutput.js +4 -4
- package/lib/renderer/WGPURayTracePass.js +5 -3
- package/lib/renderer/WGPURayTracePass.js.map +1 -1
- package/lib/renderer/WGPURenderingPipeline.js +7 -7
- package/lib/renderer/WebGLJNLMDenoiser.js +36 -36
- package/lib/renderer/WebGLRayTracePass.js +1 -0
- package/lib/renderer/WebGLRayTracePass.js.map +1 -1
- package/lib/renderer/glsl/chunks/cameraRay.glsl.js +8 -8
- package/lib/renderer/glsl/chunks/envMap.glsl.js +26 -26
- package/lib/renderer/glsl/chunks/intersect.glsl.js +141 -139
- package/lib/renderer/glsl/chunks/intersect.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js +56 -55
- package/lib/renderer/glsl/chunks/materialBuffer.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js +144 -144
- package/lib/renderer/glsl/chunks/openPbrBsdf.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/random.glsl.js +1 -1
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js +14 -14
- package/lib/renderer/glsl/chunks/rayTraceCore.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleLight.glsl.js +19 -19
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js +46 -46
- package/lib/renderer/glsl/chunks/sampleMaterial.glsl.js.map +1 -1
- package/lib/renderer/glsl/chunks/sampleShadowCatcher.glsl.js +6 -6
- package/lib/renderer/glsl/chunks/sampling.glsl.js +33 -33
- package/lib/renderer/glsl/chunks/sobol.glsl.js +7 -7
- package/lib/renderer/glsl/chunks/uvProjection.glsl.js +1 -1
- package/lib/renderer/glsl/depthQuery.frag.js +2 -2
- package/lib/renderer/glsl/rayTrace.frag.js +67 -67
- package/lib/renderer/glsl/shadowCatcher.frag.js +3 -3
- package/lib/renderer/glsl/webglPipeline.frag.js +26 -26
- package/lib/renderer/scratchSampling.js +16 -16
- package/lib/renderer/wgsl/chunks/envMap.wgsl.js +14 -14
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js +178 -178
- package/lib/renderer/wgsl/chunks/intersect.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/intersectionAlpha.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js +24 -23
- package/lib/renderer/wgsl/chunks/materialBuffer.wgsl.js.map +1 -1
- package/lib/renderer/wgsl/chunks/openPbrBsdf.wgsl.js +160 -160
- package/lib/renderer/wgsl/chunks/pdm_displacement.wgsl.js +12 -12
- package/lib/renderer/wgsl/chunks/rayTraceCore.wgsl.js +5 -5
- package/lib/renderer/wgsl/chunks/sampleLight.wgsl.js +44 -44
- package/lib/renderer/wgsl/chunks/sampleMaterial.wgsl.js +69 -69
- package/lib/renderer/wgsl/chunks/sampleShadowCatcher.wgsl.js +3 -3
- package/lib/renderer/wgsl/chunks/sampling.wgsl.js +33 -33
- package/lib/renderer/wgsl/chunks/sobol.wgsl.js +7 -7
- package/lib/renderer/wgsl/chunks/uvProjection.wgsl.js +1 -1
- package/lib/renderer/wgsl/compose.frag.wgsl.js +54 -54
- package/lib/renderer/wgsl/customDenoise.wgsl.js +6 -6
- package/lib/renderer/wgsl/depthQuery.wgsl.js +2 -2
- package/lib/renderer/wgsl/offlineAdaptive.compute.js +5 -5
- package/lib/renderer/wgsl/rayTrace.compute.js +103 -103
- package/lib/scene/OpenPBRMaterial.d.ts +1 -1
- package/lib/scene/OpenPBRMaterial.js +1 -1
- package/lib/scene/OpenPBRMaterial.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +1 -1
|
@@ -45,21 +45,21 @@ if (preserveSurfaceTexture != 0u) {
|
|
|
45
45
|
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
let
|
|
49
|
-
let center = textureLoad(in_rawNormal,
|
|
48
|
+
let fQ = vec2i(globalId.xy);
|
|
49
|
+
let center = textureLoad(in_rawNormal, fQ, 0);
|
|
50
50
|
let n = normalize(center.rgb * 2.0 - 1.0 + vec3f(1e-8));
|
|
51
|
-
var
|
|
51
|
+
var nf = 0.0;
|
|
52
52
|
for (var y = -1; y <= 1; y++) {
|
|
53
53
|
for (var x = -1; x <= 1; x++) {
|
|
54
54
|
let tV = textureLoad(in_rawNormal,
|
|
55
|
-
clamp(
|
|
55
|
+
clamp(fQ + vec2i(x, y), vec2i(0), imageSize - 1), 0);
|
|
56
56
|
let nn = normalize(tV.rgb * 2.0 - 1.0 + vec3f(1e-8));
|
|
57
|
-
|
|
57
|
+
nf = max(nf,
|
|
58
58
|
max(1.0 - dot(n, nn), abs(center.a - tV.a)));
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
let un = smoothstep(0.02, 0.1,
|
|
62
|
-
let raw = clamp(textureLoad(in_rawAlbedo,
|
|
61
|
+
let un = smoothstep(0.02, 0.1, nf);
|
|
62
|
+
let raw = clamp(textureLoad(in_rawAlbedo, fQ, 0).rgb,
|
|
63
63
|
vec3f(0.0), vec3f(1.0));
|
|
64
64
|
result = mix(raw, linear, un);
|
|
65
65
|
}
|
|
@@ -47,12 +47,12 @@ ivec2 size = rawGuideTexRegion();
|
|
|
47
47
|
vec2 center = load_rawGuideTex(p, 0).xy;
|
|
48
48
|
float lu = 0.0;
|
|
49
49
|
float jc = 0.0;
|
|
50
|
-
float
|
|
50
|
+
float mY = 0.0;
|
|
51
51
|
float iX = 0.0;
|
|
52
52
|
for (int dy = -1; dy <= 1; dy++) {
|
|
53
53
|
for (int dx = -1; dx <= 1; dx++) {
|
|
54
54
|
vec2 value = load_rawGuideTex(clamp(p + ivec2(dx, dy), ivec2(0), size - 1), 0).xy;
|
|
55
|
-
|
|
55
|
+
mY += value.x;
|
|
56
56
|
iX += value.x * value.x;
|
|
57
57
|
if (value.y >= 0.0) {
|
|
58
58
|
lu += value.y;
|
|
@@ -64,7 +64,7 @@ float variance;
|
|
|
64
64
|
if (center.y >= 0.0) {
|
|
65
65
|
variance = lu / jc;
|
|
66
66
|
} else {
|
|
67
|
-
float lt =
|
|
67
|
+
float lt = mY / 9.0;
|
|
68
68
|
variance = max(iX / 9.0 - lt * lt, 0.0) * 9.0 / 8.0;
|
|
69
69
|
}
|
|
70
70
|
out_guide = vec4(center.x, variance, 0.0, 1.0);
|
|
@@ -105,7 +105,7 @@ const filterFragment = new FragmentShader({
|
|
|
105
105
|
|
|
106
106
|
ivec2 imageSize;
|
|
107
107
|
|
|
108
|
-
vec2
|
|
108
|
+
vec2 nH(ivec2 p) {
|
|
109
109
|
return load_guideTex(clamp(p, ivec2(0), imageSize - 1), 0).xy;
|
|
110
110
|
}
|
|
111
111
|
|
|
@@ -116,14 +116,14 @@ if (decodeInput) c.rgb = pow(max(c.rgb, 0.0), vec3(2.2));
|
|
|
116
116
|
return vec4(c.rgb * c.a, c.a);
|
|
117
117
|
}
|
|
118
118
|
|
|
119
|
-
float
|
|
119
|
+
float lw(ivec2 q, vec4 bs, vec3 gT) {
|
|
120
120
|
vec4 albedo = load_albedoTex(q, 0);
|
|
121
121
|
|
|
122
122
|
|
|
123
123
|
vec3 pf = max((albedo.rgb + bs.rgb) * 0.5, vec3(${JNLM_ALBEDO_FLOOR}));
|
|
124
124
|
vec3 ld = (albedo.rgb - bs.rgb) / pf;
|
|
125
125
|
float iU = albedo.a - bs.a;
|
|
126
|
-
vec3 lp = load_normalTex(q, 0).rgb -
|
|
126
|
+
vec3 lp = load_normalTex(q, 0).rgb - gT;
|
|
127
127
|
return max(
|
|
128
128
|
dot(ld, ld) * INV_ALBEDO_BANDWIDTH2
|
|
129
129
|
+ iU * iU * INV_COVERAGE_BANDWIDTH2,
|
|
@@ -135,16 +135,16 @@ void main() {
|
|
|
135
135
|
imageSize = guideTexRegion();
|
|
136
136
|
ivec2 p = ivec2(gl_FragCoord.xy);
|
|
137
137
|
vec4 bs = load_albedoTex(p, 0);
|
|
138
|
-
vec4
|
|
139
|
-
vec3
|
|
138
|
+
vec4 fD = load_normalTex(p, 0);
|
|
139
|
+
vec3 gT = fD.rgb;
|
|
140
140
|
|
|
141
141
|
|
|
142
|
-
if (
|
|
142
|
+
if (fD.a <= 0.0 && load_shadowCatcherTex(p, 0).r <= 0.0) {
|
|
143
143
|
vec4 c = rL(p);
|
|
144
144
|
vec3 rgb = c.rgb / max(c.a, 1e-6);
|
|
145
145
|
if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));
|
|
146
146
|
out_color = vec4(rgb, c.a);
|
|
147
|
-
out_guide = vec4(
|
|
147
|
+
out_guide = vec4(nH(p), 0.0, 1.0);
|
|
148
148
|
return;
|
|
149
149
|
}
|
|
150
150
|
|
|
@@ -152,20 +152,20 @@ vec2 lf[PATCH_SIZE];
|
|
|
152
152
|
int k = 0;
|
|
153
153
|
for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
|
|
154
154
|
for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
|
|
155
|
-
lf[k] =
|
|
155
|
+
lf[k] = nH(p + ivec2(dx, dy) * dilation);
|
|
156
156
|
k++;
|
|
157
157
|
}
|
|
158
158
|
}
|
|
159
159
|
float k2 = colorSensitivity * colorSensitivity;
|
|
160
160
|
|
|
161
161
|
vec4 sum = vec4(0.0);
|
|
162
|
-
vec3
|
|
163
|
-
vec3
|
|
164
|
-
vec3
|
|
162
|
+
vec3 gW = max(bs.rgb, vec3(${JNLM_ALBEDO_FLOOR}));
|
|
163
|
+
vec3 mp = vec3(0.0);
|
|
164
|
+
vec3 gy = vec3(0.0);
|
|
165
165
|
vec3 hs = vec3(0.0);
|
|
166
166
|
float ps = 0.0;
|
|
167
|
-
float
|
|
168
|
-
float
|
|
167
|
+
float gA = 0.0;
|
|
168
|
+
float nU = 0.0;
|
|
169
169
|
float kM = 0.0;
|
|
170
170
|
for (int sy = -SEARCH_RADIUS; sy <= SEARCH_RADIUS; sy++) {
|
|
171
171
|
for (int sx = -SEARCH_RADIUS; sx <= SEARCH_RADIUS; sx++) {
|
|
@@ -174,36 +174,36 @@ if (
|
|
|
174
174
|
(sx == 0 && sy == 0) ||
|
|
175
175
|
q.x < 0 || q.y < 0 || q.x >= imageSize.x || q.y >= imageSize.y
|
|
176
176
|
) continue;
|
|
177
|
-
float features =
|
|
177
|
+
float features = lw(q, bs, gT);
|
|
178
178
|
if (features > 16.0) continue;
|
|
179
179
|
|
|
180
|
-
float
|
|
180
|
+
float fY = 0.0;
|
|
181
181
|
k = 0;
|
|
182
182
|
for (int dy = -PATCH_RADIUS; dy <= PATCH_RADIUS; dy++) {
|
|
183
183
|
for (int dx = -PATCH_RADIUS; dx <= PATCH_RADIUS; dx++) {
|
|
184
184
|
vec2 a = lf[k];
|
|
185
|
-
vec2 b =
|
|
185
|
+
vec2 b = nH(q + ivec2(dx, dy) * dilation);
|
|
186
186
|
float qU = a.x - b.x;
|
|
187
|
-
|
|
187
|
+
fY += (qU * qU
|
|
188
188
|
- VARIANCE_CANCELLATION * (a.y + min(a.y, b.y)))
|
|
189
189
|
/ (1e-10 + k2 * (a.y + b.y));
|
|
190
190
|
k++;
|
|
191
191
|
}
|
|
192
192
|
}
|
|
193
|
-
|
|
193
|
+
fY /= float(PATCH_SIZE);
|
|
194
194
|
|
|
195
|
-
float weight = exp(-max(max(
|
|
196
|
-
vec2 g =
|
|
195
|
+
float weight = exp(-max(max(fY, 0.0), features));
|
|
196
|
+
vec2 g = nH(q);
|
|
197
197
|
|
|
198
|
-
vec3 a = (load_albedoTex(q, 0).rgb - bs.rgb) /
|
|
198
|
+
vec3 a = (load_albedoTex(q, 0).rgb - bs.rgb) / gW;
|
|
199
199
|
vec4 value = rL(q);
|
|
200
200
|
sum += value * weight;
|
|
201
|
-
|
|
202
|
-
|
|
201
|
+
mp += a * weight;
|
|
202
|
+
gy += a * a * weight;
|
|
203
203
|
hs += a * value.rgb * weight;
|
|
204
204
|
ps += g.x * weight;
|
|
205
|
-
|
|
206
|
-
|
|
205
|
+
gA += g.y * weight * weight;
|
|
206
|
+
nU += weight;
|
|
207
207
|
kM = max(kM, weight);
|
|
208
208
|
}
|
|
209
209
|
}
|
|
@@ -211,21 +211,21 @@ kM = max(kM, weight);
|
|
|
211
211
|
|
|
212
212
|
|
|
213
213
|
vec4 center = rL(p);
|
|
214
|
-
vec2 le =
|
|
214
|
+
vec2 le = nH(p);
|
|
215
215
|
float dG = max(kM, CENTER_WEIGHT_MIN);
|
|
216
|
-
float totalWeight =
|
|
216
|
+
float totalWeight = nU + dG;
|
|
217
217
|
vec4 mean = (sum + center * dG) / totalWeight;
|
|
218
218
|
|
|
219
219
|
|
|
220
|
-
vec3 ez =
|
|
221
|
-
vec3
|
|
220
|
+
vec3 ez = mp / totalWeight;
|
|
221
|
+
vec3 lA = max(gy / totalWeight - ez * ez, vec3(0.0));
|
|
222
222
|
vec3 qu = hs / totalWeight - ez * mean.rgb;
|
|
223
223
|
|
|
224
224
|
|
|
225
225
|
|
|
226
|
-
vec3 qE = bs.rgb + ez *
|
|
227
|
-
vec3
|
|
228
|
-
vec3 vB = clamp(qu / (
|
|
226
|
+
vec3 qE = bs.rgb + ez * gW;
|
|
227
|
+
vec3 oz = mean.rgb * gW / max(qE, vec3(${JNLM_ALBEDO_FLOOR}));
|
|
228
|
+
vec3 vB = clamp(qu / (lA + vec3(${JNLM_ALBEDO_REGULARIZATION})), vec3(0.0), oz);
|
|
229
229
|
vec3 rD = mean.rgb - vB * ez;
|
|
230
230
|
vec4 filtered = vec4(max(rD, vec3(0.0)), max(mean.a, 0.0));
|
|
231
231
|
vec3 rgb = filtered.a > 1e-6
|
|
@@ -235,7 +235,7 @@ if (encodeOutput) rgb = pow(max(rgb, 0.0), vec3(1.0 / 2.2));
|
|
|
235
235
|
out_color = vec4(rgb, filtered.a);
|
|
236
236
|
out_guide = vec4(
|
|
237
237
|
(ps + le.x * dG) / totalWeight,
|
|
238
|
-
(
|
|
238
|
+
(gA + le.y * dG * dG)
|
|
239
239
|
/ (totalWeight * totalWeight),
|
|
240
240
|
0.0,
|
|
241
241
|
1.0
|
|
@@ -485,6 +485,7 @@ class WebGLRayTracePass {
|
|
|
485
485
|
STACK_SIZE,
|
|
486
486
|
USE_VERTEX_COLOR: mergedGeometry.color != null,
|
|
487
487
|
USE_TANGENT: mergedGeometry.tangent != null,
|
|
488
|
+
USE_COAT_NORMAL_FRAMES: materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap)),
|
|
488
489
|
HAS_TRANSMISSION: this._hasTransmission,
|
|
489
490
|
HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),
|
|
490
491
|
HAS_BEVEL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebGLRayTracePass.js","sourceRoot":"","sources":["../../src/renderer/WebGLRayTracePass.ts"],"names":[],"mappings":"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","sourcesContent":["import { normalizeBounces } from './pathLimits.js';\nimport { updateMeshInstanceColors } from './prepareMeshBVH.js';\nimport { updateTLASInstanceColors } from './bvhAccel.js';\nimport { getMaterialHashKey } from '../scene/openPbrSchema.js';\nimport { sameInstanceMembership } from './meshInstances.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { dirtyMeshInstanceIndices } from './prepareMeshBVH.js';\nimport { cameraApertureRadius } from './cameraLens.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { samplingPatternCode, zSobolLog2SPP, type SamplingPattern } from './sampling.js';\nimport depthQueryFrag from './glsl/depthQuery.frag.js';\nimport { readFloatPixelsAsync } from './WebGLReadback.js';\nimport { DEPTH_SAMPLE_GRID, packDepthSampleArea, unpackDepthSamples, type DepthSampleArea } from './depthQuery.js';\nimport { MeshMembershipCache } from './meshMembership.js';\nimport { SceneEnvironmentCache, RectLightTextureTracker } from './sceneLightChanges.js';\nimport { MaterialChangeTracker, materialIsEmissive, type MaterialUpdateLevel } from './materialChanges.js';\nimport {\n constants,\n WebGLDevice as WebGLRenderer,\n Texture2D as WebGLTexture2D\n} from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport { mat4 } from '../math.js';\nimport Mesh from '../scene/Mesh.js';\nimport {\n buildBLAS,\n buildTLAS,\n concatBLASBuffers,\n refitBLAS,\n refitTLAS,\n mergeRefitRanges,\n type FlattendBVH\n} from './bvhAccel.js';\nimport {\n generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform\n} from './envMapCreation.js';\nimport {\n envMapDistribution,\n environmentMapSourcesMatch,\n type EnvironmentMapSource\n} from './envMapDistribution.js';\nimport createRayTraceFragmentShader from './glsl/rayTrace.frag.js';\nimport shadowCatcherFrag from './glsl/shadowCatcher.frag.js';\nimport MaterialTable, {\n DEFAULT_MAX_TEXTURE_ARRAY_BYTES,\n materialUsesMedium\n} from './MaterialTable.js';\nimport OpenPBRMaterial, {\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\n\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { isIntelMac, numberArraysEqual } from './util.js';\nimport Camera from '../scene/Camera.js';\nimport {\n commonLinearFloatProps,\n commonNearestFloatProps,\n setDataTexture,\n textureDimensionsFromArray\n} from './dataTextureUtil.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n packLightsToBuffer\n} from './lightsUtil.js';\nimport {\n estimateAnalyticLightPower,\n estimateEnvironmentPower,\n packIESProfiles\n} from './lightSampling.js';\nimport { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged } from './geometryUpdates.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';\nimport { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';\nimport {\n DEFAULT_BEVEL_SAMPLES,\n normalizeBevelSamples\n} from './RenderingPipeline.js';\nimport {\n getOpenPbrEnergyLutData,\n OPENPBR_ENERGY_LUT_HEIGHT,\n OPENPBR_ENERGY_LUT_WIDTH\n} from './openPbrEnergyLut.js';\n\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n// A defensive mixture keeps weak-but-wide lights from being starved by an\n// imperfect scalar power estimate while still favoring dominant emitters.\nconst POWER_WEIGHTED_LIGHT_MIX = 0.25;\n\nfunction packLightsToTexture(\n texture: WebGLTexture2D,\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number>,\n selectionCdfs: ArrayLike<number>,\n iesProfileTexelOffsets: ArrayLike<number>\n) {\n const data = packLightsToBuffer(\n lights,\n texturesIndices,\n selectionPmfs,\n selectionCdfs,\n iesProfileTexelOffsets\n );\n texture.source = {\n data,\n width: data.length / 4,\n height: 1\n };\n}\n\n// TODO EXT_float_blend\n// rayTraceBlendNode.inputs = {\n// colorTex: rayTraceNode,\n// prevColorTex: {\n// node: rayTraceBlendNode,\n// prevFrame: true\n// }\n// };\n\n// TODO use one method to set all required properties.\n// Ensure necessary properties are set.\nclass WebGLRayTracePass {\n private readonly _renderer: WebGLRenderer;\n private _meshes: Mesh[] = [];\n private _sceneEnvironment = new SceneEnvironmentCache();\n private _rectLightTextures = new RectLightTextureTracker();\n private _analyticLights: AnalyticLight[] = [];\n private _analyticLightSelectionPmfs = new Float32Array(0);\n private _analyticLightSelectionCdfs = new Float32Array(0);\n private _envLightSelectionPmf = 0;\n private _materialData: MaterialTable | undefined;\n private _maxTextureArrayBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n private _preparedMeshData?: ReturnType<typeof updateMeshInstances>;\n private _membershipCache = new MeshMembershipCache();\n private _pendingMembershipData?: ReturnType<typeof updateMeshInstances>;\n private _materialChanges = new MaterialChangeTracker();\n private _pendingMaterialUpdate?: { level: MaterialUpdateLevel; emission: boolean; emissiveMap: boolean; materials: Set<OpenPBRMaterial> };\n private _pendingGeometryUpdates = new Set<Geometry>();\n private _needsUpdateMeshData = true;\n private _needsUpdateMeshMembership = false;\n private _needsRefitTLAS = false;\n private _dirtyTransformMeshes = new Set<Mesh>();\n private _dirtyColorMeshes = new Set<Mesh>();\n private _tlas?: FlattendBVH;\n private _bvhData?: Float32Array;\n private _instancesData?: Float32Array;\n private _materialIndexData?: Float32Array;\n private _meshSnapshot: {\n mesh: Mesh;\n instanceCount: number;\n instanceVersion: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion: number;\n geometry: Mesh['geometry'];\n materials: OpenPBRMaterial[];\n materialKeys: string[];\n geometryVersion: number;\n positionArray: Float32Array;\n indexArray: Geometry['indices']['array'];\n matrix: number[];\n }[] = [];\n private _snapshotByMesh = new WeakMap<Mesh, (typeof this._meshSnapshot)[number]>();\n private _needsUpdateAnalyticLightsBuffer = true;\n private _debugBvhData?: {\n buffer: ArrayBuffer;\n };\n\n private _lightTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileColumns = 1;\n private _iesProfileTexelOffsets = new Int32Array(0);\n private _openPbrEnergyLut = new WebGLTexture2D({\n ...commonNearestFloatProps,\n source: {\n data: getOpenPbrEnergyLutData(),\n width: OPENPBR_ENERGY_LUT_WIDTH,\n height: OPENPBR_ENERGY_LUT_HEIGHT\n }\n });\n\n private _envMap = new WebGLTexture2D(commonLinearFloatProps);\n private _envMapDistribution = new WebGLTexture2D(commonLinearFloatProps);\n private _envImageSource?: EnvironmentMapSource;\n private _backgroundTex = new WebGLTexture2D(commonLinearFloatProps);\n\n private _hasEnvMap = false;\n private _hasBackground = false;\n private _groundedBackgroundParams = new Float32Array([0, 0, 0, 0]);\n private _groundedBackgroundCenter = new Float32Array([0, 0]);\n private _backgroundMapTransform = backgroundMapTransform();\n\n private _bounces = 2;\n private _bevelSamples = DEFAULT_BEVEL_SAMPLES;\n private _clamping?: number;\n\n // higher number results in faster convergence over time, but with lower quality initial samples\n\n private _samplingCode = -1;\n private _sequenceSeed = 0;\n private _zLogSPP = 0;\n\n private _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _matIndexBufferTex = new WebGLTexture2D({\n ...commonNearestFloatProps\n // type: constants.INT\n });\n\n private _hasTransmission = false;\n private _hasAlpha = false;\n\n private _invalid = false;\n private _transmissiveAlphaMin = 1;\n\n private _mainPass: WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >;\n private _shadowCatcherPass: WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >;\n\n private _viewProjInv = mat4.create();\n private _apertureRadius = 0;\n private _focusDistance = 10;\n\n private _tracePasses: WebGLFullQuadPass<any, any>[];\n private readonly _depthPass: WebGLFullQuadPass<never, 'depth'>;\n private readonly _depthAbort = new AbortController();\n private _depthAspect = 1;\n private _hasShadowCatcher = false;\n private _spectral = false;\n\n constructor(renderer: WebGLRenderer) {\n this._renderer = renderer;\n const accumulationOutput = {\n type: constants.FLOAT,\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n };\n\n const rayTraceFrag = createRayTraceFragmentShader();\n rayTraceFrag.parallelCompile = true;\n shadowCatcherFrag.parallelCompile = true;\n this._mainPass = new WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >('rayTrace', renderer, {\n shader: rayTraceFrag,\n // `moments` holds the denoiser's guide value moments and sample count.\n outputs: ['color', 'albedo', 'normal', 'moments'],\n outputParams: {\n color: accumulationOutput,\n albedo: accumulationOutput,\n normal: accumulationOutput,\n moments: accumulationOutput\n }\n });\n this._shadowCatcherPass = new WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >(\n 'shadowCatcher',\n renderer,\n {\n shader: shadowCatcherFrag,\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n outputParams: {\n shadowCatcher: accumulationOutput,\n catcherBackground: accumulationOutput,\n catcherMoments: accumulationOutput\n }\n }\n );\n this._depthPass = new WebGLFullQuadPass('Depth query', renderer, {\n shader: depthQueryFrag, outputs: ['depth'],\n outputParams: { depth: commonNearestFloatProps }\n });\n this._tracePasses = [this._mainPass, this._shadowCatcherPass, this._depthPass];\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n OES_texture_float_linear: !!renderer.gl.getExtension(\n 'OES_texture_float_linear'\n )\n });\n });\n this._mainPass.setUniform('openPbrEnergyLut', this._openPbrEnergyLut);\n }\n\n createPass(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number },\n disableShadowCatcher = false\n ) {\n this.prepare();\n const options = {\n clear,\n blend: !clear,\n scissor: tile\n };\n this._mainPass.createPass({} as Record<never, WebGLTexture2D>, undefined, options);\n if (this._hasShadowCatcher && !disableShadowCatcher) {\n this._shadowCatcherPass.createPass(\n {} as Record<never, WebGLTexture2D>,\n undefined,\n options\n );\n }\n }\n\n getOutput(\n label: 'color' | 'albedo' | 'normal' | 'moments' |\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n ) {\n return label === 'shadowCatcher' || label === 'catcherBackground' ||\n label === 'catcherMoments'\n ? this._shadowCatcherPass.getOutput(label)\n : this._mainPass.getOutput(label);\n }\n\n setBounce(bounce: number) {\n const next = normalizeBounces(bounce);\n const changed = this._bounces !== next;\n this._bounces = next;\n return changed;\n }\n\n setClamping(clamping?: number) {\n const changed = this._clamping !== clamping;\n this._clamping = clamping;\n return changed;\n }\n\n setBevelSamples(samples: number) {\n const next = normalizeBevelSamples(samples);\n const changed = this._bevelSamples !== next;\n if (changed) {\n this._bevelSamples = next;\n }\n return changed;\n }\n\n private _setEnvMap(envImage: EnvironmentMapSource | undefined) {\n if (!environmentMapSourcesMatch(envImage, this._envImageSource) && envImage) {\n this._envMap.source = envImage;\n this._envMapDistribution.source = envMapDistribution(envImage);\n }\n this._envImageSource = envImage;\n this._tracePasses.forEach((pass) => {\n pass.setUniform('envMap', envImage ? this._envMap : null);\n pass.setUniform(\n 'envMapDistribution',\n envImage ? this._envMapDistribution : null\n );\n pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf);\n\n pass.setDefines({\n USE_ENVMAP: !!envImage\n });\n });\n\n this._hasEnvMap = !!envImage;\n }\n\n setBackground(background?: SceneBackground) {\n this._backgroundMapTransform.set(backgroundMapTransform(background));\n const backgroundImage =\n background && generateBackgroundMapFromSceneBackground(background)!;\n\n if (backgroundImage) {\n this._backgroundTex.source = backgroundImage;\n }\n this._hasBackground = !!backgroundImage;\n const grounded =\n background &&\n !Array.isArray(background) &&\n 'type' in background &&\n background.type === 'GroundedSkybox'\n ? background\n : undefined;\n this._groundedBackgroundParams.set(\n grounded\n ? [\n Math.max(grounded.height, 0.0001),\n Math.max(grounded.radius, 0.0001),\n grounded.groundHeight ?? 0,\n 1\n ]\n : [0, 0, 0, 0]\n );\n this._groundedBackgroundCenter.set(grounded?.center ?? [0, 0]);\n }\n\n setTransmissiveOutputAlphaMin(transmissiveAlphaMin: number) {\n const changed = this._transmissiveAlphaMin !== transmissiveAlphaMin;\n this._transmissiveAlphaMin = transmissiveAlphaMin;\n return changed;\n }\n\n setMeshes(meshes: Mesh[], update?: { transforms?: readonly Mesh[]; colors?: readonly Mesh[]; geometries?: readonly Geometry[]; materials?: readonly OpenPBRMaterial[] }) {\n for (const mesh of update?.colors ?? []) this._dirtyColorMeshes.add(mesh);\n if (update && this._preparedMeshData && this._materialData &&\n !this._needsUpdateMeshData && meshes === this._meshes) {\n const change = this._materialChanges.classify(update.materials ?? []);\n if (change.level !== 'geometry' && canUpdateGeometries(this._preparedMeshData, update.geometries ?? [])) {\n if (update.materials?.length) {\n const pending = this._pendingMaterialUpdate;\n this._pendingMaterialUpdate = { level: pending?.level === 'textures' ? 'textures' : change.level,\n emission: !!pending?.emission || change.emission,\n emissiveMap: !!pending?.emissiveMap || change.emissiveMap,\n materials: new Set([...(pending?.materials ?? []), ...update.materials]) };\n this._meshSnapshot.forEach(item => { item.materialKeys = item.materials.map(getMaterialHashKey); });\n }\n for (const geometry of update.geometries ?? []) this._pendingGeometryUpdates.add(geometry);\n for (const item of this._meshSnapshot) if (this._pendingGeometryUpdates.has(item.geometry)) item.geometryVersion = item.geometry.version;\n for (const mesh of update.transforms ?? []) {\n const item = this._snapshotByMesh.get(mesh);\n if (!item) continue;\n for (let i = 0; i < 16; i++) item.matrix[i] = mesh.transform[i];\n this._dirtyTransformMeshes.add(mesh); this._needsRefitTLAS = true;\n }\n return !!update.materials?.length || !!update.transforms?.length || !!update.colors?.length || !!update.geometries?.length;\n }\n }\n const materialChange = !!update?.materials?.length;\n const next = meshes.map((mesh) => ({\n mesh,\n instanceCount: mesh instanceof InstancedMesh ? mesh.count : 1,\n instanceVersion: mesh instanceof InstancedMesh ? mesh.transformsVersion : 0,\n instanceTransforms: mesh instanceof InstancedMesh ? mesh.transforms : undefined,\n instanceColors: mesh instanceof InstancedMesh ? mesh.colors : undefined,\n colorVersion: mesh instanceof InstancedMesh ? mesh.colorsVersion : 0,\n geometry: mesh.geometry,\n materials: mesh.materials.slice(),\n materialKeys: mesh.materials.map(getMaterialHashKey),\n geometryVersion: mesh.geometry.version,\n positionArray: mesh.geometry.position.array, indexArray: mesh.geometry.indices.array,\n matrix: Array.from(mesh.transform as ArrayLike<number>)\n }));\n const membershipChanged = next.length !== this._meshSnapshot.length ||\n next.some((item, i) => item.mesh !== this._meshSnapshot[i]?.mesh || item.instanceCount !== this._meshSnapshot[i]?.instanceCount ||\n item.materials.some((material, k) => material !== this._meshSnapshot[i]?.materials[k]));\n const membership = !this._needsUpdateMeshData && membershipChanged && this._preparedMeshData\n ? this._membershipCache.update(this._preparedMeshData, meshes) : undefined;\n if (membership) {\n const versions = new Map(this._meshSnapshot.flatMap(item => item.materials.map((m, i) => [m, item.materialKeys[i]] as const)));\n const materialsChanged = membership.materials.length !== this._preparedMeshData!.materials.length ||\n membership.materials.some((m, i) => m !== this._preparedMeshData!.materials[i] ||\n versions.has(m) && getMaterialHashKey(m) !== versions.get(m));\n this._pendingMembershipData = membership;\n this._meshes = meshes;\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n this._needsUpdateMeshMembership = true;\n this._needsRefitTLAS = false;\n this._dirtyTransformMeshes.clear();\n if (materialsChanged) this._pendingMaterialUpdate = { level: 'textures', emission: true,\n emissiveMap: true, materials: new Set(membership.materials) };\n return true;\n }\n const changed =\n next.length !== this._meshSnapshot.length ||\n next.some((item, i) => {\n const prev = this._meshSnapshot[i];\n return (\n !prev ||\n item.mesh !== prev.mesh || item.instanceCount !== prev.instanceCount || item.instanceVersion !== prev.instanceVersion || item.instanceTransforms !== prev.instanceTransforms ||\n item.geometry !== prev.geometry || item.colorVersion !== prev.colorVersion || item.instanceColors !== prev.instanceColors ||\n item.materials.length !== prev.materials.length ||\n item.materials.some((material, k) => material !== prev.materials[k]) ||\n item.materialKeys.some((hash, k) => hash !== prev.materialKeys[k]) ||\n item.geometryVersion !== prev.geometryVersion ||\n item.matrix.some((value, k) => value !== prev.matrix[k])\n );\n });\n next.forEach((item, i) => {\n const prev = this._meshSnapshot[i];\n if (\n prev &&\n item.geometry === prev.geometry &&\n (item.geometryVersion !== prev.geometryVersion || item.positionArray !== prev.positionArray || item.indexArray !== prev.indexArray)\n ) {\n const usesDisplacement =\n !!item.materials[0]?.displacementMap &&\n Math.abs(item.materials[0].displacementScale) > 1e-6;\n if (\n usesDisplacement || geometryTopologyChanged(this._preparedMeshData, item.geometry) ||\n !getGeometryBvh(item.geometry) ||\n !refitBLAS(getGeometryBvh(item.geometry)!, item.geometry)\n ) {\n setGeometryBvh(item.geometry, undefined);\n }\n }\n });\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n if (!changed && update && !materialChange) return false;\n this._meshes = meshes;\n this._needsUpdateMeshData = true;\n this._needsRefitTLAS = false; this._dirtyTransformMeshes.clear();\n this._debugBvhData = undefined;\n return true;\n }\n\n setTextureAtlasBudget(maxBytes: number) {\n const next = Number.isFinite(maxBytes)\n ? Math.max(4, Math.floor(maxBytes))\n : DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n if (next === this._maxTextureArrayBytes) return false;\n this._maxTextureArrayBytes = next;\n this._needsUpdateMeshData = true;\n return true;\n }\n\n getDebugBVHData() {\n if (!this._debugBvhData) {\n const mergedMesh = mergeMeshesToGeometry(this._meshes);\n const bvh = buildBLAS(mergedMesh.geometry);\n this._debugBvhData = { buffer: bvh.buffer };\n }\n return this._debugBvhData;\n }\n\n getDiagnostics() {\n return {\n textureAtlas: this._materialData?.textureAtlasStats\n };\n }\n\n private _updateMeshData() {\n this._pendingGeometryUpdates.clear();\n this._needsUpdateMeshData = false;\n\n // GLSL intersects the original triangles, so its BVH must bound those\n // triangles rather than WebGPU's displaced height prisms.\n const res = updateMeshInstances(this._meshes, { displacement: false });\n this._preparedMeshData = res;\n this._membershipCache.capture(res);\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n const mergedGeometry = res.geometry;\n const materials = res.materials;\n const tlas = buildTLAS(res.instances, res.blases);\n this._tlas = tlas;\n const tlasBuffer = new Float32Array(tlas.buffer);\n const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer!);\n const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));\n const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);\n const blasOffset = tlasBuffer.length / 4;\n bvhBuffer.set(tlasBuffer);\n bvhBuffer.set(blasBuffer, blasOffset * 4);\n\n if (mergedGeometry.position.array.length > 0) {\n setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);\n setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);\n mergedGeometry.color &&\n setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);\n mergedGeometry.tangent &&\n setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);\n mergedGeometry.uv &&\n setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);\n mergedGeometry.uv1 &&\n setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);\n mergedGeometry.materialIndex &&\n setDataTexture(\n this._matIndexBufferTex,\n // TODO currently int texture doesn't work\n this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array),\n 4\n );\n }\n if (bvhBuffer.length > 0) {\n setDataTexture(this._bvhBufferTex, bvhBuffer, 4);\n setDataTexture(this._instancesBufferTex, instancesBuffer, 4);\n }\n\n this._materialData?.dispose(this._renderer.gl);\n const materialData = new MaterialTable(\n materials,\n this._analyticLights,\n {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS\n ),\n maxTextureDimension2D: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_TEXTURE_SIZE\n )\n }\n );\n this._materialData = materialData;\n\n this._tracePasses.forEach((pass) => {\n pass.setUniforms({\n bvhBuffer: this._bvhBufferTex,\n instancesBuffer: this._instancesBufferTex,\n positionBuffer: this._positionBufferTex,\n normalBuffer: this._normalBufferTex,\n tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,\n colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,\n uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,\n uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,\n materialIndexBuffer: this._matIndexBufferTex,\n\n bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,\n vertexColumns: textureDimensionsFromArray(\n Attribute.getCount(mergedGeometry.position)\n ).columnsLog,\n instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)\n .columnsLog,\n blasOffset,\n\n isEmptyScene: +(res.instances.length === 0)\n });\n\n });\n this._updateMaterialConstants(materials, materialData, mergedGeometry);\n this._materialChanges.capture(materials);\n this._pendingMaterialUpdate = undefined;\n\n return bvhBuffer;\n }\n\n private _updateMaterialConstants(materials: OpenPBRMaterial[], materialData: MaterialTable, mergedGeometry: Geometry) {\n // Avoid too much shader compilation\n const STACK_SIZE = 50;\n const hasShadowCatcher = materials.some((m) => m.shadowCatcher);\n const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);\n const HAS_MEDIUM = materials.some(materialUsesMedium);\n\n this._hasShadowCatcher = hasShadowCatcher;\n this._hasTransmission = materials.some(\n (m) =>\n m.transmissionWeight > 0 ||\n m.mapAlphaUsage === \"transmission\"\n );\n this._hasAlpha = materials.some(\n (m) => resolveMaterialAlphaMode(m) !== 'opaque'\n );\n this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);\n\n\n this._tracePasses.forEach(pass => {\n pass.setDefines({\n OES_texture_float_linear: true,\n\n STACK_SIZE,\n USE_VERTEX_COLOR: mergedGeometry.color != null,\n USE_TANGENT: mergedGeometry.tangent != null,\n HAS_TRANSMISSION: this._hasTransmission,\n HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),\n HAS_BEVEL,\n HAS_MEDIUM,\n HAS_ALPHA: this._hasAlpha,\n\n BEVEL_SAMPLES: this._bevelSamples,\n\n RECT_LIGHT: CONSTANT_RECT_LIGHT,\n SPHERE_LIGHT: CONSTANT_SPHERE_LIGHT,\n DIRECTIONAL_LIGHT: CONSTANT_DIRECTIONAL_LIGHT,\n\n USE_RR: true,\n // Multiple-scattering SSS paths need enough collisions to return to\n // the boundary before roulette; terminating at depth five produces\n // dark materials and a handful of very large surviving samples.\n RR_MAX: HAS_MEDIUM ? 12 : 2,\n\n ...materialData.defines\n });\n\n materialData.setToPass(pass);\n });\n }\n\n private _updateMeshMembership() {\n const res = this._pendingMembershipData!;\n this._preparedMeshData = res;\n const tlas = this._tlas = buildTLAS(res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n data.set(new Float32Array(tlas.buffer));\n data.set(blas, tlas.buffer.byteLength / 4);\n this._instancesData = new Float32Array(tlas.instancesBuffer!);\n setDataTexture(this._bvhBufferTex, data, 4);\n setDataTexture(this._instancesBufferTex, this._instancesData, 4);\n this._tracePasses.forEach(pass => pass.setUniforms({\n bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,\n instancesColumns: textureDimensionsFromArray(this._instancesData!.length / 4).columnsLog,\n blasOffset: tlas.buffer.byteLength / 16,\n isEmptyScene: +(res.instances.length === 0)\n }));\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n this._debugBvhData = undefined;\n }\n\n private _updateGeometryData() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);\n for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {\n for (const [attribute, texture] of [\n [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],\n [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],\n [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]\n ] as const) if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent)) texture.updateDataRange(this._renderer.gl, attribute.array,\n first * attribute.itemSize * 4, count * attribute.itemSize * 4);\n if (!topologyChanged) continue;\n const material = this._materialIndexData!;\n for (let i = first * 4; i < (first + count) * 4; i++) material[i] = res.geometry.materialIndex!.array[i];\n this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);\n }\n for (const mesh of update.meshes) this._dirtyTransformMeshes.add(mesh);\n if (update.relocated) for (const binding of res.instanceBindings) this._dirtyTransformMeshes.add(binding.mesh);\n if (update.resized) {\n res.instances = updateMeshInstanceTransforms(res.instanceBindings);\n refitTLAS(tlas, res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n this._bvhData.set(new Float32Array(tlas.buffer)); this._bvhData.set(blas, tlas.buffer.byteLength / 4);\n setDataTexture(this._bvhBufferTex, this._bvhData, 4);\n this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData!.length / 4).columnsLog));\n } else {\n const ranges = [];\n for (const { blas, offset } of update.blases) {\n const target = tlas.buffer.byteLength + offset;\n new Uint8Array(this._bvhData!.buffer).set(new Uint8Array(blas.buffer), target);\n ranges.push({offset: target, size: blas.buffer.byteLength});\n }\n for (const { offset, size } of mergeRefitRanges(ranges)) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n }\n this._needsRefitTLAS = true; this._pendingGeometryUpdates.clear(); this._debugBvhData = undefined;\n }\n\n private _updateMeshColors() {\n const res = this._preparedMeshData, tlas = this._tlas;\n if (res && tlas) {\n const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);\n const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);\n for (const {offset, size} of ranges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n }\n this._dirtyColorMeshes.clear();\n }\n\n private _refitMeshInstances() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const dirty = dirtyMeshInstanceIndices(res.instanceBindings, this._dirtyTransformMeshes, res.instances);\n const previousInstances = res.instances;\n res.instances = updateMeshInstanceTransforms(res.instanceBindings, res.instances, dirty);\n if (!sameInstanceMembership(previousInstances, res.instances)) {\n this._pendingMembershipData = res;\n this._updateMeshMembership();\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n return;\n }\n const ranges = refitTLAS(tlas, res.instances, res.blases, dirty);\n this._bvhData!.set(new Float32Array(tlas.buffer));\n for (const { offset, size } of ranges.tlasRanges) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n for (const { offset, size } of ranges.instanceRanges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n this._debugBvhData = undefined;\n }\n\n private _updateMaterialData() {\n const update = this._pendingMaterialUpdate!;\n const res = this._preparedMeshData!;\n let data = this._materialData!;\n if (update.level === 'textures') {\n data.dispose(this._renderer.gl);\n data = this._materialData = new MaterialTable(res.materials, this._analyticLights, {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS),\n maxTextureDimension2D: this._renderer.gl.getParameter(this._renderer.gl.MAX_TEXTURE_SIZE)\n });\n this._needsUpdateAnalyticLightsBuffer = true;\n } else data.repackParams(res.materials);\n this._updateMaterialConstants(res.materials, data, res.geometry);\n if (update.emission || update.emissiveMap) {\n // WebGL currently evaluates mesh emission on path hits; its direct-light\n // sampler has only analytic/environment sources. Retain that behavior.\n res.emissiveBindings = res.instanceBindings.filter(binding =>\n binding.materialIndices.some(index => materialIsEmissive(res.materials[index])));\n }\n this._materialChanges.capture([...update.materials]);\n this._pendingMaterialUpdate = undefined;\n }\n\n setLights(lights: SceneLight[]) {\n const analyticLights = lights.filter(\n (light) =>\n light.type === 'DirectionalLight' ||\n light.type === 'SphereLight' ||\n light.type === 'SpotLight' ||\n light.type === 'RectLight'\n ) as AnalyticLight[];\n const numAnalyticLights = analyticLights.length;\n\n const envImage = this._sceneEnvironment.update(lights);\n const rotation = environmentRotation(lights);\n const rotation3 = [rotation[0], rotation[1], rotation[2], rotation[4], rotation[5], rotation[6], rotation[8], rotation[9], rotation[10]];\n this._tracePasses.forEach(pass => pass.setUniform('environmentRotation', rotation3));\n\n const envWeight = estimateEnvironmentPower(envImage);\n const analyticWeights = analyticLights.map(estimateAnalyticLightPower);\n const totalWeight =\n envWeight + analyticWeights.reduce((sum, weight) => sum + weight, 0);\n const sourceCount = analyticLights.length + (envImage ? 1 : 0);\n const fallbackPmf = sourceCount > 0 ? 1 / sourceCount : 0;\n this._envLightSelectionPmf = envImage\n ? totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (envWeight / totalWeight)\n : fallbackPmf\n : 0;\n this._analyticLightSelectionPmfs = Float32Array.from(\n analyticWeights,\n (weight) =>\n totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)\n : fallbackPmf\n );\n let cumulativePmf = this._envLightSelectionPmf;\n this._analyticLightSelectionCdfs = Float32Array.from(\n this._analyticLightSelectionPmfs,\n (pmf) => {\n cumulativePmf += pmf;\n return cumulativePmf;\n }\n );\n if (this._analyticLightSelectionCdfs.length > 0) {\n this._analyticLightSelectionCdfs[\n this._analyticLightSelectionCdfs.length - 1\n ] = 1;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n NUM_LIGHTS: numAnalyticLights,\n HAS_SPHERE_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SphereLight'\n ),\n HAS_SPOT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SpotLight'\n ),\n HAS_RECT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'RectLight'\n ),\n HAS_DIRECTIONAL_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'DirectionalLight'\n )\n });\n });\n\n const lightTexturesChanged = this._rectLightTextures.update(analyticLights);\n this._analyticLights = analyticLights;\n const packedIES = packIESProfiles(analyticLights);\n this._iesProfileTexelOffsets = packedIES.offsets;\n this._iesProfileColumns = setDataTexture(\n this._iesProfileTex,\n packedIES.data.length ? packedIES.data : new Float32Array(4),\n 4\n ).columns;\n if (lightTexturesChanged) this._needsUpdateMeshData = true;\n\n this._needsUpdateAnalyticLightsBuffer = true;\n\n this._setEnvMap(envImage);\n }\n\n private _getViewProjInv(camera: Camera, viewProjInv: mat4.Mat4Array) {\n mat4.invert(viewProjInv, camera.getProjectionMatrix(this._depthAspect));\n mat4.mul(viewProjInv, camera.transform, viewProjInv);\n }\n\n setCamera(camera: Camera) {\n const viewProjectionInv = this._viewProjInv;\n this._apertureRadius = cameraApertureRadius(camera);\n this._focusDistance = camera.focusDistance;\n this._getViewProjInv(camera, viewProjectionInv);\n this._tracePasses.forEach((pass) => {\n pass.setUniform('viewProjectionInv', viewProjectionInv);\n pass.setUniform('viewInv', camera.transform);\n // Zero for orthographic cameras, which have no depth of field.\n pass.setUniform('cameraApertureRadius', this._apertureRadius);\n pass.setUniform('cameraFocusDistance', camera.focusDistance);\n });\n }\n\n cameraChanged(camera: Camera) {\n const tmp = mat4.create();\n this._getViewProjInv(camera, tmp);\n return (\n !numberArraysEqual(this._viewProjInv, tmp) ||\n cameraApertureRadius(camera) !== this._apertureRadius ||\n camera.focusDistance !== this._focusDistance\n );\n }\n\n setSize(width: number, height: number, targetAspect = width / height) {\n this._depthAspect = targetAspect;\n this._tracePasses.forEach((pass) => {\n pass.setSize(pass === this._depthPass ? DEPTH_SAMPLE_GRID : width,\n pass === this._depthPass ? DEPTH_SAMPLE_GRID : height);\n pass.setUniform('pixelSize', [1 / width, 1 / height]);\n });\n }\n\n setJitter(x: number, y: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('jitter', [x, y]);\n });\n }\n\n releaseTarget(target: object) { this._mainPass.releaseTarget(target); this._shadowCatcherPass.releaseTarget(target); }\n\n getTargetMemoryBytes(target: object) {\n return this._mainPass.getMemoryBytes(target) + this._shadowCatcherPass.getMemoryBytes(target);\n }\n\n useTarget(target: object) {\n this._mainPass.useTarget(target);\n this._shadowCatcherPass.useTarget(target);\n }\n\n setQuality(options: { bounces: number; bevel: boolean; dispersionWavelengths: 1 | 3; directLightCandidates: number }) {\n this._tracePasses.forEach(pass => {\n pass.setUniform('bounceLimit', normalizeBounces(options.bounces));\n pass.setUniform('bevelEnabled', options.bevel);\n pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);\n });\n }\n\n setWavelength(wavelength: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('wavelength', wavelength);\n });\n }\n\n setSampleCount(sampleCount: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('sampleCount', sampleCount);\n });\n }\n\n isInvalid() {\n return this._invalid;\n }\n\n hasShadowCatcher() {\n return this._hasShadowCatcher;\n }\n\n hasDispersion() {\n return this._spectral;\n }\n\n prepare(): void {\n if (this._needsUpdateMeshData) {\n this._updateMeshData();\n } else if (this._needsUpdateMeshMembership) {\n this._updateMeshMembership();\n }\n if (this._pendingGeometryUpdates.size) this._updateGeometryData();\n if (this._needsRefitTLAS) this._refitMeshInstances();\n if (this._dirtyColorMeshes.size) this._updateMeshColors();\n\n if (this._pendingMaterialUpdate) this._updateMaterialData();\n\n if (this._needsUpdateAnalyticLightsBuffer) {\n const analyticLights = this._analyticLights;\n analyticLights.length > 0 &&\n packLightsToTexture(\n this._lightTex,\n analyticLights,\n this._materialData!.getLightTexturesIndices(),\n this._analyticLightSelectionPmfs,\n this._analyticLightSelectionCdfs,\n this._iesProfileTexelOffsets\n );\n this._needsUpdateAnalyticLightsBuffer = false;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setUniform(\n 'backgroundMap',\n this._hasBackground\n ? this._backgroundTex\n : this._hasEnvMap\n ? this._envMap\n : null\n );\n\n pass.setUniform(\n 'transmissiveOutputAlphaMin',\n Math.max(Math.min(1, this._transmissiveAlphaMin), 0)\n );\n\n pass.setUniform('lightsTex', this._lightTex);\n pass.setUniform('iesProfileData', this._iesProfileTex);\n pass.setUniform('iesProfileColumns', this._iesProfileColumns);\n pass.setUniform('groundedBackgroundParams', this._groundedBackgroundParams);\n pass.setUniform('groundedBackgroundCenter', this._groundedBackgroundCenter);\n pass.setUniform('backgroundMapTransform', this._backgroundMapTransform);\n\n pass.setDefines({\n // Double bounce fix on intel mac\n // Limit the bounce to avoid long compilation time.\n BOUNCES: isIntelMac()\n ? Math.min(this._bounces, 3) *\n (this._hasTransmission || this._hasAlpha ? 2 : 1)\n : this._bounces,\n CLAMPING: this._clamping || undefined,\n BEVEL_SAMPLES: this._bevelSamples,\n USE_BACKGROUND: this._hasBackground,\n USE_GROUNDED_BACKGROUND: this._groundedBackgroundParams[3] > 0\n });\n });\n }\n\n setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed = 0) {\n const code = samplingPatternCode(pattern);\n const logSPP = zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples);\n const changed = this._samplingCode !== code || this._sequenceSeed !== (sequenceSeed >>> 0) ||\n (code === 1 && this._zLogSPP !== logSPP);\n this._samplingCode = code;\n this._sequenceSeed = sequenceSeed >>> 0;\n this._zLogSPP = logSPP;\n this._tracePasses.forEach(pass => {\n pass.setUniform('samplingPattern', code);\n pass.setUniform('sequenceSeed', this._sequenceSeed);\n pass.setUniform('zSobolLogSPP', logSPP);\n });\n return changed;\n }\n\n // WebGL has uniform per-pixel counts; setSampleCount already includes offset.\n setSampleSequenceOffset(_offset: number) {}\n\n async readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined> {\n if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||\n !this._renderer.isAllProgramCompiled()) return;\n this.prepare();\n this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));\n this._depthPass.createPass({});\n const rgba = await readFloatPixelsAsync(this._renderer.gl,\n DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);\n return unpackDepthSamples(rgba);\n }\n\n dispose() {\n this._depthAbort.abort();\n this._materialData?.dispose(this._renderer.gl);\n this._materialData = undefined;\n this._tracePasses.forEach((pass) => pass.dispose());\n const gl = this._renderer.gl;\n [\n this._lightTex,\n this._openPbrEnergyLut,\n this._envMap,\n this._envMapDistribution,\n this._backgroundTex,\n this._positionBufferTex,\n this._normalBufferTex,\n this._colorBufferTex,\n this._tangentBufferTex,\n this._uvBufferTex,\n this._uv1BufferTex,\n this._bvhBufferTex,\n this._instancesBufferTex,\n this._matIndexBufferTex\n ].forEach((texture) => texture.dispose(gl));\n }\n}\n\nexport default WebGLRayTracePass;\n"]}
|
|
1
|
+
{"version":3,"file":"WebGLRayTracePass.js","sourceRoot":"","sources":["../../src/renderer/WebGLRayTracePass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,aAAa,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAwB,MAAM,eAAe,CAAC;AACzF,OAAO,cAAc,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,kBAAkB,EAAwB,MAAM,iBAAiB,CAAC;AACnH,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAA4B,MAAM,sBAAsB,CAAC;AAC3G,OAAO,EACL,SAAS,EAET,SAAS,IAAI,cAAc,EAC5B,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAElC,OAAO,EACL,SAAS,EACT,SAAS,EACT,iBAAiB,EACjB,SAAS,EACT,SAAS,EACT,gBAAgB,EAEjB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,wCAAwC,EAAE,mBAAmB,EAAE,sBAAsB,EACtF,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAE3B,MAAM,yBAAyB,CAAC;AACjC,OAAO,4BAA4B,MAAM,yBAAyB,CAAC;AACnE,OAAO,iBAAiB,MAAM,8BAA8B,CAAC;AAC7D,OAAO,aAAa,EAAE,EACpB,+BAA+B,EAC/B,kBAAkB,EACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAwB,EACtB,wBAAwB,EACzB,MAAM,6BAA6B,CAAC;AAOrC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE1D,OAAO,EACL,sBAAsB,EACtB,uBAAuB,EACvB,cAAc,EACd,0BAA0B,EAC3B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,0BAA0B,EAC1B,mBAAmB,EACnB,qBAAqB,EACrB,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC9G,OAAiB,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,4BAA4B,EAAE,MAAM,qBAAqB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAG/B,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEtC,SAAS,mBAAmB,CAC1B,OAAuB,EACvB,MAAuB,EACvB,eAAyB,EACzB,aAAgC,EAChC,aAAgC,EAChC,sBAAyC;IAEzC,MAAM,IAAI,GAAG,kBAAkB,CAC7B,MAAM,EACN,eAAe,EACf,aAAa,EACb,aAAa,EACb,sBAAsB,CACvB,CAAC;IACF,OAAO,CAAC,MAAM,GAAG;QACf,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC;QACtB,MAAM,EAAE,CAAC;KACV,CAAC;AACJ,CAAC;AAED,uBAAuB;AACvB,+BAA+B;AAC/B,4BAA4B;AAC5B,oBAAoB;AACpB,+BAA+B;AAC/B,sBAAsB;AACtB,MAAM;AACN,KAAK;AAEL,sDAAsD;AACtD,uCAAuC;AACvC,MAAM,iBAAiB;IACJ,SAAS,CAAgB;IAClC,OAAO,GAAW,EAAE,CAAC;IACrB,iBAAiB,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAChD,kBAAkB,GAAG,IAAI,uBAAuB,EAAE,CAAC;IACnD,eAAe,GAAoB,EAAE,CAAC;IACtC,2BAA2B,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAClD,2BAA2B,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;IAClD,qBAAqB,GAAG,CAAC,CAAC;IAC1B,aAAa,CAA4B;IACzC,qBAAqB,GAAG,+BAA+B,CAAC;IACxD,iBAAiB,CAA0C;IAC3D,gBAAgB,GAAG,IAAI,mBAAmB,EAAE,CAAC;IAC7C,sBAAsB,CAA0C;IAChE,gBAAgB,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC/C,sBAAsB,CAA4G;IAClI,uBAAuB,GAAG,IAAI,GAAG,EAAY,CAAC;IAC9C,oBAAoB,GAAG,IAAI,CAAC;IAC5B,0BAA0B,GAAG,KAAK,CAAC;IACnC,eAAe,GAAG,KAAK,CAAC;IACxB,qBAAqB,GAAG,IAAI,GAAG,EAAQ,CAAC;IACxC,iBAAiB,GAAG,IAAI,GAAG,EAAQ,CAAC;IACpC,KAAK,CAAe;IACpB,QAAQ,CAAgB;IACxB,cAAc,CAAgB;IAC9B,kBAAkB,CAAgB;IAClC,aAAa,GAcf,EAAE,CAAC;IACD,eAAe,GAAG,IAAI,OAAO,EAA6C,CAAC;IAC3E,gCAAgC,GAAG,IAAI,CAAC;IACxC,aAAa,CAEnB;IAEM,SAAS,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACxD,cAAc,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC7D,kBAAkB,GAAG,CAAC,CAAC;IACvB,uBAAuB,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5C,iBAAiB,GAAG,IAAI,cAAc,CAAC;QAC7C,GAAG,uBAAuB;QAC1B,MAAM,EAAE;YACN,IAAI,EAAE,uBAAuB,EAAE;YAC/B,KAAK,EAAE,wBAAwB;YAC/B,MAAM,EAAE,yBAAyB;SAClC;KACF,CAAC,CAAC;IAEK,OAAO,GAAG,IAAI,cAAc,CAAC,sBAAsB,CAAC,CAAC;IACrD,mBAAmB,GAAG,IAAI,cAAc,CAAC,sBAAsB,CAAC,CAAC;IACjE,eAAe,CAAwB;IACvC,cAAc,GAAG,IAAI,cAAc,CAAC,sBAAsB,CAAC,CAAC;IAE5D,UAAU,GAAG,KAAK,CAAC;IACnB,cAAc,GAAG,KAAK,CAAC;IACvB,yBAAyB,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3D,yBAAyB,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACrD,uBAAuB,GAAG,sBAAsB,EAAE,CAAC;IAEnD,QAAQ,GAAG,CAAC,CAAC;IACb,aAAa,GAAG,qBAAqB,CAAC;IACtC,SAAS,CAAU;IAE3B,gGAAgG;IAExF,aAAa,GAAG,CAAC,CAAC,CAAC;IACnB,aAAa,GAAG,CAAC,CAAC;IAClB,QAAQ,GAAG,CAAC,CAAC;IAEb,kBAAkB,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IACjE,gBAAgB,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC/D,eAAe,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC9D,iBAAiB,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAChE,YAAY,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC3D,aAAa,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC5D,aAAa,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAC5D,mBAAmB,GAAG,IAAI,cAAc,CAAC,uBAAuB,CAAC,CAAC;IAClE,kBAAkB,GAAG,IAAI,cAAc,CAAC;QAC9C,GAAG,uBAAuB;QAC1B,sBAAsB;KACvB,CAAC,CAAC;IAEK,gBAAgB,GAAG,KAAK,CAAC;IACzB,SAAS,GAAG,KAAK,CAAC;IAElB,QAAQ,GAAG,KAAK,CAAC;IACjB,qBAAqB,GAAG,CAAC,CAAC;IAE1B,SAAS,CAGf;IACM,kBAAkB,CAGxB;IAEM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC7B,eAAe,GAAG,CAAC,CAAC;IACpB,cAAc,GAAG,EAAE,CAAC;IAEpB,YAAY,CAAgC;IACnC,UAAU,CAAoC;IAC9C,WAAW,GAAG,IAAI,eAAe,EAAE,CAAC;IAC7C,YAAY,GAAG,CAAC,CAAC;IACjB,iBAAiB,GAAG,KAAK,CAAC;IAC1B,SAAS,GAAG,KAAK,CAAC;IAE1B,YAAY,QAAuB;QACjC,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,MAAM,kBAAkB,GAAG;YACzB,IAAI,EAAE,SAAS,CAAC,KAAK;YACrB,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,SAAS,EAAE,SAAS,CAAC,MAAM;YAC3B,KAAK,EAAE,SAAS,CAAC,aAAa;YAC9B,KAAK,EAAE,SAAS,CAAC,aAAa;SAC/B,CAAC;QAEF,MAAM,YAAY,GAAG,4BAA4B,EAAE,CAAC;QACpD,YAAY,CAAC,eAAe,GAAG,IAAI,CAAC;QACpC,iBAAiB,CAAC,eAAe,GAAG,IAAI,CAAC;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,iBAAiB,CAGpC,UAAU,EAAE,QAAQ,EAAE;YACtB,MAAM,EAAE,YAAY;YACpB,uEAAuE;YACvE,OAAO,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC;YACjD,YAAY,EAAE;gBACZ,KAAK,EAAE,kBAAkB;gBACzB,MAAM,EAAE,kBAAkB;gBAC1B,MAAM,EAAE,kBAAkB;gBAC1B,OAAO,EAAE,kBAAkB;aAC5B;SACF,CAAC,CAAC;QACH,IAAI,CAAC,kBAAkB,GAAG,IAAI,iBAAiB,CAI7C,eAAe,EACf,QAAQ,EACR;YACE,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,CAAC,eAAe,EAAE,mBAAmB,EAAE,gBAAgB,CAAC;YACjE,YAAY,EAAE;gBACZ,aAAa,EAAE,kBAAkB;gBACjC,iBAAiB,EAAE,kBAAkB;gBACrC,cAAc,EAAE,kBAAkB;aACnC;SACF,CACF,CAAC;QACF,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAiB,CAAC,aAAa,EAAE,QAAQ,EAAE;YAC/D,MAAM,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC;YAC1C,YAAY,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE;SACjD,CAAC,CAAC;QACH,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/E,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC;gBACd,wBAAwB,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,YAAY,CAClD,0BAA0B,CAC3B;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,kBAAkB,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxE,CAAC;IAED,UAAU,CACR,KAAc,EACd,IAA6D,EAC7D,oBAAoB,GAAG,KAAK;QAE5B,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,MAAM,OAAO,GAAG;YACd,KAAK;YACL,KAAK,EAAE,CAAC,KAAK;YACb,OAAO,EAAE,IAAI;SACd,CAAC;QACF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAmC,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACnF,IAAI,IAAI,CAAC,iBAAiB,IAAI,CAAC,oBAAoB,EAAE,CAAC;YACpD,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAChC,EAAmC,EACnC,SAAS,EACT,OAAO,CACR,CAAC;QACJ,CAAC;IACH,CAAC;IAED,SAAS,CACP,KAC0D;QAE1D,OAAO,KAAK,KAAK,eAAe,IAAI,KAAK,KAAK,mBAAmB;YAC/D,KAAK,KAAK,gBAAgB;YAC1B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,MAAM,IAAI,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,WAAW,CAAC,QAAiB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,eAAe,CAAC,OAAe;QAC7B,MAAM,IAAI,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC5B,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,UAAU,CAAC,QAA0C;QAC3D,IAAI,CAAC,0BAA0B,CAAC,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,QAAQ,EAAE,CAAC;YAC5E,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,QAAQ,CAAC;YAC/B,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC;QAChC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,CAAC,UAAU,CACb,oBAAoB,EACpB,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAC3C,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;YAEpE,IAAI,CAAC,UAAU,CAAC;gBACd,UAAU,EAAE,CAAC,CAAC,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC;IAC/B,CAAC;IAED,aAAa,CAAC,UAA4B;QACxC,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,sBAAsB,CAAC,UAAU,CAAC,CAAC,CAAC;QACrE,MAAM,eAAe,GACnB,UAAU,IAAI,wCAAwC,CAAC,UAAU,CAAE,CAAC;QAEtE,IAAI,eAAe,EAAE,CAAC;YACpB,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,eAAe,CAAC;QAC/C,CAAC;QACD,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,eAAe,CAAC;QACxC,MAAM,QAAQ,GACZ,UAAU;YACV,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC;YAC1B,MAAM,IAAI,UAAU;YACpB,UAAU,CAAC,IAAI,KAAK,gBAAgB;YAClC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAChC,QAAQ;YACN,CAAC,CAAC;gBACE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACjC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBACjC,QAAQ,CAAC,YAAY,IAAI,CAAC;gBAC1B,CAAC;aACF;YACH,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CACjB,CAAC;QACF,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,6BAA6B,CAAC,oBAA4B;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,qBAAqB,KAAK,oBAAoB,CAAC;QACpE,IAAI,CAAC,qBAAqB,GAAG,oBAAoB,CAAC;QAClD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,MAAc,EAAE,MAA6I;QACrK,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,MAAM,IAAI,EAAE;YAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1E,IAAI,MAAM,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,aAAa;YACxD,CAAC,IAAI,CAAC,oBAAoB,IAAI,MAAM,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC;YACxD,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;YACtE,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,IAAI,mBAAmB,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,EAAE,CAAC;gBACxG,IAAI,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,CAAC;oBAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,sBAAsB,CAAC;oBAC5C,IAAI,CAAC,sBAAsB,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK;wBAC9F,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,IAAI,MAAM,CAAC,QAAQ;wBAChD,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,WAAW,IAAI,MAAM,CAAC,WAAW;wBACzD,SAAS,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;oBAC7E,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtG,CAAC;gBACD,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE;oBAAE,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAC3F,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,aAAa;oBAAE,IAAI,IAAI,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;wBAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACzI,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;oBAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAC5C,IAAI,CAAC,IAAI;wBAAE,SAAS;oBACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE;wBAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBAChE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBAAC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;gBACpE,CAAC;gBACD,OAAO,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;YAC7H,CAAC;QACH,CAAC;QACD,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACjC,IAAI;YACJ,aAAa,EAAE,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC7D,eAAe,EAAE,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAC3E,kBAAkB,EAAE,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC/E,cAAc,EAAE,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YACvE,YAAY,EAAE,IAAI,YAAY,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACpE,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE;YACjC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC;YACpD,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO;YACtC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK;YACpF,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAA8B,CAAC;SACxD,CAAC,CAAC,CAAC;QACJ,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM;YACjE,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa;gBAC7H,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,oBAAoB,IAAI,iBAAiB,IAAI,IAAI,CAAC,iBAAiB;YAC1F,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAU,CAAC,CAAC,CAAC,CAAC;YAC/H,MAAM,gBAAgB,GAAG,UAAU,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,iBAAkB,CAAC,SAAS,CAAC,MAAM;gBAC/F,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC;oBAC5E,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC;YACzC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;YACtB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,0BAA0B,GAAG,IAAI,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YAC7B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;YACnC,IAAI,gBAAgB;gBAAE,IAAI,CAAC,sBAAsB,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI;oBACrF,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAChE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GACX,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,aAAa,CAAC,MAAM;YACzC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;gBACpB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;gBACnC,OAAO,CACL,CAAC,IAAI;oBACL,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,CAAC,kBAAkB;oBAC5K,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,cAAc;oBACzH,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,SAAS,CAAC,MAAM;oBAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;oBACpE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;oBAClE,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe;oBAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CACzD,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YACnC,IACE,IAAI;gBACJ,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;gBAC9B,CAAC,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,EACpI,CAAC;gBACD,MAAM,gBAAgB,GACpB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe;oBACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,GAAG,IAAI,CAAC;gBACvD,IACE,gBAAgB,IAAI,uBAAuB,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC;oBAClF,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;oBAC9B,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,EACzD,CAAC;oBACD,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;gBAC3C,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,EAAE,CAAC;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO,IAAI,MAAM,IAAI,CAAC,cAAc;YAAE,OAAO,KAAK,CAAC;QACxD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QACjE,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,qBAAqB,CAAC,QAAgB;QACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACpC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACnC,CAAC,CAAC,+BAA+B,CAAC;QACpC,IAAI,IAAI,KAAK,IAAI,CAAC,qBAAqB;YAAE,OAAO,KAAK,CAAC;QACtD,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,eAAe;QACb,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAC3C,IAAI,CAAC,aAAa,GAAG,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;QAC9C,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,cAAc;QACZ,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,aAAa,EAAE,iBAAiB;SACpD,CAAC;IACJ,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QACrC,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC;QAElC,sEAAsE;QACtE,0DAA0D;QAC1D,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7B,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QACxC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;QACxC,MAAM,cAAc,GAAG,GAAG,CAAC,QAAQ,CAAC;QACpC,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAChC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC;QACtF,MAAM,UAAU,GAAG,IAAI,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;QAC1F,MAAM,UAAU,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QACzC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1B,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;QAE1C,IAAI,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,cAAc,CAAC,IAAI,CAAC,kBAAkB,EAAE,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtE,cAAc,CAAC,KAAK;gBAClB,cAAc,CAAC,IAAI,CAAC,eAAe,EAAE,cAAc,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YACtE,cAAc,CAAC,OAAO;gBACpB,cAAc,CAAC,IAAI,CAAC,iBAAiB,EAAE,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAC1E,cAAc,CAAC,EAAE;gBACf,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAChE,cAAc,CAAC,GAAG;gBAChB,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;YAClE,cAAc,CAAC,aAAa;gBAC1B,cAAc,CACZ,IAAI,CAAC,kBAAkB;gBACvB,0CAA0C;gBAC1C,IAAI,CAAC,kBAAkB,GAAG,IAAI,YAAY,CAAC,cAAc,CAAC,aAAa,CAAC,KAAK,CAAC,EAC9E,CAAC,CACF,CAAC;QACN,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACjD,cAAc,CAAC,IAAI,CAAC,mBAAmB,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,YAAY,GAAG,IAAI,aAAa,CACpC,SAAS,EACT,IAAI,CAAC,eAAe,EACpB;YACE,oBAAoB,EAAE,IAAI,CAAC,qBAAqB;YAChD,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CACnD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,CAC3C;YACD,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CACnD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,CACnC;SACF,CACF,CAAC;QACF,IAAI,CAAC,aAAa,GAAG,YAAY,CAAC;QAElC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,WAAW,CAAC;gBACf,SAAS,EAAE,IAAI,CAAC,aAAa;gBAC7B,eAAe,EAAE,IAAI,CAAC,mBAAmB;gBACzC,cAAc,EAAE,IAAI,CAAC,kBAAkB;gBACvC,YAAY,EAAE,IAAI,CAAC,gBAAgB;gBACnC,aAAa,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI;gBACrE,WAAW,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI;gBAC/D,QAAQ,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;gBACtD,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;gBACzD,mBAAmB,EAAE,IAAI,CAAC,kBAAkB;gBAE5C,UAAU,EAAE,0BAA0B,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU;gBACvE,aAAa,EAAE,0BAA0B,CACvC,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,CAAC,CAC5C,CAAC,UAAU;gBACZ,gBAAgB,EAAE,0BAA0B,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;qBACrE,UAAU;gBACb,UAAU;gBAEV,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;aAC5C,CAAC,CAAC;QAEL,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,wBAAwB,CAAC,SAAS,EAAE,YAAY,EAAE,cAAc,CAAC,CAAC;QACvE,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACzC,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QAExC,OAAO,SAAS,CAAC;IACnB,CAAC;IAEO,wBAAwB,CAAC,SAA4B,EAAE,YAA2B,EAAE,cAAwB;QAClH,oCAAoC;QACpC,MAAM,UAAU,GAAG,EAAE,CAAC;QACtB,MAAM,gBAAgB,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;QACzD,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEtD,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,gBAAgB,GAAG,SAAS,CAAC,IAAI,CACpC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,kBAAkB,GAAG,CAAC;YACxB,CAAC,CAAC,aAAa,KAAK,cAAc,CACrC,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAC7B,CAAC,CAAC,EAAE,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,KAAK,QAAQ,CAChD,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,2BAA2B,GAAG,CAAC,CAAC,CAAC;QAG1E,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC;gBACd,wBAAwB,EAAE,IAAI;gBAE9B,UAAU;gBACV,gBAAgB,EAAE,cAAc,CAAC,KAAK,IAAI,IAAI;gBAC9C,WAAW,EAAE,cAAc,CAAC,OAAO,IAAI,IAAI;gBAC3C,sBAAsB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;gBACrG,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;gBACvC,mBAAmB,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,uBAAuB,KAAK,MAAM,IAAI,CAAC,CAAC,kBAAkB,GAAG,CAAC,CAAC;gBAC1G,SAAS;gBACT,UAAU;gBACV,SAAS,EAAE,IAAI,CAAC,SAAS;gBAEzB,aAAa,EAAE,IAAI,CAAC,aAAa;gBAEjC,UAAU,EAAE,mBAAmB;gBAC/B,YAAY,EAAE,qBAAqB;gBACnC,iBAAiB,EAAE,0BAA0B;gBAE7C,MAAM,EAAE,IAAI;gBACZ,oEAAoE;gBACpE,mEAAmE;gBACnE,gEAAgE;gBAChE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAE3B,GAAG,YAAY,CAAC,OAAO;aACxB,CAAC,CAAC;YAEH,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,qBAAqB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,sBAAuB,CAAC;QACzC,IAAI,CAAC,iBAAiB,GAAG,GAAG,CAAC;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QACxF,IAAI,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,eAAgB,CAAC,CAAC;QAC9D,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,cAAc,CAAC,IAAI,CAAC,mBAAmB,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;YACjD,UAAU,EAAE,0BAA0B,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU;YAClE,gBAAgB,EAAE,0BAA0B,CAAC,IAAI,CAAC,cAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU;YACxF,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,EAAE;YACvC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC;SAC5C,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;QACxC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAkB,EAAE,IAAI,GAAG,IAAI,CAAC,KAAM,CAAC;QACxD,MAAM,MAAM,GAAG,wBAAwB,CAAC,GAAG,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC3E,KAAK,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACjF,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI;gBACjC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC;gBAC9F,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC;gBAC1F,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC;aACpE;gBAAE,IAAI,SAAS,IAAI,CAAC,CAAC,eAAe,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,SAAS,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;oBAAE,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,KAAK,EAC3N,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,eAAe;gBAAE,SAAS;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,kBAAmB,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,aAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzG,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,QAAQ,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,CAAC,CAAC;QAC/F,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM;YAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACvE,IAAI,MAAM,CAAC,SAAS;YAAE,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,gBAAgB;gBAAE,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/G,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,GAAG,CAAC,SAAS,GAAG,4BAA4B,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YACnE,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3E,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;YACtG,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,0BAA0B,CAAC,IAAI,CAAC,QAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;QACrI,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,EAAE,CAAC;YAClB,KAAK,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC;gBAC/C,IAAI,UAAU,CAAC,IAAI,CAAC,QAAS,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;gBAC/E,MAAM,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAC,CAAC,CAAC;YAC9D,CAAC;YACD,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC,MAAM,CAAC;gBAAE,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,QAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QAC/I,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,uBAAuB,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACpG,CAAC;IAEO,iBAAiB;QACvB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACtD,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACpG,MAAM,MAAM,GAAG,wBAAwB,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;YACpE,KAAK,MAAM,EAAC,MAAM,EAAE,IAAI,EAAC,IAAI,MAAM;gBAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,cAAe,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACvI,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAkB,EAAE,IAAI,GAAG,IAAI,CAAC,KAAM,CAAC;QACxD,MAAM,KAAK,GAAG,wBAAwB,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QACxG,MAAM,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC;QACxC,GAAG,CAAC,SAAS,GAAG,4BAA4B,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACzF,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC,sBAAsB,GAAG,GAAG,CAAC;YAClC,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC7B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;YACjE,OAAO;QACT,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACjE,IAAI,CAAC,QAAS,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,UAAU;YAAE,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,QAAS,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtI,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC,cAAc;YAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,cAAe,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtJ,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;QAAC,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC;QACjE,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;IACjC,CAAC;IAEO,mBAAmB;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAuB,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAkB,CAAC;QACpC,IAAI,IAAI,GAAG,IAAI,CAAC,aAAc,CAAC;QAC/B,IAAI,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAChC,IAAI,GAAG,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,eAAe,EAAE;gBACjF,oBAAoB,EAAE,IAAI,CAAC,qBAAqB;gBAChD,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,CAAC;gBACjG,qBAAqB,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,gBAAgB,CAAC;aAC1F,CAAC,CAAC;YACH,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC;QAC/C,CAAC;;YAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACxC,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjE,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;YAC1C,yEAAyE;YACzE,uEAAuE;YACvE,GAAG,CAAC,gBAAgB,GAAG,GAAG,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAC3D,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;IAC1C,CAAC;IAED,SAAS,CAAC,MAAoB;QAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAClC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,IAAI,KAAK,kBAAkB;YACjC,KAAK,CAAC,IAAI,KAAK,aAAa;YAC5B,KAAK,CAAC,IAAI,KAAK,WAAW;YAC1B,KAAK,CAAC,IAAI,KAAK,WAAW,CACV,CAAC;QACrB,MAAM,iBAAiB,GAAG,cAAc,CAAC,MAAM,CAAC;QAEhD,MAAM,QAAQ,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAC7C,MAAM,SAAS,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;QACzI,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,SAAS,CAAC,CAAC,CAAC;QAErF,MAAM,SAAS,GAAG,wBAAwB,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,eAAe,GAAG,cAAc,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACvE,MAAM,WAAW,GACf,SAAS,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,WAAW,GAAG,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC,qBAAqB,GAAG,QAAQ;YACnC,CAAC,CAAC,WAAW,GAAG,CAAC;gBACf,CAAC,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,GAAG,WAAW;oBAC5C,wBAAwB,GAAG,CAAC,SAAS,GAAG,WAAW,CAAC;gBACtD,CAAC,CAAC,WAAW;YACf,CAAC,CAAC,CAAC,CAAC;QACN,IAAI,CAAC,2BAA2B,GAAG,YAAY,CAAC,IAAI,CAClD,eAAe,EACf,CAAC,MAAM,EAAE,EAAE,CACT,WAAW,GAAG,CAAC;YACb,CAAC,CAAC,CAAC,CAAC,GAAG,wBAAwB,CAAC,GAAG,WAAW;gBAC5C,wBAAwB,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;YACnD,CAAC,CAAC,WAAW,CAClB,CAAC;QACF,IAAI,aAAa,GAAG,IAAI,CAAC,qBAAqB,CAAC;QAC/C,IAAI,CAAC,2BAA2B,GAAG,YAAY,CAAC,IAAI,CAClD,IAAI,CAAC,2BAA2B,EAChC,CAAC,GAAG,EAAE,EAAE;YACN,aAAa,IAAI,GAAG,CAAC;YACrB,OAAO,aAAa,CAAC;QACvB,CAAC,CACF,CAAC;QACF,IAAI,IAAI,CAAC,2BAA2B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,IAAI,CAAC,2BAA2B,CAC9B,IAAI,CAAC,2BAA2B,CAAC,MAAM,GAAG,CAAC,CAC5C,GAAG,CAAC,CAAC;QACR,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC;gBACd,UAAU,EAAE,iBAAiB;gBAC7B,iBAAiB,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CACtC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa,CACxC;gBACD,eAAe,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CACpC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CACtC;gBACD,eAAe,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CACpC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,WAAW,CACtC;gBACD,sBAAsB,EAAE,CAAC,CAAC,cAAc,CAAC,IAAI,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,kBAAkB,CAC7C;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,oBAAoB,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5E,IAAI,CAAC,eAAe,GAAG,cAAc,CAAC;QACtC,MAAM,SAAS,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC;QAClD,IAAI,CAAC,uBAAuB,GAAG,SAAS,CAAC,OAAO,CAAC;QACjD,IAAI,CAAC,kBAAkB,GAAG,cAAc,CACtC,IAAI,CAAC,cAAc,EACnB,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,EAC5D,CAAC,CACF,CAAC,OAAO,CAAC;QACV,IAAI,oBAAoB;YAAE,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QAE3D,IAAI,CAAC,gCAAgC,GAAG,IAAI,CAAC;QAE7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC5B,CAAC;IAEO,eAAe,CAAC,MAAc,EAAE,WAA2B;QACjE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QACxE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,MAAM,iBAAiB,GAAG,IAAI,CAAC,YAAY,CAAC;QAC5C,IAAI,CAAC,eAAe,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACpD,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;QAC3C,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QAChD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,CAAC;YACxD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;YAC7C,+DAA+D;YAC/D,IAAI,CAAC,UAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,MAAc;QAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAClC,OAAO,CACL,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;YAC1C,oBAAoB,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,eAAe;YACrD,MAAM,CAAC,aAAa,KAAK,IAAI,CAAC,cAAc,CAC7C,CAAC;IACJ,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,MAAc,EAAE,YAAY,GAAG,KAAK,GAAG,MAAM;QAClE,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAC/D,IAAI,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACzD,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,CAAC,CAAS,EAAE,CAAS;QAC5B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,MAAc,IAAI,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAEtH,oBAAoB,CAAC,MAAc;QACjC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAChG,CAAC;IAED,SAAS,CAAC,MAAc;QACtB,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,UAAU,CAAC,OAAyG;QAClH,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;YAClE,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC/C,IAAI,CAAC,UAAU,CAAC,uBAAuB,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CAAC,UAAkB;QAC9B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,WAAmB;QAChC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,gBAAgB;QACd,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;aAAM,IAAI,IAAI,CAAC,0BAA0B,EAAE,CAAC;YAC3C,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,uBAAuB,CAAC,IAAI;YAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAClE,IAAI,IAAI,CAAC,eAAe;YAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,iBAAiB,CAAC,IAAI;YAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAE1D,IAAI,IAAI,CAAC,sBAAsB;YAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE5D,IAAI,IAAI,CAAC,gCAAgC,EAAE,CAAC;YAC1C,MAAM,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC;YAC5C,cAAc,CAAC,MAAM,GAAG,CAAC;gBACvB,mBAAmB,CACjB,IAAI,CAAC,SAAS,EACd,cAAc,EACd,IAAI,CAAC,aAAc,CAAC,uBAAuB,EAAE,EAC7C,IAAI,CAAC,2BAA2B,EAChC,IAAI,CAAC,2BAA2B,EAChC,IAAI,CAAC,uBAAuB,CAC7B,CAAC;YACJ,IAAI,CAAC,gCAAgC,GAAG,KAAK,CAAC;QAChD,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACjC,IAAI,CAAC,UAAU,CACb,eAAe,EACf,IAAI,CAAC,cAAc;gBACjB,CAAC,CAAC,IAAI,CAAC,cAAc;gBACrB,CAAC,CAAC,IAAI,CAAC,UAAU;oBACf,CAAC,CAAC,IAAI,CAAC,OAAO;oBACd,CAAC,CAAC,IAAI,CACX,CAAC;YAEF,IAAI,CAAC,UAAU,CACb,4BAA4B,EAC5B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC,CACrD,CAAC;YAEF,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC7C,IAAI,CAAC,UAAU,CAAC,gBAAgB,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;YACvD,IAAI,CAAC,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;YAC9D,IAAI,CAAC,UAAU,CAAC,0BAA0B,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC5E,IAAI,CAAC,UAAU,CAAC,0BAA0B,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;YAC5E,IAAI,CAAC,UAAU,CAAC,wBAAwB,EAAE,IAAI,CAAC,uBAAuB,CAAC,CAAC;YAExE,IAAI,CAAC,UAAU,CAAC;gBACd,iCAAiC;gBACjC,mDAAmD;gBACnD,OAAO,EAAE,UAAU,EAAE;oBACnB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAC1B,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;oBACnD,CAAC,CAAC,IAAI,CAAC,QAAQ;gBACjB,QAAQ,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;gBACrC,aAAa,EAAE,IAAI,CAAC,aAAa;gBACjC,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,uBAAuB,EAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC;aAC/D,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,kBAAkB,CAAC,OAAwB,EAAE,UAAkB,EAAE,YAAY,GAAG,CAAC;QAC/E,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,KAAK,IAAI,IAAI,IAAI,CAAC,aAAa,KAAK,CAAC,YAAY,KAAK,CAAC,CAAC;YACxF,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,YAAY,KAAK,CAAC,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QACvB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC/B,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACpD,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC1C,CAAC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,8EAA8E;IAC9E,uBAAuB,CAAC,OAAe,IAAG,CAAC;IAE3C,KAAK,CAAC,gBAAgB,CAAC,IAAqB,EAAE,MAAe;QAC3D,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,iBAAiB;YAC7E,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE;YAAE,OAAO;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,WAAW,EAAE,mBAAmB,CAAC,IAAI,EAAE,MAAM,IAAI,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;QAChG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EACvD,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACjE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;QAC/B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACpD,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7B;YACE,IAAI,CAAC,SAAS;YACd,IAAI,CAAC,iBAAiB;YACtB,IAAI,CAAC,OAAO;YACZ,IAAI,CAAC,mBAAmB;YACxB,IAAI,CAAC,cAAc;YACnB,IAAI,CAAC,kBAAkB;YACvB,IAAI,CAAC,gBAAgB;YACrB,IAAI,CAAC,eAAe;YACpB,IAAI,CAAC,iBAAiB;YACtB,IAAI,CAAC,YAAY;YACjB,IAAI,CAAC,aAAa;YAClB,IAAI,CAAC,aAAa;YAClB,IAAI,CAAC,mBAAmB;YACxB,IAAI,CAAC,kBAAkB;SACxB,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,eAAe,iBAAiB,CAAC","sourcesContent":["import { normalizeBounces } from './pathLimits.js';\nimport { updateMeshInstanceColors } from './prepareMeshBVH.js';\nimport { updateTLASInstanceColors } from './bvhAccel.js';\nimport { getMaterialHashKey } from '../scene/openPbrSchema.js';\nimport { sameInstanceMembership } from './meshInstances.js';\nimport InstancedMesh from '../scene/InstancedMesh.js';\nimport { dirtyMeshInstanceIndices } from './prepareMeshBVH.js';\nimport { cameraApertureRadius } from './cameraLens.js';\nimport { getGeometryBvh, setGeometryBvh } from './geometryBvh.js';\nimport { samplingPatternCode, zSobolLog2SPP, type SamplingPattern } from './sampling.js';\nimport depthQueryFrag from './glsl/depthQuery.frag.js';\nimport { readFloatPixelsAsync } from './WebGLReadback.js';\nimport { DEPTH_SAMPLE_GRID, packDepthSampleArea, unpackDepthSamples, type DepthSampleArea } from './depthQuery.js';\nimport { MeshMembershipCache } from './meshMembership.js';\nimport { SceneEnvironmentCache, RectLightTextureTracker } from './sceneLightChanges.js';\nimport { MaterialChangeTracker, materialIsEmissive, type MaterialUpdateLevel } from './materialChanges.js';\nimport {\n constants,\n WebGLDevice as WebGLRenderer,\n Texture2D as WebGLTexture2D\n} from './webgl.js';\nimport { WebGLFullQuadPass } from './WebGLFullQuadPass.js';\nimport { mat4 } from '../math.js';\nimport Mesh from '../scene/Mesh.js';\nimport {\n buildBLAS,\n buildTLAS,\n concatBLASBuffers,\n refitBLAS,\n refitTLAS,\n mergeRefitRanges,\n type FlattendBVH\n} from './bvhAccel.js';\nimport {\n generateBackgroundMapFromSceneBackground, environmentRotation, backgroundMapTransform\n} from './envMapCreation.js';\nimport {\n envMapDistribution,\n environmentMapSourcesMatch,\n type EnvironmentMapSource\n} from './envMapDistribution.js';\nimport createRayTraceFragmentShader from './glsl/rayTrace.frag.js';\nimport shadowCatcherFrag from './glsl/shadowCatcher.frag.js';\nimport MaterialTable, {\n DEFAULT_MAX_TEXTURE_ARRAY_BYTES,\n materialUsesMedium\n} from './MaterialTable.js';\nimport OpenPBRMaterial, {\n resolveMaterialAlphaMode\n} from '../scene/OpenPBRMaterial.js';\n\nimport DirectionalLight from '../scene/DirectionalLight.js';\nimport SphereLight from '../scene/SphereLight.js';\nimport RectLight from '../scene/RectLight.js';\nimport SpotLight from '../scene/SpotLight.js';\nimport { SceneBackground, SceneLight } from '../scene/Scene.js';\nimport { isIntelMac, numberArraysEqual } from './util.js';\nimport Camera from '../scene/Camera.js';\nimport {\n commonLinearFloatProps,\n commonNearestFloatProps,\n setDataTexture,\n textureDimensionsFromArray\n} from './dataTextureUtil.js';\nimport {\n CONSTANT_DIRECTIONAL_LIGHT,\n CONSTANT_RECT_LIGHT,\n CONSTANT_SPHERE_LIGHT,\n packLightsToBuffer\n} from './lightsUtil.js';\nimport {\n estimateAnalyticLightPower,\n estimateEnvironmentPower,\n packIESProfiles\n} from './lightSampling.js';\nimport { updatePreparedGeometries, canUpdateGeometries, geometryTopologyChanged } from './geometryUpdates.js';\nimport Geometry, { Attribute } from '../scene/Geometry.js';\nimport { updateMeshInstances, updateMeshInstanceTransforms } from './prepareMeshBVH.js';\nimport { mergeMeshesToGeometry } from './mergeMeshesToGeometry.js';\nimport {\n DEFAULT_BEVEL_SAMPLES,\n normalizeBevelSamples\n} from './RenderingPipeline.js';\nimport {\n getOpenPbrEnergyLutData,\n OPENPBR_ENERGY_LUT_HEIGHT,\n OPENPBR_ENERGY_LUT_WIDTH\n} from './openPbrEnergyLut.js';\n\ntype AnalyticLight = DirectionalLight | SphereLight | SpotLight | RectLight;\n// A defensive mixture keeps weak-but-wide lights from being starved by an\n// imperfect scalar power estimate while still favoring dominant emitters.\nconst POWER_WEIGHTED_LIGHT_MIX = 0.25;\n\nfunction packLightsToTexture(\n texture: WebGLTexture2D,\n lights: AnalyticLight[],\n texturesIndices: number[],\n selectionPmfs: ArrayLike<number>,\n selectionCdfs: ArrayLike<number>,\n iesProfileTexelOffsets: ArrayLike<number>\n) {\n const data = packLightsToBuffer(\n lights,\n texturesIndices,\n selectionPmfs,\n selectionCdfs,\n iesProfileTexelOffsets\n );\n texture.source = {\n data,\n width: data.length / 4,\n height: 1\n };\n}\n\n// TODO EXT_float_blend\n// rayTraceBlendNode.inputs = {\n// colorTex: rayTraceNode,\n// prevColorTex: {\n// node: rayTraceBlendNode,\n// prevFrame: true\n// }\n// };\n\n// TODO use one method to set all required properties.\n// Ensure necessary properties are set.\nclass WebGLRayTracePass {\n private readonly _renderer: WebGLRenderer;\n private _meshes: Mesh[] = [];\n private _sceneEnvironment = new SceneEnvironmentCache();\n private _rectLightTextures = new RectLightTextureTracker();\n private _analyticLights: AnalyticLight[] = [];\n private _analyticLightSelectionPmfs = new Float32Array(0);\n private _analyticLightSelectionCdfs = new Float32Array(0);\n private _envLightSelectionPmf = 0;\n private _materialData: MaterialTable | undefined;\n private _maxTextureArrayBytes = DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n private _preparedMeshData?: ReturnType<typeof updateMeshInstances>;\n private _membershipCache = new MeshMembershipCache();\n private _pendingMembershipData?: ReturnType<typeof updateMeshInstances>;\n private _materialChanges = new MaterialChangeTracker();\n private _pendingMaterialUpdate?: { level: MaterialUpdateLevel; emission: boolean; emissiveMap: boolean; materials: Set<OpenPBRMaterial> };\n private _pendingGeometryUpdates = new Set<Geometry>();\n private _needsUpdateMeshData = true;\n private _needsUpdateMeshMembership = false;\n private _needsRefitTLAS = false;\n private _dirtyTransformMeshes = new Set<Mesh>();\n private _dirtyColorMeshes = new Set<Mesh>();\n private _tlas?: FlattendBVH;\n private _bvhData?: Float32Array;\n private _instancesData?: Float32Array;\n private _materialIndexData?: Float32Array;\n private _meshSnapshot: {\n mesh: Mesh;\n instanceCount: number;\n instanceVersion: number;\n instanceTransforms?: Float32Array;\n instanceColors?: Float32Array;\n colorVersion: number;\n geometry: Mesh['geometry'];\n materials: OpenPBRMaterial[];\n materialKeys: string[];\n geometryVersion: number;\n positionArray: Float32Array;\n indexArray: Geometry['indices']['array'];\n matrix: number[];\n }[] = [];\n private _snapshotByMesh = new WeakMap<Mesh, (typeof this._meshSnapshot)[number]>();\n private _needsUpdateAnalyticLightsBuffer = true;\n private _debugBvhData?: {\n buffer: ArrayBuffer;\n };\n\n private _lightTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileTex = new WebGLTexture2D(commonNearestFloatProps);\n private _iesProfileColumns = 1;\n private _iesProfileTexelOffsets = new Int32Array(0);\n private _openPbrEnergyLut = new WebGLTexture2D({\n ...commonNearestFloatProps,\n source: {\n data: getOpenPbrEnergyLutData(),\n width: OPENPBR_ENERGY_LUT_WIDTH,\n height: OPENPBR_ENERGY_LUT_HEIGHT\n }\n });\n\n private _envMap = new WebGLTexture2D(commonLinearFloatProps);\n private _envMapDistribution = new WebGLTexture2D(commonLinearFloatProps);\n private _envImageSource?: EnvironmentMapSource;\n private _backgroundTex = new WebGLTexture2D(commonLinearFloatProps);\n\n private _hasEnvMap = false;\n private _hasBackground = false;\n private _groundedBackgroundParams = new Float32Array([0, 0, 0, 0]);\n private _groundedBackgroundCenter = new Float32Array([0, 0]);\n private _backgroundMapTransform = backgroundMapTransform();\n\n private _bounces = 2;\n private _bevelSamples = DEFAULT_BEVEL_SAMPLES;\n private _clamping?: number;\n\n // higher number results in faster convergence over time, but with lower quality initial samples\n\n private _samplingCode = -1;\n private _sequenceSeed = 0;\n private _zLogSPP = 0;\n\n private _positionBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _normalBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _colorBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _tangentBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uvBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _uv1BufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _bvhBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _instancesBufferTex = new WebGLTexture2D(commonNearestFloatProps);\n private _matIndexBufferTex = new WebGLTexture2D({\n ...commonNearestFloatProps\n // type: constants.INT\n });\n\n private _hasTransmission = false;\n private _hasAlpha = false;\n\n private _invalid = false;\n private _transmissiveAlphaMin = 1;\n\n private _mainPass: WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >;\n private _shadowCatcherPass: WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >;\n\n private _viewProjInv = mat4.create();\n private _apertureRadius = 0;\n private _focusDistance = 10;\n\n private _tracePasses: WebGLFullQuadPass<any, any>[];\n private readonly _depthPass: WebGLFullQuadPass<never, 'depth'>;\n private readonly _depthAbort = new AbortController();\n private _depthAspect = 1;\n private _hasShadowCatcher = false;\n private _spectral = false;\n\n constructor(renderer: WebGLRenderer) {\n this._renderer = renderer;\n const accumulationOutput = {\n type: constants.FLOAT,\n minFilter: constants.LINEAR,\n magFilter: constants.LINEAR,\n wrapS: constants.CLAMP_TO_EDGE,\n wrapT: constants.CLAMP_TO_EDGE\n };\n\n const rayTraceFrag = createRayTraceFragmentShader();\n rayTraceFrag.parallelCompile = true;\n shadowCatcherFrag.parallelCompile = true;\n this._mainPass = new WebGLFullQuadPass<\n never,\n 'color' | 'albedo' | 'normal' | 'moments'\n >('rayTrace', renderer, {\n shader: rayTraceFrag,\n // `moments` holds the denoiser's guide value moments and sample count.\n outputs: ['color', 'albedo', 'normal', 'moments'],\n outputParams: {\n color: accumulationOutput,\n albedo: accumulationOutput,\n normal: accumulationOutput,\n moments: accumulationOutput\n }\n });\n this._shadowCatcherPass = new WebGLFullQuadPass<\n never,\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n >(\n 'shadowCatcher',\n renderer,\n {\n shader: shadowCatcherFrag,\n outputs: ['shadowCatcher', 'catcherBackground', 'catcherMoments'],\n outputParams: {\n shadowCatcher: accumulationOutput,\n catcherBackground: accumulationOutput,\n catcherMoments: accumulationOutput\n }\n }\n );\n this._depthPass = new WebGLFullQuadPass('Depth query', renderer, {\n shader: depthQueryFrag, outputs: ['depth'],\n outputParams: { depth: commonNearestFloatProps }\n });\n this._tracePasses = [this._mainPass, this._shadowCatcherPass, this._depthPass];\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n OES_texture_float_linear: !!renderer.gl.getExtension(\n 'OES_texture_float_linear'\n )\n });\n });\n this._mainPass.setUniform('openPbrEnergyLut', this._openPbrEnergyLut);\n }\n\n createPass(\n clear: boolean,\n tile: { x: number; y: number; width: number; height: number },\n disableShadowCatcher = false\n ) {\n this.prepare();\n const options = {\n clear,\n blend: !clear,\n scissor: tile\n };\n this._mainPass.createPass({} as Record<never, WebGLTexture2D>, undefined, options);\n if (this._hasShadowCatcher && !disableShadowCatcher) {\n this._shadowCatcherPass.createPass(\n {} as Record<never, WebGLTexture2D>,\n undefined,\n options\n );\n }\n }\n\n getOutput(\n label: 'color' | 'albedo' | 'normal' | 'moments' |\n 'shadowCatcher' | 'catcherBackground' | 'catcherMoments'\n ) {\n return label === 'shadowCatcher' || label === 'catcherBackground' ||\n label === 'catcherMoments'\n ? this._shadowCatcherPass.getOutput(label)\n : this._mainPass.getOutput(label);\n }\n\n setBounce(bounce: number) {\n const next = normalizeBounces(bounce);\n const changed = this._bounces !== next;\n this._bounces = next;\n return changed;\n }\n\n setClamping(clamping?: number) {\n const changed = this._clamping !== clamping;\n this._clamping = clamping;\n return changed;\n }\n\n setBevelSamples(samples: number) {\n const next = normalizeBevelSamples(samples);\n const changed = this._bevelSamples !== next;\n if (changed) {\n this._bevelSamples = next;\n }\n return changed;\n }\n\n private _setEnvMap(envImage: EnvironmentMapSource | undefined) {\n if (!environmentMapSourcesMatch(envImage, this._envImageSource) && envImage) {\n this._envMap.source = envImage;\n this._envMapDistribution.source = envMapDistribution(envImage);\n }\n this._envImageSource = envImage;\n this._tracePasses.forEach((pass) => {\n pass.setUniform('envMap', envImage ? this._envMap : null);\n pass.setUniform(\n 'envMapDistribution',\n envImage ? this._envMapDistribution : null\n );\n pass.setUniform('envLightSelectionPmf', this._envLightSelectionPmf);\n\n pass.setDefines({\n USE_ENVMAP: !!envImage\n });\n });\n\n this._hasEnvMap = !!envImage;\n }\n\n setBackground(background?: SceneBackground) {\n this._backgroundMapTransform.set(backgroundMapTransform(background));\n const backgroundImage =\n background && generateBackgroundMapFromSceneBackground(background)!;\n\n if (backgroundImage) {\n this._backgroundTex.source = backgroundImage;\n }\n this._hasBackground = !!backgroundImage;\n const grounded =\n background &&\n !Array.isArray(background) &&\n 'type' in background &&\n background.type === 'GroundedSkybox'\n ? background\n : undefined;\n this._groundedBackgroundParams.set(\n grounded\n ? [\n Math.max(grounded.height, 0.0001),\n Math.max(grounded.radius, 0.0001),\n grounded.groundHeight ?? 0,\n 1\n ]\n : [0, 0, 0, 0]\n );\n this._groundedBackgroundCenter.set(grounded?.center ?? [0, 0]);\n }\n\n setTransmissiveOutputAlphaMin(transmissiveAlphaMin: number) {\n const changed = this._transmissiveAlphaMin !== transmissiveAlphaMin;\n this._transmissiveAlphaMin = transmissiveAlphaMin;\n return changed;\n }\n\n setMeshes(meshes: Mesh[], update?: { transforms?: readonly Mesh[]; colors?: readonly Mesh[]; geometries?: readonly Geometry[]; materials?: readonly OpenPBRMaterial[] }) {\n for (const mesh of update?.colors ?? []) this._dirtyColorMeshes.add(mesh);\n if (update && this._preparedMeshData && this._materialData &&\n !this._needsUpdateMeshData && meshes === this._meshes) {\n const change = this._materialChanges.classify(update.materials ?? []);\n if (change.level !== 'geometry' && canUpdateGeometries(this._preparedMeshData, update.geometries ?? [])) {\n if (update.materials?.length) {\n const pending = this._pendingMaterialUpdate;\n this._pendingMaterialUpdate = { level: pending?.level === 'textures' ? 'textures' : change.level,\n emission: !!pending?.emission || change.emission,\n emissiveMap: !!pending?.emissiveMap || change.emissiveMap,\n materials: new Set([...(pending?.materials ?? []), ...update.materials]) };\n this._meshSnapshot.forEach(item => { item.materialKeys = item.materials.map(getMaterialHashKey); });\n }\n for (const geometry of update.geometries ?? []) this._pendingGeometryUpdates.add(geometry);\n for (const item of this._meshSnapshot) if (this._pendingGeometryUpdates.has(item.geometry)) item.geometryVersion = item.geometry.version;\n for (const mesh of update.transforms ?? []) {\n const item = this._snapshotByMesh.get(mesh);\n if (!item) continue;\n for (let i = 0; i < 16; i++) item.matrix[i] = mesh.transform[i];\n this._dirtyTransformMeshes.add(mesh); this._needsRefitTLAS = true;\n }\n return !!update.materials?.length || !!update.transforms?.length || !!update.colors?.length || !!update.geometries?.length;\n }\n }\n const materialChange = !!update?.materials?.length;\n const next = meshes.map((mesh) => ({\n mesh,\n instanceCount: mesh instanceof InstancedMesh ? mesh.count : 1,\n instanceVersion: mesh instanceof InstancedMesh ? mesh.transformsVersion : 0,\n instanceTransforms: mesh instanceof InstancedMesh ? mesh.transforms : undefined,\n instanceColors: mesh instanceof InstancedMesh ? mesh.colors : undefined,\n colorVersion: mesh instanceof InstancedMesh ? mesh.colorsVersion : 0,\n geometry: mesh.geometry,\n materials: mesh.materials.slice(),\n materialKeys: mesh.materials.map(getMaterialHashKey),\n geometryVersion: mesh.geometry.version,\n positionArray: mesh.geometry.position.array, indexArray: mesh.geometry.indices.array,\n matrix: Array.from(mesh.transform as ArrayLike<number>)\n }));\n const membershipChanged = next.length !== this._meshSnapshot.length ||\n next.some((item, i) => item.mesh !== this._meshSnapshot[i]?.mesh || item.instanceCount !== this._meshSnapshot[i]?.instanceCount ||\n item.materials.some((material, k) => material !== this._meshSnapshot[i]?.materials[k]));\n const membership = !this._needsUpdateMeshData && membershipChanged && this._preparedMeshData\n ? this._membershipCache.update(this._preparedMeshData, meshes) : undefined;\n if (membership) {\n const versions = new Map(this._meshSnapshot.flatMap(item => item.materials.map((m, i) => [m, item.materialKeys[i]] as const)));\n const materialsChanged = membership.materials.length !== this._preparedMeshData!.materials.length ||\n membership.materials.some((m, i) => m !== this._preparedMeshData!.materials[i] ||\n versions.has(m) && getMaterialHashKey(m) !== versions.get(m));\n this._pendingMembershipData = membership;\n this._meshes = meshes;\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n this._needsUpdateMeshMembership = true;\n this._needsRefitTLAS = false;\n this._dirtyTransformMeshes.clear();\n if (materialsChanged) this._pendingMaterialUpdate = { level: 'textures', emission: true,\n emissiveMap: true, materials: new Set(membership.materials) };\n return true;\n }\n const changed =\n next.length !== this._meshSnapshot.length ||\n next.some((item, i) => {\n const prev = this._meshSnapshot[i];\n return (\n !prev ||\n item.mesh !== prev.mesh || item.instanceCount !== prev.instanceCount || item.instanceVersion !== prev.instanceVersion || item.instanceTransforms !== prev.instanceTransforms ||\n item.geometry !== prev.geometry || item.colorVersion !== prev.colorVersion || item.instanceColors !== prev.instanceColors ||\n item.materials.length !== prev.materials.length ||\n item.materials.some((material, k) => material !== prev.materials[k]) ||\n item.materialKeys.some((hash, k) => hash !== prev.materialKeys[k]) ||\n item.geometryVersion !== prev.geometryVersion ||\n item.matrix.some((value, k) => value !== prev.matrix[k])\n );\n });\n next.forEach((item, i) => {\n const prev = this._meshSnapshot[i];\n if (\n prev &&\n item.geometry === prev.geometry &&\n (item.geometryVersion !== prev.geometryVersion || item.positionArray !== prev.positionArray || item.indexArray !== prev.indexArray)\n ) {\n const usesDisplacement =\n !!item.materials[0]?.displacementMap &&\n Math.abs(item.materials[0].displacementScale) > 1e-6;\n if (\n usesDisplacement || geometryTopologyChanged(this._preparedMeshData, item.geometry) ||\n !getGeometryBvh(item.geometry) ||\n !refitBLAS(getGeometryBvh(item.geometry)!, item.geometry)\n ) {\n setGeometryBvh(item.geometry, undefined);\n }\n }\n });\n this._meshSnapshot = next;\n this._snapshotByMesh = new WeakMap();\n next.forEach(item => this._snapshotByMesh.set(item.mesh, item));\n if (!changed && update && !materialChange) return false;\n this._meshes = meshes;\n this._needsUpdateMeshData = true;\n this._needsRefitTLAS = false; this._dirtyTransformMeshes.clear();\n this._debugBvhData = undefined;\n return true;\n }\n\n setTextureAtlasBudget(maxBytes: number) {\n const next = Number.isFinite(maxBytes)\n ? Math.max(4, Math.floor(maxBytes))\n : DEFAULT_MAX_TEXTURE_ARRAY_BYTES;\n if (next === this._maxTextureArrayBytes) return false;\n this._maxTextureArrayBytes = next;\n this._needsUpdateMeshData = true;\n return true;\n }\n\n getDebugBVHData() {\n if (!this._debugBvhData) {\n const mergedMesh = mergeMeshesToGeometry(this._meshes);\n const bvh = buildBLAS(mergedMesh.geometry);\n this._debugBvhData = { buffer: bvh.buffer };\n }\n return this._debugBvhData;\n }\n\n getDiagnostics() {\n return {\n textureAtlas: this._materialData?.textureAtlasStats\n };\n }\n\n private _updateMeshData() {\n this._pendingGeometryUpdates.clear();\n this._needsUpdateMeshData = false;\n\n // GLSL intersects the original triangles, so its BVH must bound those\n // triangles rather than WebGPU's displaced height prisms.\n const res = updateMeshInstances(this._meshes, { displacement: false });\n this._preparedMeshData = res;\n this._membershipCache.capture(res);\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n const mergedGeometry = res.geometry;\n const materials = res.materials;\n const tlas = buildTLAS(res.instances, res.blases);\n this._tlas = tlas;\n const tlasBuffer = new Float32Array(tlas.buffer);\n const instancesBuffer = this._instancesData = new Float32Array(tlas.instancesBuffer!);\n const blasBuffer = new Float32Array(concatBLASBuffers(res.blases));\n const bvhBuffer = this._bvhData = new Float32Array(tlasBuffer.length + blasBuffer.length);\n const blasOffset = tlasBuffer.length / 4;\n bvhBuffer.set(tlasBuffer);\n bvhBuffer.set(blasBuffer, blasOffset * 4);\n\n if (mergedGeometry.position.array.length > 0) {\n setDataTexture(this._positionBufferTex, mergedGeometry.position.array, 3);\n setDataTexture(this._normalBufferTex, mergedGeometry.normal.array, 3);\n mergedGeometry.color &&\n setDataTexture(this._colorBufferTex, mergedGeometry.color.array, 3);\n mergedGeometry.tangent &&\n setDataTexture(this._tangentBufferTex, mergedGeometry.tangent.array, 4);\n mergedGeometry.uv &&\n setDataTexture(this._uvBufferTex, mergedGeometry.uv.array, 2);\n mergedGeometry.uv1 &&\n setDataTexture(this._uv1BufferTex, mergedGeometry.uv1.array, 2);\n mergedGeometry.materialIndex &&\n setDataTexture(\n this._matIndexBufferTex,\n // TODO currently int texture doesn't work\n this._materialIndexData = new Float32Array(mergedGeometry.materialIndex.array),\n 4\n );\n }\n if (bvhBuffer.length > 0) {\n setDataTexture(this._bvhBufferTex, bvhBuffer, 4);\n setDataTexture(this._instancesBufferTex, instancesBuffer, 4);\n }\n\n this._materialData?.dispose(this._renderer.gl);\n const materialData = new MaterialTable(\n materials,\n this._analyticLights,\n {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS\n ),\n maxTextureDimension2D: this._renderer.gl.getParameter(\n this._renderer.gl.MAX_TEXTURE_SIZE\n )\n }\n );\n this._materialData = materialData;\n\n this._tracePasses.forEach((pass) => {\n pass.setUniforms({\n bvhBuffer: this._bvhBufferTex,\n instancesBuffer: this._instancesBufferTex,\n positionBuffer: this._positionBufferTex,\n normalBuffer: this._normalBufferTex,\n tangentBuffer: mergedGeometry.tangent ? this._tangentBufferTex : null,\n colorBuffer: mergedGeometry.color ? this._colorBufferTex : null,\n uvBuffer: mergedGeometry.uv ? this._uvBufferTex : null,\n uv1Buffer: mergedGeometry.uv1 ? this._uv1BufferTex : null,\n materialIndexBuffer: this._matIndexBufferTex,\n\n bvhColumns: textureDimensionsFromArray(bvhBuffer.length / 4).columnsLog,\n vertexColumns: textureDimensionsFromArray(\n Attribute.getCount(mergedGeometry.position)\n ).columnsLog,\n instancesColumns: textureDimensionsFromArray(instancesBuffer.length / 4)\n .columnsLog,\n blasOffset,\n\n isEmptyScene: +(res.instances.length === 0)\n });\n\n });\n this._updateMaterialConstants(materials, materialData, mergedGeometry);\n this._materialChanges.capture(materials);\n this._pendingMaterialUpdate = undefined;\n\n return bvhBuffer;\n }\n\n private _updateMaterialConstants(materials: OpenPBRMaterial[], materialData: MaterialTable, mergedGeometry: Geometry) {\n // Avoid too much shader compilation\n const STACK_SIZE = 50;\n const hasShadowCatcher = materials.some((m) => m.shadowCatcher);\n const HAS_BEVEL = materials.some((m) => m.bevelSize > 0);\n const HAS_MEDIUM = materials.some(materialUsesMedium);\n\n this._hasShadowCatcher = hasShadowCatcher;\n this._hasTransmission = materials.some(\n (m) =>\n m.transmissionWeight > 0 ||\n m.mapAlphaUsage === \"transmission\"\n );\n this._hasAlpha = materials.some(\n (m) => resolveMaterialAlphaMode(m) !== 'opaque'\n );\n this._spectral = materials.some((m) => m.transmissionDispersionScale > 0);\n\n\n this._tracePasses.forEach(pass => {\n pass.setDefines({\n OES_texture_float_linear: true,\n\n STACK_SIZE,\n USE_VERTEX_COLOR: mergedGeometry.color != null,\n USE_TANGENT: mergedGeometry.tangent != null,\n USE_COAT_NORMAL_FRAMES: materials.some(m => m.coatWeight > 0 && (!!m.normalMap || !!m.coatNormalMap)),\n HAS_TRANSMISSION: this._hasTransmission,\n HAS_GLTF_ANISOTROPY: materials.some(m => m.specularAnisotropyModel === 'gltf' && m.specularAnisotropy > 0),\n HAS_BEVEL,\n HAS_MEDIUM,\n HAS_ALPHA: this._hasAlpha,\n\n BEVEL_SAMPLES: this._bevelSamples,\n\n RECT_LIGHT: CONSTANT_RECT_LIGHT,\n SPHERE_LIGHT: CONSTANT_SPHERE_LIGHT,\n DIRECTIONAL_LIGHT: CONSTANT_DIRECTIONAL_LIGHT,\n\n USE_RR: true,\n // Multiple-scattering SSS paths need enough collisions to return to\n // the boundary before roulette; terminating at depth five produces\n // dark materials and a handful of very large surviving samples.\n RR_MAX: HAS_MEDIUM ? 12 : 2,\n\n ...materialData.defines\n });\n\n materialData.setToPass(pass);\n });\n }\n\n private _updateMeshMembership() {\n const res = this._pendingMembershipData!;\n this._preparedMeshData = res;\n const tlas = this._tlas = buildTLAS(res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n const data = this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n data.set(new Float32Array(tlas.buffer));\n data.set(blas, tlas.buffer.byteLength / 4);\n this._instancesData = new Float32Array(tlas.instancesBuffer!);\n setDataTexture(this._bvhBufferTex, data, 4);\n setDataTexture(this._instancesBufferTex, this._instancesData, 4);\n this._tracePasses.forEach(pass => pass.setUniforms({\n bvhColumns: textureDimensionsFromArray(data.length / 4).columnsLog,\n instancesColumns: textureDimensionsFromArray(this._instancesData!.length / 4).columnsLog,\n blasOffset: tlas.buffer.byteLength / 16,\n isEmptyScene: +(res.instances.length === 0)\n }));\n this._pendingMembershipData = undefined;\n this._needsUpdateMeshMembership = false;\n this._debugBvhData = undefined;\n }\n\n private _updateGeometryData() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const update = updatePreparedGeometries(res, this._pendingGeometryUpdates);\n for (const { first, count, topologyChanged, deformationOnly } of update.vertices) {\n for (const [attribute, texture] of [\n [res.geometry.position, this._positionBufferTex], [res.geometry.normal, this._normalBufferTex],\n [res.geometry.tangent, this._tangentBufferTex], [res.geometry.color, this._colorBufferTex],\n [res.geometry.uv, this._uvBufferTex], [res.geometry.uv1, this._uv1BufferTex]\n ] as const) if (attribute && (!deformationOnly || attribute === res.geometry.position || attribute === res.geometry.normal || attribute === res.geometry.tangent)) texture.updateDataRange(this._renderer.gl, attribute.array,\n first * attribute.itemSize * 4, count * attribute.itemSize * 4);\n if (!topologyChanged) continue;\n const material = this._materialIndexData!;\n for (let i = first * 4; i < (first + count) * 4; i++) material[i] = res.geometry.materialIndex!.array[i];\n this._matIndexBufferTex.updateDataRange(this._renderer.gl, material, first * 16, count * 16);\n }\n for (const mesh of update.meshes) this._dirtyTransformMeshes.add(mesh);\n if (update.relocated) for (const binding of res.instanceBindings) this._dirtyTransformMeshes.add(binding.mesh);\n if (update.resized) {\n res.instances = updateMeshInstanceTransforms(res.instanceBindings);\n refitTLAS(tlas, res.instances, res.blases);\n const blas = new Float32Array(concatBLASBuffers(res.blases));\n this._bvhData = new Float32Array(tlas.buffer.byteLength / 4 + blas.length);\n this._bvhData.set(new Float32Array(tlas.buffer)); this._bvhData.set(blas, tlas.buffer.byteLength / 4);\n setDataTexture(this._bvhBufferTex, this._bvhData, 4);\n this._tracePasses.forEach(pass => pass.setUniform('bvhColumns', textureDimensionsFromArray(this._bvhData!.length / 4).columnsLog));\n } else {\n const ranges = [];\n for (const { blas, offset } of update.blases) {\n const target = tlas.buffer.byteLength + offset;\n new Uint8Array(this._bvhData!.buffer).set(new Uint8Array(blas.buffer), target);\n ranges.push({offset: target, size: blas.buffer.byteLength});\n }\n for (const { offset, size } of mergeRefitRanges(ranges)) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n }\n this._needsRefitTLAS = true; this._pendingGeometryUpdates.clear(); this._debugBvhData = undefined;\n }\n\n private _updateMeshColors() {\n const res = this._preparedMeshData, tlas = this._tlas;\n if (res && tlas) {\n const dirty = updateMeshInstanceColors(res.instanceBindings, res.instances, this._dirtyColorMeshes);\n const ranges = updateTLASInstanceColors(tlas, res.instances, dirty);\n for (const {offset, size} of ranges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n }\n this._dirtyColorMeshes.clear();\n }\n\n private _refitMeshInstances() {\n const res = this._preparedMeshData!, tlas = this._tlas!;\n const dirty = dirtyMeshInstanceIndices(res.instanceBindings, this._dirtyTransformMeshes, res.instances);\n const previousInstances = res.instances;\n res.instances = updateMeshInstanceTransforms(res.instanceBindings, res.instances, dirty);\n if (!sameInstanceMembership(previousInstances, res.instances)) {\n this._pendingMembershipData = res;\n this._updateMeshMembership();\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n return;\n }\n const ranges = refitTLAS(tlas, res.instances, res.blases, dirty);\n this._bvhData!.set(new Float32Array(tlas.buffer));\n for (const { offset, size } of ranges.tlasRanges) this._bvhBufferTex.updateDataRange(this._renderer.gl, this._bvhData!, offset, size);\n for (const { offset, size } of ranges.instanceRanges) this._instancesBufferTex.updateDataRange(this._renderer.gl, this._instancesData!, offset, size);\n this._dirtyTransformMeshes.clear(); this._needsRefitTLAS = false;\n this._debugBvhData = undefined;\n }\n\n private _updateMaterialData() {\n const update = this._pendingMaterialUpdate!;\n const res = this._preparedMeshData!;\n let data = this._materialData!;\n if (update.level === 'textures') {\n data.dispose(this._renderer.gl);\n data = this._materialData = new MaterialTable(res.materials, this._analyticLights, {\n maxTextureArrayBytes: this._maxTextureArrayBytes,\n maxTextureArrayLayers: this._renderer.gl.getParameter(this._renderer.gl.MAX_ARRAY_TEXTURE_LAYERS),\n maxTextureDimension2D: this._renderer.gl.getParameter(this._renderer.gl.MAX_TEXTURE_SIZE)\n });\n this._needsUpdateAnalyticLightsBuffer = true;\n } else data.repackParams(res.materials);\n this._updateMaterialConstants(res.materials, data, res.geometry);\n if (update.emission || update.emissiveMap) {\n // WebGL currently evaluates mesh emission on path hits; its direct-light\n // sampler has only analytic/environment sources. Retain that behavior.\n res.emissiveBindings = res.instanceBindings.filter(binding =>\n binding.materialIndices.some(index => materialIsEmissive(res.materials[index])));\n }\n this._materialChanges.capture([...update.materials]);\n this._pendingMaterialUpdate = undefined;\n }\n\n setLights(lights: SceneLight[]) {\n const analyticLights = lights.filter(\n (light) =>\n light.type === 'DirectionalLight' ||\n light.type === 'SphereLight' ||\n light.type === 'SpotLight' ||\n light.type === 'RectLight'\n ) as AnalyticLight[];\n const numAnalyticLights = analyticLights.length;\n\n const envImage = this._sceneEnvironment.update(lights);\n const rotation = environmentRotation(lights);\n const rotation3 = [rotation[0], rotation[1], rotation[2], rotation[4], rotation[5], rotation[6], rotation[8], rotation[9], rotation[10]];\n this._tracePasses.forEach(pass => pass.setUniform('environmentRotation', rotation3));\n\n const envWeight = estimateEnvironmentPower(envImage);\n const analyticWeights = analyticLights.map(estimateAnalyticLightPower);\n const totalWeight =\n envWeight + analyticWeights.reduce((sum, weight) => sum + weight, 0);\n const sourceCount = analyticLights.length + (envImage ? 1 : 0);\n const fallbackPmf = sourceCount > 0 ? 1 / sourceCount : 0;\n this._envLightSelectionPmf = envImage\n ? totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (envWeight / totalWeight)\n : fallbackPmf\n : 0;\n this._analyticLightSelectionPmfs = Float32Array.from(\n analyticWeights,\n (weight) =>\n totalWeight > 0\n ? (1 - POWER_WEIGHTED_LIGHT_MIX) * fallbackPmf +\n POWER_WEIGHTED_LIGHT_MIX * (weight / totalWeight)\n : fallbackPmf\n );\n let cumulativePmf = this._envLightSelectionPmf;\n this._analyticLightSelectionCdfs = Float32Array.from(\n this._analyticLightSelectionPmfs,\n (pmf) => {\n cumulativePmf += pmf;\n return cumulativePmf;\n }\n );\n if (this._analyticLightSelectionCdfs.length > 0) {\n this._analyticLightSelectionCdfs[\n this._analyticLightSelectionCdfs.length - 1\n ] = 1;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setDefines({\n NUM_LIGHTS: numAnalyticLights,\n HAS_SPHERE_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SphereLight'\n ),\n HAS_SPOT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'SpotLight'\n ),\n HAS_RECT_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'RectLight'\n ),\n HAS_DIRECTIONAL_LIGHTS: !!analyticLights.find(\n (light) => light.type === 'DirectionalLight'\n )\n });\n });\n\n const lightTexturesChanged = this._rectLightTextures.update(analyticLights);\n this._analyticLights = analyticLights;\n const packedIES = packIESProfiles(analyticLights);\n this._iesProfileTexelOffsets = packedIES.offsets;\n this._iesProfileColumns = setDataTexture(\n this._iesProfileTex,\n packedIES.data.length ? packedIES.data : new Float32Array(4),\n 4\n ).columns;\n if (lightTexturesChanged) this._needsUpdateMeshData = true;\n\n this._needsUpdateAnalyticLightsBuffer = true;\n\n this._setEnvMap(envImage);\n }\n\n private _getViewProjInv(camera: Camera, viewProjInv: mat4.Mat4Array) {\n mat4.invert(viewProjInv, camera.getProjectionMatrix(this._depthAspect));\n mat4.mul(viewProjInv, camera.transform, viewProjInv);\n }\n\n setCamera(camera: Camera) {\n const viewProjectionInv = this._viewProjInv;\n this._apertureRadius = cameraApertureRadius(camera);\n this._focusDistance = camera.focusDistance;\n this._getViewProjInv(camera, viewProjectionInv);\n this._tracePasses.forEach((pass) => {\n pass.setUniform('viewProjectionInv', viewProjectionInv);\n pass.setUniform('viewInv', camera.transform);\n // Zero for orthographic cameras, which have no depth of field.\n pass.setUniform('cameraApertureRadius', this._apertureRadius);\n pass.setUniform('cameraFocusDistance', camera.focusDistance);\n });\n }\n\n cameraChanged(camera: Camera) {\n const tmp = mat4.create();\n this._getViewProjInv(camera, tmp);\n return (\n !numberArraysEqual(this._viewProjInv, tmp) ||\n cameraApertureRadius(camera) !== this._apertureRadius ||\n camera.focusDistance !== this._focusDistance\n );\n }\n\n setSize(width: number, height: number, targetAspect = width / height) {\n this._depthAspect = targetAspect;\n this._tracePasses.forEach((pass) => {\n pass.setSize(pass === this._depthPass ? DEPTH_SAMPLE_GRID : width,\n pass === this._depthPass ? DEPTH_SAMPLE_GRID : height);\n pass.setUniform('pixelSize', [1 / width, 1 / height]);\n });\n }\n\n setJitter(x: number, y: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('jitter', [x, y]);\n });\n }\n\n releaseTarget(target: object) { this._mainPass.releaseTarget(target); this._shadowCatcherPass.releaseTarget(target); }\n\n getTargetMemoryBytes(target: object) {\n return this._mainPass.getMemoryBytes(target) + this._shadowCatcherPass.getMemoryBytes(target);\n }\n\n useTarget(target: object) {\n this._mainPass.useTarget(target);\n this._shadowCatcherPass.useTarget(target);\n }\n\n setQuality(options: { bounces: number; bevel: boolean; dispersionWavelengths: 1 | 3; directLightCandidates: number }) {\n this._tracePasses.forEach(pass => {\n pass.setUniform('bounceLimit', normalizeBounces(options.bounces));\n pass.setUniform('bevelEnabled', options.bevel);\n pass.setUniform('dispersionWavelengths', options.dispersionWavelengths);\n });\n }\n\n setWavelength(wavelength: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('wavelength', wavelength);\n });\n }\n\n setSampleCount(sampleCount: number) {\n this._tracePasses.forEach((pass) => {\n pass.setUniform('sampleCount', sampleCount);\n });\n }\n\n isInvalid() {\n return this._invalid;\n }\n\n hasShadowCatcher() {\n return this._hasShadowCatcher;\n }\n\n hasDispersion() {\n return this._spectral;\n }\n\n prepare(): void {\n if (this._needsUpdateMeshData) {\n this._updateMeshData();\n } else if (this._needsUpdateMeshMembership) {\n this._updateMeshMembership();\n }\n if (this._pendingGeometryUpdates.size) this._updateGeometryData();\n if (this._needsRefitTLAS) this._refitMeshInstances();\n if (this._dirtyColorMeshes.size) this._updateMeshColors();\n\n if (this._pendingMaterialUpdate) this._updateMaterialData();\n\n if (this._needsUpdateAnalyticLightsBuffer) {\n const analyticLights = this._analyticLights;\n analyticLights.length > 0 &&\n packLightsToTexture(\n this._lightTex,\n analyticLights,\n this._materialData!.getLightTexturesIndices(),\n this._analyticLightSelectionPmfs,\n this._analyticLightSelectionCdfs,\n this._iesProfileTexelOffsets\n );\n this._needsUpdateAnalyticLightsBuffer = false;\n }\n\n this._tracePasses.forEach((pass) => {\n pass.setUniform(\n 'backgroundMap',\n this._hasBackground\n ? this._backgroundTex\n : this._hasEnvMap\n ? this._envMap\n : null\n );\n\n pass.setUniform(\n 'transmissiveOutputAlphaMin',\n Math.max(Math.min(1, this._transmissiveAlphaMin), 0)\n );\n\n pass.setUniform('lightsTex', this._lightTex);\n pass.setUniform('iesProfileData', this._iesProfileTex);\n pass.setUniform('iesProfileColumns', this._iesProfileColumns);\n pass.setUniform('groundedBackgroundParams', this._groundedBackgroundParams);\n pass.setUniform('groundedBackgroundCenter', this._groundedBackgroundCenter);\n pass.setUniform('backgroundMapTransform', this._backgroundMapTransform);\n\n pass.setDefines({\n // Double bounce fix on intel mac\n // Limit the bounce to avoid long compilation time.\n BOUNCES: isIntelMac()\n ? Math.min(this._bounces, 3) *\n (this._hasTransmission || this._hasAlpha ? 2 : 1)\n : this._bounces,\n CLAMPING: this._clamping || undefined,\n BEVEL_SAMPLES: this._bevelSamples,\n USE_BACKGROUND: this._hasBackground,\n USE_GROUNDED_BACKGROUND: this._groundedBackgroundParams[3] > 0\n });\n });\n }\n\n setSamplingPattern(pattern: SamplingPattern, maxSamples: number, sequenceSeed = 0) {\n const code = samplingPatternCode(pattern);\n const logSPP = zSobolLog2SPP(code === 1 ? maxSamples - 1 : maxSamples);\n const changed = this._samplingCode !== code || this._sequenceSeed !== (sequenceSeed >>> 0) ||\n (code === 1 && this._zLogSPP !== logSPP);\n this._samplingCode = code;\n this._sequenceSeed = sequenceSeed >>> 0;\n this._zLogSPP = logSPP;\n this._tracePasses.forEach(pass => {\n pass.setUniform('samplingPattern', code);\n pass.setUniform('sequenceSeed', this._sequenceSeed);\n pass.setUniform('zSobolLogSPP', logSPP);\n });\n return changed;\n }\n\n // WebGL has uniform per-pixel counts; setSampleCount already includes offset.\n setSampleSequenceOffset(_offset: number) {}\n\n async readDepthSamples(area: DepthSampleArea, aspect?: number): Promise<Float32Array | undefined> {\n if (this._depthAbort.signal.aborted || this._invalid || !this._preparedMeshData ||\n !this._renderer.isAllProgramCompiled()) return;\n this.prepare();\n this._depthPass.setUniform('depthArea', packDepthSampleArea(area, aspect ?? this._depthAspect));\n this._depthPass.createPass({});\n const rgba = await readFloatPixelsAsync(this._renderer.gl,\n DEPTH_SAMPLE_GRID, DEPTH_SAMPLE_GRID, this._depthAbort.signal);\n return unpackDepthSamples(rgba);\n }\n\n dispose() {\n this._depthAbort.abort();\n this._materialData?.dispose(this._renderer.gl);\n this._materialData = undefined;\n this._tracePasses.forEach((pass) => pass.dispose());\n const gl = this._renderer.gl;\n [\n this._lightTex,\n this._openPbrEnergyLut,\n this._envMap,\n this._envMapDistribution,\n this._backgroundTex,\n this._positionBufferTex,\n this._normalBufferTex,\n this._colorBufferTex,\n this._tangentBufferTex,\n this._uvBufferTex,\n this._uv1BufferTex,\n this._bvhBufferTex,\n this._instancesBufferTex,\n this._matIndexBufferTex\n ].forEach((texture) => texture.dispose(gl));\n }\n}\n\nexport default WebGLRayTracePass;\n"]}
|