diff --git a/src/globe/navara/look.js b/src/globe/navara/look.js index 8abae7133..67e9c0013 100644 --- a/src/globe/navara/look.js +++ b/src/globe/navara/look.js @@ -164,7 +164,7 @@ export function buildNavaraLook( } } // Terrain-relative layers keep distant cumulus above mountain ridges. - // Keep a downward view clear once the camera rises above the cloud deck. + // Keep the deck visible from aircraft altitude, then clear it for regional views. if (clouds) { const offset = cloudTerrainOffset(height, ground); const pass = clouds.ref?.raw; @@ -179,7 +179,7 @@ export function buildNavaraLook( } } cloudsSunlit = cloudsSunlitAt(elevation, cloudsSunlit); - const ceiling = CUMULUS_BASES[0] + offset + (cloudsShown ? 800 : 500); + const ceiling = offset + (cloudsShown ? 12_000 : 11_000); const next = cloudsSunlit && height <= ceiling; if (next !== cloudsShown) { cloudsShown = next; diff --git a/src/globe/navara/look.test.mjs b/src/globe/navara/look.test.mjs index 2de6286fb..31f75b1b5 100644 --- a/src/globe/navara/look.test.mjs +++ b/src/globe/navara/look.test.mjs @@ -143,6 +143,8 @@ test('cumulus rises over mountain terrain and leaves the orbital view clear', () assert.deepEqual(clouds.updates, [{ visible: false }]); look.frame(900, false, 0); assert.deepEqual(clouds.updates.at(-1), { visible: true }); + look.frame(6500, true, 0); + assert.deepEqual(clouds.updates.at(-1), { visible: true }, 'above the deck'); }); test('globe lighting switches on only at rest, and off even in motion', () => { diff --git a/src/globe/navara/viewOptions.js b/src/globe/navara/viewOptions.js index bb4c75066..3b5e8d860 100644 --- a/src/globe/navara/viewOptions.js +++ b/src/globe/navara/viewOptions.js @@ -83,7 +83,7 @@ export function globeLightingAt(height, current = false) { // Navara cloud layers use ellipsoid heights. Over uplands raise the two // cumulus layers together; at world scale a single ground sample no longer // represents the whole view. Quantize the offset to avoid tiny layer updates. -export const LOCAL_CLOUD_COVERAGE = 0.22; +export const LOCAL_CLOUD_COVERAGE = 0.36; export const CUMULUS_BASES = Object.freeze([1500, 1800]); export function cloudTerrainOffset(height, ground) { if (!Number.isFinite(ground) || height >= STARS_SPACE_ENTER_M) return 0; diff --git a/src/globe/navara/viewOptions.test.mjs b/src/globe/navara/viewOptions.test.mjs index ed96520bf..eb71ca495 100644 --- a/src/globe/navara/viewOptions.test.mjs +++ b/src/globe/navara/viewOptions.test.mjs @@ -102,7 +102,7 @@ test('the cinematic look: photoreal plus clouds and ACES, no sun shadow maps, no useNormalBuffer: false, albedoScale: 2, }); - assert.equal(clouds.clouds.coverage, 0.22); + assert.equal(clouds.clouds.coverage, 0.36); assert.equal(clouds.clouds.shadows, false, 'no cloud shadow maps'); assert.ok( clouds.clouds.cloudLayers.every(({ altitude }) => altitude >= 1000),