procedural-terrains 2.0.0 → 2.0.1
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/{FiniteTerrain-B34WMz5S.js → FiniteTerrain-B5_3y6xX.js} +3 -3
- package/dist/{FiniteTerrain-B34WMz5S.js.map → FiniteTerrain-B5_3y6xX.js.map} +1 -1
- package/dist/{InfiniteTerrain-SgoJz3qJ.js → InfiniteTerrain-jeCy6RED.js} +5 -5
- package/dist/{InfiniteTerrain-SgoJz3qJ.js.map → InfiniteTerrain-jeCy6RED.js.map} +1 -1
- package/dist/{MiniTerrain-Blt0H1S0.js → MiniTerrain-Bb5VYkZU.js} +8 -8
- package/dist/MiniTerrain-Bb5VYkZU.js.map +1 -0
- package/dist/{PlanetMaterial-B1_ZPlx5.js → PlanetMaterial-Cs-_x6vr.js} +4 -4
- package/dist/{PlanetMaterial-B1_ZPlx5.js.map → PlanetMaterial-Cs-_x6vr.js.map} +1 -1
- package/dist/{PlanetTerrain-DCvxS1Q8.js → PlanetTerrain-Bsfx7YA6.js} +5 -5
- package/dist/{PlanetTerrain-DCvxS1Q8.js.map → PlanetTerrain-Bsfx7YA6.js.map} +1 -1
- package/dist/{RevisionScope-J__6V9I_.js → RevisionScope-Dl4yjj-0.js} +2 -2
- package/dist/{RevisionScope-J__6V9I_.js.map → RevisionScope-Dl4yjj-0.js.map} +1 -1
- package/dist/{TerrainClouds-BuKvwnWw.js → TerrainClouds-DV6ny7P1.js} +31 -19
- package/dist/TerrainClouds-DV6ny7P1.js.map +1 -0
- package/dist/{TerrainHeightCache-Dsde6EDL.js → TerrainHeightCache-DIZxi9jz.js} +2 -2
- package/dist/{TerrainHeightCache-Dsde6EDL.js.map → TerrainHeightCache-DIZxi9jz.js.map} +1 -1
- package/dist/{TerrainParameters-A3fcNJTR.js → TerrainParameters-DMCjnnxz.js} +10 -8
- package/dist/TerrainParameters-DMCjnnxz.js.map +1 -0
- package/dist/{TerrainWater-Cil7waG3.js → TerrainWater-CX4XdwA0.js} +17 -11
- package/dist/TerrainWater-CX4XdwA0.js.map +1 -0
- package/dist/{WaterMaterial-BUsAp0SS.js → WaterMaterial-C9h1xm9E.js} +7 -5
- package/dist/WaterMaterial-C9h1xm9E.js.map +1 -0
- package/dist/{biomeGLSL-CIkhxIlH.js → biomeGLSL-DWGDDBqT.js} +6 -3
- package/dist/{biomeGLSL-CIkhxIlH.js.map → biomeGLSL-DWGDDBqT.js.map} +1 -1
- package/dist/clouds.js +1 -1
- package/dist/documents.js +6 -6
- package/dist/export.js +2 -2
- package/dist/index.js +1 -1
- package/dist/infinite.js +1 -1
- package/dist/mini.js +1 -1
- package/dist/planet.js +1 -1
- package/dist/{planetGLSL-2xas0f3o.js → planetGLSL-D9Zy2IAw.js} +2 -2
- package/dist/{planetGLSL-2xas0f3o.js.map → planetGLSL-D9Zy2IAw.js.map} +1 -1
- package/dist/real-world.js +1 -1
- package/dist/render.js +1 -1
- package/dist/viewer.js +1 -1
- package/dist/water.js +1 -1
- package/package.json +1 -1
- package/dist/MiniTerrain-Blt0H1S0.js.map +0 -1
- package/dist/TerrainClouds-BuKvwnWw.js.map +0 -1
- package/dist/TerrainParameters-A3fcNJTR.js.map +0 -1
- package/dist/TerrainWater-Cil7waG3.js.map +0 -1
- package/dist/WaterMaterial-BUsAp0SS.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TerrainWater-CX4XdwA0.js","sources":["../../../src/engine/sky/proceduralSkyGLSL.js","../../../src/engine/water/RealisticWaterMaterial.js","../../../src/engine/water/WaterPresets.js","../../../src/engine/water/WaterMaterialFactory.js","../../../src/engine/water/WaterDebugViews.js","../../../src/engine/water/WaterMaskArtifacts.js","../../../src/engine/water/WaterExport.js","../../../src/engine/water/WaterSurfacePass.js","../../../src/engine/water/StylizedWaterLayer.js","../../../src/engine/water/WaterPlanarReflectionPass.js","../../../src/engine/water/CinematicWaterGeometry.js","../../../src/engine/water/WaterSystem.js","../../../src/engine/render/UnderwaterController.js","../../../src/engine/render/UnderwaterEffect.js","../../../src/runtime/effects/TerrainWater.js"],"sourcesContent":["import * as THREE from 'three';\n\n// ============================================================================\n// Shared procedural-sky shader evaluation.\n//\n// The sky dome and Realistic Water V2 include the same function and bind the\n// same uniform objects. This keeps analytical water reflections in lock-step\n// with time of day and sky appearance without a reflection render target.\n// ============================================================================\n\nexport const PROCEDURAL_SKY_UNIFORMS_GLSL = /* glsl */ `\nuniform vec3 uSkyZenith;\nuniform vec3 uSkyHorizon;\nuniform vec3 uSkySunColor;\nuniform vec3 uSkyFogColor;\nuniform vec3 uSkySunDir;\nuniform float uSkyLightIntensity;\nuniform float uSkyBrightness;\nuniform float uSkyHaze;\nuniform float uSkyStars;\nuniform float uSkyHdrIntensity;\nuniform float uSkySunGlow;\nuniform float uSkyHorizonGlow;\nuniform vec3 uSkyAtmosphereTint;\n`;\n\nexport const PROCEDURAL_SKY_EVALUATION_GLSL = /* glsl */ `\nvec3 evaluateProceduralSkyLinear(\n vec3 direction,\n float sunDiscStrength,\n float starStrength\n) {\n vec3 dir = normalize(direction);\n float y = dir.y;\n\n float horizonBlend = 1.0 - pow(max(y, 0.0), 0.45);\n vec3 skyCol = mix(uSkyZenith, uSkyHorizon, horizonBlend) * uSkyAtmosphereTint;\n\n float hazeBand = exp(-abs(y) * 8.0);\n skyCol = mix(skyCol, uSkyFogColor, hazeBand * uSkyHaze);\n if (y < 0.0) {\n float belowBlend = clamp(-y * 5.0, 0.0, 1.0);\n skyCol = mix(skyCol, uSkyFogColor, belowBlend);\n }\n\n float sunDot = max(dot(dir, normalize(uSkySunDir)), 0.0);\n float sunDisc = smoothstep(0.9994, 0.9998, sunDot);\n float sunGlow = pow(sunDot, 256.0) * 0.8;\n float sunHalo = pow(sunDot, 32.0) * 0.25;\n float sunScatter = pow(sunDot, 8.0) * 0.08;\n vec3 sunCol = uSkySunColor * uSkyLightIntensity;\n skyCol += sunCol * (\n sunDisc * 3.0 * sunDiscStrength\n + sunGlow * mix(0.35, 1.0, sunDiscStrength)\n + sunHalo * uSkySunGlow\n ) * uSkySunGlow;\n\n float scatterMask = exp(-abs(y) * 3.0);\n skyCol += uSkySunColor * sunScatter * scatterMask * uSkyLightIntensity;\n\n float horizonWarmth = pow(sunDot, 4.0) * hazeBand * 0.3;\n skyCol += uSkySunColor * horizonWarmth * uSkyLightIntensity * (1.0 + uSkyHorizonGlow);\n skyCol += uSkyHorizon * hazeBand * uSkyHorizonGlow * 0.35;\n\n float nightFactor = smoothstep(0.15, -0.1, uSkySunDir.y)\n * uSkyStars * starStrength;\n if (nightFactor > 0.01 && y > 0.0) {\n vec3 starGrid = floor(dir * 300.0);\n vec3 p = fract(starGrid * vec3(0.1031, 0.1030, 0.0973));\n p += dot(p, p.yxz + 33.33);\n float starHash = fract((p.x + p.y) * p.z);\n float star = step(0.998, starHash) * pow(max(y, 0.0), 0.3);\n float twinkle = 0.7 + 0.3 * sin(starHash * 6283.0 + starGrid.x * 0.5);\n skyCol += vec3(0.8, 0.85, 1.0) * star * twinkle * nightFactor * 0.6;\n }\n\n return max(skyCol * uSkyBrightness * uSkyHdrIntensity, vec3(0.0));\n}\n`;\n\nexport function createProceduralSkyUniforms() {\n return {\n uSkyZenith: { value: new THREE.Color(0.18, 0.35, 0.72) },\n uSkyHorizon: { value: new THREE.Color(0.50, 0.62, 0.78) },\n uSkySunColor: { value: new THREE.Color(1.0, 0.98, 0.92) },\n uSkyFogColor: { value: new THREE.Color(0.55, 0.62, 0.75) },\n uSkySunDir: { value: new THREE.Vector3(0.5, 0.7, 0.3).normalize() },\n uSkyLightIntensity: { value: 1.0 },\n uSkyBrightness: { value: 1.0 },\n uSkyHaze: { value: 0.55 },\n uSkyStars: { value: 1.0 },\n uSkyHdrIntensity: { value: 1.08 },\n uSkySunGlow: { value: 1.0 },\n uSkyHorizonGlow: { value: 0.35 },\n uSkyAtmosphereTint: { value: new THREE.Color(1.0, 0.98, 0.92) },\n };\n}\n","import * as THREE from 'three';\nimport { COMMON_UNIFORMS_GLSL, WATER_DEPTH_PULL_GLSL, WATER_TILE_MASK_GLSL, fitNearBake } from '../terrain/terrainGLSL.js';\nimport { PALETTE_UNIFORMS_GLSL } from '../shaders/terrainColor.glsl.js';\nimport {\n PROCEDURAL_SKY_UNIFORMS_GLSL,\n PROCEDURAL_SKY_EVALUATION_GLSL,\n createProceduralSkyUniforms,\n} from '../sky/proceduralSkyGLSL.js';\nimport { generateStackGLSL } from '../terrain/noise/noiseStackCodegen.js';\nimport { defaultLegacyStack } from '../terrain/noise/NoiseStack.js';\nimport {\n buildWaterHeightShaderParts,\n WATER_TERRAIN_CACHE_GLSL,\n} from './waterShaderGLSL.js';\nimport { WATER_OPTICS_GLSL } from './waterOpticsGLSL.js';\nimport {\n WATER_GEOMETRY_WAVES_GLSL,\n WATER_WAVES_GLSL,\n} from './waterWavesGLSL.js';\nimport {\n WATER_LIGHTING_UNIFORMS_GLSL,\n createWaterLightingUniforms,\n} from './waterLightingGLSL.js';\n\nconst DEFAULT_STACK_GLSL = generateStackGLSL(defaultLegacyStack());\n\n// ============================================================================\n// Realistic Water Surface V2 — physical depth absorption, coherent directional\n// normals, live procedural-sky reflection, roughness-aware sunlight and foam.\n// Volumetric/Cinematic tiers can additionally sample a water-free scene capture\n// for real screen-space refraction while the surface itself stays single-pass.\n// ============================================================================\n\nconst VERTEX = /* glsl */ `\nuniform float uTime;\nuniform float uWaterAnim;\nuniform float uWaterTier;\nuniform float uWaveComplexity;\nuniform float uWaveSpeed;\nuniform float uWaveScale;\nuniform float uWaveStrength;\nuniform float uSmallWaveStr;\nuniform float uLargeWaveStr;\nuniform vec2 uWaveDir;\nuniform float uAnimSpeed;\nuniform vec2 uGeometryFocus;\nuniform float uGeometryDisplacementEnabled;\n${WATER_DEPTH_PULL_GLSL}\n\nvarying vec3 vWorldPos;\n\n${WATER_GEOMETRY_WAVES_GLSL}\n\nfloat waterConcentratedGridAxis(float coordinate, float focus) {\n float u = coordinate + 0.5;\n float densityPower = 1.72;\n if (u < 0.5) {\n float sideT = u * 2.0;\n return focus - (focus + 0.5)\n * pow(max(1.0 - sideT, 0.0), densityPower);\n }\n float sideT = (u - 0.5) * 2.0;\n return focus + (0.5 - focus)\n * pow(max(sideT, 0.0), densityPower);\n}\n\nvoid main() {\n float geometryEnabled = uGeometryDisplacementEnabled\n * step(2.5, uWaterTier);\n vec3 localPosition = position;\n if (geometryEnabled > 0.5) {\n localPosition.x = waterConcentratedGridAxis(\n position.x,\n clamp(uGeometryFocus.x, -0.42, 0.42)\n );\n localPosition.z = waterConcentratedGridAxis(\n position.z,\n clamp(uGeometryFocus.y, -0.42, 0.42)\n );\n }\n\n vec4 wp = modelMatrix * vec4(localPosition, 1.0);\n if (geometryEnabled > 0.5) {\n float crest;\n float t = uTime * uWaterAnim * uAnimSpeed;\n vec3 displacement = waterCinematicDisplacement(wp.xz, t, crest);\n float distanceFade = 1.0 - smoothstep(\n 900.0,\n 2200.0,\n length(cameraPosition.xz - wp.xz)\n );\n wp.xyz += displacement * distanceFade;\n }\n vWorldPos = wp.xyz;\n gl_Position = waterClipPosition(wp);\n}\n`;\n\nconst buildFragmentSource = (stackGLSL, infinite = false) => {\n const { dependencies, terrainHeightFunction } = buildWaterHeightShaderParts(stackGLSL, infinite);\n const biomeClimateFunction = infinite\n ? /* glsl */ `\nvec4 waterBiomeClimateAt(vec2 xz) {\n float available = 0.0;\n vec4 field = infiniteFieldSampleAt(xz, available);\n vec4 result = vec4(0.0);\n if (available > 0.5) {\n float region = fbm3((xz * uFrequency + uSeedOffset) * 0.700 + vec2(631.4, 199.2));\n result = vec4(field.g, field.b, field.a, region);\n } else {\n Climate climate = climateAt(xz * uFrequency + uSeedOffset);\n result = vec4(climate.temp, climate.moist, climate.cont, climate.region);\n }\n return result;\n}\n\nfloat waterBiomeClimateAvailable() {\n return 1.0;\n}\n`\n : /* glsl */ `\nvec4 waterBiomeClimateAt(vec2 xz) {\n vec4 result = vec4(0.0);\n if (uUseWaterTerrainBiomeTex > 0.5) {\n // the bake holds temp, moist, cont, erosion; region jitter is evaluated live\n vec4 baked = textureLod(uWaterTerrainBiomeTex, waterBakedUvAt(xz), 0.0);\n float region = fbm3((xz * uFrequency + uSeedOffset) * 0.700 + vec2(631.4, 199.2));\n result = vec4(baked.r, baked.g, baked.b, region);\n } else {\n Climate climate = climateAt(xz * uFrequency + uSeedOffset);\n result = vec4(climate.temp, climate.moist, climate.cont, climate.region);\n }\n return result;\n}\n\nfloat waterBiomeClimateAvailable() {\n return 1.0;\n}\n`;\n return /* glsl */ `\nprecision highp float;\n\n${COMMON_UNIFORMS_GLSL}\n${WATER_TILE_MASK_GLSL}\n${dependencies}\n${WATER_TERRAIN_CACHE_GLSL}\n${PALETTE_UNIFORMS_GLSL}\n${terrainHeightFunction}\n${PROCEDURAL_SKY_UNIFORMS_GLSL}\n${WATER_LIGHTING_UNIFORMS_GLSL}\n\nuniform float uWaterAnim;\nuniform float uWaterFadeStart;\nuniform float uWaterFadeEnd;\n\nuniform float uWaterQuality;\nuniform float uWaterDetail;\nuniform float uWaterReflection;\nuniform float uWaveComplexity;\nuniform float uRoughness;\nuniform float uReflectionQuality;\nuniform float uMicroWaveDetail;\nuniform float uSkyReflectionEnabled;\nuniform float uBiomeColorEnabled;\nuniform float uBiomeColorStrength;\nuniform float uWaterNaturalColor;\n\n// realistic water controls\nuniform float uWaterTier; // 1=realistic, 2=volumetric, 3=cinematic\nuniform float uWaterOpacity;\nuniform float uFresnelStrength;\nuniform float uRefractionStrength;\nuniform float uSpecularStrength;\nuniform float uDepthColorStr;\nuniform float uDepthOpacityStr;\nuniform float uMaxVisibleDepth;\nuniform float uDepthFalloff;\nuniform float uShallowDist;\nuniform float uDeepDist;\nuniform float uAbsorptionStr;\nuniform float uWaveSpeed;\nuniform float uWaveScale;\nuniform float uWaveStrength;\nuniform float uSmallWaveStr;\nuniform float uLargeWaveStr;\nuniform float uNormalIntensity;\nuniform vec2 uWaveDir;\nuniform float uAnimSpeed;\nuniform float uFoamEnabled;\nuniform float uFoamStrength;\nuniform float uFoamWidth;\nuniform float uFoamSoftness;\nuniform float uFoamAnimSpeed;\nuniform float uSlopeFoam;\nuniform float uCliffFoam;\nuniform float uCausticsStr;\nuniform float uCausticMinDepth;\nuniform float uCausticMinDepthFalloff;\nuniform float uRefractionQual;\nuniform float uFoamQual;\nuniform float uCausticsQual;\nuniform sampler2D uSceneColor;\nuniform sampler2D uSceneDepth;\nuniform vec2 uSceneTexelSize;\nuniform vec2 uSceneViewportInv;\nuniform float uSceneNear;\nuniform float uSceneFar;\nuniform float uSceneRefractionEnabled;\nuniform sampler2D uPlanarReflection;\nuniform mat4 uPlanarReflectionMatrix;\nuniform vec2 uPlanarReflectionTexelSize;\nuniform float uPlanarReflectionEnabled;\nuniform vec2 uGeometryFocus;\nuniform float uGeometryDisplacementEnabled;\nuniform float uDebugMode; // see WaterDebugViews / setWaterDebugMode\nuniform float uVisualFoamBreakup;\nuniform float uVisualWetSandRange;\nuniform float uVisualShallowWaterSoftness;\nuniform int uWaterTraceSteps; // reflection height-field march, 0 = off\nuniform mat4 projectionMatrix;\n\nvarying vec3 vWorldPos;\n\n${PROCEDURAL_SKY_EVALUATION_GLSL}\n${WATER_OPTICS_GLSL}\n${WATER_GEOMETRY_WAVES_GLSL}\n${WATER_WAVES_GLSL}\n${biomeClimateFunction}\n\nfloat terrainHeightAt(vec2 xz) {\n return waterTerrainHeightAt(xz);\n}\n\nvec4 waterPaintedBiomeAt(vec2 xz) {\n if (uPaintEnabled < 0.5) return vec4(0.0);\n vec2 uv = xz / max(uPaintBoardSize, 1.0) + vec2(0.5);\n if (any(lessThan(uv, vec2(0.0))) || any(greaterThan(uv, vec2(1.0)))) {\n return vec4(0.0);\n }\n return textureLod(uPaintBiomeTexture, uv, 0.0) * uPaintOpacity;\n}\n\n// Broad biome weights for the water above each point. The climate fields and\n// filtered Studio bake keep transitions gradual across biome borders.\n// x = desert, y = tropical, z = wetland, w = alpine; canyon comes from paint.\nvec4 waterBiomeWeights(vec2 xz, out float canyon, out float strength) {\n vec4 climate = waterBiomeClimateAt(xz);\n float borderJitter = (climate.a - 0.5) * 0.16;\n float hot = smoothstep(0.52, 0.76, climate.r + borderJitter);\n float cold = smoothstep(0.34, 0.12, climate.r + borderJitter);\n float dry = smoothstep(0.56, 0.28, climate.g - borderJitter);\n float wet = smoothstep(0.54, 0.80, climate.g + borderJitter);\n float coastal = smoothstep(0.58, 0.30, climate.b);\n float inland = smoothstep(0.42, 0.72, climate.b);\n\n vec4 painted = waterPaintedBiomeAt(xz);\n vec4 weights = vec4(\n max(hot * dry, painted.r),\n hot * wet,\n max(wet * coastal * (1.0 - hot * 0.35), painted.b),\n max(cold * inland, painted.a)\n );\n canyon = painted.g;\n\n float paintedAvailable = max(max(painted.r, painted.g), max(painted.b, painted.a));\n float available = max(waterBiomeClimateAvailable(), paintedAvailable);\n strength = uBiomeColorEnabled * clamp(available, 0.0, 1.0);\n return weights;\n}\n\n// Relative tint for the palette colours, so custom palettes and water presets\n// remain authoritative when Natural Water Color is lowered.\nvec3 waterBiomeColorMultiplier(vec4 weights, float canyon, float strength) {\n vec3 tint = vec3(1.0);\n tint = mix(tint, vec3(0.88, 1.07, 1.12), weights.x * 0.70);\n tint = mix(tint, vec3(0.76, 1.12, 1.01), weights.y * 0.78);\n tint = mix(tint, vec3(0.72, 0.99, 0.76), weights.z * 0.82);\n tint = mix(tint, vec3(0.82, 0.94, 1.11), weights.w * 0.72);\n tint = mix(tint, vec3(0.94, 1.03, 0.92), canyon * 0.55);\n return mix(\n vec3(1.0),\n tint,\n clamp(strength * uBiomeColorStrength, 0.0, 1.5)\n );\n}\n\n// Physically plausible clear-water colours (linear). Shallow is sunlit sand\n// seen through a few metres of water; deep is the open-water body. Each biome\n// swaps in its own water: lagoon turquoise, clear desert aqua, murky wetland,\n// milky glacial melt and silty canyon rivers.\nvoid waterNaturalColors(\n vec4 weights,\n float canyon,\n float strength,\n out vec3 natShallow,\n out vec3 natDeep\n) {\n // Lake/coastal water: green penetrates about as far as blue, so sand\n // reads turquoise; open water is a deep teal rather than electric blue.\n natShallow = vec3(0.020, 0.400, 0.380);\n natDeep = vec3(0.006, 0.070, 0.100);\n float amount = clamp(strength * uBiomeColorStrength / 0.55, 0.0, 1.0);\n vec4 w = weights * amount;\n float c = canyon * amount;\n natShallow = mix(natShallow, vec3(0.010, 0.520, 0.500), w.y);\n natDeep = mix(natDeep, vec3(0.004, 0.100, 0.150), w.y);\n natShallow = mix(natShallow, vec3(0.030, 0.430, 0.540), w.x);\n natDeep = mix(natDeep, vec3(0.006, 0.072, 0.135), w.x);\n natShallow = mix(natShallow, vec3(0.085, 0.150, 0.055), w.z);\n natDeep = mix(natDeep, vec3(0.018, 0.042, 0.022), w.z);\n natShallow = mix(natShallow, vec3(0.110, 0.330, 0.380), w.w);\n natDeep = mix(natDeep, vec3(0.040, 0.150, 0.180), w.w);\n natShallow = mix(natShallow, vec3(0.120, 0.210, 0.150), c);\n natDeep = mix(natDeep, vec3(0.026, 0.062, 0.058), c);\n}\n\n// Cheap cross-kernel smoothing for depth tint. Reuses center sample when provided.\n// The taps run in a loop with a uniform bound (always 4) so the compiled\n// program keeps ONE inlined height lookup instead of one per tap.\nuniform int uWaterHeightTaps;\n\nfloat smoothedFloorHeight(vec2 xz, float centerH) {\n float e = mix(8.0, 16.0, clamp(uVisualShallowWaterSoftness, 0.0, 1.0));\n float sum = centerH;\n for (int tap = 0; tap < uWaterHeightTaps; tap++) {\n vec2 offset = tap == 0 ? vec2(e, 0.0)\n : tap == 1 ? vec2(-e, 0.0)\n : tap == 2 ? vec2(0.0, e)\n : vec2(0.0, -e);\n sum += waterTerrainKernelHeightAt(xz + offset);\n }\n return sum * 0.2;\n}\n\nfloat slopeFromCenter(vec2 xz, float centerH) {\n float e = 4.0;\n vec2 heights = vec2(centerH);\n for (int tap = 0; tap < uWaterHeightTaps / 2; tap++) {\n heights[tap] = waterTerrainKernelHeightAt(xz + (tap == 0 ? vec2(e, 0.0) : vec2(0.0, e)));\n }\n return length(heights - vec2(centerH)) / e;\n}\n\n// Sine-free hash (stable at large world coordinates).\nfloat waterGlintHash(vec2 p) {\n vec3 p3 = fract(vec3(p.xyx) * 0.1031);\n p3 += dot(p3, p3.yzx + 33.33);\n return fract((p3.x + p3.y) * p3.z);\n}\n\nfloat waterLinearSceneDepth(float rawDepth) {\n float z = rawDepth * 2.0 - 1.0;\n return (2.0 * uSceneNear * uSceneFar)\n / max(uSceneFar + uSceneNear - z * (uSceneFar - uSceneNear), 0.0001);\n}\n\n\nfloat waterReflectionTraceAvailable() {\n#ifdef INFINITE_MODE\n return 0.0;\n#else\n // Only the published bake makes the march cheap enough to run per pixel.\n return uUseWaterTerrainBiomeTex;\n#endif\n}\n\n// March a mirrored ray through the baked terrain height field. Each step\n// advances by a fraction of the ray's height above the terrain, so it races\n// across open air and slows near banks and ridges instead of skipping thin\n// features; a short bisection then pins the hit. Returns 1 on a hit.\nfloat waterTraceTerrain(\n vec3 origin,\n vec3 dir,\n float jitter,\n out vec3 hitPos,\n out float traveled\n) {\n hitPos = origin;\n traveled = 0.0;\n float rise = max(dir.y, 0.002);\n float tEnd = (uHeightScale * 1.05 - origin.y) / rise;\n // Leave the march where the ray exits the baked area.\n vec2 bakeMin = uBakeOrigin;\n vec2 bakeMax = uBakeOrigin + uBakeSpan;\n vec2 safeDir = vec2(\n abs(dir.x) < 1e-5 ? 1e-5 : dir.x,\n abs(dir.z) < 1e-5 ? 1e-5 : dir.z\n );\n vec2 exitT = max(\n (bakeMin - origin.xz) / safeDir,\n (bakeMax - origin.xz) / safeDir\n );\n tEnd = min(tEnd, min(exitT.x, exitT.y));\n if (tEnd <= 0.0) return 0.0;\n float prevT = 0.0;\n float tCur = 0.4 + jitter * 0.6;\n for (int i = 0; i < uWaterTraceSteps; i++) {\n vec3 pos = origin + dir * tCur;\n float gap = pos.y - waterBakedHeightAt(pos.xz);\n if (gap < 0.0) {\n float lo = prevT;\n float hi = tCur;\n for (int r = 0; r < 5; r++) {\n float mid = 0.5 * (lo + hi);\n vec3 midPos = origin + dir * mid;\n if (midPos.y < waterBakedHeightAt(midPos.xz)) hi = mid;\n else lo = mid;\n }\n traveled = hi;\n hitPos = origin + dir * hi;\n return 1.0;\n }\n prevT = tCur;\n tCur += max(gap * 0.55, 0.5 + tCur * 0.012);\n if (tCur > tEnd) return 0.0;\n }\n return 0.0;\n}\n\n// Lit palette estimate for reflected terrain the scene capture cannot see\n// (off screen, or Realistic tier without a capture). Height bands follow the\n// terrain shader loosely; distance hazes it into the fog like the real thing.\nvec3 waterReflectedTerrainEstimate(vec3 hitPos, float pathLength) {\n float h01 = clamp(hitPos.y / max(uHeightScale, 1.0), 0.0, 1.0);\n vec3 albedo = mix(uColGrass, uColForest, 0.55);\n albedo = mix(albedo, uColDryGrass, smoothstep(0.22, 0.45, h01) * 0.6);\n albedo = mix(albedo, uColRock, smoothstep(0.35, 0.70, h01));\n albedo = mix(\n albedo,\n uColSnow,\n smoothstep(uSnowLine - 0.04, uSnowLine + 0.10, h01)\n );\n albedo *= uPaletteTint;\n vec3 light = uTerrainSunCol * uTerrainSunIntensity * 0.45\n + uTerrainSkyAmb * 0.5\n + uTerrainBounce * 0.2;\n float fogF = 1.0 - exp(-uFogDensity * uFogDensity * pathLength * pathLength);\n return mix(albedo * light, uFogColor, clamp(fogF, 0.0, 1.0));\n}\n\nvoid main() {\n vec2 xz = vWorldPos.xz;\n\n#ifndef INFINITE_MODE\n if (waterTileOccupiedAt(xz) < 0.5) discard;\n#endif\n\n float floorH = terrainHeightAt(xz);\n // Mean sea level and the exact terrain field are the single shoreline\n // authority. Geometry waves are visual displacement only and cannot turn a\n // dry mountain into water or detach the foam band from the coast.\n float depth = uSeaLevel - floorH;\n if (depth <= 0.02) discard;\n\n // Smoothed bathymetry for depth tint — 4 extra samples max (not 20+).\n float visualDepth = depth;\n if (uDepthColorStr > 0.05 || uDepthOpacityStr > 0.05) {\n visualDepth = uSeaLevel - smoothedFloorHeight(xz, floorH);\n }\n visualDepth = max(visualDepth, 0.0);\n\n float camDist = length(cameraPosition - vWorldPos);\n float farWater = smoothstep(700.0, 2400.0, camDist);\n // The wave spectrum now resolves chop down to sub-unit scale, so the\n // Roughness setting only needs to cover the unresolved micro-facets. A low\n // base keeps the sun highlight broken into sharp glints on every wavelet.\n float roughness = clamp(uRoughness * 0.5 + farWater * 0.08, 0.03, 1.0);\n float t = uTime * uWaterAnim * uAnimSpeed;\n vec3 n = waterDirectionalNormal(xz, t, camDist, roughness);\n // Ripples too small for this pixel were filtered out of n; their slope\n // variance widens the sun lobe and reflection blur instead.\n roughness = waterFilteredRoughness(\n roughness,\n uNormalIntensity * uWaveStrength * uWaveComplexity\n );\n vec3 viewDir = normalize(cameraPosition - vWorldPos);\n if (dot(n, viewDir) < 0.0) n = -n;\n\n // Water colours. Deep is the colour of the water itself — what an\n // infinitely deep column scatters back. Shallow is the hue light keeps\n // after travelling through it, which sets the spectral absorption. Shallow\n // is never painted onto the surface: shallow water shows the floor through\n // a tinted column, deep water converges to the body colour.\n float shoreSoft = clamp(uVisualShallowWaterSoftness, 0.0, 1.0);\n vec3 shallowColor = mix(\n vec3(dot(uColShallow, vec3(0.299, 0.587, 0.114))),\n uColShallow,\n uPaletteSaturation\n ) * uPaletteTint;\n vec3 deepColor = mix(\n vec3(dot(uColDeep, vec3(0.299, 0.587, 0.114))),\n uColDeep,\n uPaletteSaturation\n ) * uPaletteTint;\n float biomeCanyon;\n float biomeStrength;\n vec4 biomeWeights = waterBiomeWeights(xz, biomeCanyon, biomeStrength);\n vec3 biomeColorMultiplier = waterBiomeColorMultiplier(\n biomeWeights,\n biomeCanyon,\n biomeStrength\n );\n shallowColor *= biomeColorMultiplier;\n deepColor *= mix(vec3(1.0), biomeColorMultiplier, 0.68);\n vec3 naturalShallow;\n vec3 naturalDeep;\n waterNaturalColors(\n biomeWeights,\n biomeCanyon,\n biomeStrength,\n naturalShallow,\n naturalDeep\n );\n float naturalColor = clamp(uWaterNaturalColor, 0.0, 1.0);\n shallowColor = mix(shallowColor, naturalShallow, naturalColor);\n deepColor = mix(deepColor, naturalDeep, naturalColor);\n // Water-leaving reflectance of real water is a few percent; the palette\n // deep colour is authored brighter so it reads as a swatch.\n vec3 bodyAlbedo = deepColor * 0.45;\n\n // Light path through the column: down along the refracted sun ray, back\n // up along the refracted view ray. Snell's law caps both slants, so\n // grazing views get denser without the old 1/cos blow-up.\n vec3 skySunDir = normalize(uSkySunDir);\n float viewMu = waterRefractedCosine(clamp(abs(viewDir.y), 0.0, 1.0));\n float sunMu = waterRefractedCosine(clamp(skySunDir.y, 0.08, 1.0));\n float opticalDepth = visualDepth\n * (1.0 / max(viewMu, 0.2) + 1.0 / max(sunMu, 0.2))\n * max(uDepthColorStr, 0.1);\n vec3 absorptionRGB = waterAbsorptionCoefficients(\n shallowColor,\n uDeepDist * (1.0 + shoreSoft * 0.3),\n uAbsorptionStr,\n uWaterOpacity,\n uDepthOpacityStr\n );\n vec3 transmittance = waterBeerLambert(absorptionRGB, opticalDepth);\n // Water Clarity keeps its meaning: higher values let more floor through.\n float transmissionExponent = pow(\n 0.45 / max(uRefractionStrength, 0.05),\n 0.18\n );\n transmittance = pow(\n transmittance,\n vec3(clamp(transmissionExponent, 0.72, 1.45))\n );\n\n // Schlick Fresnel follows the animated wave normal.\n float fres = waterSchlickFresnel(n, viewDir, uFresnelStrength);\n\n // Screen-space refraction for Volumetric/Cinematic modes. The water-free\n // capture is decoded back to linear space before optical composition.\n float sceneCaptureEnabled = uSceneRefractionEnabled\n * step(1.5, uWaterTier);\n // Once no channel reaches the floor, the explicit composite and the plain\n // blend agree; skip the capture there.\n float visibleFloor = smoothstep(\n 0.0005,\n 0.004,\n max(max(transmittance.r, transmittance.g), transmittance.b)\n );\n float sceneRefractionWeight = sceneCaptureEnabled * visibleFloor;\n // Derive capture UVs from the rasterized pixel. Interpolating clip\n // coordinates across the water plane's two triangles can differ by a few\n // ulps on their shared diagonal, which becomes a visible refraction cut.\n vec2 screenUv = gl_FragCoord.xy * uSceneViewportInv;\n vec2 refractedUv = screenUv;\n vec3 refractedSceneLinear = vec3(0.0);\n if (sceneCaptureEnabled > 0.5) {\n float refractionDetail = clamp(uRefractionQual, 0.0, 1.5) / 1.5;\n // Deeper water bends the floor further; the contact line stays put.\n float distortionScale = mix(0.018, 0.065, refractionDetail)\n * uRefractionStrength\n * (1.0 - fres)\n * smoothstep(0.0, 3.0, visualDepth);\n vec2 uvMargin = uSceneTexelSize * 1.5;\n vec2 distortedUv = clamp(\n screenUv + n.xz * distortionScale,\n uvMargin,\n vec2(1.0) - uvMargin\n );\n\n // Reject samples that cross a terrain/prop silhouette. Sampling the\n // undistorted pixel instead prevents cliffs from smearing across the sea.\n float centerDepth = waterLinearSceneDepth(\n textureLod(uSceneDepth, screenUv, 0.0).r\n );\n float distortedDepth = waterLinearSceneDepth(\n textureLod(uSceneDepth, distortedUv, 0.0).r\n );\n float rejectStart = max(\n 1.5,\n min(centerDepth, distortedDepth) * 0.035\n );\n float silhouetteReject = smoothstep(\n rejectStart,\n rejectStart * 3.0,\n abs(distortedDepth - centerDepth)\n );\n refractedUv = mix(distortedUv, screenUv, silhouetteReject);\n vec3 encodedScene = textureLod(uSceneColor, refractedUv, 0.0).rgb;\n refractedSceneLinear = pow(\n max(encodedScene, vec3(0.0)),\n vec3(2.2)\n );\n }\n\n // Evaluate the same live procedural sky as the sky dome. Rough water blends\n // toward a broad reflection direction; distant water trends toward horizon\n // radiance and suppresses micro detail through waterDirectionalNormal().\n vec3 reflectedDirection = reflect(-viewDir, n);\n float reflectionDetail = clamp(uReflectionQuality, 0.0, 1.0);\n float reflectionBlur = clamp(\n roughness * roughness + (1.0 - reflectionDetail) * 0.32,\n 0.0,\n 1.0\n );\n vec3 broadDirection = normalize(vec3(\n reflectedDirection.x * 0.42,\n max(reflectedDirection.y, 0.08),\n reflectedDirection.z * 0.42\n ));\n vec3 reflectedSkySharp = evaluateProceduralSkyLinear(\n reflectedDirection,\n mix(1.0, 0.12, reflectionBlur),\n mix(0.35, 0.0, reflectionBlur)\n );\n vec3 reflectedSkyBroad = evaluateProceduralSkyLinear(broadDirection, 0.0, 0.0);\n vec3 reflectedSky = mix(\n reflectedSkySharp,\n reflectedSkyBroad,\n reflectionBlur * 0.82\n );\n if (farWater > 0.001) {\n vec3 horizonDirection = normalize(vec3(\n reflectedDirection.x,\n 0.06,\n reflectedDirection.z\n ));\n reflectedSky = mix(\n reflectedSky,\n evaluateProceduralSkyLinear(horizonDirection, 0.0, 0.0),\n farWater * 0.42\n );\n }\n // Facets tilted so their mirror ray points below the horizon see the next\n // wave, not the pale below-horizon fog. Darken toward the water body so\n // grazing views keep their colour instead of turning into white stripes.\n float reflectionHorizon = smoothstep(-0.12, 0.05, reflectedDirection.y);\n reflectedSky = mix(\n reflectedSky * mix(vec3(0.55), deepColor * 1.6 + 0.2, 0.5),\n reflectedSky,\n reflectionHorizon\n );\n vec3 fallbackReflection = mix(\n uSkyFogColor,\n vec3(0.12, 0.24, 0.38),\n clamp(reflectedDirection.y, 0.0, 1.0)\n );\n float liveSkyAmount = uSkyReflectionEnabled\n * mix(0.35, 1.0, reflectionDetail);\n reflectedSky = mix(fallbackReflection, reflectedSky, liveSkyAmount);\n\n // Planar reflection quality gate for Cinematic (terrain, props, clouds).\n float planarReflectionWeight = uPlanarReflectionEnabled\n * step(2.5, uWaterTier);\n float planarQuality = clamp(\n (uReflectionQuality - 1.0) * 2.0,\n 0.0,\n 1.0\n );\n\n // Terrain reflections: march the mirrored ray through the baked height\n // field. Hits take their colour from the water-free scene capture where it\n // is on screen (Volumetric/Cinematic) and from a lit palette estimate\n // elsewhere, so mountains and shore banks mirror into the water on every\n // tier instead of the lake reflecting only sky.\n float terrainReflection = 0.0;\n vec3 terrainReflectionColor = vec3(0.0);\n if (\n uWaterTraceSteps > 0\n && planarReflectionWeight * planarQuality < 0.99\n && waterReflectionTraceAvailable() > 0.5\n ) {\n float traceJitter = fract(52.9829189 * fract(dot(\n gl_FragCoord.xy,\n vec2(0.06711056, 0.00583715)\n )));\n vec3 traceHit;\n float traveled;\n terrainReflection = waterTraceTerrain(\n vec3(vWorldPos.x, max(vWorldPos.y, uSeaLevel), vWorldPos.z),\n reflectedDirection,\n traceJitter,\n traceHit,\n traveled\n );\n if (terrainReflection > 0.0) {\n terrainReflectionColor = waterReflectedTerrainEstimate(\n traceHit,\n camDist + traveled\n );\n if (sceneCaptureEnabled > 0.5) {\n vec4 hitClip = projectionMatrix * (viewMatrix * vec4(traceHit, 1.0));\n if (hitClip.w > 0.0) {\n vec2 hitUv = hitClip.xy / hitClip.w * 0.5 + 0.5;\n vec2 edge = min(hitUv, vec2(1.0) - hitUv);\n float onScreen = smoothstep(0.0, 0.06, min(edge.x, edge.y));\n if (onScreen > 0.0) {\n vec2 blurStep = uSceneTexelSize\n * mix(0.75, 5.0, reflectionBlur);\n vec3 hitScene = textureLod(uSceneColor, hitUv, 0.0).rgb * 0.36;\n hitScene += textureLod(uSceneColor, hitUv + vec2(blurStep.x, 0.0), 0.0).rgb * 0.16;\n hitScene += textureLod(uSceneColor, hitUv - vec2(blurStep.x, 0.0), 0.0).rgb * 0.16;\n hitScene += textureLod(uSceneColor, hitUv + vec2(0.0, blurStep.y), 0.0).rgb * 0.16;\n hitScene += textureLod(uSceneColor, hitUv - vec2(0.0, blurStep.y), 0.0).rgb * 0.16;\n terrainReflectionColor = mix(\n terrainReflectionColor,\n pow(max(hitScene, vec3(0.0)), vec3(2.2)),\n onScreen\n );\n }\n }\n }\n }\n }\n reflectedSky = mix(reflectedSky, terrainReflectionColor, terrainReflection);\n\n // Cinematic planar reflection captures terrain, props, clouds, and the live\n // sky from a sea-level mirrored camera. Roughness broadens the four-tap\n // sample, while invalid projected coordinates retain analytical sky.\n vec3 reflectedSurface = reflectedSky;\n if (planarReflectionWeight > 0.5) {\n vec4 planarProjected = uPlanarReflectionMatrix * vec4(vWorldPos, 1.0);\n vec2 planarUv = planarProjected.xy\n / max(planarProjected.w, 0.0001)\n * 0.5 + 0.5;\n float planarValid = step(0.0001, planarProjected.w)\n * step(0.0, planarUv.x)\n * step(planarUv.x, 1.0)\n * step(0.0, planarUv.y)\n * step(planarUv.y, 1.0);\n float planarDistortion = mix(0.012, 0.045, reflectionDetail)\n * (1.0 - roughness * 0.45);\n vec2 planarMargin = uPlanarReflectionTexelSize * 4.0;\n planarUv = clamp(\n planarUv + n.xz * planarDistortion,\n planarMargin,\n vec2(1.0) - planarMargin\n );\n vec2 blurOffset = uPlanarReflectionTexelSize\n * mix(1.0, 8.0, roughness * roughness);\n vec3 planarEncoded = textureLod(uPlanarReflection, planarUv, 0.0).rgb * 0.40;\n planarEncoded += textureLod(\n uPlanarReflection,\n planarUv + vec2(blurOffset.x, 0.0),\n 0.0\n ).rgb * 0.15;\n planarEncoded += textureLod(\n uPlanarReflection,\n planarUv - vec2(blurOffset.x, 0.0),\n 0.0\n ).rgb * 0.15;\n planarEncoded += textureLod(\n uPlanarReflection,\n planarUv + vec2(0.0, blurOffset.y),\n 0.0\n ).rgb * 0.15;\n planarEncoded += textureLod(\n uPlanarReflection,\n planarUv - vec2(0.0, blurOffset.y),\n 0.0\n ).rgb * 0.15;\n vec3 planarLinear = pow(max(planarEncoded, vec3(0.0)), vec3(2.2));\n float planarBlend = planarReflectionWeight\n * planarValid\n * planarQuality\n * (1.0 - roughness * 0.38);\n reflectedSurface = mix(reflectedSky, planarLinear, planarBlend);\n }\n\n float reflectionScale = clamp(uWaterReflection, 0.0, 1.5);\n vec3 reflectionTerm = reflectedSurface * fres * reflectionScale;\n\n // Roughness-aware GGX sunlight uses the current sky sun color/intensity.\n float sunSpecular = waterGgxSunSpecular(n, viewDir, skySunDir, roughness);\n // Sun glitter: on real water individual micro-facets flash the sun, so the\n // highlight is a scatter of sharp glints rather than one smooth blob. A\n // sparse animated mask with mean ~1 redistributes a wider lobe into glints\n // and fades back to the smooth lobe where glints would be sub-pixel.\n // Glints are pinpoint sparkles: each cell holds at most one small, sharp\n // facet at a random spot that twinkles on and off. Two cell sizes cover\n // close-ups and the usual editor distance; each fades before it aliases.\n float glintFootprint = length(fwidth(xz));\n float fineGlints = waterBandFilter(6.0, glintFootprint);\n float coarseGlints = waterBandFilter(1.1, glintFootprint)\n * (1.0 - fineGlints);\n float glitterVisible = fineGlints + coarseGlints;\n if (glitterVisible > 0.001) {\n float cellSize = mix(2.2, 0.45, fineGlints);\n // Glints ride the wave slopes instead of sliding over them.\n vec2 glintUv = (xz + n.xz * cellSize * 3.0) / cellSize;\n vec2 glintCell = floor(glintUv);\n vec2 glintLocal = fract(glintUv);\n float glintSeed = waterGlintHash(glintCell);\n float glintSeedB = waterGlintHash(glintCell + vec2(17.3, 41.9));\n vec2 glintCenter = 0.25 + 0.5 * vec2(glintSeed, glintSeedB);\n float twinkle = fract(glintSeed * 7.13 + t * (0.6 + glintSeedB * 0.9));\n float alive = step(0.35, glintSeedB)\n * smoothstep(0.0, 0.12, twinkle)\n * smoothstep(0.55, 0.3, twinkle);\n float glitterMask = alive\n * (1.0 - smoothstep(0.06, 0.16, length(glintLocal - glintCenter)));\n float wideLobe = waterGgxSunSpecular(\n n,\n viewDir,\n skySunDir,\n max(roughness, 0.3)\n );\n sunSpecular = mix(\n sunSpecular,\n sunSpecular * 0.45 + wideLobe * glitterMask * 40.0,\n glitterVisible * clamp(uSpecularStrength, 0.0, 1.0)\n );\n }\n // Mirrored terrain blocks the sun's reflection too.\n sunSpecular = min(sunSpecular, 24.0) * (1.0 - terrainReflection);\n vec3 sunSpecularTerm = waterResolveSunLight(\n uSkySunColor * uSkyLightIntensity\n )\n * sunSpecular\n * uSpecularStrength\n * reflectionScale;\n\n // The water body is lit by the light falling on the flat surface, not by\n // the wave normal: Lambert shading of ripples is what made the old surface\n // read as painted plastic. Waves show through reflection and glints.\n float diff = max(uSunDir.y, 0.0);\n vec3 waterLight = waterResolveLighting(\n vec3(0.0, 1.0, 0.0),\n vec3(0.0, 1.0, 0.0),\n diff,\n vec3(0.62 + 0.38 * diff)\n );\n // Forward subsurface scattering: sunlight transmitted through thin, steep\n // wave faces toward the viewer gives backlit slopes their turquoise glow.\n vec3 sunLightColor = waterResolveSunLight(\n uSkySunColor * uSkyLightIntensity\n );\n float sunBehind = clamp(dot(-viewDir, skySunDir) * 0.5 + 0.5, 0.0, 1.0);\n float waveThin = clamp((1.0 - n.y) * 14.0, 0.0, 1.0);\n float sssAmount = (sunBehind * sunBehind * sunBehind * (0.35 + waveThin)\n + waveThin * 0.18)\n * (1.0 - abs(viewDir.y) * 0.6)\n * smoothstep(-0.05, 0.25, skySunDir.y);\n float scatterPeak = max(max(shallowColor.r, shallowColor.g), shallowColor.b);\n vec3 scatterHue = shallowColor / max(scatterPeak, 0.0001);\n vec3 subsurface = scatterHue * max(bodyAlbedo, shallowColor * 0.1)\n * sunLightColor * sssAmount * 0.6;\n vec3 scatteringColor = bodyAlbedo * waterLight + subsurface;\n vec3 inScatter = scatteringColor * (vec3(1.0) - transmittance);\n\n // Realistic mode keeps the transparent single-pass approximation: the\n // blend can only dim the floor uniformly, so the least-transmitted channel\n // goes through the blend and the chromatic remainder is rebuilt from the\n // palette sand. Shallow floors then pick up the water hue.\n float volumeAlpha = waterVolumeOpacity(transmittance);\n float neutralPass = min(min(transmittance.r, transmittance.g), transmittance.b);\n float chromaSplit = 1.0 - sceneCaptureEnabled;\n volumeAlpha = mix(volumeAlpha, 1.0 - neutralPass, chromaSplit);\n vec3 chromaTransmission = max(transmittance - vec3(neutralPass), vec3(0.0))\n * chromaSplit;\n\n vec3 bodyPremultiplied = (\n inScatter\n + uColSand * 0.8 * waterLight * chromaTransmission\n )\n * (1.0 - fres);\n vec3 premultipliedColor = bodyPremultiplied + reflectionTerm + sunSpecularTerm;\n float reflectionAlpha = clamp(fres * reflectionScale, 0.0, 0.98);\n float alpha = 1.0 - (1.0 - volumeAlpha) * (1.0 - reflectionAlpha);\n // Submerged ground is wet, so it is darker than the dry capture.\n vec3 sceneTransmittance = transmittance * 0.82;\n vec3 refractedVolume = refractedSceneLinear * sceneTransmittance\n + inScatter;\n vec3 sceneComposite = refractedVolume * (1.0 - fres)\n + reflectionTerm\n + sunSpecularTerm;\n premultipliedColor = mix(\n premultipliedColor,\n sceneComposite,\n sceneRefractionWeight\n );\n alpha = mix(alpha, 1.0, sceneRefractionWeight);\n\n // shoreline foam — depth-based only; slope foam restricted to very shallow water\n float shoreDist = depth;\n float foamNoise = 0.0;\n if (uFoamEnabled > 0.5 && uFoamQual > 0.1) {\n foamNoise = vnoise(xz * 0.18 + vec2(t * uFoamAnimSpeed * 1.4, -t * uFoamAnimSpeed * 1.1));\n }\n float breakup = clamp(uVisualFoamBreakup, 0.0, 1.0);\n float foamEdgeNoise = foamNoise * mix(1.4, 4.2, breakup);\n float foamPatch = mix(1.0, smoothstep(0.18, 0.82, vnoise(xz * 0.055 + vec2(t * 0.35, t * -0.28))), breakup);\n float shoreFoam = smoothstep(uFoamWidth + uFoamSoftness + uVisualWetSandRange * 0.05, uFoamSoftness, shoreDist + foamEdgeNoise);\n // Lace: solid at the waterline, breaking into drifting cells farther out.\n // Fades to its mean before the finer octave can alias.\n if (uFoamEnabled > 0.5 && uFoamQual > 0.1) {\n vec2 foamFlow = vec2(t * uFoamAnimSpeed * 0.35, -t * uFoamAnimSpeed * 0.27);\n float lace = vnoise(xz * 0.85 + foamFlow) * 0.6\n + vnoise(xz * 2.1 - foamFlow * 1.7) * 0.4;\n float laceVisible = waterBandFilter(13.2, glintFootprint);\n lace = mix(0.62, smoothstep(0.36, 0.70, lace), laceVisible);\n float edgeSolid = 1.0 - smoothstep(\n uFoamSoftness,\n uFoamSoftness + 0.9,\n shoreDist\n );\n shoreFoam *= mix(lace, 1.0, edgeSolid);\n }\n float nearShore = smoothstep(10.0 + uVisualWetSandRange * 0.35, 0.0, shoreDist);\n float slopeFoam = 0.0;\n float cliffFoam = 0.0;\n if (uFoamEnabled > 0.5 && nearShore > 0.01 && (uSlopeFoam > 0.01 || uCliffFoam > 0.01)) {\n float slope = slopeFromCenter(xz, floorH);\n slopeFoam = smoothstep(0.35, 1.1, slope) * uSlopeFoam * nearShore;\n cliffFoam = smoothstep(0.85, 1.8, slope) * uCliffFoam * nearShore;\n }\n // Cinematic whitecaps follow the same Gerstner phases as vertex movement.\n // A delayed sample leaves a short advected trail, approximating temporal\n // foam persistence without another history render target.\n float crestFoam = 0.0;\n float breakingFoam = 0.0;\n if (\n uWaterTier > 2.5\n && uGeometryDisplacementEnabled > 0.5\n && uFoamEnabled > 0.5\n && uFoamQual > 0.75\n ) {\n float crestNow = waterCinematicCrest(xz, t);\n float crestPrevious = waterCinematicCrest(\n xz - normalize(uWaveDir) * 1.8,\n t - 0.42 * uFoamAnimSpeed\n );\n float foamPersistence = max(crestNow, crestPrevious * 0.78);\n float crestAa = max(fwidth(foamPersistence) * 1.35, 0.018);\n crestFoam = smoothstep(\n 0.86 - crestAa,\n 0.86 + crestAa,\n foamPersistence\n );\n // Break the remaining crests into sparse streaks. Reusing the existing\n // foam fields avoids a new noise lookup and keeps whitecaps from forming\n // repeated rows over a large ocean.\n float crestBreakup = smoothstep(\n 0.42,\n 0.76,\n foamNoise * 0.62 + foamPatch * 0.38\n );\n crestFoam *= crestBreakup;\n float waveEnergy = smoothstep(\n 0.82,\n 1.72,\n uWaveStrength * uLargeWaveStr\n );\n float crestDistanceFade = 1.0 - smoothstep(520.0, 1750.0, camDist);\n crestFoam *= waveEnergy * crestDistanceFade;\n\n float breakingBand = 1.0 - smoothstep(\n max(uFoamWidth * 0.7, 1.0),\n max(uShallowDist * 1.65, uFoamWidth * 2.0),\n visualDepth\n );\n float shoreApproach = smoothstep(0.35, 0.82, foamPatch);\n breakingFoam = crestFoam * breakingBand * shoreApproach;\n }\n float foam = clamp(\n (\n shoreFoam * foamPatch\n + slopeFoam * 0.2\n + cliffFoam * 0.15\n + crestFoam * 0.13\n + breakingFoam * 0.48\n ) * uFoamStrength,\n 0.0,\n 1.0\n );\n // Keep the authored foam hue, but let its brightness and tint follow the\n // active atmosphere. uWaterFoamLighting retains a readable unlit component\n // at night instead of leaving a pure-white emissive-looking shoreline.\n vec3 litFoamColor = waterResolveFoamColor(uColFoam, waterLight);\n premultipliedColor = mix(premultipliedColor, litFoamColor, foam);\n alpha = mix(alpha, 1.0, foam);\n\n vec3 refractionTerm = mix(\n transmittance,\n refractedSceneLinear * sceneTransmittance,\n sceneRefractionWeight\n ) * (1.0 - fres);\n\n // The refracted scene already contains caustics on the terrain. Keep this\n // inexpensive fallback only where that scene sample is unavailable.\n if (uCausticsQual > 0.05 && uWaterTier > 1.5 && sceneCaptureEnabled < 0.5) {\n float shallowMask = 1.0 - smoothstep(uShallowDist * 0.5, uDeepDist, visualDepth);\n float c1 = vnoise(xz * 0.09 + vec2(t * 0.9, -t * 0.7));\n float c2 = vnoise(xz * 0.14 - vec2(t * 0.6, t * 0.5));\n float caust = pow(max(c1 * c2, 0.0), 2.2) * shallowMask;\n premultipliedColor += vec3(0.9, 0.95, 1.0)\n * caust * uCausticsStr * uCausticsQual * 0.28 * alpha;\n }\n\n // Soft contact line: the last few decimetres fade into the real floor\n // instead of ending in a hard reflective rim.\n float contactFade = smoothstep(0.02, 0.7, depth);\n premultipliedColor *= contactFade;\n alpha *= contactFade;\n\n float edgeFade = 1.0 - smoothstep(uWaterFadeStart, uWaterFadeEnd, camDist);\n premultipliedColor *= edgeFade;\n alpha *= edgeFade;\n if (alpha < 0.01) discard;\n\n // debug views\n if (uDebugMode > 0.5) {\n if (uDebugMode < 1.5) {\n float dv = clamp(depth / max(uMaxVisibleDepth, 1.0), 0.0, 1.0);\n gl_FragColor = vec4(vec3(1.0 - dv, dv * 0.5, dv), 1.0);\n return;\n }\n if (uDebugMode < 2.5) {\n float sv = smoothstep(uFoamWidth + 2.0, 0.5, depth);\n gl_FragColor = vec4(vec3(sv), 1.0);\n return;\n }\n if (uDebugMode < 3.5) {\n gl_FragColor = vec4(vec3(foam), 1.0);\n return;\n }\n if (uDebugMode < 4.5) {\n gl_FragColor = vec4(0.1, 0.45, 0.95, 1.0);\n return;\n }\n if (uDebugMode < 5.5) {\n gl_FragColor = vec4(n * 0.5 + 0.5, 1.0);\n return;\n }\n if (uDebugMode < 6.5) {\n float od = 1.0 - exp(-opticalDepth / max(uMaxVisibleDepth, 1.0));\n gl_FragColor = vec4(vec3(od), 1.0);\n return;\n }\n if (uDebugMode < 7.5) {\n gl_FragColor = vec4(transmittance, 1.0);\n return;\n }\n if (uDebugMode < 8.5) {\n gl_FragColor = vec4(vec3(fres), 1.0);\n return;\n }\n if (uDebugMode < 9.5) {\n gl_FragColor = vec4(min(reflectedSurface, vec3(1.0)), 1.0);\n return;\n }\n if (uDebugMode < 10.5) {\n gl_FragColor = vec4(clamp(refractionTerm, 0.0, 1.0), 1.0);\n return;\n }\n if (uDebugMode < 11.5) {\n gl_FragColor = vec4(vec3(alpha), 1.0);\n return;\n }\n gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0);\n return;\n }\n\n vec3 straightColor = premultipliedColor / max(alpha, 0.001);\n float fogF = 1.0 - exp(-uFogDensity * uFogDensity * camDist * camDist);\n fogF *= mix(0.82, 0.68, farWater);\n straightColor = mix(straightColor, uFogColor, clamp(fogF, 0.0, 1.0));\n straightColor = pow(max(straightColor, vec3(0.0)), vec3(1.0 / 2.2));\n gl_FragColor = vec4(straightColor * alpha, alpha);\n}\n`;\n};\n\nconst buildFragment = (stackGLSL, infinite = false) => fitNearBake(buildFragmentSource(stackGLSL, infinite));\n\nfunction realisticUniforms(sharedUniforms, environmentUniforms) {\n const skyUniforms = environmentUniforms ?? createProceduralSkyUniforms();\n return {\n ...sharedUniforms,\n ...skyUniforms,\n uWaterHeightTaps: { value: 4 },\n uWaterTraceSteps: { value: 0 },\n uWaterQuality: { value: 2.0 },\n uWaterDetail: { value: 1.0 },\n uWaterReflection: { value: 1.0 },\n uWaveComplexity: { value: 1.0 },\n uRoughness: { value: 0.35 },\n uReflectionQuality: { value: 1.0 },\n uMicroWaveDetail: { value: 1.0 },\n uSkyReflectionEnabled: { value: 1.0 },\n uBiomeColorEnabled: { value: 1.0 },\n uBiomeColorStrength: { value: 0.55 },\n uWaterNaturalColor: { value: 0.7 },\n ...createWaterLightingUniforms(),\n uWaterAnim: { value: 1.0 },\n uWaterFadeStart: { value: 99999.0 },\n uWaterFadeEnd: { value: 100000.0 },\n uWaterTier: { value: 1.0 },\n uWaterOpacity: { value: 0.72 },\n uFresnelStrength: { value: 1.0 },\n uRefractionStrength: { value: 0.45 },\n uSpecularStrength: { value: 1.0 },\n uDepthColorStr: { value: 1.0 },\n uDepthOpacityStr: { value: 1.0 },\n uMaxVisibleDepth: { value: 120.0 },\n uDepthFalloff: { value: 1.0 },\n uShallowDist: { value: 8.0 },\n uDeepDist: { value: 55.0 },\n uAbsorptionStr: { value: 1.0 },\n uWaveSpeed: { value: 1.0 },\n uWaveScale: { value: 1.0 },\n uWaveStrength: { value: 1.0 },\n uSmallWaveStr: { value: 0.65 },\n uLargeWaveStr: { value: 1.0 },\n uNormalIntensity: { value: 1.0 },\n uWaveDir: { value: new THREE.Vector2(1, 0) },\n uAnimSpeed: { value: 1.0 },\n uFoamEnabled: { value: 1.0 },\n uFoamStrength: { value: 0.75 },\n uFoamWidth: { value: 3.2 },\n uFoamSoftness: { value: 0.6 },\n uFoamAnimSpeed: { value: 1.0 },\n uSlopeFoam: { value: 0.5 },\n uCliffFoam: { value: 0.65 },\n uCausticsStr: { value: 0.4 },\n uCausticMinDepth: { value: 1.0 },\n uCausticMinDepthFalloff: { value: 1.0 },\n uRefractionQual: { value: 0.6 },\n uFoamQual: { value: 1.0 },\n uCausticsQual: { value: 0.5 },\n uSceneColor: { value: null },\n uSceneDepth: { value: null },\n uSceneTexelSize: { value: new THREE.Vector2(1, 1) },\n uSceneViewportInv: { value: new THREE.Vector2(1, 1) },\n uSceneNear: { value: 1.0 },\n uSceneFar: { value: 50000.0 },\n uSceneRefractionEnabled: { value: 0.0 },\n uPlanarReflection: { value: null },\n uPlanarReflectionMatrix: { value: new THREE.Matrix4() },\n uPlanarReflectionTexelSize: { value: new THREE.Vector2(1, 1) },\n uPlanarReflectionEnabled: { value: 0.0 },\n uGeometryFocus: { value: new THREE.Vector2(0, 0) },\n uGeometryDisplacementEnabled: { value: 0.0 },\n uDebugMode: { value: 0.0 },\n };\n}\n\nexport function createRealisticWaterMaterial(\n sharedUniforms,\n octaves = 7,\n stackGLSL = DEFAULT_STACK_GLSL,\n environmentUniforms = null,\n) {\n const mat = new THREE.ShaderMaterial({\n uniforms: realisticUniforms(sharedUniforms, environmentUniforms),\n defines: { OCTAVES: octaves },\n vertexShader: VERTEX,\n fragmentShader: buildFragment(stackGLSL, false),\n transparent: true,\n premultipliedAlpha: true,\n depthTest: true,\n depthWrite: false,\n side: THREE.DoubleSide,\n forceSinglePass: true,\n });\n return mat;\n}\n\nexport function createInfiniteRealisticWaterMaterial(\n sharedUniforms,\n octaves = 7,\n stackGLSL = DEFAULT_STACK_GLSL,\n environmentUniforms = null,\n) {\n const mat = new THREE.ShaderMaterial({\n uniforms: realisticUniforms(sharedUniforms, environmentUniforms),\n defines: { OCTAVES: octaves, INFINITE_MODE: 1 },\n vertexShader: VERTEX,\n fragmentShader: buildFragment(stackGLSL, true),\n transparent: true,\n premultipliedAlpha: true,\n depthTest: true,\n depthWrite: false,\n side: THREE.DoubleSide,\n forceSinglePass: true,\n });\n mat.uniforms.uWaterFadeStart.value = 2000.0;\n mat.uniforms.uWaterFadeEnd.value = 2500.0;\n return mat;\n}\n\nexport function rebuildRealisticWaterShaderSource(mat, stackGLSL) {\n const infinite = Object.hasOwn(mat.defines ?? {}, 'INFINITE_MODE');\n mat.fragmentShader = buildFragment(stackGLSL, infinite);\n mat.needsUpdate = true;\n}\n\nexport function applyRealisticWaterUniforms(mat, params, mode) {\n if (!mat?.uniforms) return;\n const u = mat.uniforms;\n const tier = mode === 'cinematic' ? 3 : mode === 'volumetric' ? 2 : 1;\n const dirRad = (params.waterWaveDirection ?? 0) * Math.PI / 180;\n u.uWaterTier.value = tier;\n u.uWaterOpacity.value = params.waterOpacity ?? 0.72;\n u.uRoughness.value = params.waterRoughness ?? 0.35;\n u.uReflectionQuality.value = params.waterReflectionQuality ?? 1;\n u.uMicroWaveDetail.value = params.waterNormalResolution ?? 1;\n u.uSkyReflectionEnabled.value = params.skyboxEnabled !== false ? 1 : 0;\n u.uBiomeColorEnabled.value =\n params.waterBiomeColorEnabled !== false ? 1 : 0;\n u.uBiomeColorStrength.value =\n params.waterBiomeColorStrength ?? 0.55;\n u.uWaterNaturalColor.value = params.waterNaturalColor ?? 0.7;\n u.uFresnelStrength.value = params.waterFresnelStrength ?? 1;\n u.uRefractionStrength.value = params.waterRefractionStrength ?? 0.45;\n u.uSpecularStrength.value = params.waterSpecularStrength ?? 1;\n u.uDepthColorStr.value = params.waterDepthColorStrength ?? 1;\n u.uDepthOpacityStr.value = params.waterDepthOpacityStrength ?? 1;\n u.uMaxVisibleDepth.value = params.waterMaxVisibleDepth ?? 120;\n u.uDepthFalloff.value = params.waterDepthFalloff ?? 1;\n u.uShallowDist.value = params.waterShallowDistance ?? 8;\n u.uDeepDist.value = params.waterDeepDistance ?? 55;\n u.uAbsorptionStr.value = params.waterAbsorptionStrength ?? 1;\n u.uWaveSpeed.value = params.waterWaveSpeed ?? 1;\n u.uWaveScale.value = params.waterWaveScale ?? 1;\n u.uWaveStrength.value = params.waterWaveStrength ?? 1;\n u.uSmallWaveStr.value = params.waterSmallWaveStrength ?? 0.65;\n u.uLargeWaveStr.value = params.waterLargeWaveStrength ?? 1;\n u.uNormalIntensity.value = params.waterNormalIntensity ?? 1;\n u.uWaveDir.value.set(Math.cos(dirRad), Math.sin(dirRad));\n u.uAnimSpeed.value = params.waterAnimSpeed ?? 1;\n u.uFoamEnabled.value = params.waterFoamEnabled !== false ? 1 : 0;\n u.uFoamStrength.value = params.waterFoamStrength ?? 0.75;\n u.uFoamWidth.value = params.waterFoamWidth ?? 3.2;\n u.uFoamSoftness.value = params.waterFoamSoftness ?? 0.6;\n u.uFoamAnimSpeed.value = params.waterFoamAnimSpeed ?? 1;\n u.uSlopeFoam.value = params.waterSlopeFoam ?? 0.5;\n u.uCliffFoam.value = params.waterCliffFoam ?? 0.65;\n u.uCausticsStr.value = params.waterUnderwaterCaustics ?? 0.4;\n u.uCausticMinDepth.value =\n params.waterUnderwaterCausticMinDepth ?? 1;\n u.uCausticMinDepthFalloff.value =\n params.waterUnderwaterCausticMinDepthFalloff ?? 1;\n u.uRefractionQual.value = (params.waterRefractionQuality ?? 0.6) * (tier >= 2 ? 1 : 0.5);\n u.uFoamQual.value = params.waterFoamQuality ?? 1;\n u.uCausticsQual.value = (params.waterCausticsQuality ?? 0.5) * (tier >= 2 ? 1 : 0.25);\n u.uGeometryDisplacementEnabled.value = tier >= 3 ? 1 : 0;\n u.uWaterTraceSteps.value = waterReflectionTraceSteps(tier, params.waterReflectionQuality ?? 1);\n}\n\n/** Height-field reflection march length per tier; scales with Reflection Quality. */\nexport function waterReflectionTraceSteps(tier, reflectionQuality = 1) {\n const base = tier >= 3 ? 40 : tier >= 2 ? 32 : 20;\n const quality = Math.min(Math.max(Number(reflectionQuality) || 0, 0), 1.5);\n if (quality < 0.15) return 0;\n return Math.round(base * Math.min(Math.max(quality, 0.5), 1.25));\n}\n\nexport function setWaterDebugMode(mat, debugView) {\n if (!mat?.uniforms?.uDebugMode) return;\n const map = {\n off: 0,\n depth: 1,\n shoreline: 2,\n foam: 3,\n mask: 4,\n normal: 5,\n opticalDepth: 6,\n transmittance: 7,\n fresnel: 8,\n reflection: 9,\n refraction: 10,\n opacity: 11,\n };\n mat.uniforms.uDebugMode.value = map[debugView] ?? 0;\n}\n","// ============================================================================\n// Water quality presets — apply groups of water settings at once.\n// ============================================================================\n\nimport { WATER_DEFAULT_PARAMS } from './WaterSettings.js';\n\nexport const WATER_PRESETS = {\n legacy: {\n label: 'Legacy Low',\n patch: {\n waterMode: 'legacy',\n waterQualityPreset: 'legacy',\n waterFoamEnabled: true,\n waterFoamStrength: 0.75,\n },\n },\n balanced: {\n label: 'Balanced Realistic',\n patch: {\n waterMode: 'realistic',\n waterQualityPreset: 'balanced',\n waterOpacity: 0.72,\n waterRoughness: 0.3,\n waterRefractionStrength: 0.45,\n waterSpecularStrength: 1.0,\n waterDepthColorStrength: 1.0,\n waterDepthOpacityStrength: 1.0,\n waterAbsorptionStrength: 0.95,\n waterWaveScale: 1.0,\n waterWaveStrength: 1.0,\n waterSmallWaveStrength: 0.65,\n waterLargeWaveStrength: 1.0,\n waterNormalIntensity: 1.0,\n waterNormalResolution: 1.0,\n waterFoamEnabled: true,\n waterFoamStrength: 0.7,\n waterFresnelStrength: 1.0,\n waterReflectionQuality: 1.0,\n waterUnderwaterEnabled: true,\n waterCausticsQuality: 0.3,\n },\n },\n tropical: {\n label: 'Clear Tropical',\n patch: {\n waterMode: 'realistic',\n waterQualityPreset: 'tropical',\n waterOpacity: 0.48,\n waterRoughness: 0.2,\n waterSpecularStrength: 1.1,\n waterDepthColorStrength: 0.85,\n waterDepthOpacityStrength: 0.7,\n waterMaxVisibleDepth: 90,\n waterShallowDistance: 12,\n waterDeepDistance: 45,\n waterAbsorptionStrength: 0.6,\n waterWaveStrength: 0.72,\n waterSmallWaveStrength: 0.5,\n waterLargeWaveStrength: 0.72,\n waterNormalIntensity: 0.8,\n waterNormalResolution: 0.9,\n waterFoamStrength: 0.55,\n waterFresnelStrength: 1.1,\n waterRefractionStrength: 0.55,\n waterReflectionQuality: 1.0,\n },\n },\n\n cartoon: {\n label: 'Cartoon Water',\n patch: {\n waterMode: 'legacy',\n waterQualityPreset: 'cartoon',\n waterOpacity: 0.78,\n waterRoughness: 0.18,\n waterFresnelStrength: 1.35,\n waterRefractionStrength: 0.25,\n waterSpecularStrength: 0.85,\n waterDepthColorStrength: 0.65,\n waterDepthOpacityStrength: 0.55,\n waterMaxVisibleDepth: 80,\n waterShallowDistance: 14,\n waterDeepDistance: 38,\n waterAbsorptionStrength: 0.55,\n waterWaveSpeed: 0.55,\n waterWaveScale: 1.65,\n waterWaveStrength: 0.34,\n waterSmallWaveStrength: 0.18,\n waterLargeWaveStrength: 0.28,\n waterNormalIntensity: 0.45,\n waterFoamEnabled: true,\n waterFoamStrength: 1.15,\n waterFoamWidth: 5.6,\n waterFoamSoftness: 0.35,\n waterFoamAnimSpeed: 0.55,\n waterSlopeFoam: 0.15,\n waterCliffFoam: 0.18,\n waterUnderwaterMode: 'lite',\n waterUnderwaterFogDensity: 0.75,\n waterUnderwaterVisibility: 1.25,\n waterUnderwaterDistortion: 0.25,\n waterUnderwaterCaustics: 0.25,\n waterReflectionQuality: 0.35,\n waterRefractionQuality: 0.25,\n waterFoamQuality: 0.8,\n waterCausticsQuality: 0.2,\n waterNormalResolution: 0.5,\n waterRenderScale: 0.75,\n },\n },\n ocean: {\n label: 'Deep Ocean',\n patch: {\n waterMode: 'realistic',\n waterQualityPreset: 'ocean',\n waterOpacity: 0.88,\n waterRoughness: 0.22,\n waterRefractionStrength: 0.35,\n waterSpecularStrength: 1.15,\n waterDepthColorStrength: 1.25,\n waterDepthOpacityStrength: 1.15,\n waterMaxVisibleDepth: 160,\n waterShallowDistance: 6,\n waterDeepDistance: 80,\n waterAbsorptionStrength: 1.35,\n waterWaveStrength: 1.2,\n waterLargeWaveStrength: 1.25,\n waterSmallWaveStrength: 0.72,\n waterNormalIntensity: 1.05,\n waterNormalResolution: 1.1,\n waterFoamStrength: 0.65,\n waterFresnelStrength: 0.9,\n waterReflectionQuality: 1.1,\n },\n },\n lake: {\n label: 'Mountain Lake',\n patch: {\n waterMode: 'realistic',\n waterQualityPreset: 'lake',\n waterOpacity: 0.66,\n waterRoughness: 0.44,\n waterRefractionStrength: 0.5,\n waterSpecularStrength: 0.8,\n waterDepthColorStrength: 0.95,\n waterDepthOpacityStrength: 0.9,\n waterMaxVisibleDepth: 70,\n waterShallowDistance: 10,\n waterDeepDistance: 40,\n waterAbsorptionStrength: 0.9,\n waterWaveScale: 0.9,\n waterWaveStrength: 0.45,\n waterSmallWaveStrength: 0.35,\n waterLargeWaveStrength: 0.5,\n waterNormalIntensity: 0.72,\n waterNormalResolution: 0.8,\n waterFoamStrength: 0.4,\n waterFoamWidth: 2.4,\n waterReflectionQuality: 0.95,\n },\n },\n swamp: {\n label: 'Swamp Water',\n patch: {\n waterMode: 'realistic',\n waterQualityPreset: 'swamp',\n waterRoughness: 0.58,\n waterRefractionStrength: 0.2,\n waterSpecularStrength: 0.55,\n waterDepthColorStrength: 1.1,\n waterDepthOpacityStrength: 1.25,\n waterMaxVisibleDepth: 35,\n waterAbsorptionStrength: 1.5,\n waterOpacity: 0.94,\n waterWaveStrength: 0.28,\n waterSmallWaveStrength: 0.2,\n waterLargeWaveStrength: 0.35,\n waterNormalIntensity: 0.55,\n waterNormalResolution: 0.55,\n waterFoamStrength: 0.35,\n waterReflectionQuality: 0.65,\n waterUnderwaterFogDensity: 1.4,\n waterUnderwaterVisibility: 0.55,\n },\n },\n alien: {\n label: 'Alien Water',\n patch: {\n waterMode: 'volumetric',\n waterQualityPreset: 'alien',\n waterDepthColorStrength: 1.3,\n waterFresnelStrength: 1.4,\n waterRefractionStrength: 0.7,\n waterFoamStrength: 0.5,\n waterUnderwaterCaustics: 0.8,\n waterCausticsQuality: 0.85,\n },\n },\n volumetric: {\n label: 'High Volumetric',\n patch: {\n waterMode: 'volumetric',\n waterQualityPreset: 'volumetric',\n waterOpacity: 0.8,\n waterRoughness: 0.24,\n waterRefractionStrength: 0.58,\n waterSpecularStrength: 1.1,\n waterDepthColorStrength: 1.15,\n waterDepthOpacityStrength: 1.1,\n waterAbsorptionStrength: 1.2,\n waterFoamStrength: 0.85,\n waterFoamQuality: 1.2,\n waterRefractionQuality: 0.75,\n waterRenderScale: 1.0,\n waterCausticsQuality: 0.65,\n waterUnderwaterCaustics: 0.55,\n waterNormalIntensity: 1.15,\n waterNormalResolution: 1.15,\n waterReflectionQuality: 1.0,\n },\n },\n cinematic: {\n label: 'Cinematic Screenshot',\n patch: {\n waterMode: 'cinematic',\n waterQualityPreset: 'cinematic',\n waterOpacity: 0.82,\n waterRoughness: 0.18,\n waterRefractionStrength: 0.62,\n waterSpecularStrength: 1.25,\n waterDepthColorStrength: 1.2,\n waterFoamStrength: 1.0,\n waterFoamQuality: 1.5,\n waterReflectionQuality: 1.4,\n waterRefractionQuality: 1.0,\n waterRenderScale: 2.0,\n waterUpdateFrequency: 1,\n waterCausticsQuality: 1.0,\n waterNormalIntensity: 1.25,\n waterNormalResolution: 1.35,\n waterLargeWaveStrength: 1.15,\n waterUnderwaterCaustics: 0.7,\n },\n },\n};\n\nexport function applyWaterPreset(params, presetKey) {\n const preset = WATER_PRESETS[presetKey];\n if (!preset) return params;\n return {\n ...params,\n waterEnabled: preset.patch.waterMode !== 'off',\n ...preset.patch,\n waterQualityPreset: presetKey,\n };\n}\n\nexport function resetWaterSettings(params) {\n const next = { ...params };\n for (const key of Object.keys(WATER_DEFAULT_PARAMS)) {\n next[key] = WATER_DEFAULT_PARAMS[key];\n }\n return next;\n}\n","import { createWaterMaterial, createInfiniteWaterMaterial } from '../terrain/WaterMaterial.js';\nimport { createPlanetWaterMaterial } from '../terrain/PlanetMaterial.js';\nimport {\n createRealisticWaterMaterial,\n createInfiniteRealisticWaterMaterial,\n applyRealisticWaterUniforms,\n setWaterDebugMode,\n} from './RealisticWaterMaterial.js';\nimport { isRealisticWaterMode } from './WaterSettings.js';\nimport { applyWaterLightingUniforms } from './waterLightingGLSL.js';\n\n// ============================================================================\n// WaterMaterialFactory — creates the correct water material for a mode.\n// ============================================================================\n\nexport function createWaterMaterialForMode({\n mode,\n sharedUniforms,\n environmentUniforms,\n octaves,\n stackGLSL,\n infinite = false,\n planet = false,\n}) {\n if (planet) {\n return createPlanetWaterMaterial(sharedUniforms, octaves, stackGLSL);\n }\n if (isRealisticWaterMode(mode)) {\n return infinite\n ? createInfiniteRealisticWaterMaterial(\n sharedUniforms,\n octaves,\n stackGLSL,\n environmentUniforms,\n )\n : createRealisticWaterMaterial(\n sharedUniforms,\n octaves,\n stackGLSL,\n environmentUniforms,\n );\n }\n return infinite\n ? createInfiniteWaterMaterial(sharedUniforms, octaves, stackGLSL)\n : createWaterMaterial(sharedUniforms, octaves, stackGLSL);\n}\n\nexport function applyWaterMaterialSettings(mat, params, mode, debugView = 'off') {\n if (!mat?.uniforms) return;\n if (mat.uniforms.uWaterAnim) {\n mat.uniforms.uWaterAnim.value = params.waterAnim ? 1 : 0;\n }\n applyWaterLightingUniforms(mat.uniforms, params);\n if (mat.uniforms.uFoamWidth) {\n mat.uniforms.uFoamWidth.value = params.waterFoamWidth ?? 3.2;\n }\n // While a realistic program links, the legacy plane stays visible and is\n // still listed as the active material: it has no realistic uniforms.\n if (isRealisticWaterMode(mode) && mat.uniforms.uWaterTier) {\n applyRealisticWaterUniforms(mat, params, mode);\n setWaterDebugMode(mat, debugView);\n }\n}\n","// ============================================================================\n// WaterDebugViews — debug overlay helpers for the water pipeline.\n// ============================================================================\n\nimport { setWaterDebugMode } from './RealisticWaterMaterial.js';\n\nexport const WATER_DEBUG_VIEWS = [\n { value: 'off', label: 'Off' },\n { value: 'depth', label: 'Depth Map' },\n { value: 'shoreline', label: 'Shoreline Mask' },\n { value: 'foam', label: 'Foam Mask' },\n { value: 'mask', label: 'Water Mask' },\n { value: 'normal', label: 'Surface Normal' },\n { value: 'opticalDepth', label: 'Optical Depth' },\n { value: 'transmittance', label: 'Transmittance' },\n { value: 'fresnel', label: 'Fresnel' },\n { value: 'reflection', label: 'Sky Reflection' },\n { value: 'refraction', label: 'Transmission / Refraction' },\n { value: 'opacity', label: 'Final Opacity' },\n];\n\nexport function applyWaterDebugToMaterials(materials, debugView) {\n for (const mat of materials) {\n if (mat?.uniforms?.uDebugMode) setWaterDebugMode(mat, debugView);\n }\n}\n\nexport function waterDebugActive(debugView) {\n return debugView && debugView !== 'off';\n}\n","// ============================================================================\n// WaterMasks — CPU-side mask generation from terrain height data.\n// Used for debug previews and export; not regenerated every frame.\n// ============================================================================\nimport { createExportCanvas } from '../../runtime/export/ExportCanvas.js';\nimport { canvasPngBytes } from '../../export/ExportEncoding.js';\n\n/**\n * Generate water-related masks from a height sampler.\n * @param {object} opts\n * @param {function(number,number): number} opts.sampleHeight - height at world XZ\n * @param {number} opts.seaLevel\n * @param {number} opts.size - world extent (square)\n * @param {number} opts.resolution - pixels per side\n * @param {object} [opts.origin] - { x, z } world origin of the map\n */\nexport function generateWaterMasks({\n sampleHeight,\n seaLevel,\n size,\n resolution,\n origin = { x: 0, z: 0 },\n}) {\n const res = Math.max(8, Math.min(2048, resolution | 0));\n const half = size * 0.5;\n const waterMask = new Float32Array(res * res);\n const depthMap = new Float32Array(res * res);\n const shorelineMask = new Float32Array(res * res);\n const foamMask = new Float32Array(res * res);\n const underwaterMask = new Float32Array(res * res);\n\n let maxDepth = 0.001;\n\n for (let j = 0; j < res; j++) {\n for (let i = 0; i < res; i++) {\n const u = i / (res - 1);\n const v = j / (res - 1);\n const x = origin.x + (u - 0.5) * size;\n const z = origin.z + (v - 0.5) * size;\n const h = sampleHeight(x, z);\n const depth = seaLevel - h;\n const idx = j * res + i;\n\n if (depth > 0.02) {\n waterMask[idx] = 1;\n depthMap[idx] = depth;\n maxDepth = Math.max(maxDepth, depth);\n underwaterMask[idx] = depth > 0.5 ? 1 : 0;\n }\n }\n }\n\n // shoreline + foam from depth gradient\n for (let j = 0; j < res; j++) {\n for (let i = 0; i < res; i++) {\n const idx = j * res + i;\n if (waterMask[idx] < 0.5) continue;\n const depth = depthMap[idx];\n const dL = i > 0 ? depthMap[idx - 1] : depth;\n const dR = i < res - 1 ? depthMap[idx + 1] : depth;\n const dU = j > 0 ? depthMap[idx - res] : depth;\n const dD = j < res - 1 ? depthMap[idx + res] : depth;\n const grad = Math.max(\n Math.abs(depth - dL),\n Math.abs(depth - dR),\n Math.abs(depth - dU),\n Math.abs(depth - dD),\n );\n const shore = smoothstep(8, 0.5, depth) * (0.5 + grad * 0.15);\n shorelineMask[idx] = shore;\n foamMask[idx] = smoothstep(4, 0.8, depth) * (0.6 + grad * 0.2);\n }\n }\n\n // normalize depth map\n for (let i = 0; i < depthMap.length; i++) {\n if (waterMask[i] > 0.5) depthMap[i] /= maxDepth;\n }\n\n return {\n resolution: res,\n size,\n origin,\n seaLevel,\n maxDepth,\n waterMask,\n depthMap,\n shorelineMask,\n foamMask,\n underwaterMask,\n };\n}\n\nfunction smoothstep(edge0, edge1, x) {\n const t = Math.max(0, Math.min(1, (x - edge0) / (edge1 - edge0)));\n return t * t * (3 - 2 * t);\n}\n\n/** Convert a float mask to PNG data URL for download. */\nfunction maskToCanvas(mask, resolution, { colorize = false, dom = false } = {}) {\n const data = new Uint8ClampedArray(resolution * resolution * 4);\n for (let i = 0; i < mask.length; i++) {\n const v = Math.max(0, Math.min(1, mask[i]));\n const p = i * 4;\n if (colorize) {\n data[p] = Math.round((1 - v) * 255);\n data[p + 1] = Math.round(v * 128);\n data[p + 2] = Math.round(v * 255);\n } else {\n const b = Math.round(v * 255);\n data[p] = data[p + 1] = data[p + 2] = b;\n }\n data[p + 3] = 255;\n }\n const canvas = dom && typeof document !== 'undefined' ? document.createElement('canvas') : createExportCanvas();\n canvas.width = resolution;\n canvas.height = resolution;\n const ctx = canvas.getContext('2d');\n const img = ctx.createImageData(resolution, resolution);\n img.data.set(data);\n ctx.putImageData(img, 0, 0);\n return canvas;\n}\n\nexport function maskToPngDataUrl(mask, resolution, opts) {\n const canvas=maskToCanvas(mask,resolution,{...opts,dom:true});\n if(!canvas.toDataURL)throw new Error('Data URLs require a DOM canvas; use maskToPngBytes for OffscreenCanvas');\n return canvas.toDataURL('image/png');\n}\n\n/** Encode a float mask as PNG bytes (Uint8Array) for bundling into a zip. */\nexport async function maskToPngBytes(mask, resolution, opts) {\n return canvasPngBytes(maskToCanvas(mask, resolution, opts));\n}\n","// ============================================================================\n// WaterExport — helpers for exporting water meshes and mask maps.\n// ============================================================================\n\nimport * as THREE from 'three';\nimport { generateWaterMasks, maskToPngBytes } from './WaterMaskArtifacts.js';\nimport { isWaterActive } from './WaterSettings.js';\n\n/**\n * Build the requested water mask PNGs as a { filename: Uint8Array } map so the\n * caller can fold them into a single export zip (no separate downloads).\n * Returns an empty map when water is inactive or nothing is requested.\n */\nexport async function buildWaterMaskFiles({\n sampleHeight,\n seaLevel,\n size,\n resolution = 512,\n origin,\n options = {},\n}) {\n if (!isWaterActive(options.waterMode ?? 'legacy', seaLevel)) return {};\n\n const wantMask = !!options.exportWaterMask;\n const wantDepth = !!options.exportDepthMap;\n const wantShore = !!options.exportShorelineMask;\n const wantFoam = !!options.exportFoamMask;\n if (!wantMask && !wantDepth && !wantShore && !wantFoam) return {};\n\n const masks = generateWaterMasks({ sampleHeight, seaLevel, size, resolution, origin });\n const prefix = options.filenamePrefix ?? 'water';\n const files = {};\n\n if (wantMask) files[`water/${prefix}-water-mask.png`] = await maskToPngBytes(masks.waterMask, masks.resolution);\n if (wantDepth) files[`water/${prefix}-depth-map.png`] = await maskToPngBytes(masks.depthMap, masks.resolution, { colorize: true });\n if (wantShore) files[`water/${prefix}-shoreline-mask.png`] = await maskToPngBytes(masks.shorelineMask, masks.resolution);\n if (wantFoam) files[`water/${prefix}-foam-mask.png`] = await maskToPngBytes(masks.foamMask, masks.resolution);\n\n return files;\n}\n\n/**\n * Build a simple water plane mesh for GLB export (separate named object).\n */\nexport function buildExportWaterPlane({ size, seaLevel, name = 'Water' }) {\n const geo = new THREE.PlaneGeometry(size, size);\n geo.rotateX(-Math.PI / 2);\n const mat = new THREE.MeshStandardMaterial({\n color: 0x1a4a6e,\n transparent: true,\n opacity: 0.75,\n roughness: 0.2,\n metalness: 0.1,\n name: 'WaterMaterial',\n });\n const mesh = new THREE.Mesh(geo, mat);\n mesh.name = name;\n mesh.position.y = seaLevel;\n return mesh;\n}\n\nexport function buildWaterMetadata(params) {\n return {\n waterMode: params.waterMode,\n seaLevel: params.seaLevel,\n waterEnabled: params.waterEnabled,\n preset: params.waterQualityPreset,\n };\n}\n","import * as THREE from 'three';\n\nconst BASE_REFRACTION_SCALE = 0.5;\n\nexport function isSceneRefractionMode(mode) {\n return mode === 'volumetric' || mode === 'cinematic';\n}\n\nexport function resolveWaterSurfacePassSize({\n width,\n height,\n renderScale = 1,\n} = {}) {\n const scale = BASE_REFRACTION_SCALE\n * THREE.MathUtils.clamp(Number(renderScale) || 1, 0.25, 2);\n return {\n width: Math.max(1, Math.round((Number(width) || 1) * scale)),\n height: Math.max(1, Math.round((Number(height) || 1) * scale)),\n scale,\n };\n}\n\nfunction setMaterialCapture(material, {\n color = null,\n depth = null,\n width = 1,\n height = 1,\n viewportWidth = width,\n viewportHeight = height,\n near = 1,\n far = 50000,\n enabled = false,\n} = {}) {\n const uniforms = material?.uniforms;\n if (!uniforms?.uSceneRefractionEnabled) return;\n if (uniforms.uSceneColor) uniforms.uSceneColor.value = color;\n if (uniforms.uSceneDepth) uniforms.uSceneDepth.value = depth;\n if (uniforms.uSceneTexelSize) {\n uniforms.uSceneTexelSize.value.set(\n 1 / Math.max(width, 1),\n 1 / Math.max(height, 1),\n );\n }\n if (uniforms.uSceneViewportInv) {\n uniforms.uSceneViewportInv.value.set(\n 1 / Math.max(viewportWidth, 1),\n 1 / Math.max(viewportHeight, 1),\n );\n }\n if (uniforms.uSceneNear) uniforms.uSceneNear.value = near;\n if (uniforms.uSceneFar) uniforms.uSceneFar.value = far;\n uniforms.uSceneRefractionEnabled.value = enabled && color && depth ? 1 : 0;\n}\n\n/**\n * Lazy scene-color/depth capture used by Volumetric/Cinematic water.\n *\n * The water meshes are hidden and their sampler uniforms are unbound while\n * this target is written. This guarantees that the pass can never sample the\n * same texture it is currently rendering into.\n */\nexport class WaterSurfacePass {\n constructor() {\n this._target = null;\n this._active = false;\n this._captureMs = 0;\n this._captureCount = 0;\n this._sharedSource = null;\n this._disposed = false;\n }\n\n get target() {\n return this._target;\n }\n\n shouldCapture(params, mode, worldMode) {\n return !this._disposed\n && worldMode !== 'planet'\n && params?.waterEnabled !== false\n && (params?.waterHideAtZero === false || (params?.seaLevel ?? 0) > 0.5)\n && (params?.waterRefractionQuality ?? 0.6) > 0.01\n && isSceneRefractionMode(mode);\n }\n\n disable(materials = []) {\n this._active = false;\n for (const material of materials) setMaterialCapture(material);\n }\n\n deactivate(materials = []) {\n this.disable(materials);\n this._target?.dispose();\n this._target = null;\n this._sharedSource = null;\n this._captureMs = 0;\n }\n\n capture(renderer, scene, camera, {\n params,\n mode,\n worldMode,\n sceneSize,\n hiddenObjects = [],\n materials = [],\n sourceTarget = null,\n } = {}) {\n if (!this.shouldCapture(params, mode, worldMode)) {\n this.deactivate(materials);\n return false;\n }\n let viewportWidth = sceneSize?.x ?? sceneSize?.width;\n let viewportHeight = sceneSize?.y ?? sceneSize?.height;\n if (!Number.isFinite(viewportWidth) || !Number.isFinite(viewportHeight)) {\n const fallbackSize = renderer.getDrawingBufferSize?.(new THREE.Vector2());\n viewportWidth = fallbackSize?.x ?? sourceTarget?.width ?? 1;\n viewportHeight = fallbackSize?.y ?? sourceTarget?.height ?? 1;\n }\n if (sourceTarget?.texture && sourceTarget?.depthTexture) {\n this._target?.dispose();\n this._target = null;\n this._sharedSource = sourceTarget;\n this._active = true;\n this._captureMs = 0;\n for (const material of materials) {\n setMaterialCapture(material, {\n color: sourceTarget.texture,\n depth: sourceTarget.depthTexture,\n width: sourceTarget.width,\n height: sourceTarget.height,\n viewportWidth,\n viewportHeight,\n near: camera.near,\n far: camera.far,\n enabled: true,\n });\n }\n return true;\n }\n this._sharedSource = null;\n\n const size = resolveWaterSurfacePassSize({\n width: viewportWidth,\n height: viewportHeight,\n renderScale: params?.waterRenderScale ?? 1,\n });\n this._ensureTarget(size.width, size.height);\n\n // Unbind before writing even though water is hidden. It prevents a future\n // visibility or layer regression from creating a texture feedback loop.\n this.disable(materials);\n const visibility = hiddenObjects\n .filter(Boolean)\n .map((object) => [object, object.visible]);\n const previousTarget = renderer.getRenderTarget?.() ?? null;\n const started = globalThis.performance?.now?.() ?? Date.now();\n\n try {\n for (const [object] of visibility) object.visible = false;\n renderer.setRenderTarget(this._target);\n renderer.render(scene, camera);\n } finally {\n renderer.setRenderTarget(previousTarget);\n for (const [object, visible] of visibility) object.visible = visible;\n }\n\n const ended = globalThis.performance?.now?.() ?? Date.now();\n this._captureMs = Math.max(0, ended - started);\n this._captureCount += 1;\n this._active = true;\n for (const material of materials) {\n setMaterialCapture(material, {\n color: this._target.texture,\n depth: this._target.depthTexture,\n width: this._target.width,\n height: this._target.height,\n viewportWidth,\n viewportHeight,\n near: camera.near,\n far: camera.far,\n enabled: true,\n });\n }\n return true;\n }\n\n diagnostics() {\n if (!this._target && !this._sharedSource) {\n return {\n active: false,\n allocated: false,\n resolution: null,\n memoryBytes: 0,\n additionalSceneRenders: 0,\n captureMs: 0,\n captures: this._captureCount,\n };\n }\n const source = this._target || this._sharedSource;\n return {\n active: this._active,\n allocated: true,\n shared: !!this._sharedSource,\n resolution: { width: source.width, height: source.height },\n // RGBA8 scene color + unsigned-int depth.\n memoryBytes: this._sharedSource ? 0 : source.width * source.height * 8,\n additionalSceneRenders: this._sharedSource ? 0 : (this._active ? 1 : 0),\n captureMs: this._captureMs,\n captures: this._captureCount,\n };\n }\n\n _ensureTarget(width, height) {\n if (this._target?.width === width && this._target?.height === height) return;\n this._target?.dispose();\n\n const depthTexture = new THREE.DepthTexture(width, height);\n depthTexture.format = THREE.DepthFormat;\n depthTexture.type = THREE.UnsignedIntType;\n depthTexture.minFilter = THREE.NearestFilter;\n depthTexture.magFilter = THREE.NearestFilter;\n depthTexture.generateMipmaps = false;\n depthTexture.name = 'WaterOpaqueDepth';\n\n this._target = new THREE.WebGLRenderTarget(width, height, {\n depthBuffer: true,\n stencilBuffer: false,\n depthTexture,\n });\n this._target.texture.minFilter = THREE.LinearFilter;\n this._target.texture.magFilter = THREE.LinearFilter;\n this._target.texture.generateMipmaps = false;\n this._target.texture.name = 'WaterOpaqueColor';\n this._target.samples = 0;\n }\n\n dispose() {\n this._disposed = true;\n this._active = false;\n this._target?.dispose();\n this._target = null;\n this._sharedSource = null;\n }\n}\n","import { applyMiniWaterLook, createMiniWaterSurfaceMaterial, resolveMiniReflections } from '../mini/MiniWaterMaterial.js';\nimport { miniWaterColors } from '../mini/MiniLook.js';\n\n// ============================================================================\n// StylizedWaterLayer — the Mini Terrain water surface offered to the classic\n// worlds as the \"Stylized\" water mode (Tile and Infinite World; the Planet\n// shell keeps its spherical water, like the Realistic tiers).\n//\n// The managed WaterSystem material stays the cheap Legacy one and is never\n// shown: the stylized material is presented through the WaterSystem\n// overrides of the studio mesh and of the Infinite water plane, and is\n// registered as auxiliary water so it receives the water-free scene capture\n// (refraction + depth). A Mini diorama's own surface keeps priority.\n// ============================================================================\n\nexport const STYLIZED_WATER_MODE = 'stylized';\n\nexport class StylizedWaterLayer {\n constructor(engine) {\n this.engine = engine;\n this.material = null;\n this._entry = null;\n this._compileGeneration = 0;\n this._compilingVersion = -1;\n this._compilingWorldMode = null;\n this._readyVersion = -1;\n this.pending = false;\n this.failed = false;\n }\n\n /** Create the material (and its capture registration) on first use. */\n ensure(waterSystem) {\n if (this.material) return this.material;\n const eng = this.engine;\n this.material = createMiniWaterSurfaceMaterial(eng.uniforms, {\n name: 'StylizedWaterSurface',\n sky: eng.proceduralSky?.uniforms ?? null,\n });\n // unbounded surface: no footprint clip, no glass edge\n this.material.uniforms.uMiniHalf.value = 1e7;\n this._entry = {\n material: this.material,\n applySettings: (params) => this.applySettings(params),\n };\n waterSystem.addAuxiliaryWater(this._entry);\n return this.material;\n }\n\n get ready() {\n return !!this.material && this._readyVersion === this.material.version;\n }\n\n prepare(waterSystem, worldMode) {\n const material = this.material;\n if (!material || this.ready || ((this.pending || this.failed)\n && this._compilingVersion === material.version && this._compilingWorldMode === worldMode)) return;\n const engine = this.engine;\n const version = material.version;\n const generation = ++this._compileGeneration;\n this._compilingVersion = version;\n this._compilingWorldMode = worldMode;\n this.pending = true;\n this.failed = false;\n const isCurrent = () => this.material === material && generation === this._compileGeneration\n && material.version === version && engine.worldMode === worldMode\n && waterSystem.getEffectiveMode() === STYLIZED_WATER_MODE && !waterSystem._disposed;\n // Leave the already-prepared Legacy material visible until both linking\n // and the offscreen validation draw finish. First draw must never compile.\n engine.compileWaterMaterialsAsync([material], () => {\n if (!isCurrent()) return;\n this._readyVersion = version;\n this.pending = false;\n engine._needsRender = true;\n }, { isCurrent }).then((ready) => {\n if (!isCurrent() || ready) return;\n this.pending = false;\n this.failed = true;\n engine._needsRender = true;\n engine.cb?.onToast?.('Water could not be prepared. Legacy water remains active.');\n });\n }\n\n cancelPreparation() {\n this._compileGeneration++;\n this.pending = false;\n this.failed = false;\n }\n\n applySettings(params = this.engine.params) {\n if (!this.material) return;\n const heightScale = Math.max(1, params.heightScale ?? 560);\n applyMiniWaterLook(this.material, {\n colors: miniWaterColors('procedural'),\n params,\n depthRange: Math.max(30, Math.min(heightScale * 0.18, (params.waterDeepDistance ?? 55) * 2)),\n });\n const u = this.material.uniforms;\n u.uMiniWaveScale.value = Math.max(0.1, params.waterWaveScale ?? 1);\n u.uMiniReflect.value = 0.6 * Math.max(0, params.waterFresnelStrength ?? 1)\n * resolveMiniReflections(params).strength;\n }\n\n /** Per frame: animation clock and depth source. */\n update(worldMode) {\n if (!this.material) return;\n const eng = this.engine;\n const p = eng.params;\n const anim = p.waterAnim ? (eng.uniforms.uTime?.value ?? 0) * (p.waterAnimSpeed ?? 1) * (p.waterWaveSpeed ?? 1) : 0;\n applyMiniWaterLook(this.material, { animTime: anim, lightTex: null });\n const u = this.material.uniforms;\n // the studio height bake is board-local: Infinite World reads the capture\n u.uMiniBakeDepth.value = worldMode === 'studio' ? 1 : 0;\n // Infinite World fades the plane out at the terrain render distance (the\n // managed material's fade, kept current by InfiniteWorld)\n const fade = worldMode === 'infinite' ? eng.infiniteWorld?.waterMaterial?.uniforms : null;\n u.uWaterFadeStart.value = fade?.uWaterFadeStart?.value ?? 99999;\n u.uWaterFadeEnd.value = fade?.uWaterFadeEnd?.value ?? 100000;\n }\n\n get compileMaterials() {\n return this.material ? [this.material] : [];\n }\n\n dispose(waterSystem) {\n this.cancelPreparation();\n this._readyVersion = -1;\n if (this._entry) waterSystem?.removeAuxiliaryWater(this._entry);\n this._entry = null;\n this.material?.dispose();\n this.material = null;\n }\n}\n","import * as THREE from 'three';\n\nconst WATER_PLANE_NORMAL = new THREE.Vector3(0, 1, 0);\n\nexport function isPlanarReflectionMode(mode) {\n return mode === 'cinematic';\n}\n\nexport function resolveWaterPlanarReflectionSize({\n width,\n height,\n reflectionQuality = 1,\n renderScale = 1,\n} = {}) {\n const quality = THREE.MathUtils.clamp(\n ((Number(reflectionQuality) || 1) - 1) / 0.5,\n 0,\n 1,\n );\n const qualityScale = THREE.MathUtils.lerp(0.5, 1, quality);\n const renderScaleMultiplier = THREE.MathUtils.clamp(\n Number(renderScale) || 1,\n 0.5,\n 2,\n ) * 0.5;\n const scale = THREE.MathUtils.clamp(\n qualityScale * renderScaleMultiplier,\n 0.25,\n 1,\n );\n return {\n width: Math.max(1, Math.round((Number(width) || 1) * scale)),\n height: Math.max(1, Math.round((Number(height) || 1) * scale)),\n scale,\n };\n}\n\nexport function resolvePlanarReflectionCadence(value) {\n const requested = Math.round(Number(value) || 1);\n if (requested >= 4) return 4;\n if (requested >= 2) return 2;\n return 1;\n}\n\nfunction setMaterialPlanarReflection(material, {\n color = null,\n matrix = null,\n width = 1,\n height = 1,\n enabled = false,\n} = {}) {\n const uniforms = material?.uniforms;\n if (!uniforms?.uPlanarReflectionEnabled) return;\n if (uniforms.uPlanarReflection) {\n uniforms.uPlanarReflection.value = color;\n }\n if (uniforms.uPlanarReflectionMatrix && matrix) {\n uniforms.uPlanarReflectionMatrix.value.copy(matrix);\n }\n if (uniforms.uPlanarReflectionTexelSize) {\n uniforms.uPlanarReflectionTexelSize.value.set(\n 1 / Math.max(width, 1),\n 1 / Math.max(height, 1),\n );\n }\n uniforms.uPlanarReflectionEnabled.value = enabled && color ? 1 : 0;\n}\n\n/**\n * Mirror a perspective/orthographic camera around the horizontal water plane,\n * then replace its near plane with an oblique sea-level clip plane. This keeps\n * underwater terrain out of the reflection without per-material clipping.\n */\nexport function updatePlanarReflectionCamera(\n sourceCamera,\n reflectionCamera,\n seaLevel,\n clipBias = 0.003,\n) {\n sourceCamera.updateMatrixWorld(true);\n reflectionCamera.copy(sourceCamera);\n\n const cameraWorldPosition = sourceCamera.getWorldPosition(new THREE.Vector3());\n const rotationMatrix = new THREE.Matrix4().extractRotation(sourceCamera.matrixWorld);\n const reflectorPosition = new THREE.Vector3(0, seaLevel, 0);\n const view = reflectorPosition.clone()\n .sub(cameraWorldPosition)\n .reflect(WATER_PLANE_NORMAL)\n .negate()\n .add(reflectorPosition);\n const lookAtPosition = new THREE.Vector3(0, 0, -1)\n .applyMatrix4(rotationMatrix)\n .add(cameraWorldPosition);\n const target = reflectorPosition.clone()\n .sub(lookAtPosition)\n .reflect(WATER_PLANE_NORMAL)\n .negate()\n .add(reflectorPosition);\n const up = new THREE.Vector3(0, 1, 0)\n .applyMatrix4(rotationMatrix)\n .reflect(WATER_PLANE_NORMAL);\n\n reflectionCamera.position.copy(view);\n reflectionCamera.up.copy(up);\n reflectionCamera.lookAt(target);\n reflectionCamera.updateMatrixWorld(true);\n reflectionCamera.projectionMatrix.copy(sourceCamera.projectionMatrix);\n\n const reflectorPlane = new THREE.Plane(\n WATER_PLANE_NORMAL.clone(),\n -seaLevel,\n );\n reflectorPlane.applyMatrix4(reflectionCamera.matrixWorldInverse);\n const clipPlane = new THREE.Vector4(\n reflectorPlane.normal.x,\n reflectorPlane.normal.y,\n reflectorPlane.normal.z,\n reflectorPlane.constant,\n );\n const projection = reflectionCamera.projectionMatrix;\n const elements = projection.elements;\n const q = new THREE.Vector4(\n (Math.sign(clipPlane.x) + elements[8]) / elements[0],\n (Math.sign(clipPlane.y) + elements[9]) / elements[5],\n -1,\n (1 + elements[10]) / elements[14],\n );\n clipPlane.multiplyScalar(2 / clipPlane.dot(q));\n elements[2] = clipPlane.x;\n elements[6] = clipPlane.y;\n elements[10] = clipPlane.z + 1 - clipBias;\n elements[14] = clipPlane.w;\n reflectionCamera.projectionMatrixInverse.copy(projection).invert();\n\n return reflectionCamera;\n}\n\n/**\n * Lazy Cinematic-only planar reflection. Water meshes are hidden and their\n * reflection samplers are unbound while the target is being written, avoiding\n * recursive reflections and render-target feedback loops.\n */\nexport class WaterPlanarReflectionPass {\n constructor() {\n this._target = null;\n this._camera = null;\n this._textureMatrix = new THREE.Matrix4();\n this._cameraPosition = new THREE.Vector3();\n this._active = false;\n this._updatedThisFrame = false;\n this._captureMs = 0;\n this._captureCount = 0;\n this._frame = 0;\n this._cadence = 1;\n this._lastSeaLevel = null;\n this._lastRevision = null;\n this._disposed = false;\n }\n\n get target() {\n return this._target;\n }\n\n get reflectionCamera() {\n return this._camera;\n }\n\n shouldCapture(params, mode, worldMode, camera, enabled = true) {\n const seaLevel = params?.seaLevel ?? 0;\n const cameraY = camera?.getWorldPosition\n ? camera.getWorldPosition(this._cameraPosition).y\n : camera?.position?.y;\n return enabled\n && !this._disposed\n && worldMode === 'studio'\n && params?.waterEnabled !== false\n && (params?.waterHideAtZero === false || seaLevel > 0.5)\n && cameraY > seaLevel + 0.05\n && (params?.waterReflectionQuality ?? 1) > 1\n && isPlanarReflectionMode(mode);\n }\n\n disable(materials = []) {\n this._active = false;\n this._updatedThisFrame = false;\n for (const material of materials) setMaterialPlanarReflection(material);\n }\n\n deactivate(materials = []) {\n this.disable(materials);\n this._target?.dispose();\n this._target = null;\n this._camera = null;\n this._captureMs = 0;\n this._lastSeaLevel = null;\n this._lastRevision = null;\n }\n\n capture(renderer, scene, camera, {\n params,\n mode,\n worldMode,\n sceneSize,\n hiddenObjects = [],\n materials = [],\n enabled = true,\n revision = null,\n } = {}) {\n if (!this.shouldCapture(params, mode, worldMode, camera, enabled)) {\n this.deactivate(materials);\n return false;\n }\n\n const fallbackSize = renderer.getDrawingBufferSize(new THREE.Vector2());\n const sourceWidth = sceneSize?.x ?? sceneSize?.width ?? fallbackSize.x;\n const sourceHeight = sceneSize?.y ?? sceneSize?.height ?? fallbackSize.y;\n const size = resolveWaterPlanarReflectionSize({\n width: sourceWidth,\n height: sourceHeight,\n reflectionQuality: params?.waterReflectionQuality ?? 1,\n renderScale: params?.waterRenderScale ?? 1,\n });\n const targetChanged = this._ensureTarget(size.width, size.height);\n this._ensureCamera(camera);\n this._cadence = resolvePlanarReflectionCadence(\n params?.waterUpdateFrequency ?? 1,\n );\n this._frame += 1;\n const seaLevel = params?.seaLevel ?? 0;\n const planeChanged = this._lastSeaLevel !== seaLevel;\n const revisionChanged = revision == null || revision !== this._lastRevision;\n const due = targetChanged\n || planeChanged\n || this._captureCount === 0\n || (revisionChanged && (this._frame - 1) % this._cadence === 0);\n\n if (!due) {\n this._active = true;\n this._updatedThisFrame = false;\n this._bind(materials);\n return true;\n }\n\n updatePlanarReflectionCamera(camera, this._camera, seaLevel);\n this._textureMatrix.multiplyMatrices(\n this._camera.projectionMatrix,\n this._camera.matrixWorldInverse,\n );\n\n this.disable(materials);\n const visibility = hiddenObjects\n .filter(Boolean)\n .map((object) => [object, object.visible]);\n const previousTarget = renderer.getRenderTarget?.() ?? null;\n const previousXrEnabled = renderer.xr?.enabled;\n const previousShadowAutoUpdate = renderer.shadowMap?.autoUpdate;\n const started = globalThis.performance?.now?.() ?? Date.now();\n\n try {\n for (const [object] of visibility) object.visible = false;\n if (renderer.xr) renderer.xr.enabled = false;\n if (renderer.shadowMap) renderer.shadowMap.autoUpdate = false;\n renderer.setRenderTarget(this._target);\n renderer.render(scene, this._camera);\n } finally {\n renderer.setRenderTarget(previousTarget);\n if (renderer.xr && previousXrEnabled !== undefined) {\n renderer.xr.enabled = previousXrEnabled;\n }\n if (renderer.shadowMap && previousShadowAutoUpdate !== undefined) {\n renderer.shadowMap.autoUpdate = previousShadowAutoUpdate;\n }\n for (const [object, visible] of visibility) object.visible = visible;\n }\n\n const ended = globalThis.performance?.now?.() ?? Date.now();\n this._captureMs = Math.max(0, ended - started);\n this._captureCount += 1;\n this._lastSeaLevel = seaLevel;\n this._lastRevision = revision;\n this._active = true;\n this._updatedThisFrame = true;\n this._bind(materials);\n return true;\n }\n\n diagnostics() {\n if (!this._target) {\n return {\n active: false,\n allocated: false,\n resolution: null,\n memoryBytes: 0,\n additionalSceneRenders: 0,\n captureMs: 0,\n captures: this._captureCount,\n cadence: this._cadence,\n updatedThisFrame: false,\n };\n }\n return {\n active: this._active,\n allocated: true,\n resolution: {\n width: this._target.width,\n height: this._target.height,\n },\n memoryBytes: this._target.width * this._target.height * 4,\n additionalSceneRenders: this._updatedThisFrame ? 1 : 0,\n captureMs: this._captureMs,\n captures: this._captureCount,\n cadence: this._cadence,\n updatedThisFrame: this._updatedThisFrame,\n };\n }\n\n _bind(materials) {\n for (const material of materials) {\n setMaterialPlanarReflection(material, {\n color: this._target?.texture ?? null,\n matrix: this._textureMatrix,\n width: this._target?.width ?? 1,\n height: this._target?.height ?? 1,\n enabled: this._active,\n });\n }\n }\n\n _ensureCamera(sourceCamera) {\n if (this._camera?.type === sourceCamera.type) return;\n this._camera = sourceCamera.clone();\n }\n\n _ensureTarget(width, height) {\n if (this._target?.width === width && this._target?.height === height) {\n return false;\n }\n this._target?.dispose();\n this._target = new THREE.WebGLRenderTarget(width, height, {\n depthBuffer: true,\n stencilBuffer: false,\n });\n this._target.texture.minFilter = THREE.LinearFilter;\n this._target.texture.magFilter = THREE.LinearFilter;\n this._target.texture.generateMipmaps = false;\n this._target.texture.name = 'WaterPlanarReflection';\n this._target.samples = 0;\n return true;\n }\n\n dispose() {\n this._disposed = true;\n this._active = false;\n this._updatedThisFrame = false;\n this._target?.dispose();\n this._target = null;\n this._camera = null;\n }\n}\n","import * as THREE from 'three';\n\nexport const CINEMATIC_WATER_SEGMENTS = Object.freeze({\n low: 96,\n medium: 144,\n high: 192,\n});\n\nexport function resolveCinematicWaterSegments(waterQuality = 2) {\n const quality = Math.round(Number(waterQuality) || 0);\n if (quality >= 2) return CINEMATIC_WATER_SEGMENTS.high;\n if (quality >= 1) return CINEMATIC_WATER_SEGMENTS.medium;\n return CINEMATIC_WATER_SEGMENTS.low;\n}\n\nexport function shouldUseCinematicWaterGeometry(\n mode,\n worldMode,\n fpsDowngraded = false,\n) {\n return mode === 'cinematic'\n && worldMode === 'studio'\n && !fpsDowngraded;\n}\n\n/**\n * Unit-size grid that preserves the legacy water mesh footprint. The vertex\n * shader redistributes these vertices around the camera, so the dense central\n * patch follows the view without rebuilding position buffers every frame.\n */\nexport function createCinematicWaterGeometry(segments) {\n const resolved = Math.max(2, Math.round(Number(segments) || 2));\n const geometry = new THREE.PlaneGeometry(1, 1, resolved, resolved);\n geometry.rotateX(-Math.PI / 2);\n geometry.name = 'CinematicWaterGrid';\n geometry.userData.cinematicWater = true;\n geometry.userData.segments = resolved;\n return geometry;\n}\n\nexport function getWaterGeometryDiagnostics(geometry) {\n if (!geometry) {\n return {\n mode: 'none',\n segments: 0,\n vertices: 0,\n triangles: 0,\n memoryBytes: 0,\n };\n }\n const position = geometry.getAttribute?.('position');\n const vertices = position?.count ?? 0;\n const indexCount = geometry.index?.count ?? 0;\n const triangles = indexCount\n ? Math.floor(indexCount / 3)\n : Math.floor(vertices / 3);\n let memoryBytes = geometry.index?.array?.byteLength ?? 0;\n for (const attribute of Object.values(geometry.attributes ?? {})) {\n memoryBytes += attribute?.array?.byteLength ?? 0;\n }\n return {\n mode: geometry.userData?.cinematicWater ? 'camera-density-grid' : 'single-quad',\n segments: geometry.userData?.segments ?? 1,\n vertices,\n triangles,\n memoryBytes,\n };\n}\n","import * as THREE from 'three';\nimport { createWaterMaterial, createInfiniteWaterMaterial, rebuildWaterShaderSource } from '../terrain/WaterMaterial.js';\nimport { rebuildRealisticWaterShaderSource } from './RealisticWaterMaterial.js';\nimport {\n resolveEffectiveWaterMode,\n isRealisticWaterMode,\n isWaterActive,\n migrateWaterParams,\n} from './WaterSettings.js';\nimport { applyWaterPreset, resetWaterSettings } from './WaterPresets.js';\nimport {\n createWaterMaterialForMode,\n applyWaterMaterialSettings,\n} from './WaterMaterialFactory.js';\nimport { applyWaterDebugToMaterials } from './WaterDebugViews.js';\nimport { buildWaterMaskFiles, buildWaterMetadata } from './WaterExport.js';\nimport { isSceneRefractionMode, WaterSurfacePass } from './WaterSurfacePass.js';\nimport { STYLIZED_WATER_MODE, StylizedWaterLayer } from './StylizedWaterLayer.js';\nimport {\n isPlanarReflectionMode,\n WaterPlanarReflectionPass,\n} from './WaterPlanarReflectionPass.js';\nimport {\n createCinematicWaterGeometry,\n getWaterGeometryDiagnostics,\n resolveCinematicWaterSegments,\n shouldUseCinematicWaterGeometry,\n} from './CinematicWaterGeometry.js';\n\n// ============================================================================\n// WaterSystem — central controller for the scalable water pipeline.\n// Manages renderer switching, uniform updates, visibility, and cleanup.\n// ============================================================================\n\nexport class WaterSystem {\n constructor(engine) {\n this.engine = engine;\n this._effectiveMode = 'legacy';\n this._usingRealistic = false;\n this._boundsHelper = null;\n this._fpsDowngraded = false;\n this._fpsBelowSince = 0;\n this._fpsAboveSince = 0;\n this._lastFpsTierChangeAt = -Infinity;\n this._disposed = false;\n this._waterCompileGen = 0;\n this._waterCompilePending = false;\n this._waterCompileRetryTimer = null;\n this._waterCompileRetryCount = 0;\n this._waterCompileFailed = false;\n this._surfacePass = new WaterSurfacePass();\n this._planarReflectionPass = new WaterPlanarReflectionPass();\n this._baseStudioGeometry = engine.water?.geometry ?? null;\n this._cinematicGeometry = null;\n this._cinematicSegments = 0;\n this._geometryFocusAnchored = false;\n this._surfaceSubmitStarted = 0;\n this._surfaceSubmitMs = 0;\n this._surfaceSubmitAvgMs = 0;\n this._timedMeshes = new Map();\n this._bindSurfaceTiming(engine.water);\n // Presentation override for the studio water mesh (Mini Terrain water).\n this._studioOverride = null;\n // \"Stylized\" water mode: the Mini surface on the studio mesh and the\n // Infinite plane (the managed material underneath stays Legacy).\n this._stylized = new StylizedWaterLayer(engine);\n this._stylizedActive = false;\n this._installStudioOverride(engine.water);\n\n // Owned transition materials. The legacy Infinite fallback is private and\n // exists only while a realistic replacement is compiling.\n this._realisticStudio = null;\n this._realisticInfinite = null;\n this._realisticInfiniteHeightSig = null;\n this._realisticInfiniteHeightProgram = null;\n this._legacyInfiniteFallback = null;\n this._realisticAttached = false;\n\n // Auxiliary water meshes (e.g. the Mini Terrain cut faces). They are part\n // of the water layer: hidden from every water-free capture, bound to the\n // same scene colour/depth, and refreshed with the water settings.\n this._auxiliary = new Set();\n }\n\n /**\n * @param {{ mesh: THREE.Object3D, material?: THREE.Material,\n * applySettings?: (params, mode) => void }} entry\n */\n addAuxiliaryWater(entry) {\n if (!entry?.mesh && !entry?.material) return;\n this._auxiliary.add(entry);\n entry.applySettings?.(this.engine.params, this._effectiveMode);\n }\n\n removeAuxiliaryWater(entry) {\n if (!entry) return;\n this._auxiliary.delete(entry);\n if (entry.material) this._surfacePass.disable([entry.material]);\n }\n\n auxiliaryWaterMeshes() {\n return [...this._auxiliary].map((entry) => entry.mesh).filter(Boolean);\n }\n\n _auxiliaryWaterMaterials() {\n return [...this._auxiliary].map((entry) => entry.material).filter(Boolean);\n }\n\n /** Call once after engine scene + water meshes exist. */\n init() {\n this.prepareInitialMaterials(this.engine.params, this.engine.worldMode);\n this.activateInitialMaterials(this.engine.params, this.engine.worldMode);\n }\n\n /**\n * Create only the material needed by the current effective mode. Boot calls\n * this before compiling so a saved realistic preset never pays to compile\n * the legacy shader first merely as a temporary fallback.\n */\n prepareInitialMaterials(params = this.engine.params, worldMode = this.engine.worldMode) {\n const eng = this.engine;\n const octaves = Math.round(eng.params.octaves);\n this._effectiveMode = resolveEffectiveWaterMode(params, worldMode);\n this._usingRealistic = isRealisticWaterMode(this._effectiveMode);\n this._syncStylized(worldMode);\n\n if (this._usingRealistic) {\n if (worldMode === 'infinite') {\n this._ensureRealisticInfinite(octaves);\n return [this._realisticInfinite];\n }\n this._ensureRealisticStudio(octaves);\n return [this._realisticStudio];\n }\n\n if (worldMode === 'infinite') {\n this._ensureLegacyInfiniteMaterial(octaves);\n return [eng._infiniteWaterMat];\n }\n if (worldMode === 'planet') return [eng.planetWaterMat].filter(Boolean);\n return [eng.waterMaterial];\n }\n\n /** Attach a material only after its program has reported genuinely ready. */\n activateInitialMaterials(params = this.engine.params, worldMode = this.engine.worldMode) {\n const eng = this.engine;\n const p = params ?? eng.params;\n const debug = p.waterDebugView ?? 'off';\n\n this._waterCompilePending = false;\n this._waterCompileGen++;\n this._waterCompileRetryCount = 0;\n this._waterCompileFailed = false;\n if (this._usingRealistic) {\n this._attachRealisticMaterials(p, debug);\n } else {\n if (eng.water && eng.waterMaterial) eng.water.material = eng.waterMaterial;\n if (eng.infiniteWorld?.waterPlane && eng._infiniteWaterMat) {\n eng.infiniteWorld.waterPlane.material = eng._infiniteWaterMat;\n eng.infiniteWorld.waterMaterial = eng._infiniteWaterMat;\n }\n applyWaterMaterialSettings(eng.waterMaterial, p, 'legacy', 'off');\n applyWaterMaterialSettings(eng._infiniteWaterMat, p, 'legacy', 'off');\n applyWaterMaterialSettings(eng.planetWaterMat, p, 'legacy', 'off');\n }\n\n this._syncStudioGeometry(p, worldMode);\n this._applyVisibility(p, worldMode);\n this._applyUniforms(p);\n this._applyDebug(p);\n this._updateBoundsHelper(p);\n this.applyPerf(eng.perf);\n }\n\n migrateParams(params) {\n return migrateWaterParams(params);\n }\n\n applyPreset(presetKey) {\n return applyWaterPreset(this.engine.params, presetKey);\n }\n\n resetSettings() {\n return resetWaterSettings(this.engine.params);\n }\n\n getEffectiveMode() {\n return this._effectiveMode;\n }\n\n isEnabled() {\n return isWaterActive(this._effectiveMode, this.engine.params.seaLevel, this.engine.params.waterHideAtZero);\n }\n\n /**\n * Mode that decides the water-free scene capture. A studio override (Mini\n * diorama water) composites over that capture whatever the managed tier, so\n * Legacy / Realistic still capture while it is installed; without an\n * override this is exactly the effective mode.\n */\n _captureMode() {\n const mode = this._effectiveMode;\n const presented = this._stylizedActive\n || (!!this._studioOverride && this.engine.worldMode === 'studio');\n if (!presented) return mode;\n return isSceneRefractionMode(mode) ? mode : 'volumetric';\n }\n\n /** Stylized mode on/off for the current world + infinite plane override. */\n _syncStylized(worldMode = this.engine.worldMode) {\n const active = this._effectiveMode === STYLIZED_WATER_MODE && worldMode !== 'planet';\n if (active) {\n this._stylized.ensure(this);\n this._stylized.applySettings(this.engine.params);\n this._stylized.update(worldMode);\n this._stylized.prepare(this, worldMode);\n } else if (this._stylized.pending || this._stylized.failed) {\n this._stylized.cancelPreparation();\n this.engine.cb?.onStatus?.('Ready', false);\n }\n if (active !== this._stylizedActive) this.engine._needsRender = true;\n this._stylizedActive = active;\n this._installInfiniteOverride(this.engine.infiniteWorld?.waterPlane);\n }\n\n /** Material shown on the studio mesh / Infinite plane by the stylized mode. */\n _stylizedMaterial() {\n return this._stylizedActive && this._stylized.ready ? this._stylized.material : null;\n }\n\n get stylizedMaterial() {\n return this._stylized.material;\n }\n\n needsSceneRefraction() {\n return this._surfacePass.shouldCapture(\n this.engine.params,\n this._captureMode(),\n this.engine.worldMode,\n );\n }\n\n /** Main settings sync — call from _applyUniforms and mode changes. */\n sync(params, worldMode) {\n if (worldMode !== 'infinite') this._disposeLegacyInfiniteFallback();\n const prevMode = this._effectiveMode;\n const prevRealistic = this._usingRealistic;\n this._effectiveMode = resolveEffectiveWaterMode(params, worldMode);\n this._usingRealistic = isRealisticWaterMode(this._effectiveMode);\n this._syncStylized(worldMode);\n this._syncStudioGeometry(params, worldMode);\n\n if (prevMode !== this._effectiveMode || prevRealistic !== this._usingRealistic) {\n this._waterCompileRetryCount = 0;\n this._waterCompileFailed = false;\n if (!this._usingRealistic && prevRealistic) this._disposeRealistic();\n this._swapMaterials(params, worldMode);\n // Material swap may be async — uniforms for the active mesh are applied there.\n if (!this._waterCompilePending) {\n this._applyVisibility(params, worldMode);\n this._applyUniforms(params);\n this._applyDebug(params);\n this._updateBoundsHelper(params);\n this.applyPerf(this.engine.perf);\n }\n return;\n }\n\n this._applyVisibility(params, worldMode);\n this._applyUniforms(params);\n this._applyDebug(params);\n this._updateBoundsHelper(params);\n this.applyPerf(this.engine.perf);\n }\n\n applyPerf(perf) {\n const mats = new Set([...this._allActiveMaterials(), ...this._auxiliaryWaterMaterials()]);\n for (const mat of mats) {\n if (!mat?.uniforms) continue;\n if (mat.uniforms.uWaterQuality) mat.uniforms.uWaterQuality.value = perf.waterQuality;\n if (mat.uniforms.uWaterDetail) mat.uniforms.uWaterDetail.value = perf.waterDetail;\n if (mat.uniforms.uWaterReflection) {\n mat.uniforms.uWaterReflection.value = perf.waterReflection;\n }\n if (mat.uniforms.uWaveComplexity) mat.uniforms.uWaveComplexity.value = perf.waterWaves;\n }\n this._syncStudioGeometry(this.engine.params, this.engine.worldMode);\n this._maybeFpsDowngrade(perf);\n }\n\n /** Per-frame update — FPS downgrade + bounds helper. */\n update(fps, now = performance.now()) {\n this._maybeFpsDowngrade(this.engine.perf, fps, now);\n if (this._stylizedActive) {\n this._installInfiniteOverride(this.engine.infiniteWorld?.waterPlane);\n this._stylized.update(this.engine.worldMode);\n }\n }\n\n /**\n * Capture the water-free scene and bind it to Volumetric/Cinematic water.\n * Allocation remains lazy; Realistic, Legacy, Off, and Planet modes only\n * execute the cheap uniform-disable path.\n */\n captureSceneRefraction(renderer, scene, camera, sceneSize, sourceTarget = null) {\n const eng = this.engine;\n const materials = [\n this._realisticStudio,\n this._realisticInfinite,\n ...this._auxiliaryWaterMaterials(),\n ].filter(Boolean);\n return this._surfacePass.capture(renderer, scene, camera, {\n params: eng.params,\n mode: this._captureMode(),\n worldMode: eng.worldMode,\n sceneSize,\n hiddenObjects: [\n eng.water,\n eng.infiniteWorld?.waterPlane,\n eng.planetWater,\n this._boundsHelper,\n ...this.auxiliaryWaterMeshes(),\n ],\n materials,\n sourceTarget,\n });\n }\n\n getRefractionDiagnostics() {\n return this._surfacePass.diagnostics();\n }\n\n /**\n * Capture the mirrored above-water scene for Cinematic mode. Infinite World\n * never reaches this path while its automatic quality safeguard is enabled.\n */\n capturePlanarReflection(renderer, scene, camera, sceneSize, revision = null) {\n const eng = this.engine;\n const materials = [\n this._realisticStudio,\n this._realisticInfinite,\n ].filter(Boolean);\n return this._planarReflectionPass.capture(renderer, scene, camera, {\n params: eng.params,\n mode: this._effectiveMode,\n worldMode: eng.worldMode,\n sceneSize,\n hiddenObjects: [\n eng.water,\n eng.infiniteWorld?.waterPlane,\n eng.planetWater,\n this._boundsHelper,\n ...this.auxiliaryWaterMeshes(),\n ],\n materials,\n enabled: !this._fpsDowngraded,\n revision,\n });\n }\n\n getPlanarReflectionDiagnostics() {\n return this._planarReflectionPass.diagnostics();\n }\n\n getSurfaceDiagnostics() {\n return {\n ...getWaterGeometryDiagnostics(this.engine.water?.geometry),\n displaced: !!(\n this._cinematicGeometry\n && this.engine.water?.geometry === this._cinematicGeometry\n && !this._fpsDowngraded\n ),\n cameraFocused: !!this._cinematicGeometry,\n focusAnchored: this._geometryFocusAnchored,\n surfaceSubmitMs: this._surfaceSubmitMs,\n surfaceSubmitAvgMs: this._surfaceSubmitAvgMs,\n surfaceGpuMs: null,\n gpuTimingScope: 'whole-frame-only',\n };\n }\n\n getPerformanceDiagnostics() {\n const refraction = this.getRefractionDiagnostics();\n const reflection = this.getPlanarReflectionDiagnostics();\n const surface = this.getSurfaceDiagnostics();\n return {\n surface,\n refraction,\n reflection,\n renderTargetMemoryBytes:\n (refraction.memoryBytes || 0) + (reflection.memoryBytes || 0),\n additionalSceneRenders:\n (refraction.additionalSceneRenders || 0)\n + (reflection.additionalSceneRenders || 0),\n };\n }\n\n onStackRebuilt(stackGLSL, octaves) {\n const eng = this.engine;\n if (this._realisticStudio) {\n rebuildRealisticWaterShaderSource(this._realisticStudio, stackGLSL);\n this._realisticStudio.defines ||= {};\n this._realisticStudio.defines.OCTAVES = octaves;\n this._realisticStudio.needsUpdate = true;\n }\n // Infinite World always uses the Classic stack. Studio Nodes may call this\n // hook with graph-only GLSL while an Infinite realistic material is retained\n // across mode teardown, so never publish that graph source into this cache.\n const infiniteStack = eng._stackGLSL ?? stackGLSL;\n const infiniteOctaves = Math.round(eng.params?.octaves ?? octaves);\n if (this._realisticInfinite) {\n this._syncRealisticInfiniteHeightSource(infiniteStack, infiniteOctaves);\n }\n // Rebuild every live legacy Infinite material, including the private\n // transition fallback when the realistic shader is still linking.\n const legacyInfiniteMaterials = new Set([\n this._legacyInfiniteFallback,\n eng._infiniteWaterMat,\n ]);\n for (const material of legacyInfiniteMaterials) {\n if (!material\n || material === this._realisticStudio\n || material === this._realisticInfinite) continue;\n rebuildWaterShaderSource(material, infiniteStack);\n material.defines.OCTAVES = infiniteOctaves;\n material.needsUpdate = true;\n }\n if (eng.planetWaterMat) {\n // planet water rebuild handled by engine planet rebuild path\n }\n }\n\n /**\n * Build a disposable Infinite-water clone matching the currently requested\n * renderer. Engine uses it to warm the exact realistic program before the\n * live source swap; legacy water is warmed directly by Engine.\n */\n createInfiniteStackWarmMaterial(stackGLSL, octaves) {\n if (!this._usingRealistic || !this._realisticInfinite) return null;\n return createWaterMaterialForMode({\n mode: this._effectiveMode,\n sharedUniforms: this.engine.uniforms,\n environmentUniforms: this.engine.proceduralSky?.uniforms,\n octaves,\n stackGLSL,\n infinite: true,\n });\n }\n\n /** Build a disposable Studio-water clone for an atomic terrain transition. */\n createStudioStackWarmMaterial(stackGLSL, octaves) {\n return createWaterMaterialForMode({\n mode: this._effectiveMode,\n sharedUniforms: this.engine.uniforms,\n environmentUniforms: this.engine.proceduralSky?.uniforms,\n octaves,\n stackGLSL,\n infinite: false,\n });\n }\n\n /**\n * Render the studio water mesh with `material` instead of the material this\n * system manages (null restores it). Every internal assignment keeps\n * targeting the managed material, so leaving the override is exact.\n */\n setStudioOverride(material) {\n this._studioOverride = material || null;\n this.engine._needsRender = true;\n }\n\n get studioOverride() {\n return this._studioOverride;\n }\n\n _installStudioOverride(mesh) {\n if (!mesh || Object.getOwnPropertyDescriptor(mesh, 'material')?.get) return;\n let managed = mesh.material;\n const system = this;\n Object.defineProperty(mesh, 'material', {\n configurable: true,\n enumerable: true,\n get() { return system._studioOverride ?? system._stylizedMaterial() ?? managed; },\n set(value) { managed = value; },\n });\n }\n\n /** Same accessor for the Infinite World water plane (created per session). */\n _installInfiniteOverride(mesh) {\n if (!mesh || Object.getOwnPropertyDescriptor(mesh, 'material')?.get) return;\n let managed = mesh.material;\n const system = this;\n Object.defineProperty(mesh, 'material', {\n configurable: true,\n enumerable: true,\n get() { return system._stylizedMaterial() ?? managed; },\n set(value) { managed = value; },\n });\n }\n\n /** Materials for shader warmup / compile lists. */\n getCompileMaterials() {\n const mats = [];\n if (this._studioOverride) mats.push(this._studioOverride);\n if (this._stylizedActive) mats.push(...this._stylized.compileMaterials);\n if (this.engine.waterMaterial) mats.push(this.engine.waterMaterial);\n if (this.engine._infiniteWaterMat) mats.push(this.engine._infiniteWaterMat);\n if (this.engine.planetWaterMat) mats.push(this.engine.planetWaterMat);\n if (this._realisticStudio) mats.push(this._realisticStudio);\n if (this._realisticInfinite) mats.push(this._realisticInfinite);\n return mats;\n }\n\n getStudioMaterial() {\n return this._activeStudioMaterial();\n }\n\n getInfiniteMaterial() {\n return this._activeInfiniteMaterial();\n }\n\n /** Material most recently prepared for a mode, whether attached or not. */\n getRequestedMaterial(worldMode = this.engine.worldMode) {\n if (worldMode === 'planet') return this.engine.planetWaterMat;\n if (this._usingRealistic) {\n return worldMode === 'infinite'\n ? this._realisticInfinite\n : this._realisticStudio;\n }\n return worldMode === 'infinite'\n ? this.engine._infiniteWaterMat\n : this.engine.waterMaterial;\n }\n\n /** Replace infinite water material reference when entering infinite mode. */\n createInfiniteMaterial() {\n const eng = this.engine;\n const oct = Math.round(eng.params.octaves);\n const mode = resolveEffectiveWaterMode(eng.params, 'infinite');\n if (isRealisticWaterMode(mode)) {\n this._ensureRealisticInfinite(oct);\n return this._realisticInfinite;\n }\n return createWaterMaterialForMode({\n mode: 'legacy',\n sharedUniforms: eng.uniforms,\n octaves: oct,\n stackGLSL: eng._stackGLSL,\n infinite: true,\n });\n }\n\n /**\n * Build the requested water masks (and optional metadata) as a\n * { filename: Uint8Array } map for inclusion in the export zip. Lazily\n * creates the minimap sampler so masks work even before the minimap renders.\n */\n async exportMasks(options) {\n const eng = this.engine;\n const sampleHeight = (x, z) => {\n if (eng.heightSampler?.cpu) return eng.heightSampler.cpu.heightAt(x, z);\n return eng._getMinimapSampler().heightAt(x, z);\n };\n const size = Number(options.maskSize) || eng.boardSize || eng.params.chunkSize * eng.params.chunkCount;\n const origin = options.maskOrigin ?? { x: 0, z: 0 };\n const files = await buildWaterMaskFiles({\n sampleHeight,\n seaLevel: eng.params.seaLevel,\n size,\n origin,\n resolution: parseInt(options.maskRes ?? '512', 10),\n options: { ...options, waterMode: this._effectiveMode },\n });\n if (options.exportWaterMetadata) {\n files['water/water_metadata.json'] = new TextEncoder().encode(\n JSON.stringify(buildWaterMetadata(eng.params), null, 2),\n );\n }\n return files;\n }\n\n dispose() {\n this._disposed = true;\n if (this._waterCompileRetryTimer) {\n clearTimeout(this._waterCompileRetryTimer);\n this._waterCompileRetryTimer = null;\n }\n this._waterCompileGen++;\n this._waterCompilePending = false;\n this._surfacePass.dispose();\n this._planarReflectionPass.dispose();\n this._disposeCinematicGeometry();\n this._restoreSurfaceTiming();\n this._disposeRealistic();\n this._disposeLegacyInfiniteFallback();\n this._stylizedActive = false;\n this._stylized.dispose(this);\n if (this._boundsHelper) {\n this.engine.scene.remove(this._boundsHelper);\n this._boundsHelper.geometry?.dispose();\n this._boundsHelper.material?.dispose();\n this._boundsHelper = null;\n }\n }\n\n // ---- internal ----\n\n _syncFromParams() {\n this.sync(this.engine.params, this.engine.worldMode);\n }\n\n _swapMaterials(params, worldMode) {\n const eng = this.engine;\n const wasPending = this._waterCompilePending;\n if (this._waterCompileRetryTimer) {\n clearTimeout(this._waterCompileRetryTimer);\n this._waterCompileRetryTimer = null;\n }\n const oct = Math.round(eng.params.octaves);\n const p = params ?? eng.params;\n const debug = p.waterDebugView ?? 'off';\n const wm = worldMode ?? eng.worldMode;\n\n if (this._usingRealistic) {\n this._ensureRealisticStudio(oct);\n if (wm === 'infinite') this._ensureRealisticInfinite(oct);\n\n const mats = [this._realisticStudio];\n if (this._realisticInfinite) mats.push(this._realisticInfinite);\n\n this._waterCompileGen++;\n const gen = this._waterCompileGen;\n const materialVersions = mats.map((material) => material?.version ?? 0);\n const isCurrent = () => !this._disposed && gen === this._waterCompileGen\n && eng.worldMode === wm\n && mats.every((material, index) => (material?.version ?? 0) === materialVersions[index]);\n this._waterCompilePending = true;\n // Keep the cheap legacy plane visible while the requested realistic\n // material links. This matters on boot, where water was hidden until init.\n if (eng.water && eng.waterMaterial) {\n eng.water.material = eng.waterMaterial;\n applyWaterMaterialSettings(eng.waterMaterial, p, 'legacy', debug);\n applyWaterDebugToMaterials([eng.waterMaterial], debug);\n }\n if (wm === 'infinite') {\n this._ensureLegacyInfiniteMaterial(oct);\n if (eng.infiniteWorld?.waterPlane && eng._infiniteWaterMat) {\n eng.infiniteWorld.waterPlane.material = eng._infiniteWaterMat;\n eng.infiniteWorld.waterMaterial = eng._infiniteWaterMat;\n applyWaterMaterialSettings(eng._infiniteWaterMat, p, 'legacy', debug);\n applyWaterDebugToMaterials([eng._infiniteWaterMat], debug);\n }\n }\n this._applyVisibility(p, wm);\n this._updateBoundsHelper(p);\n this._realisticAttached = false;\n const compileJob = eng.compileWaterMaterialsAsync(mats, () => {\n if (this._disposed || gen !== this._waterCompileGen) return;\n const currentParams = eng.params;\n const currentWorldMode = eng.worldMode;\n const currentMode = resolveEffectiveWaterMode(\n currentParams,\n currentWorldMode,\n );\n const materialSourceIsCurrent = mats.every(\n (material, index) =>\n (material?.version ?? 0) === materialVersions[index],\n );\n if (!materialSourceIsCurrent\n || currentMode !== this._effectiveMode\n || currentWorldMode !== wm\n || !isRealisticWaterMode(currentMode)) {\n this._waterCompilePending = false;\n if (!materialSourceIsCurrent\n && currentMode === this._effectiveMode\n && isRealisticWaterMode(currentMode)) {\n this._swapMaterials(currentParams, currentWorldMode);\n } else {\n this.sync(currentParams, currentWorldMode);\n }\n return;\n }\n const currentDebug = currentParams.waterDebugView ?? 'off';\n this._waterCompilePending = false;\n this._waterCompileRetryCount = 0;\n this._waterCompileFailed = false;\n this._attachRealisticMaterials(currentParams, currentDebug);\n this._applyVisibility(currentParams, currentWorldMode);\n this._applyUniforms(currentParams);\n this._applyDebug(currentParams);\n this._updateBoundsHelper(currentParams);\n this.applyPerf(eng.perf);\n // Studio renders on demand. The settings change painted the legacy\n // fallback before this async callback ran, so explicitly request the\n // first frame that uses the newly attached realistic material.\n eng._needsRender = true;\n }, { isCurrent });\n Promise.resolve(compileJob).then((ready) => {\n if (this._disposed || gen !== this._waterCompileGen || ready !== false) return;\n if (!isCurrent()) {\n this._waterCompilePending = false;\n this._swapMaterials(eng.params, eng.worldMode);\n return;\n }\n this._waterCompilePending = false;\n this._realisticAttached = false;\n const currentParams = eng.params;\n const currentWorldMode = eng.worldMode;\n const currentDebug = currentParams.waterDebugView ?? 'off';\n if (eng.water && eng.waterMaterial) {\n eng.water.material = eng.waterMaterial;\n applyWaterMaterialSettings(\n eng.waterMaterial,\n currentParams,\n 'legacy',\n currentDebug,\n );\n }\n if (currentWorldMode === 'infinite') {\n this._ensureLegacyInfiniteMaterial(Math.round(currentParams.octaves));\n if (eng.infiniteWorld?.waterPlane && eng._infiniteWaterMat) {\n eng.infiniteWorld.waterPlane.material = eng._infiniteWaterMat;\n eng.infiniteWorld.waterMaterial = eng._infiniteWaterMat;\n applyWaterMaterialSettings(\n eng._infiniteWaterMat,\n currentParams,\n 'legacy',\n currentDebug,\n );\n }\n }\n this._applyVisibility(currentParams, currentWorldMode);\n this._waterCompileRetryCount++;\n if (this._waterCompileRetryCount >= 3) {\n // Keep the visible legacy material as a terminal degraded fallback.\n // A setting/mode change or a later successful compile resets this.\n this._waterCompileFailed = true;\n eng.cb?.onToast?.('Water could not be prepared. Legacy water remains active.');\n eng.cb?.onStatus?.('Water could not be prepared. Legacy water remains active.', false);\n eng._needsRender = true;\n return;\n }\n if (!this._waterCompileRetryTimer\n && isRealisticWaterMode(resolveEffectiveWaterMode(\n currentParams,\n currentWorldMode,\n ))) {\n const delay = Math.min(\n 15000,\n 3000 * (2 ** Math.min(this._waterCompileRetryCount - 1, 2)),\n );\n this._waterCompileRetryTimer = setTimeout(() => {\n this._waterCompileRetryTimer = null;\n if (this._disposed) return;\n this._swapMaterials(eng.params, eng.worldMode);\n }, delay);\n }\n });\n return;\n }\n\n this._waterCompilePending = false;\n this._waterCompileRetryCount = 0;\n this._waterCompileFailed = false;\n this._realisticAttached = false;\n this._waterCompileGen++;\n if (wasPending) eng.cb?.onStatus?.('Ready', false);\n this._ensureLegacyInfiniteMaterial(oct);\n if (eng.water && eng.waterMaterial) eng.water.material = eng.waterMaterial;\n if (eng.infiniteWorld?.waterPlane && eng._infiniteWaterMat) {\n eng.infiniteWorld.waterPlane.material = eng._infiniteWaterMat;\n eng.infiniteWorld.waterMaterial = eng._infiniteWaterMat;\n }\n applyWaterMaterialSettings(eng.waterMaterial, p, 'legacy', 'off');\n applyWaterMaterialSettings(eng._infiniteWaterMat, p, 'legacy', 'off');\n applyWaterMaterialSettings(eng.planetWaterMat, p, 'legacy', 'off');\n }\n\n _attachRealisticMaterials(p, debug) {\n const eng = this.engine;\n if (eng.water) eng.water.material = this._realisticStudio;\n if (eng.infiniteWorld?.waterPlane && this._realisticInfinite) {\n eng.infiniteWorld.waterPlane.material = this._realisticInfinite;\n eng.infiniteWorld.waterMaterial = this._realisticInfinite;\n }\n eng._infiniteWaterMat = this._realisticInfinite ?? eng._infiniteWaterMat;\n // A legacy material may have stayed visible while the realistic program\n // linked. The atomic attachment above releases its final references.\n this._disposeLegacyInfiniteFallback();\n this._realisticAttached = true;\n applyWaterMaterialSettings(this._realisticStudio, p, this._effectiveMode, debug);\n if (this._realisticInfinite) {\n applyWaterMaterialSettings(this._realisticInfinite, p, this._effectiveMode, debug);\n }\n }\n\n /** Recreate or reattach the owned legacy Infinite transition fallback. */\n _ensureLegacyInfiniteMaterial(octaves) {\n const eng = this.engine;\n const current = eng._infiniteWaterMat;\n if (current && !this.ownsMaterial(current)) return current;\n if (this._legacyInfiniteFallback) {\n eng._infiniteWaterMat = this._legacyInfiniteFallback;\n return this._legacyInfiniteFallback;\n }\n this._legacyInfiniteFallback = createWaterMaterialForMode({\n mode: 'legacy',\n sharedUniforms: eng.uniforms,\n octaves,\n stackGLSL: eng._stackGLSL,\n infinite: true,\n });\n eng._infiniteWaterMat = this._legacyInfiniteFallback;\n return this._legacyInfiniteFallback;\n }\n\n _disposeLegacyInfiniteFallback() {\n const fallback = this._legacyInfiniteFallback;\n if (!fallback) return;\n const eng = this.engine;\n if (eng.infiniteWorld?.waterPlane?.material === fallback) {\n eng.infiniteWorld.waterPlane.material = null;\n }\n if (eng.infiniteWorld?.waterMaterial === fallback) {\n eng.infiniteWorld.waterMaterial = null;\n }\n if (eng._infiniteWaterMat === fallback) eng._infiniteWaterMat = null;\n fallback.dispose();\n this._legacyInfiniteFallback = null;\n }\n\n _ensureRealisticStudio(octaves) {\n if (this._realisticStudio) return;\n const eng = this.engine;\n this._realisticStudio = createWaterMaterialForMode({\n mode: this._effectiveMode,\n sharedUniforms: eng.uniforms,\n environmentUniforms: eng.proceduralSky?.uniforms,\n octaves,\n stackGLSL: eng._stackGLSL,\n infinite: false,\n });\n }\n\n _ensureRealisticInfinite(octaves) {\n const eng = this.engine;\n if (this._realisticInfinite) {\n this._syncRealisticInfiniteHeightSource(eng._stackGLSL, octaves);\n return;\n }\n this._realisticInfinite = createWaterMaterialForMode({\n mode: this._effectiveMode,\n sharedUniforms: eng.uniforms,\n environmentUniforms: eng.proceduralSky?.uniforms,\n octaves,\n stackGLSL: eng._stackGLSL,\n infinite: true,\n });\n this._realisticInfiniteHeightSig = eng._stackGLSL?.heightSig\n || eng._stackGLSL?.sig\n || null;\n this._realisticInfiniteHeightProgram = eng._stackGLSL ?? null;\n }\n\n _syncRealisticInfiniteHeightSource(stackGLSL, octaves) {\n const material = this._realisticInfinite;\n if (!material) return false;\n const sourceSig = stackGLSL?.heightSig || stackGLSL?.sig || null;\n const sourceMatches = sourceSig != null\n ? this._realisticInfiniteHeightSig === sourceSig\n : this._realisticInfiniteHeightProgram === stackGLSL;\n if (sourceMatches && material.defines?.OCTAVES === octaves) return false;\n rebuildRealisticWaterShaderSource(material, stackGLSL);\n material.defines ||= {};\n material.defines.OCTAVES = octaves;\n material.needsUpdate = true;\n this._realisticInfiniteHeightSig = sourceSig;\n this._realisticInfiniteHeightProgram = stackGLSL ?? null;\n return true;\n }\n\n _disposeRealistic() {\n const eng = this.engine;\n if (eng.water?.material === this._realisticStudio && eng.waterMaterial) {\n eng.water.material = eng.waterMaterial;\n }\n if (eng.infiniteWorld?.waterPlane?.material === this._realisticInfinite) {\n eng.infiniteWorld.waterPlane.material = null;\n eng.infiniteWorld.waterMaterial = null;\n }\n if (eng._infiniteWaterMat === this._realisticInfinite) {\n eng._infiniteWaterMat = null;\n }\n for (const mat of [this._realisticStudio, this._realisticInfinite]) {\n mat?.dispose();\n }\n this._realisticStudio = null;\n this._realisticInfinite = null;\n this._realisticInfiniteHeightSig = null;\n this._realisticInfiniteHeightProgram = null;\n this._realisticAttached = false;\n }\n\n _activeStudioMaterial() {\n return this._usingRealistic && this._realisticAttached\n ? this._realisticStudio\n : this.engine.waterMaterial;\n }\n\n _activeInfiniteMaterial() {\n return this._usingRealistic && this._realisticAttached\n ? this._realisticInfinite\n : this.engine._infiniteWaterMat;\n }\n\n _allActiveMaterials() {\n const mats = [];\n const studio = this._activeStudioMaterial();\n const inf = this._activeInfiniteMaterial();\n if (studio) mats.push(studio);\n if (inf && inf !== studio) mats.push(inf);\n if (this.engine.planetWaterMat) mats.push(this.engine.planetWaterMat);\n return mats;\n }\n\n _applyVisibility(params, worldMode) {\n const eng = this.engine;\n const active = isWaterActive(this._effectiveMode, params.seaLevel, params.waterHideAtZero) && !eng._waterDeferred;\n const sea = params.seaLevel;\n\n if (eng.water) {\n eng.water.position.y = sea;\n eng.water.visible = active && worldMode === 'studio';\n }\n\n if (eng.infiniteWorld?.waterPlane) {\n this._bindSurfaceTiming(eng.infiniteWorld.waterPlane);\n eng.infiniteWorld.waterPlane.position.y = sea;\n eng.infiniteWorld.waterPlane.visible = active;\n eng.infiniteWorld.updateSettings?.({ seaLevel: sea });\n // updateSettings may force visible from sea level alone — respect water off\n eng.infiniteWorld.waterPlane.visible = active;\n }\n\n if (eng.planetWater) {\n eng.planetWater.visible = active && worldMode === 'planet';\n eng._updatePlanetWater?.();\n }\n }\n\n _applyUniforms(params) {\n const debug = params.waterDebugView ?? 'off';\n for (const mat of this._allActiveMaterials()) {\n applyWaterMaterialSettings(mat, params, this._effectiveMode, debug);\n }\n if (!isSceneRefractionMode(this._captureMode())) {\n this._surfacePass.deactivate([\n this._realisticStudio,\n this._realisticInfinite,\n ...this._auxiliaryWaterMaterials(),\n ].filter(Boolean));\n }\n for (const entry of this._auxiliary) entry.applySettings?.(params, this._effectiveMode);\n if (!isPlanarReflectionMode(this._effectiveMode)) {\n this._planarReflectionPass.deactivate([\n this._realisticStudio,\n this._realisticInfinite,\n ].filter(Boolean));\n }\n this._applyGeometryUniforms();\n\n // The underwater pass + caustics are driven centrally each frame by\n // Engine._updateUnderwater (UnderwaterController is the single source of\n // truth), so nothing to configure here on a settings change.\n }\n\n ownsMaterial(mat) {\n return mat === this._realisticStudio\n || mat === this._realisticInfinite\n || mat === this._legacyInfiniteFallback;\n }\n\n getTransitionState() {\n if (this._stylizedActive) {\n return {\n requestedMode: this._effectiveMode,\n renderedMode: this._stylized.ready ? this._effectiveMode : 'legacy',\n pending: this._stylized.pending,\n failed: this._stylized.failed,\n };\n }\n return {\n requestedMode: this._effectiveMode,\n renderedMode: this._usingRealistic && !this._realisticAttached ? 'legacy' : this._effectiveMode,\n pending: this._waterCompilePending,\n failed: this._waterCompileFailed,\n };\n }\n\n isMaterialTransitionPending() {\n return this._stylizedActive ? this._stylized.pending : this._waterCompilePending;\n }\n\n isRequestedMaterialReady() {\n if (this._stylizedActive) return this._stylized.ready || this._stylized.failed;\n return !this._usingRealistic\n || this._realisticAttached\n || this._waterCompileFailed;\n }\n\n _applyDebug(params) {\n applyWaterDebugToMaterials(this._allActiveMaterials(), params.waterDebugView ?? 'off');\n }\n\n _updateBoundsHelper(params) {\n const eng = this.engine;\n const show = !!params.waterShowMeshBounds && this.isEnabled();\n if (!show) {\n if (this._boundsHelper) this._boundsHelper.visible = false;\n return;\n }\n if (!this._boundsHelper && eng.water) {\n this._boundsHelper = new THREE.BoxHelper(eng.water, 0x44aaff);\n this._boundsHelper.renderOrder = 99;\n eng.scene.add(this._boundsHelper);\n }\n if (this._boundsHelper) {\n this._boundsHelper.visible = true;\n const target = eng.worldMode === 'infinite'\n ? eng.infiniteWorld?.waterPlane\n : eng.worldMode === 'planet'\n ? eng.planetWater\n : eng.water;\n if (target) this._boundsHelper.setFromObject(target);\n }\n }\n\n _maybeFpsDowngrade(perf, fps = this.engine._fps, now = performance.now()) {\n const threshold = this.engine.params.waterDisableExpensiveBelowFps ?? 42;\n const restoreThreshold = Math.max(\n threshold + 8,\n this.engine.params.waterRestoreExpensiveAboveFps ?? threshold + 12,\n );\n const downgradeDelay = Math.max(0, this.engine.params.waterDowngradeDelayMs ?? 2500);\n const restoreDelay = Math.max(0, this.engine.params.waterRestoreDelayMs ?? 5000);\n const cooldown = Math.max(0, this.engine.params.waterQualityCooldownMs ?? 8000);\n const safeguardEnabled = !!this.engine.params.waterLegacyOnLowFps\n && isRealisticWaterMode(this._effectiveMode);\n\n if (!safeguardEnabled || fps <= 0) {\n this._fpsBelowSince = 0;\n this._fpsAboveSince = 0;\n if (this._fpsDowngraded && !safeguardEnabled) this._restoreFpsQuality(now);\n return;\n }\n\n if (fps < threshold) {\n if (!this._fpsBelowSince) this._fpsBelowSince = now;\n this._fpsAboveSince = 0;\n } else if (fps > restoreThreshold) {\n if (!this._fpsAboveSince) this._fpsAboveSince = now;\n this._fpsBelowSince = 0;\n } else {\n // Inside the hysteresis band: neither accumulate a downgrade nor a\n // restore. A brief threshold crossing cannot flip quality.\n this._fpsBelowSince = 0;\n this._fpsAboveSince = 0;\n }\n\n const cooldownElapsed = now - this._lastFpsTierChangeAt >= cooldown;\n const shouldDowngrade = !this._fpsDowngraded\n && this._fpsBelowSince > 0\n && now - this._fpsBelowSince >= downgradeDelay\n && cooldownElapsed;\n const shouldRestore = this._fpsDowngraded\n && this._fpsAboveSince > 0\n && now - this._fpsAboveSince >= restoreDelay\n && cooldownElapsed;\n\n if (shouldDowngrade) {\n this._fpsDowngraded = true;\n this._lastFpsTierChangeAt = now;\n this._fpsBelowSince = 0;\n this._syncStudioGeometry(this.engine.params, this.engine.worldMode);\n this._planarReflectionPass.deactivate(\n [this._realisticStudio, this._realisticInfinite].filter(Boolean),\n );\n // temporary visual downgrade via quality uniforms only\n for (const mat of this._allActiveMaterials()) {\n if (mat.uniforms.uWaterTier) mat.uniforms.uWaterTier.value = 1;\n if (mat.uniforms.uCausticsQual) mat.uniforms.uCausticsQual.value *= 0.25;\n if (mat.uniforms.uRefractionQual) mat.uniforms.uRefractionQual.value *= 0.25;\n }\n } else if (shouldRestore) this._restoreFpsQuality(now);\n }\n\n _restoreFpsQuality(now = performance.now()) {\n this._fpsDowngraded = false;\n this._lastFpsTierChangeAt = now;\n this._fpsBelowSince = 0;\n this._fpsAboveSince = 0;\n this._syncStudioGeometry(this.engine.params, this.engine.worldMode);\n this._applyUniforms(this.engine.params);\n }\n\n _syncStudioGeometry(params, worldMode) {\n const water = this.engine.water;\n if (!water || !this._baseStudioGeometry) return;\n const useCinematic = shouldUseCinematicWaterGeometry(\n this._effectiveMode,\n worldMode,\n this._fpsDowngraded,\n );\n if (!useCinematic) {\n this._disposeCinematicGeometry();\n this._applyGeometryUniforms();\n return;\n }\n\n const segments = resolveCinematicWaterSegments(\n this.engine.perf?.waterQuality ?? 2,\n );\n if (!this._cinematicGeometry || this._cinematicSegments !== segments) {\n const previous = this._cinematicGeometry;\n this._cinematicGeometry = createCinematicWaterGeometry(segments);\n this._cinematicSegments = segments;\n this._geometryFocusAnchored = false;\n water.geometry = this._cinematicGeometry;\n previous?.dispose();\n } else if (water.geometry !== this._cinematicGeometry) {\n water.geometry = this._cinematicGeometry;\n }\n // Anchor the density distribution once for this geometry. Continuously\n // following the camera morphs vertex positions and makes the displaced\n // surface wobble while orbiting, even though its wave field is world-space.\n if (!this._geometryFocusAnchored) {\n this._updateGeometryFocus(this.engine.camera);\n }\n this._applyGeometryUniforms();\n }\n\n _disposeCinematicGeometry() {\n const water = this.engine.water;\n if (water && water.geometry === this._cinematicGeometry) {\n water.geometry = this._baseStudioGeometry;\n }\n this._cinematicGeometry?.dispose();\n this._cinematicGeometry = null;\n this._cinematicSegments = 0;\n this._geometryFocusAnchored = false;\n }\n\n _applyGeometryUniforms() {\n const enabled = this._cinematicGeometry\n && this.engine.water?.geometry === this._cinematicGeometry\n && this.engine.worldMode === 'studio'\n && this._effectiveMode === 'cinematic'\n && !this._fpsDowngraded;\n for (const material of [\n this._realisticStudio,\n this._realisticInfinite,\n ]) {\n if (material?.uniforms?.uGeometryDisplacementEnabled) {\n material.uniforms.uGeometryDisplacementEnabled.value =\n material === this._realisticStudio && enabled ? 1 : 0;\n }\n }\n }\n\n _updateGeometryFocus(camera) {\n const water = this.engine.water;\n const uniform = this._realisticStudio?.uniforms?.uGeometryFocus;\n if (!water || !camera || !uniform || !this._cinematicGeometry) return;\n const sx = Math.max(Math.abs(water.scale.x), 1);\n const sz = Math.max(Math.abs(water.scale.z), 1);\n uniform.value.set(\n THREE.MathUtils.clamp((camera.position.x - water.position.x) / sx, -0.42, 0.42),\n THREE.MathUtils.clamp((camera.position.z - water.position.z) / sz, -0.42, 0.42),\n );\n this._geometryFocusAnchored = true;\n }\n\n _bindSurfaceTiming(mesh) {\n if (!mesh || this._timedMeshes.has(mesh)) return;\n const originalBefore = mesh.onBeforeRender;\n const originalAfter = mesh.onAfterRender;\n mesh.onBeforeRender = (...args) => {\n originalBefore?.apply(mesh, args);\n if (this.engine.params?.waterShowPerfCost) {\n this._surfaceSubmitStarted =\n globalThis.performance?.now?.() ?? Date.now();\n }\n };\n mesh.onAfterRender = (...args) => {\n originalAfter?.apply(mesh, args);\n if (!this._surfaceSubmitStarted) return;\n const ended = globalThis.performance?.now?.() ?? Date.now();\n this._surfaceSubmitMs = Math.max(0, ended - this._surfaceSubmitStarted);\n this._surfaceSubmitAvgMs = this._surfaceSubmitAvgMs\n ? THREE.MathUtils.lerp(\n this._surfaceSubmitAvgMs,\n this._surfaceSubmitMs,\n 0.15,\n )\n : this._surfaceSubmitMs;\n this._surfaceSubmitStarted = 0;\n };\n this._timedMeshes.set(mesh, { originalBefore, originalAfter });\n }\n\n _restoreSurfaceTiming() {\n for (const [mesh, callbacks] of this._timedMeshes) {\n mesh.onBeforeRender = callbacks.originalBefore;\n mesh.onAfterRender = callbacks.originalAfter;\n }\n this._timedMeshes.clear();\n }\n}\n","// ============================================================================\n// UnderwaterController — centralized underwater state detection + transition.\n//\n// Single source of truth for \"is the camera submerged, how deep, and how\n// strongly should underwater effects apply right now\". It works in all three\n// world modes:\n//\n// - Tile / Infinite : flat water plane at seaLevel → submersion = seaLevel - camY\n// - Planet : spherical ocean shell at (planetRadius + seaLevel) from\n// the planet centre → submersion = oceanRadius - |camPos|\n//\n// The activation (`blend`) is a smooth ramp across a band around the surface\n// plus temporal smoothing, so crossing the waterline cross-fades instead of\n// popping. Everything downstream (post-process pass, terrain caustics,\n// diagnostics) reads the resolved values from here — nothing recomputes the\n// submersion test independently.\n// ============================================================================\n\nexport class UnderwaterController {\n constructor() {\n // config (driven from settings each frame)\n this.enabled = true;\n this.blendBand = 0.8; // world units around the surface to fade over\n this.transitionSpeed = 1.0; // multiplier on the temporal smoothing rate\n\n // resolved per-frame state (read by the effect + diagnostics)\n this.isUnderwater = false;\n this.underwaterDepth = 0; // metres below the surface (>= 0)\n this.waterSurfaceDistance = 0; // |distance to the surface| (above or below)\n this.underwaterBlend = 0; // smoothed activation 0..1\n this.waterMode = 'off'; // effective water renderer mode\n this.quality = 'off'; // resolved underwater quality: off|lite|high\n this.requestedQuality = 'auto';\n this.fellBackToLite = false; // High requested but Lite forced\n\n // optional sub-effects (mirrored from settings for diagnostics + shader)\n this.causticsEnabled = false;\n this.particlesEnabled = false;\n this.lightShaftsEnabled = false;\n\n // capability flags (set by the engine after the render target exists)\n this.depthTextureAvailable = true;\n }\n\n /** Effects only run while we are at/below the surface and not Off. */\n get active() {\n return this.underwaterBlend > 0.002 && this.quality !== 'off';\n }\n\n get highActive() {\n return this.active && this.quality === 'high';\n }\n\n /**\n * Advance the underwater state. Call once per frame, before render.\n *\n * @param {number} dt frame delta seconds\n * @param {Object} ctx\n * worldMode 'studio' | 'infinite' | 'planet'\n * cameraPos THREE.Vector3 (world)\n * seaLevel current sea level\n * waterActive whether water is on at all\n * waterMode effective water renderer mode\n * quality resolved underwater quality ('off'|'lite'|'high')\n * requestedQuality raw setting ('off'|'lite'|'high'|'auto')\n * fellBack High requested but Lite forced\n * planetRadius planet radius (planet mode only)\n * blendBand transition band width (world units)\n * transitionSpeed transition speed multiplier\n * causticsEnabled / particlesEnabled / lightShaftsEnabled\n * volume optional bounded water volume (Mini Terrain):\n * { minX, maxX, minZ, maxZ, floorY }. When present the\n * camera is submerged only INSIDE the footprint and\n * above its floor — a camera outside looking at the\n * cut faces is never treated as underwater.\n */\n update(dt, ctx) {\n const {\n worldMode, cameraPos, seaLevel, waterActive,\n waterMode = 'off', quality = 'off', requestedQuality = 'auto',\n fellBack = false, planetRadius = 0,\n blendBand, transitionSpeed,\n causticsEnabled = false, particlesEnabled = false, lightShaftsEnabled = false,\n volume = null,\n } = ctx;\n\n if (blendBand != null) this.blendBand = Math.max(0.2, blendBand);\n if (transitionSpeed != null) this.transitionSpeed = Math.max(0.1, transitionSpeed);\n\n this.waterMode = waterMode;\n this.quality = quality;\n this.requestedQuality = requestedQuality;\n this.fellBack = fellBack;\n this.fellBackToLite = fellBack;\n this.causticsEnabled = causticsEnabled;\n this.particlesEnabled = particlesEnabled;\n this.lightShaftsEnabled = lightShaftsEnabled;\n\n // ---- submersion test (mode-specific) ----\n let submerge = -1e9;\n if (this.enabled && waterActive && cameraPos) {\n if (worldMode === 'planet') {\n const oceanRadius = (planetRadius || 0) + (seaLevel || 0);\n const camRadius = Math.hypot(cameraPos.x, cameraPos.y, cameraPos.z);\n submerge = oceanRadius - camRadius;\n } else if (Number.isFinite(seaLevel)) {\n submerge = seaLevel - cameraPos.y;\n if (volume && submerge > -1e8) {\n // Signed distance to the footprint walls / floor (positive inside):\n // fades the activation across the cut faces instead of popping.\n let inside = Math.min(\n cameraPos.x - volume.minX,\n volume.maxX - cameraPos.x,\n cameraPos.z - volume.minZ,\n volume.maxZ - cameraPos.z,\n cameraPos.y - (volume.floorY ?? -Infinity),\n );\n if (volume.hexagon) {\n const x = Math.abs(cameraPos.x - (volume.minX + volume.maxX) * 0.5);\n const z = Math.abs(cameraPos.z - (volume.minZ + volume.maxZ) * 0.5);\n const a = (volume.maxX - volume.minX) * Math.sqrt(3) / 4;\n inside = Math.min(inside, a - Math.max(x, x * 0.5 + z * Math.sqrt(3) / 2));\n } else if (volume.bevel > 0) {\n const cx = (volume.minX + volume.maxX) * 0.5;\n const cz = (volume.minZ + volume.maxZ) * 0.5;\n const span = (volume.maxX - volume.minX + volume.maxZ - volume.minZ) * 0.5;\n const cornerX = Math.max(Math.abs(cameraPos.x - cx) - (volume.maxX - volume.minX) * 0.5 + volume.bevel, 0);\n const cornerZ = Math.max(Math.abs(cameraPos.z - cz) - (volume.maxZ - volume.minZ) * 0.5 + volume.bevel, 0);\n const cornerDistance = volume.rounded ? volume.bevel - Math.hypot(cornerX, cornerZ)\n : (span - volume.bevel - Math.abs(cameraPos.x - cx) - Math.abs(cameraPos.z - cz)) * Math.SQRT1_2;\n inside = Math.min(inside, cornerDistance);\n }\n submerge = Math.min(submerge, inside);\n }\n }\n }\n\n this.underwaterDepth = Math.max(submerge, 0);\n this.waterSurfaceDistance = Math.abs(submerge);\n\n // ---- smooth activation ----\n let target = 0;\n if (this.quality !== 'off' && submerge > -1e8) {\n const band = this.blendBand;\n target = clamp((submerge + band * 0.5) / band, 0, 1);\n }\n\n // temporal smoothing (also catches teleports / mode switches)\n const k = 1 - Math.exp(-dt * 9 * this.transitionSpeed);\n this.underwaterBlend += (target - this.underwaterBlend) * k;\n if (this.underwaterBlend < 0.002 && target === 0) this.underwaterBlend = 0;\n\n this.isUnderwater = submerge > 0;\n return this;\n }\n\n /** Read-only snapshot for the performance overlay. */\n snapshot() {\n return {\n active: this.active,\n isUnderwater: this.isUnderwater,\n mode: this.quality,\n requestedMode: this.requestedQuality,\n fellBackToLite: this.fellBackToLite,\n blend: this.underwaterBlend,\n depth: this.underwaterDepth,\n surfaceDistance: this.waterSurfaceDistance,\n waterMode: this.waterMode,\n causticsEnabled: this.causticsEnabled && this.quality !== 'off',\n particlesEnabled: this.particlesEnabled && this.quality === 'high',\n lightShaftsEnabled: this.lightShaftsEnabled && this.quality === 'high',\n depthTextureAvailable: this.depthTextureAvailable,\n };\n }\n}\n\nfunction clamp(v, lo, hi) {\n return v < lo ? lo : v > hi ? hi : v;\n}\n","import * as THREE from 'three';\n\n// ============================================================================\n// UnderwaterEffect: camera-underwater post-processing pass.\n//\n// The project renders directly to the canvas (no composer), so this effect is\n// self-contained and strictly opt-in per frame: while the camera is above the\n// water surface the scene is rendered directly as before (zero extra cost).\n// Only when the camera is at/below water level does the scene get rendered\n// into an offscreen target (with depth) and composited through a fullscreen\n// underwater shader.\n//\n// Two quality paths share ONE program (branched on a uniform, so switching\n// quality never recompiles):\n// - Lite : tint + exponential fog + cheap distortion + vignette + a single\n// screen-space caustic shimmer. Cheap enough for the legacy water\n// renderer / low-end devices.\n// - High : depth-aware absorption, layered caustic shimmer, sun light shafts,\n// optional suspended particles and a brighter surface when looking\n// up. Paired with the realistic water renderer.\n//\n// Detection + the smoothed activation `blend` come from the UnderwaterController\n// (single source of truth). The underwater colors are derived from the live\n// shared uniforms (uColShallow / uColDeep / uPaletteTint) so alien palettes\n// produce alien underwater colors automatically.\n// ============================================================================\n\nconst VERTEX = /* glsl */ `\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = vec4(position.xy, 0.0, 1.0);\n}\n`;\n\nconst FRAGMENT = /* glsl */ `\nprecision highp float;\n\n#include <packing>\n\nuniform sampler2D tDiffuse;\nuniform sampler2D tDepth;\nuniform float uStrength; // 0 = dry, 1 = fully submerged\nuniform float uTime;\nuniform float uNear;\nuniform float uFar;\nuniform vec3 uWaterShallow; // palette shallow water color (tinted)\nuniform vec3 uWaterDeep; // palette deep water color (tinted)\nuniform float uSubmergeDepth; // how far below the surface the camera is\nuniform float uVisibility; // underwater visibility distance (world units)\nuniform float uIntensity; // user master intensity\nuniform float uDistortion; // user distortion strength\nuniform float uHighMode; // 0 = Lite, 1 = High\nuniform float uCausticStr; // screen-space caustic shimmer strength\nuniform float uParticles; // suspended particle density (High only)\nuniform float uLightShafts; // sun light-shaft strength (High only)\nuniform vec2 uSunScreen; // sun position in screen UV\nuniform float uSunVisible; // 1 if the sun is in front of the camera\nuniform float uAspect; // viewport aspect (w/h)\nuniform float uDepthValid; // 1 if the depth texture is usable\n\nvarying vec2 vUv;\n\nfloat hash21(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\n// value noise (cheap, self-contained — the post pass has no NOISE include)\nfloat vn(vec2 p) {\n vec2 i = floor(p);\n vec2 f = fract(p);\n f = f * f * (3.0 - 2.0 * f);\n float a = hash21(i);\n float b = hash21(i + vec2(1.0, 0.0));\n float c = hash21(i + vec2(0.0, 1.0));\n float d = hash21(i + vec2(1.0, 1.0));\n return mix(mix(a, b, f.x), mix(c, d, f.x), f.y);\n}\n\n// animated caustic cells (two layers, different scale/speed → not a static tile)\nfloat caustic(vec2 p, float t) {\n float a = vn(p + vec2(t * 0.7, t * 0.5));\n float b = vn(p * 1.7 - vec2(t * 0.45, t * 0.62));\n float c = 1.0 - clamp((abs(a - 0.5) + abs(b - 0.5)) * 2.3, 0.0, 1.0);\n return pow(c, 2.5);\n}\n\nfloat viewDistance(vec2 uv) {\n if (uDepthValid < 0.5) return uFar * 0.5;\n float fragZ = texture2D(tDepth, uv).x;\n float viewZ = perspectiveDepthToViewZ(fragZ, uNear, uFar);\n return min(-viewZ, uFar);\n}\n\nvoid main() {\n float s = uStrength * uIntensity;\n bool high = uHighMode > 0.5;\n\n // screen-space distortion (scaled by user setting; gentler in Lite)\n vec2 uv = vUv;\n float wob = s * 0.0035 * (0.4 + uDistortion);\n if (high) {\n // higher-frequency, sun-modulated wobble for the realistic renderer\n uv.x += (sin(vUv.y * 30.0 + uTime * 1.9) + sin(vUv.y * 11.0 - uTime * 1.1)) * wob * 0.6;\n uv.y += (cos(vUv.x * 26.0 - uTime * 1.4) + cos(vUv.x * 9.0 + uTime * 0.8)) * wob * 0.55;\n } else {\n uv.x += sin(vUv.y * 28.0 + uTime * 1.7) * wob;\n uv.y += cos(vUv.x * 23.0 - uTime * 1.3) * wob * 0.7;\n }\n uv = clamp(uv, vec2(0.001), vec2(0.999));\n\n vec3 col = texture2D(tDiffuse, uv).rgb;\n\n float dist = viewDistance(uv);\n float murk = clamp(uSubmergeDepth / 45.0, 0.0, 1.0);\n vec3 waterCol = mix(uWaterShallow, uWaterDeep, 0.35 + 0.65 * murk);\n // Palette water colors can be highly saturated because the surface also\n // contains reflection and transmission. Underwater fog fills the whole\n // screen, so retain less chroma here and bias away from an electric-blue\n // result while preserving custom/alien palette identity.\n float waterLuma = dot(waterCol, vec3(0.299, 0.587, 0.114));\n waterCol = mix(\n vec3(waterLuma),\n waterCol,\n high ? 0.52 : 0.66\n );\n waterCol.g *= 1.03;\n waterCol.b *= high ? 0.78 : 0.86;\n waterCol = clamp(waterCol, vec3(0.0), vec3(1.0));\n\n // depth-aware fog (denser deeper). High mode shifts color with depth more\n // aggressively (physically-inspired absorption: red goes first).\n float densBase = high ? (1.4 + murk * 1.8) : (1.6 + murk * 1.4);\n float density = densBase / max(uVisibility, 10.0);\n float fogF = clamp(1.0 - exp(-density * density * dist * dist), 0.0, 1.0);\n\n vec3 uw = col * (0.85 - 0.25 * murk);\n uw = mix(\n uw,\n uw * (vec3(0.65) + waterCol * 1.25),\n high ? 0.30 : 0.26\n );\n\n if (high) {\n // Wavelength-dependent absorption, kept moderate so physical warm-channel\n // loss does not turn the entire view into saturated blue.\n vec3 absorb = vec3(0.32, 0.17, 0.10) * (0.6 + 0.9 * murk);\n uw *= exp(-absorb * dist / max(uVisibility, 10.0));\n }\n\n // desaturation + reduced contrast (soft underwater light)\n float luma = dot(uw, vec3(0.299, 0.587, 0.114));\n uw = mix(uw, vec3(luma), high ? 0.12 : 0.18);\n uw = mix(vec3(0.5 * (uWaterShallow + uWaterDeep) * 0.4 + 0.18), uw, 0.88);\n\n // NOTE: caustics are projected on the actual sea floor in the terrain shader\n // (world-space, lighting-driven) — NOT faked as a screen overlay here, which\n // read as noise stuck to the lens. The post pass only does water optics.\n\n // ---- sun light shafts (High only) ----\n if (high && uLightShafts > 0.001 && uSunVisible > 0.5) {\n vec2 d = vUv - uSunScreen;\n d.x *= uAspect;\n float shaft = 0.0;\n float ang = atan(d.y, d.x);\n float r = length(d);\n // streaky radial glow that breaks up with animated noise\n float streak = vn(vec2(ang * 5.0, r * 6.0 - uTime * 0.6));\n shaft = smoothstep(1.1, 0.0, r) * (0.4 + 0.6 * streak);\n shaft *= smoothstep(0.0, 0.25, vUv.y); // fade toward the seabed\n uw += vec3(1.0, 0.97, 0.85) * shaft * uLightShafts * 0.5;\n }\n\n // ---- suspended particles (High only, opt-in, kept sparse + subtle) ----\n if (high && uParticles > 0.001) {\n vec2 pp = vec2(vUv.x * uAspect, vUv.y) * 70.0;\n pp.y += uTime * 0.4; // slow upward drift\n pp += vec2(sin(uTime * 0.3 + vUv.y * 10.0) * 0.5, 0.0);\n float cell = hash21(floor(pp));\n float spec = smoothstep(0.993, 1.0, cell); // far fewer specks\n uw += vec3(0.8, 0.9, 1.0) * spec * uParticles * 0.35;\n }\n\n // ---- brighter surface when looking up (suggest the surface from below) ----\n if (high) {\n float upLook = smoothstep(0.55, 1.0, vUv.y);\n float shimmer = vn(vec2(vUv.x * 10.0 + uTime * 0.7, uTime * 0.4));\n uw += waterCol * upLook * (0.05 + 0.05 * shimmer) * (1.0 - murk * 0.6);\n }\n\n // fog last so the horizon fully closes into the water color\n uw = mix(uw, waterCol, fogF);\n\n // vignette\n float vig = smoothstep(1.25, 0.45, length(vUv - 0.5) * 1.6);\n uw *= mix(high ? 0.72 : 0.78, 1.0, vig);\n\n gl_FragColor = vec4(mix(col, uw, s), 1.0);\n}\n`;\n\nexport class UnderwaterEffect {\n constructor() {\n this.enabled = true; // settings toggle (perf.underwaterEffect)\n this.intensity = 1.0; // master strength multiplier\n this.visibility = 140; // underwater view distance, world units\n this.blendBand = 0.8; // world units around the surface to fade over\n this.strength = 0; // mirrored activation 0..1 (from controller)\n this.highMode = false; // Lite vs High\n this._depthSupported = true;\n\n this._rt = null;\n this._quadScene = new THREE.Scene();\n this._quadCam = new THREE.OrthographicCamera(-1, 1, 1, -1, 0, 1);\n this._material = new THREE.ShaderMaterial({\n vertexShader: VERTEX,\n fragmentShader: FRAGMENT,\n uniforms: {\n tDiffuse: { value: null },\n tDepth: { value: null },\n uStrength: { value: 0 },\n uTime: { value: 0 },\n uNear: { value: 0.5 },\n uFar: { value: 80000 },\n uWaterShallow: { value: new THREE.Vector3(0.1, 0.3, 0.4) },\n uWaterDeep: { value: new THREE.Vector3(0.02, 0.08, 0.15) },\n uSubmergeDepth: { value: 0 },\n uVisibility: { value: 140 },\n uIntensity: { value: 1 },\n uDistortion: { value: 0.5 },\n uHighMode: { value: 0 },\n uCausticStr: { value: 0.4 },\n uParticles: { value: 0 },\n uLightShafts: { value: 0 },\n uSunScreen: { value: new THREE.Vector2(0.5, 0.8) },\n uSunVisible: { value: 0 },\n uAspect: { value: 1.7 },\n uDepthValid: { value: 1 },\n },\n depthTest: false,\n depthWrite: false,\n });\n // fullscreen triangle (avoids a diagonal seam, 1 less vertex than a quad)\n const geo = new THREE.BufferGeometry();\n geo.setAttribute('position', new THREE.BufferAttribute(new Float32Array([\n -1, -1, 0, 3, -1, 0, -1, 3, 0,\n ]), 3));\n geo.setAttribute('uv', new THREE.BufferAttribute(new Float32Array([\n 0, 0, 2, 0, 0, 2,\n ]), 2));\n this._quadScene.add(new THREE.Mesh(geo, this._material));\n }\n\n get active() { return this.strength > 0.002; }\n get sceneDepthTexture() { return this.active ? this._rt?.depthTexture || null : null; }\n\n /**\n * Sync the pass from the centralized controller + live palette. Call once per\n * frame before render(). Detection/smoothing live in the controller — this\n * just mirrors its resolved state into the shader uniforms.\n *\n * @param {UnderwaterController} controller\n * @param {number} time shared shader time\n * @param {Object} sharedUniforms live terrain/water uniforms (palette)\n * @param {Object} [opts] { distortion, caustics, particles,\n * lightShafts, sunScreen{x,y}, sunVisible }\n */\n update(controller, time, sharedUniforms, opts = {}) {\n this.strength = controller.active ? Math.min(controller.underwaterBlend, 1) : 0;\n this.highMode = controller.quality === 'high';\n if (!this.active) return;\n\n const u = this._material.uniforms;\n u.uStrength.value = this.strength;\n u.uTime.value = time;\n u.uSubmergeDepth.value = controller.underwaterDepth;\n u.uVisibility.value = this.visibility;\n u.uIntensity.value = this.intensity;\n u.uHighMode.value = this.highMode ? 1 : 0;\n u.uDistortion.value = opts.distortion ?? 0.5;\n u.uCausticStr.value = controller.causticsEnabled ? (opts.caustics ?? 0.4) : 0;\n u.uParticles.value = (this.highMode && controller.particlesEnabled) ? (opts.particles ?? 0.5) : 0;\n u.uLightShafts.value = (this.highMode && controller.lightShaftsEnabled) ? (opts.lightShafts ?? 0.5) : 0;\n if (opts.sunScreen) u.uSunScreen.value.set(opts.sunScreen.x, opts.sunScreen.y);\n u.uSunVisible.value = opts.sunVisible ? 1 : 0;\n\n // live palette → underwater colors (alien water = alien underwater)\n const tint = sharedUniforms.uPaletteTint.value;\n const sh = sharedUniforms.uColShallow.value;\n const dp = sharedUniforms.uColDeep.value;\n u.uWaterShallow.value.set(sh.x * tint.x, sh.y * tint.y, sh.z * tint.z);\n u.uWaterDeep.value.set(dp.x * tint.x, dp.y * tint.y, dp.z * tint.z);\n }\n\n /**\n * Render the scene — directly when dry, through the underwater pass when\n * submerged. Drop-in replacement for renderer.render(scene, camera).\n * outputTarget lets Tile-mode visual postprocessing chain after underwater.\n */\n render(renderer, scene, camera, outputTarget = null) {\n if (!this.active) {\n renderer.setRenderTarget(outputTarget);\n renderer.render(scene, camera);\n if (outputTarget) renderer.setRenderTarget(null);\n return;\n }\n\n const size = outputTarget\n ? new THREE.Vector2(outputTarget.width, outputTarget.height)\n : renderer.getDrawingBufferSize(new THREE.Vector2());\n this._ensureTarget(renderer, size.x, size.y);\n const u = this._material.uniforms;\n u.uNear.value = camera.near;\n u.uFar.value = camera.far;\n u.uAspect.value = size.x / Math.max(size.y, 1);\n u.uDepthValid.value = this._depthSupported ? 1 : 0;\n\n renderer.setRenderTarget(this._rt);\n renderer.render(scene, camera);\n\n u.tDiffuse.value = this._rt.texture;\n u.tDepth.value = this._rt.depthTexture;\n renderer.setRenderTarget(outputTarget);\n renderer.render(this._quadScene, this._quadCam);\n if (outputTarget) renderer.setRenderTarget(null);\n }\n\n /**\n * Composite an already-rendered scene target. This is the render-graph path:\n * the shared scene color/depth is reused instead of rendering the world a\n * second time solely for the underwater effect.\n */\n compositeFromTarget(renderer, camera, sourceTarget) {\n if (!this.active || !sourceTarget?.texture) return sourceTarget;\n const size = new THREE.Vector2(sourceTarget.width, sourceTarget.height);\n this._ensureTarget(renderer, size.x, size.y);\n const u = this._material.uniforms;\n u.uNear.value = camera.near;\n u.uFar.value = camera.far;\n u.uAspect.value = size.x / Math.max(size.y, 1);\n u.uDepthValid.value = sourceTarget.depthTexture ? 1 : 0;\n u.tDiffuse.value = sourceTarget.texture;\n u.tDepth.value = sourceTarget.depthTexture;\n renderer.setRenderTarget(this._rt);\n renderer.render(this._quadScene, this._quadCam);\n renderer.setRenderTarget(null);\n return this._rt;\n }\n\n _ensureTarget(renderer, width, height) {\n const size = (width && height)\n ? new THREE.Vector2(width, height)\n : renderer.getDrawingBufferSize(new THREE.Vector2());\n const w = Math.max(1, Math.round(size.x));\n const h = Math.max(1, Math.round(size.y));\n if (this._rt && this._rt.width === w && this._rt.height === h) return;\n\n if (this._rt) this._rt.dispose();\n let depthTexture = null;\n try {\n depthTexture = new THREE.DepthTexture(w, h);\n depthTexture.type = THREE.UnsignedIntType;\n depthTexture.format = THREE.DepthFormat;\n this._depthSupported = true;\n } catch (e) {\n // No depth-texture support → fall back to a tint/fog-only look (uDepthValid\n // off). The pass still renders; depth-aware fog uses a constant estimate.\n depthTexture = null;\n this._depthSupported = false;\n console.warn('Underwater: depth texture unavailable, using simplified fog', e);\n }\n // no MSAA: with samples > 0, three (r160) resolves depth into a\n // renderbuffer, leaving the sampled depth texture unpopulated. The\n // underwater image is fogged + distorted, so aliasing is not visible.\n this._rt = new THREE.WebGLRenderTarget(w, h, {\n depthTexture: depthTexture || undefined,\n depthBuffer: true,\n stencilBuffer: false,\n });\n }\n\n dispose() {\n if (this._rt) { this._rt.dispose(); this._rt = null; }\n this._material.dispose();\n this._quadScene.children.forEach((m) => m.geometry?.dispose());\n }\n}\n","import { effectQuality, WATER_QUALITY_DEFAULTS } from './EffectQuality.js';\nimport { resolveEffectHost } from './EffectHost.js';\nimport * as THREE from 'three';\nimport { validateParameters } from '../resources/ParameterValidation.js';\nimport { WaterSystem } from '../../engine/water/WaterSystem.js';\nimport {\n WATER_DEFAULT_PARAMS,\n WATER_MODES,\n resolveUnderwaterMode,\n} from '../../engine/water/WaterSettings.js';\nimport { createWaterMaterialForMode } from '../../engine/water/WaterMaterialFactory.js';\nimport { compileMaterial } from '../resources/CompileMaterial.js';\nimport { RevisionScope } from '../resources/RevisionScope.js';\nimport { UnderwaterController } from '../../engine/render/UnderwaterController.js';\nimport { UnderwaterEffect } from '../../engine/render/UnderwaterEffect.js';\n\nexport class TerrainWater {\n constructor({ terrain, renderer, world, mode = 'legacy', parameters = {}, quality = {} } = {}) {\n validateParameters(parameters, WATER_DEFAULT_PARAMS, { seaLevel: 0, waterAnim: true });\n const resolvedQuality=effectQuality(quality,WATER_QUALITY_DEFAULTS);\n const host = resolveEffectHost({terrain,renderer,world});\n terrain=host.terrain;\n this.terrain=terrain;\n this._ownsHost=host.ownsHost;\n this.object=new THREE.Group();this.object.name='water';terrain.object.add(this.object);\n this.mode = mode;\n this.parameters = {\n ...WATER_DEFAULT_PARAMS,\n ...(this._ownsHost ? {waterHideAtZero:false,waterAutoDowngradeInfinite:false} : {}),\n ...parameters,\n waterMode: mode,\n waterEnabled: mode !== 'off' && parameters.waterEnabled !== false,\n };\n this.quality = resolvedQuality;\n this.scope = new RevisionScope();\n this.context = null;\n this.system = null;\n this.controller = new UnderwaterController();\n this.underwater = new UnderwaterEffect();\n this._detach = terrain.addLayer(this);\n }\n _createContext(params, quality = this.quality) {\n const t = this.terrain,\n u = t._uniforms,\n wm = t.mode === 'finite' ? 'studio' : t.mode;\n const group = new THREE.Group();\n group.name = 'terrain-water';\n group.visible = false;\n this.object.add(group);\n const base = createWaterMaterialForMode({\n mode: 'legacy',\n sharedUniforms: u,\n octaves: t.configuration.source.octaves,\n stackGLSL: t._stackGLSL,\n planet: wm === 'planet',\n infinite: wm === 'infinite',\n });\n const geometry =\n wm === 'planet'\n ? new THREE.SphereGeometry(1, 64, 48)\n : new THREE.PlaneGeometry(1, 1).rotateX(-Math.PI / 2);\n const mesh = new THREE.Mesh(geometry, base);\n mesh.frustumCulled = false;\n mesh.renderOrder = 10;\n group.add(mesh);\n const layer = this;\n const context = {\n group,\n mesh,\n base,\n geometry,\n scene: group,\n uniforms: u,\n perf: quality,\n worldMode: wm,\n params,\n camera: t._viewCamera ?? new THREE.PerspectiveCamera(),\n _fps: 60,\n _needsRender: false,\n _waterDeferred: true,\n _stackGLSL: t._stackGLSL,\n boardSize: t.configuration.layout.chunkCount * t.configuration.layout.chunkSize,\n heightSampler: { heightAt: (x, z) => t.sampleHeight(x, z) ?? 0 },\n _getMinimapSampler: () => ({ heightAt: (x, z) => t.sampleHeight(x, z) ?? 0 }),\n water: wm === 'studio' ? mesh : null,\n waterMaterial: wm === 'studio' ? base : null,\n planetWater: wm === 'planet' ? mesh : null,\n planetWaterMat: wm === 'planet' ? base : null,\n _infiniteWaterMat: wm === 'infinite' ? base : null,\n infiniteWorld:\n wm === 'infinite'\n ? {\n waterPlane: mesh,\n waterMaterial: base,\n updateSettings: ({ seaLevel }) => {\n if (seaLevel !== undefined) mesh.position.y = seaLevel;\n },\n }\n : null,\n compileWaterMaterialsAsync: async (mats, done) => {\n for (const m of mats) await compileMaterial(t._renderer, m, context.camera);\n if (layer.scope.disposed) return false;\n done?.();\n return true;\n },\n _updatePlanetWater: () =>\n mesh.scale.setScalar(t.configuration.layout.radius + params.seaLevel),\n };\n const size =\n wm === 'infinite'\n ? t.configuration.layout.chunkSize * (t.configuration.layout.viewRadius * 2 + 2)\n : context.boardSize;\n if (wm === 'planet') context._updatePlanetWater();\n else mesh.scale.set(size, 1, size);\n return context;\n }\n async configure(patch = {}, options = {}) {\n const mode = patch.mode ?? this.mode;\n const quality=effectQuality(patch.quality,this.quality);\n if (!WATER_MODES.some((m) => m.value === mode)) throw new TypeError('Invalid water mode');\n const parameters = {\n ...this.parameters,\n ...patch.parameters,\n waterMode: mode,\n waterEnabled: mode !== 'off' && (patch.parameters?.waterEnabled ?? (patch.mode !== undefined ? true : this.parameters.waterEnabled)),\n };\n validateParameters(patch.parameters ?? {}, WATER_DEFAULT_PARAMS, {\n seaLevel: 0,\n waterAnim: true,\n });\n return this.scope.run(async (check) => {\n const context = this._createContext({\n ...this.terrain._params,\n ...parameters,\n seaLevel: parameters.seaLevel ?? this.terrain.configuration.seaLevel,\n }, quality);\n const system = new WaterSystem(context);\n let published = false;\n try {\n const mats = system.prepareInitialMaterials(context.params, context.worldMode);\n for (const m of new Set([...mats, ...system.getCompileMaterials()]))\n await compileMaterial(this.terrain._renderer, m, context.camera, {\n geometry: context.geometry.clone(),\n });\n check();\n this.terrain._assertAlive();\n context._waterDeferred = false;\n system.activateInitialMaterials(context.params, context.worldMode);\n this._disposeActive();\n this.context = context;\n this.system = system;\n this.mode = mode;\n this.parameters = parameters;\n this.quality = quality;\n context.group.visible = true;\n published = true;\n } finally {\n if (!published) {\n system.dispose();\n context.group.removeFromParent();\n context.geometry.dispose();\n context.base.dispose();\n }\n }\n }, options);\n }\n prepare(camera, options = {}) {\n if(this._ownsHost) this.terrain.frame(0,camera);\n if (this.context) this.context.camera = camera;\n return this.configure({}, options);\n }\n onTerrainChanged({ signal, sourceChanged, programChanged } = {}) {\n if (!this.context || programChanged || sourceChanged) return this.configure({}, { signal });\n this.context.params = {\n ...this.terrain._params,\n ...this.parameters,\n seaLevel: this.parameters.seaLevel ?? this.terrain.configuration.seaLevel,\n };\n this.system.sync(this.context.params, this.context.worldMode);\n }\n update(dt, { camera }) {\n if(this._ownsHost) camera=this.terrain.frame(dt,camera);\n if (!this.system) return;\n const c = this.context,\n t = this.terrain;\n c.camera = camera;\n if (t.mode === 'infinite') {\n c.mesh.position.x = camera.position.x;\n c.mesh.position.z = camera.position.z;\n }\n this.system.update(dt > 0 ? 1 / dt : 60);\n const waterMode = this.system.getEffectiveMode();\n const quality = resolveUnderwaterMode(c.params, waterMode, true);\n this.controller.update(dt, {\n worldMode: c.worldMode,\n cameraPos: camera.position,\n seaLevel: c.params.seaLevel,\n planetRadius: t.configuration.layout.radius,\n waterActive: this.system.isEnabled(),\n waterMode,\n quality,\n requestedQuality: c.params.waterUnderwaterMode,\n blendBand: Math.max(.3,c.params.waterSurfaceTransition??.8),\n causticsEnabled: c.params.waterUnderwaterCausticsEnabled !== false,\n particlesEnabled: !!c.params.waterUnderwaterParticles,\n lightShaftsEnabled: !!c.params.waterUnderwaterLightShafts,\n volume: t._miniVolume ?? null,\n });\n this.underwater.enabled=c.params.waterUnderwaterEnabled!==false;\n this.underwater.intensity=c.params.waterUnderwaterFogDensity??1;\n this.underwater.visibility=140/Math.max(.25,c.params.waterUnderwaterVisibility??1);\n const causticsOn=this.system.isEnabled() && this.controller.causticsEnabled && quality!=='off';\n const u=t._uniforms;\n u.uCausticStrength.value=causticsOn && !t.mini && waterMode!=='stylized' ? c.params.waterUnderwaterCaustics : 0;\n u.uCausticBlend.value=causticsOn?1:0;\n u.uCausticScale.value=c.params.waterUnderwaterCausticScale;\n u.uCausticSpeed.value=c.params.waterUnderwaterCausticSpeed;\n u.uCausticMinDepth.value=c.params.waterUnderwaterCausticMinDepth;\n u.uCausticMinDepthFalloff.value=c.params.waterUnderwaterCausticMinDepthFalloff;\n const sun=t._uniforms.uSunDir.value.clone().multiplyScalar(10000).add(camera.position).project(camera);\n this.underwater.update(this.controller, t._uniforms.uTime.value, t._uniforms, {\n distortion:c.params.waterUnderwaterDistortion,caustics:c.params.waterUnderwaterCaustics,\n particles:.6,lightShafts:.7,sunScreen:{x:sun.x*.5+.5,y:sun.y*.5+.5},sunVisible:sun.z<1 && t._uniforms.uSunDir.value.y>0,\n });\n }\n serialize() {\n return {\n type: 'water',\n ...(this._ownsHost ? {world:{...this.terrain.world}} : {}),\n mode: this.mode,\n parameters: structuredClone(this.parameters),\n quality: { ...this.quality },\n };\n }\n getDiagnostics() {\n return {\n requestedMode: this.mode,\n effectiveMode: this.system?.getEffectiveMode() ?? 'off',\n underwater: {\n active: this.controller.active,\n quality: this.controller.quality,\n blend: this.controller.underwaterBlend,\n },\n ...this.system?.getPerformanceDiagnostics(),\n };\n }\n _disposeActive() {\n if (!this.context) return;\n this.system?.dispose();\n this.context.group.removeFromParent();\n this.context.geometry.dispose();\n this.context.base.dispose();\n this.context = null;\n this.system = null;\n }\n dispose() {\n if (this.scope.disposed) return;\n this.scope.dispose();\n this._detach();\n this._disposeActive();\n this.underwater.dispose();\n this.object.removeFromParent();\n if(this._ownsHost)this.terrain.dispose();\n }\n}\n\nexport async function createWater(options) {\n const layer = new TerrainWater(options);\n try {\n await layer.configure({}, { signal: options.signal });\n return layer;\n } catch (e) {\n layer.dispose();\n throw e;\n }\n}\n"],"names":["VERTEX"],"mappings":";;;;;;;;;;;;AAUO,MAAM;AAAA;AAAA,EAA0C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBhD,MAAM;AAAA;AAAA,EAA4C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAsDlD,SAAS,8BAA8B;AAC5C,SAAO;AAAA,IACL,YAAoB,EAAE,OAAO,IAAI,MAAM,MAAM,MAAM,MAAM,IAAI,EAAC;AAAA,IAC9D,aAAoB,EAAE,OAAO,IAAI,MAAM,MAAM,KAAM,MAAM,IAAI,EAAC;AAAA,IAC9D,cAAoB,EAAE,OAAO,IAAI,MAAM,MAAM,GAAK,MAAM,IAAI,EAAC;AAAA,IAC7D,cAAoB,EAAE,OAAO,IAAI,MAAM,MAAM,MAAM,MAAM,IAAI,EAAC;AAAA,IAC9D,YAAoB,EAAE,OAAO,IAAI,MAAM,QAAQ,KAAK,KAAK,GAAG,EAAE,YAAW;AAAA,IACzE,oBAAoB,EAAE,OAAO,EAAG;AAAA,IAChC,gBAAoB,EAAE,OAAO,EAAG;AAAA,IAChC,UAAoB,EAAE,OAAO,KAAI;AAAA,IACjC,WAAoB,EAAE,OAAO,EAAG;AAAA,IAChC,kBAAoB,EAAE,OAAO,KAAI;AAAA,IACjC,aAAoB,EAAE,OAAO,EAAG;AAAA,IAChC,iBAAoB,EAAE,OAAO,KAAI;AAAA,IACjC,oBAAoB,EAAE,OAAO,IAAI,MAAM,MAAM,GAAK,MAAM,IAAI,EAAC;AAAA,EACjE;AACA;ACxEA,MAAM,qBAAqB,kBAAkB,oBAAoB;AASjE,MAAMA;AAAAA;AAAAA,EAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcxB,qBAAqB;AAAA;AAAA;AAAA;AAAA,EAIrB,yBAAyB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+C3B,MAAM,sBAAsB,CAAC,WAAW,WAAW,UAAU;AAC3D,QAAM,EAAE,cAAc,sBAAqB,IAAK,4BAA4B,WAAW,QAAQ;AAC/F,QAAM,uBAAuB;AAAA;AAAA,IACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAmBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBf;AAAA;AAAA,IAAkB;AAAA;AAAA;AAAA,EAGlB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,qBAAqB;AAAA,EACrB,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0E5B,8BAA8B;AAAA,EAC9B,iBAAiB;AAAA,EACjB,yBAAyB;AAAA,EACzB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAA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"}
|